// RecordWorkItemState saves the WorkItemState for this task. We drop a // copy into our JSON log as a backup, and update the WorkItemState in // Pharos, so the next worker knows what to do with this item. // // Param activeResult will change, depending on what stage of processing // we're in. It could be the IngestState.FetchResult, IngestState.RecordResult, // etc. func RecordWorkItemState(ingestState *models.IngestState, _context *context.Context, activeResult *models.WorkSummary) { // Serialize the IngestManifest to JSON, and stuff it into the // WorkItemState.State. Subsequent workers need this info to // store the object's files in S3 and Glacier, and to record // results in Pharos. err := ingestState.WorkItemState.SetStateFromIngestManifest(ingestState.IngestManifest) if err != nil { // If we couldn't serialize the IngestManifest, subsequent workers // won't have the info they need to process this bag. We'll have to // requeue this item and start all over. _context.MessageLog.Error(err.Error()) activeResult.AddError("Could not convert Ingest Manifest "+ "to JSON. This item will have to be re-processed. Error was: %v", err) } else { // OK. We serialized the IngestManifest. Dump a copy into the // file system for backup and troubleshooting, and send a copy // over to Pharos, so the next worker in the chain (the save worker) // can access it. LogJson(ingestState, _context.JsonLog) resp := _context.PharosClient.WorkItemStateSave(ingestState.WorkItemState) if resp.Error != nil { // Could not send a copy of the WorkItemState to Pharos. // That means subsequent workers won't have the info they // need to work on this bag. We'll have to start processing // all over again. _context.MessageLog.Error(resp.Error.Error()) activeResult.AddError("Could not save WorkItemState "+ "to Pharos. This item will have to be re-processed. Error was: %v", resp.Error) } else { // Saved to Pharos! _context.MessageLog.Info("Saved WorkItemState for WorkItem %d (%s/%s) to Pharos", ingestState.WorkItem.Id, ingestState.WorkItem.Bucket, ingestState.WorkItem.Name) ingestState.WorkItemState = resp.WorkItemState() } } }