// 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
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(
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)
}
package main
import (
+ "errors"
"log"
"time"
)
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)
}
}
Expect no errors.
*/
func TestTrashWorkerIntegration_GetNonExistingLocator(t *testing.T) {
+ never_delete = false
testData := TrashWorkerTestData{
Locator1: "5d41402abc4b2a76b9719d911017c592",
Block1: []byte("hello"),
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,
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,
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,
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,
Expect the other unaffected.
*/
func TestTrashWorkerIntegration_TwoDifferentLocatorsInVolume1(t *testing.T) {
+ never_delete = false
testData := TrashWorkerTestData{
Locator1: TEST_HASH,
Block1: TEST_BLOCK,
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,
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