X-Git-Url: https://git.arvados.org/arvados.git/blobdiff_plain/47a79960c81ea689445f2040b24cb76729afab06..0561bd0c3c07257fd58ded6c7cfa5feeae97af57:/services/keepstore/trash_worker_test.go diff --git a/services/keepstore/trash_worker_test.go b/services/keepstore/trash_worker_test.go index ac9406178c..c5a410b06f 100644 --- a/services/keepstore/trash_worker_test.go +++ b/services/keepstore/trash_worker_test.go @@ -1,7 +1,12 @@ +// Copyright (C) The Arvados Authors. All rights reserved. +// +// SPDX-License-Identifier: AGPL-3.0 + package main import ( "container/list" + "context" "testing" "time" ) @@ -21,7 +26,8 @@ type TrashWorkerTestData struct { UseTrashLifeTime bool DifferentMtimes bool - DeleteLocator string + DeleteLocator string + SpecifyMountUUID bool ExpectLocator1 bool ExpectLocator2 bool @@ -31,7 +37,7 @@ type TrashWorkerTestData struct { Expect no errors. */ func TestTrashWorkerIntegration_GetNonExistingLocator(t *testing.T) { - neverDelete = false + theConfig.EnableDelete = true testData := TrashWorkerTestData{ Locator1: "5d41402abc4b2a76b9719d911017c592", Block1: []byte("hello"), @@ -53,7 +59,7 @@ func TestTrashWorkerIntegration_GetNonExistingLocator(t *testing.T) { Expect the second locator in volume 2 to be unaffected. */ func TestTrashWorkerIntegration_LocatorInVolume1(t *testing.T) { - neverDelete = false + theConfig.EnableDelete = true testData := TrashWorkerTestData{ Locator1: TestHash, Block1: TestBlock, @@ -75,7 +81,7 @@ func TestTrashWorkerIntegration_LocatorInVolume1(t *testing.T) { Expect the first locator in volume 1 to be unaffected. */ func TestTrashWorkerIntegration_LocatorInVolume2(t *testing.T) { - neverDelete = false + theConfig.EnableDelete = true testData := TrashWorkerTestData{ Locator1: TestHash, Block1: TestBlock, @@ -97,7 +103,7 @@ func TestTrashWorkerIntegration_LocatorInVolume2(t *testing.T) { Expect locator to be deleted from both volumes. */ func TestTrashWorkerIntegration_LocatorInBothVolumes(t *testing.T) { - neverDelete = false + theConfig.EnableDelete = true testData := TrashWorkerTestData{ Locator1: TestHash, Block1: TestBlock, @@ -119,7 +125,7 @@ func TestTrashWorkerIntegration_LocatorInBothVolumes(t *testing.T) { Delete the second and expect the first to be still around. */ func TestTrashWorkerIntegration_MtimeMatchesForLocator1ButNotForLocator2(t *testing.T) { - neverDelete = false + theConfig.EnableDelete = true testData := TrashWorkerTestData{ Locator1: TestHash, Block1: TestBlock, @@ -138,12 +144,35 @@ func TestTrashWorkerIntegration_MtimeMatchesForLocator1ButNotForLocator2(t *test performTrashWorkerTest(testData, t) } +// Delete a block that exists on both volumes with matching mtimes, +// but specify a MountUUID in the request so it only gets deleted from +// the first volume. +func TestTrashWorkerIntegration_SpecifyMountUUID(t *testing.T) { + theConfig.EnableDelete = true + testData := TrashWorkerTestData{ + Locator1: TestHash, + Block1: TestBlock, + + Locator2: TestHash, + Block2: TestBlock, + + CreateData: true, + + DeleteLocator: TestHash, + SpecifyMountUUID: true, + + ExpectLocator1: true, + ExpectLocator2: true, + } + performTrashWorkerTest(testData, t) +} + /* Two different locators in volume 1. Delete one of them. Expect the other unaffected. */ func TestTrashWorkerIntegration_TwoDifferentLocatorsInVolume1(t *testing.T) { - neverDelete = false + theConfig.EnableDelete = true testData := TrashWorkerTestData{ Locator1: TestHash, Block1: TestBlock, @@ -166,7 +195,7 @@ func TestTrashWorkerIntegration_TwoDifferentLocatorsInVolume1(t *testing.T) { will not be deleted because its Mtime is within the trash life time. */ func TestTrashWorkerIntegration_SameLocatorInTwoVolumesWithDefaultTrashLifeTime(t *testing.T) { - neverDelete = false + theConfig.EnableDelete = true testData := TrashWorkerTestData{ Locator1: TestHash, Block1: TestBlock, @@ -188,11 +217,11 @@ func TestTrashWorkerIntegration_SameLocatorInTwoVolumesWithDefaultTrashLifeTime( performTrashWorkerTest(testData, t) } -/* Delete a block with matching mtime for locator in both volumes, but neverDelete is true, +/* Delete a block with matching mtime for locator in both volumes, but EnableDelete is false, so block won't be deleted. */ -func TestTrashWorkerIntegration_NeverDelete(t *testing.T) { - neverDelete = true +func TestTrashWorkerIntegration_DisabledDelete(t *testing.T) { + theConfig.EnableDelete = false testData := TrashWorkerTestData{ Locator1: TestHash, Block1: TestBlock, @@ -219,24 +248,27 @@ func performTrashWorkerTest(testData TrashWorkerTestData, t *testing.T) { // Put test content vols := KeepVM.AllWritable() if testData.CreateData { - vols[0].Put(testData.Locator1, testData.Block1) - vols[0].Put(testData.Locator1+".meta", []byte("metadata")) + vols[0].Put(context.Background(), testData.Locator1, testData.Block1) + vols[0].Put(context.Background(), testData.Locator1+".meta", []byte("metadata")) if testData.CreateInVolume1 { - vols[0].Put(testData.Locator2, testData.Block2) - vols[0].Put(testData.Locator2+".meta", []byte("metadata")) + vols[0].Put(context.Background(), testData.Locator2, testData.Block2) + vols[0].Put(context.Background(), testData.Locator2+".meta", []byte("metadata")) } else { - vols[1].Put(testData.Locator2, testData.Block2) - vols[1].Put(testData.Locator2+".meta", []byte("metadata")) + vols[1].Put(context.Background(), testData.Locator2, testData.Block2) + vols[1].Put(context.Background(), testData.Locator2+".meta", []byte("metadata")) } } - oldBlockTime := time.Now().Add(-blobSignatureTTL - time.Minute) + oldBlockTime := time.Now().Add(-theConfig.BlobSignatureTTL.Duration() - time.Minute) // Create TrashRequest for the test trashRequest := TrashRequest{ Locator: testData.DeleteLocator, - BlockMtime: oldBlockTime.Unix(), + BlockMtime: oldBlockTime.UnixNano(), + } + if testData.SpecifyMountUUID { + trashRequest.MountUUID = KeepVM.Mounts()[0].UUID } // Run trash worker and put the trashRequest on trashq @@ -290,26 +322,27 @@ func performTrashWorkerTest(testData TrashWorkerTestData, t *testing.T) { expectEqualWithin(t, time.Second, 0, func() interface{} { return trashq.Status().InProgress }) // Verify Locator1 to be un/deleted as expected - data, _ := GetBlock(testData.Locator1) + buf := make([]byte, BlockSize) + size, err := GetBlock(context.Background(), testData.Locator1, buf, nil) if testData.ExpectLocator1 { - if len(data) == 0 { + if size == 0 || err != nil { t.Errorf("Expected Locator1 to be still present: %s", testData.Locator1) } } else { - if len(data) > 0 { + if size > 0 || err == nil { t.Errorf("Expected Locator1 to be deleted: %s", testData.Locator1) } } // Verify Locator2 to be un/deleted as expected if testData.Locator1 != testData.Locator2 { - data, _ = GetBlock(testData.Locator2) + size, err = GetBlock(context.Background(), testData.Locator2, buf, nil) if testData.ExpectLocator2 { - if len(data) == 0 { + if size == 0 || err != nil { t.Errorf("Expected Locator2 to be still present: %s", testData.Locator2) } } else { - if len(data) > 0 { + if size > 0 || err == nil { t.Errorf("Expected Locator2 to be deleted: %s", testData.Locator2) } } @@ -321,7 +354,8 @@ func performTrashWorkerTest(testData TrashWorkerTestData, t *testing.T) { if testData.DifferentMtimes { locatorFoundIn := 0 for _, volume := range KeepVM.AllReadable() { - if _, err := volume.Get(testData.Locator1); err == nil { + buf := make([]byte, BlockSize) + if _, err := volume.Get(context.Background(), testData.Locator1, buf); err == nil { locatorFoundIn = locatorFoundIn + 1 } }