X-Git-Url: https://git.arvados.org/arvados.git/blobdiff_plain/0d1971f04c8f0674ff8d94bae5dbb7f6b94e7f5f..bdb92619b5f6d920119b8c32c3027cf4b751ed16:/services/keepstore/trash_worker.go diff --git a/services/keepstore/trash_worker.go b/services/keepstore/trash_worker.go index 72b9a4663a..696c3e53a6 100644 --- a/services/keepstore/trash_worker.go +++ b/services/keepstore/trash_worker.go @@ -1,44 +1,61 @@ package main import ( - "log" + "errors" "time" -) -/* - Keepstore initiates trash worker channel goroutine. - The channel will process trash list. - For each (next) trash request: - Delete the block indicated by the trash request Locator - Repeat -*/ + "git.curoverse.com/arvados.git/sdk/go/arvados" + log "github.com/Sirupsen/logrus" +) +// RunTrashWorker is used by Keepstore to initiate trash worker channel goroutine. +// The channel will process trash list. +// For each (next) trash request: +// Delete the block indicated by the trash request Locator +// Repeat +// func RunTrashWorker(trashq *WorkQueue) { - nextItem := trashq.NextItem - for item := range nextItem { + for item := range trashq.NextItem { trashRequest := item.(TrashRequest) - err := TrashItem(trashRequest) - if err != nil { - log.Printf("Trash request error for %s: %s", trashRequest, err) - } + TrashItem(trashRequest) + trashq.DoneItem <- struct{}{} } } -/* - Delete the block indicated by the Locator in TrashRequest. -*/ -func TrashItem(trashRequest TrashRequest) (err error) { - // Verify if the block is to be deleted based on its Mtime - for _, volume := range KeepVM.Volumes() { +// TrashItem deletes the indicated block from every writable volume. +func TrashItem(trashRequest TrashRequest) { + reqMtime := time.Unix(0, trashRequest.BlockMtime) + if time.Since(reqMtime) < theConfig.BlobSignatureTTL.Duration() { + log.Printf("WARNING: data manager asked to delete a %v old block %v (BlockMtime %d = %v), but my blobSignatureTTL is %v! Skipping.", + arvados.Duration(time.Since(reqMtime)), + trashRequest.Locator, + trashRequest.BlockMtime, + reqMtime, + theConfig.BlobSignatureTTL) + return + } + + for _, volume := range KeepVM.AllWritable() { mtime, err := volume.Mtime(trashRequest.Locator) - if err == nil { - if trashRequest.BlockMtime == mtime.Unix() { - currentTime := time.Now().Unix() - if time.Duration(currentTime-trashRequest.BlockMtime)*time.Second >= permission_ttl { - err = volume.Delete(trashRequest.Locator) - } - } + if err != nil { + log.Printf("%v Delete(%v): %v", volume, trashRequest.Locator, err) + continue + } + if trashRequest.BlockMtime != mtime.UnixNano() { + log.Printf("%v Delete(%v): stored mtime %v does not match trash list value %v", volume, trashRequest.Locator, mtime.UnixNano(), trashRequest.BlockMtime) + continue + } + + if !theConfig.EnableDelete { + err = errors.New("did not delete block because EnableDelete is false") + } else { + err = volume.Trash(trashRequest.Locator) + } + + if err != nil { + log.Printf("%v Delete(%v): %v", volume, trashRequest.Locator, err) + } else { + log.Printf("%v Delete(%v) OK", volume, trashRequest.Locator) } } - return }