func (t *rpcType) cleanup(request sub.CleanupRequest, reply *sub.CleanupResponse) error { t.disableScannerFunc(true) defer t.disableScannerFunc(false) t.rwLock.Lock() defer t.rwLock.Unlock() t.logger.Printf("Cleanup(): %d objects\n", len(request.Hashes)) if t.fetchInProgress { t.logger.Println("Error: fetch in progress") return errors.New("fetch in progress") } if t.updateInProgress { t.logger.Println("Error: update progress") return errors.New("update in progress") } for _, hash := range request.Hashes { pathname := path.Join(t.objectsDir, objectcache.HashToFilename(hash)) err := fsutil.ForceRemove(pathname) if err == nil { t.logger.Printf("Deleted: %s\n", pathname) } else { t.logger.Println(err) } } return nil }
func makeHardlinks(hardlinksToMake []sub.Hardlink, rootDirectoryName string, triggers *triggers.Triggers, tmpDir string, takeAction bool, logger *log.Logger) { tmpName := path.Join(tmpDir, "temporaryHardlink") for _, hardlink := range hardlinksToMake { triggers.Match(hardlink.NewLink) if takeAction { targetPathname := path.Join(rootDirectoryName, hardlink.Target) linkPathname := path.Join(rootDirectoryName, hardlink.NewLink) // A Link directly to linkPathname will fail if it exists, so do a // Link+Rename using a temporary filename. if err := fsutil.ForceLink(targetPathname, tmpName); err != nil { logger.Println(err) continue } if err := fsutil.ForceRename(tmpName, linkPathname); err != nil { logger.Println(err) if err := fsutil.ForceRemove(tmpName); err != nil { logger.Println(err) } } else { logger.Printf("Linked: %s => %s\n", linkPathname, targetPathname) } } } }