6221: Make never_delete true by default, make trash_worker respect never_delete, add
authorPeter Amstutz <peter.amstutz@curoverse.com>
Tue, 14 Jul 2015 18:02:18 +0000 (14:02 -0400)
committerPeter Amstutz <peter.amstutz@curoverse.com>
Tue, 14 Jul 2015 18:02:36 +0000 (14:02 -0400)
test.

services/keepstore/handler_test.go
services/keepstore/keepstore.go
services/keepstore/trash_worker.go
services/keepstore/trash_worker_test.go

index c181982a132cb7490d03451c891d78c5e56eaa33..8be471025db5119fb25510d2305fdaaa5cbb7257 100644 (file)
@@ -231,6 +231,7 @@ func TestPutAndDeleteSkipReadonlyVolumes(t *testing.T) {
                        uri:          "/" + TEST_HASH,
                        request_body: TEST_BLOCK,
                })
+       never_delete = false
        IssueRequest(
                &RequestTester{
                        method:       "DELETE",
@@ -448,6 +449,8 @@ func TestDeleteHandler(t *testing.T) {
        var user_token = "NOT DATA MANAGER TOKEN"
        data_manager_token = "DATA MANAGER TOKEN"
 
+       never_delete = false
+
        unauth_req := &RequestTester{
                method: "DELETE",
                uri:    "/" + TEST_HASH,
index 06b2f6fa28a3f6af0f4e9fef1861a5b65787d58d..e55e0ef841495724b26a4e89cdf84e11d0051a7e 100644 (file)
@@ -54,7 +54,7 @@ var data_manager_token string
 
 // never_delete can be used to prevent the DELETE handler from
 // actually deleting anything.
-var never_delete = false
+var never_delete = true
 
 var maxBuffers = 128
 var bufs *bufferPool
@@ -232,7 +232,7 @@ func main() {
        flag.BoolVar(
                &never_delete,
                "never-delete",
-               false,
+               true,
                "If set, nothing will be deleted. HTTP 405 will be returned "+
                        "for valid DELETE requests.")
        flag.StringVar(
@@ -294,11 +294,11 @@ func main() {
        bufs = newBufferPool(maxBuffers, BLOCKSIZE)
 
        if pidfile != "" {
-               f, err := os.OpenFile(pidfile, os.O_RDWR | os.O_CREATE, 0777)
+               f, err := os.OpenFile(pidfile, os.O_RDWR|os.O_CREATE, 0777)
                if err != nil {
                        log.Fatalf("open pidfile (%s): %s", pidfile, err)
                }
-               err = syscall.Flock(int(f.Fd()), syscall.LOCK_EX | syscall.LOCK_NB)
+               err = syscall.Flock(int(f.Fd()), syscall.LOCK_EX|syscall.LOCK_NB)
                if err != nil {
                        log.Fatalf("flock pidfile (%s): %s", pidfile, err)
                }
index bc1775f97eb3e0c700c8197fa5b21b77ecc019e0..52f5e7534578d27ddf1d72c51b3258a72950c56d 100644 (file)
@@ -1,6 +1,7 @@
 package main
 
 import (
+       "errors"
        "log"
        "time"
 )
@@ -37,11 +38,17 @@ func TrashItem(trashRequest TrashRequest) {
                if err != nil || trashRequest.BlockMtime != mtime.Unix() {
                        continue
                }
-               err = volume.Delete(trashRequest.Locator)
-               if err != nil {
+
+               if !never_delete {
+                       err = volume.Delete(trashRequest.Locator)
+               } else {
+                       err = errors.New("did not delete block because never_delete is true")
+               }
+
+               if err == nil {
+                       log.Printf("%v Delete(%v) OK", volume, trashRequest.Locator)
+               } else {
                        log.Printf("%v Delete(%v): %v", volume, trashRequest.Locator, err)
-                       continue
                }
-               log.Printf("%v Delete(%v) OK", volume, trashRequest.Locator)
        }
 }
index 0511b48d372fc3cc33b5513411512f624f12a199..8268191b08eb47c7520f26c9063e51e31e695ca6 100644 (file)
@@ -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,
@@ -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,6 +188,28 @@ 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) {
        // Create Keep Volumes