1 // Code for generating trash lists
7 "git.curoverse.com/arvados.git/sdk/go/keepclient"
8 "git.curoverse.com/arvados.git/services/datamanager/keep"
12 func BuildTrashLists(kc *keepclient.KeepClient,
13 keepServerInfo *keep.ReadServers,
14 keepBlocksNotInCollections BlockSet) (m map[string]keep.TrashList, err error) {
16 // Servers that are writeable
17 writableServers := map[string]struct{}{}
18 for _, url := range kc.WritableLocalRoots() {
19 writableServers[url] = struct{}{}
22 _ttl, err := kc.Arvados.Discovery("blobSignatureTtl")
24 return nil, errors.New(fmt.Sprintf("Failed to get blobSignatureTtl, can't build trash lists: %v", err))
27 ttl := int64(_ttl.(float64))
29 // expire unreferenced blocks more than "ttl" seconds old.
30 expiry := time.Now().UTC().Unix() - ttl
32 return buildTrashListsInternal(writableServers, keepServerInfo, expiry, keepBlocksNotInCollections), nil
35 func buildTrashListsInternal(writableServers map[string]struct{},
36 keepServerInfo *keep.ReadServers,
38 keepBlocksNotInCollections BlockSet) (m map[string]keep.TrashList) {
40 m = make(map[string]keep.TrashList)
42 for block := range keepBlocksNotInCollections {
43 for _, block_on_server := range keepServerInfo.BlockToServers[block] {
44 if block_on_server.Mtime >= expiry {
48 // block is older than expire cutoff
49 srv := keepServerInfo.KeepServerIndexToAddress[block_on_server.ServerIndex].String()
51 if _, writable := writableServers[srv]; !writable {
55 m[srv] = append(m[srv], keep.TrashRequest{Locator: block.Digest.String(), BlockMtime: block_on_server.Mtime})