3762: Expose Discovery func in arvadosclient. Use Discovery to get defaultTrashLifeti...
[arvados.git] / services / keepstore / trash_worker.go
1 package main
2
3 import (
4         "git.curoverse.com/arvados.git/sdk/go/arvadosclient"
5         "log"
6         "time"
7 )
8
9 /*
10         Keepstore initiates trash worker channel goroutine.
11         The channel will process trash list.
12                 For each (next) trash request:
13       Delete the block indicated by the trash request Locator
14                 Repeat
15 */
16
17 var defaultTrashLifetime int64 = 0
18
19 func RunTrashWorker(arv *arvadosclient.ArvadosClient, trashq *WorkQueue) {
20         if arv != nil {
21                 defaultTrashLifetimeMap, err := arv.Discovery("defaultTrashLifetime")
22                 if err != nil {
23                         log.Fatalf("Error setting up arvados client %s", err.Error())
24                 }
25                 defaultTrashLifetime = int64(defaultTrashLifetimeMap["defaultTrashLifetime"].(float64))
26         }
27
28         nextItem := trashq.NextItem
29         for item := range nextItem {
30                 trashRequest := item.(TrashRequest)
31                 err := TrashItem(trashRequest)
32                 if err != nil {
33                         log.Printf("Trash request error for %s: %s", trashRequest, err)
34                 }
35         }
36 }
37
38 /*
39         Delete the block indicated by the Locator in TrashRequest.
40 */
41 func TrashItem(trashRequest TrashRequest) (err error) {
42         // Verify if the block is to be deleted based on its Mtime
43         for _, volume := range KeepVM.Volumes() {
44                 mtime, err := volume.Mtime(trashRequest.Locator)
45                 if err == nil {
46                         if trashRequest.BlockMtime == mtime.Unix() {
47                                 currentTime := time.Now().Unix()
48                                 if (currentTime - trashRequest.BlockMtime) > defaultTrashLifetime {
49                                         err = volume.Delete(trashRequest.Locator)
50                                 }
51                         }
52                 }
53         }
54         return
55 }