func doUpdate(request sub.UpdateRequest, rootDirectoryName string) { defer clearUpdateInProgress() var oldTriggers triggers.Triggers file, err := os.Open(oldTriggersFilename) if err == nil { decoder := json.NewDecoder(file) var trig triggers.Triggers err = decoder.Decode(&trig.Triggers) file.Close() if err == nil { oldTriggers = trig } else { logger.Printf("Error decoding old triggers: %s", err.Error()) } } if len(oldTriggers.Triggers) > 0 { processDeletes(request, rootDirectoryName, &oldTriggers, false) processMakeDirectories(request, rootDirectoryName, &oldTriggers, false) matchedOldTriggers := oldTriggers.GetMatchedTriggers() runTriggers(matchedOldTriggers, "stop") } processDeletes(request, rootDirectoryName, request.Triggers, true) processMakeDirectories(request, rootDirectoryName, request.Triggers, true) matchedNewTriggers := request.Triggers.GetMatchedTriggers() file, err = os.Create(oldTriggersFilename) if err == nil { b, err := json.Marshal(request.Triggers.Triggers) if err == nil { var out bytes.Buffer json.Indent(&out, b, "", " ") out.WriteTo(file) } else { logger.Printf("Error marshaling triggers: %s", err.Error()) } file.Close() } runTriggers(matchedNewTriggers, "start") // TODO(rgooch): Remove debugging hack and implement. time.Sleep(time.Second * 15) logger.Printf("Update() complete\n") }
func (t *rpcType) doUpdate(request sub.UpdateRequest, rootDirectoryName string) { defer t.clearUpdateInProgress() t.disableScannerFunc(true) defer t.disableScannerFunc(false) startTime := time.Now() var oldTriggers triggers.Triggers file, err := os.Open(t.oldTriggersFilename) if err == nil { decoder := json.NewDecoder(file) var trig triggers.Triggers err = decoder.Decode(&trig.Triggers) file.Close() if err == nil { oldTriggers = trig } else { t.logger.Printf("Error decoding old triggers: %s", err.Error()) } } t.copyFilesToCache(request.FilesToCopyToCache, rootDirectoryName) t.makeObjectCopies(request.MultiplyUsedObjects) t.lastUpdateHadTriggerFailures = false if len(oldTriggers.Triggers) > 0 { t.makeDirectories(request.DirectoriesToMake, rootDirectoryName, &oldTriggers, false) t.makeInodes(request.InodesToMake, rootDirectoryName, request.MultiplyUsedObjects, &oldTriggers, false) makeHardlinks(request.HardlinksToMake, rootDirectoryName, &oldTriggers, "", false, t.logger) doDeletes(request.PathsToDelete, rootDirectoryName, &oldTriggers, false, t.logger) changeInodes(request.InodesToChange, rootDirectoryName, &oldTriggers, false, t.logger) matchedOldTriggers := oldTriggers.GetMatchedTriggers() if runTriggers(matchedOldTriggers, "stop", t.logger) { t.lastUpdateHadTriggerFailures = true } } fsChangeStartTime := time.Now() t.makeDirectories(request.DirectoriesToMake, rootDirectoryName, request.Triggers, true) t.makeInodes(request.InodesToMake, rootDirectoryName, request.MultiplyUsedObjects, request.Triggers, true) makeHardlinks(request.HardlinksToMake, rootDirectoryName, request.Triggers, t.objectsDir, true, t.logger) doDeletes(request.PathsToDelete, rootDirectoryName, request.Triggers, true, t.logger) changeInodes(request.InodesToChange, rootDirectoryName, request.Triggers, true, t.logger) fsChangeDuration := time.Since(fsChangeStartTime) matchedNewTriggers := request.Triggers.GetMatchedTriggers() file, err = os.Create(t.oldTriggersFilename) if err == nil { b, err := json.Marshal(request.Triggers.Triggers) if err == nil { var out bytes.Buffer json.Indent(&out, b, "", " ") out.WriteTo(file) } else { t.logger.Printf("Error marshaling triggers: %s", err.Error()) } file.Close() } if runTriggers(matchedNewTriggers, "start", t.logger) { t.lastUpdateHadTriggerFailures = true } timeTaken := time.Since(startTime) t.logger.Printf("Update() completed in %s (change window: %s)\n", timeTaken, fsChangeDuration) }
func (t *rpcType) updateAndUnlock(request sub.UpdateRequest, rootDirectoryName string) error { defer t.clearUpdateInProgress() t.disableScannerFunc(true) defer t.disableScannerFunc(false) startTime := time.Now() if request.Triggers == nil { request.Triggers = triggers.New() } var oldTriggers triggers.Triggers file, err := os.Open(t.oldTriggersFilename) if err == nil { decoder := json.NewDecoder(file) var trig triggers.Triggers err = decoder.Decode(&trig.Triggers) file.Close() if err == nil { oldTriggers = trig } else { t.logger.Printf("Error decoding old triggers: %s", err.Error()) } } t.copyFilesToCache(request.FilesToCopyToCache, rootDirectoryName) t.makeObjectCopies(request.MultiplyUsedObjects) t.lastUpdateHadTriggerFailures = false if len(oldTriggers.Triggers) > 0 { t.makeDirectories(request.DirectoriesToMake, rootDirectoryName, &oldTriggers, false) t.makeInodes(request.InodesToMake, rootDirectoryName, request.MultiplyUsedObjects, &oldTriggers, false) t.makeHardlinks(request.HardlinksToMake, rootDirectoryName, &oldTriggers, "", false) t.doDeletes(request.PathsToDelete, rootDirectoryName, &oldTriggers, false) t.changeInodes(request.InodesToChange, rootDirectoryName, &oldTriggers, false) matchedOldTriggers := oldTriggers.GetMatchedTriggers() if runTriggers(matchedOldTriggers, "stop", t.logger) { t.lastUpdateHadTriggerFailures = true } } fsChangeStartTime := time.Now() t.makeDirectories(request.DirectoriesToMake, rootDirectoryName, request.Triggers, true) t.makeInodes(request.InodesToMake, rootDirectoryName, request.MultiplyUsedObjects, request.Triggers, true) t.makeHardlinks(request.HardlinksToMake, rootDirectoryName, request.Triggers, t.objectsDir, true) t.doDeletes(request.PathsToDelete, rootDirectoryName, request.Triggers, true) t.changeInodes(request.InodesToChange, rootDirectoryName, request.Triggers, true) fsChangeDuration := time.Since(fsChangeStartTime) matchedNewTriggers := request.Triggers.GetMatchedTriggers() file, err = os.Create(t.oldTriggersFilename) if err == nil { writer := bufio.NewWriter(file) if err := jsonlib.WriteWithIndent(writer, " ", request.Triggers.Triggers); err != nil { t.logger.Printf("Error marshaling triggers: %s", err) } writer.Flush() file.Close() } if runTriggers(matchedNewTriggers, "start", t.logger) { t.lastUpdateHadTriggerFailures = true } timeTaken := time.Since(startTime) if t.lastUpdateError != nil { t.logger.Printf("Update(): last error: %s\n", t.lastUpdateError) } else { t.rwLock.Lock() t.lastSuccessfulImageName = request.ImageName t.rwLock.Unlock() } t.logger.Printf("Update() completed in %s (change window: %s)\n", timeTaken, fsChangeDuration) return t.lastUpdateError }