X-Git-Url: https://git.arvados.org/arvados.git/blobdiff_plain/4d078362f10fba8b94cce3ecc3ed8b4924b79b41..b0b276ff6121aace3c52ee855752df6852120343:/services/keepstore/trash_worker_test.go diff --git a/services/keepstore/trash_worker_test.go b/services/keepstore/trash_worker_test.go index af4040af81..8268191b08 100644 --- a/services/keepstore/trash_worker_test.go +++ b/services/keepstore/trash_worker_test.go @@ -15,11 +15,11 @@ type TrashWorkerTestData struct { Block2 []byte BlockMtime2 int64 - CreateData bool - CreateInVolume1 bool - UseDelayToCreate bool + CreateData bool + CreateInVolume1 bool UseTrashLifeTime bool + DifferentMtimes bool DeleteLocator string @@ -31,6 +31,7 @@ type TrashWorkerTestData struct { Expect no errors. */ func TestTrashWorkerIntegration_GetNonExistingLocator(t *testing.T) { + never_delete = false testData := TrashWorkerTestData{ Locator1: "5d41402abc4b2a76b9719d911017c592", Block1: []byte("hello"), @@ -52,6 +53,7 @@ func TestTrashWorkerIntegration_GetNonExistingLocator(t *testing.T) { Expect the second locator in volume 2 to be unaffected. */ func TestTrashWorkerIntegration_LocatorInVolume1(t *testing.T) { + never_delete = false testData := TrashWorkerTestData{ Locator1: TEST_HASH, Block1: TEST_BLOCK, @@ -73,6 +75,7 @@ func TestTrashWorkerIntegration_LocatorInVolume1(t *testing.T) { Expect the first locator in volume 1 to be unaffected. */ func TestTrashWorkerIntegration_LocatorInVolume2(t *testing.T) { + never_delete = false testData := TrashWorkerTestData{ Locator1: TEST_HASH, Block1: TEST_BLOCK, @@ -94,6 +97,7 @@ func TestTrashWorkerIntegration_LocatorInVolume2(t *testing.T) { Expect locator to be deleted from both volumes. */ func TestTrashWorkerIntegration_LocatorInBothVolumes(t *testing.T) { + never_delete = false testData := TrashWorkerTestData{ Locator1: TEST_HASH, Block1: TEST_BLOCK, @@ -115,6 +119,7 @@ func TestTrashWorkerIntegration_LocatorInBothVolumes(t *testing.T) { Delete the second and expect the first to be still around. */ func TestTrashWorkerIntegration_MtimeMatchesForLocator1ButNotForLocator2(t *testing.T) { + never_delete = false testData := TrashWorkerTestData{ Locator1: TEST_HASH, Block1: TEST_BLOCK, @@ -122,8 +127,8 @@ func TestTrashWorkerIntegration_MtimeMatchesForLocator1ButNotForLocator2(t *test Locator2: TEST_HASH, Block2: TEST_BLOCK, - CreateData: true, - UseDelayToCreate: true, + CreateData: true, + DifferentMtimes: true, DeleteLocator: TEST_HASH, @@ -138,6 +143,7 @@ func TestTrashWorkerIntegration_MtimeMatchesForLocator1ButNotForLocator2(t *test Expect the other unaffected. */ func TestTrashWorkerIntegration_TwoDifferentLocatorsInVolume1(t *testing.T) { + never_delete = false testData := TrashWorkerTestData{ Locator1: TEST_HASH, Block1: TEST_BLOCK, @@ -160,6 +166,7 @@ func TestTrashWorkerIntegration_TwoDifferentLocatorsInVolume1(t *testing.T) { will not be deleted becuase its Mtime is within the trash life time. */ func TestTrashWorkerIntegration_SameLocatorInTwoVolumesWithDefaultTrashLifeTime(t *testing.T) { + never_delete = false testData := TrashWorkerTestData{ Locator1: TEST_HASH, Block1: TEST_BLOCK, @@ -181,10 +188,30 @@ func TestTrashWorkerIntegration_SameLocatorInTwoVolumesWithDefaultTrashLifeTime( performTrashWorkerTest(testData, t) } +/* Delete a block with matching mtime for locator in both volumes, but never_delete is true, + so block won't be deleted. +*/ +func TestTrashWorkerIntegration_NeverDelete(t *testing.T) { + never_delete = true + testData := TrashWorkerTestData{ + Locator1: TEST_HASH, + Block1: TEST_BLOCK, + + Locator2: TEST_HASH, + Block2: TEST_BLOCK, + + CreateData: true, + + DeleteLocator: TEST_HASH, + + ExpectLocator1: true, + ExpectLocator2: true, + } + performTrashWorkerTest(testData, t) +} + /* Perform the test */ func performTrashWorkerTest(testData TrashWorkerTestData, t *testing.T) { - actual_permission_ttl := permission_ttl - // Create Keep Volumes KeepVM = MakeTestVolumeManager(2) defer KeepVM.Close() @@ -195,11 +222,6 @@ func performTrashWorkerTest(testData TrashWorkerTestData, t *testing.T) { vols[0].Put(testData.Locator1, testData.Block1) vols[0].Put(testData.Locator1+".meta", []byte("metadata")) - // One of the tests deletes a locator with different Mtimes in two different volumes - if testData.UseDelayToCreate { - time.Sleep(1 * time.Second) - } - if testData.CreateInVolume1 { vols[0].Put(testData.Locator2, testData.Block2) vols[0].Put(testData.Locator2+".meta", []byte("metadata")) @@ -209,24 +231,30 @@ func performTrashWorkerTest(testData TrashWorkerTestData, t *testing.T) { } } + oldBlockTime := time.Now().Add(-blob_signature_ttl - time.Minute) + // Create TrashRequest for the test trashRequest := TrashRequest{ Locator: testData.DeleteLocator, - BlockMtime: time.Now().Unix(), + BlockMtime: oldBlockTime.Unix(), } - // delay by permission_ttl to allow deletes to work - time.Sleep(1 * time.Second) - // Run trash worker and put the trashRequest on trashq trashList := list.New() trashList.PushBack(trashRequest) trashq = NewWorkQueue() + defer trashq.Close() - // Trash worker would not delete block if its Mtime is within trash life time. - // Hence, we will have to bypass it to allow the deletion to succeed. if !testData.UseTrashLifeTime { - permission_ttl = time.Duration(1) * time.Second + // Trash worker would not delete block if its Mtime is + // within trash life time. Back-date the block to + // allow the deletion to succeed. + for _, v := range vols { + v.(*MockVolume).Timestamps[testData.DeleteLocator] = oldBlockTime + if testData.DifferentMtimes { + oldBlockTime = oldBlockTime.Add(time.Second) + } + } } go RunTrashWorker(trashq) @@ -259,10 +287,10 @@ func performTrashWorkerTest(testData TrashWorkerTestData, t *testing.T) { } } - // One test used the same locator in two different volumes but with different Mtime values - // Hence let's verify that only one volume has it and the other is deleted - if (testData.ExpectLocator1) && - (testData.Locator1 == testData.Locator2) { + // The DifferentMtimes test puts the same locator in two + // different volumes, but only one copy has an Mtime matching + // the trash request. + if testData.DifferentMtimes { locatorFoundIn := 0 for _, volume := range KeepVM.AllReadable() { if _, err := volume.Get(testData.Locator1); err == nil { @@ -270,11 +298,7 @@ func performTrashWorkerTest(testData TrashWorkerTestData, t *testing.T) { } } if locatorFoundIn != 1 { - t.Errorf("Expected locator to be found in only one volume after deleting. But found: %s", locatorFoundIn) + t.Errorf("Found %d copies of %s, expected 1", locatorFoundIn, testData.Locator1) } } - - // Done - permission_ttl = actual_permission_ttl - trashq.Close() }