// gcTreeStore removes all treeStoreIDs not referenced by any non garbage // collected pod from the store. func gcTreeStore(s *store.Store) error { // Take an exclusive lock to block other pods being created. // This is needed to avoid races between the below steps (getting the // list of referenced treeStoreIDs, getting the list of treeStoreIDs // from the store, removal of unreferenced treeStoreIDs) and new // pods/treeStores being created/referenced keyLock, err := lock.ExclusiveKeyLock(lockDir(), common.PrepareLock) if err != nil { return fmt.Errorf("cannot get exclusive prepare lock: %v", err) } defer keyLock.Close() referencedTreeStoreIDs, err := getReferencedTreeStoreIDs() if err != nil { return fmt.Errorf("cannot get referenced treestoreIDs: %v", err) } treeStoreIDs, err := s.GetTreeStoreIDs() if err != nil { return fmt.Errorf("cannot get treestoreIDs from the store: %v", err) } for _, treeStoreID := range treeStoreIDs { if _, ok := referencedTreeStoreIDs[treeStoreID]; !ok { if err := s.RemoveTreeStore(treeStoreID); err != nil { stderr("rkt: error removing treestore %q: %v", treeStoreID, err) } else { stderr("rkt: removed treestore %q", treeStoreID) } } } return nil }