in go/cmd/ct-fetch/ct-fetch.go [732:781]
func (lw *LogWorker) saveState(newSubtree *CtLogSubtree, minTimestamp, maxTimestamp uint64) error {
// TODO(jms) Block until entry channel is empty and database writes are complete
// Depends on: using a separate entry channel per log
// Ensure that the entries in newSubtree are contiguous with the DB.
switch lw.WorkOrder {
case Init:
if lw.LogState.LastUpdateTime.IsZero() {
// New log. We need to initialize Min{Entry,Timestamp}.
// Subsequent calls with WorkOrder=Init only update Max{Entry,Timestamp}
lw.LogState.MinEntry = newSubtree.First
lw.LogState.MaxEntry = newSubtree.Last
lw.LogState.MinTimestamp = minTimestamp
lw.LogState.MaxTimestamp = maxTimestamp
} else if lw.LogState.MaxEntry == newSubtree.First-1 {
lw.LogState.MaxEntry = newSubtree.Last
} else {
return fmt.Errorf("Missing entries")
}
case Update:
if lw.LogState.MaxEntry == newSubtree.First-1 {
lw.LogState.MaxEntry = newSubtree.Last
} else {
return fmt.Errorf("Missing entries")
}
case Backfill:
if lw.LogState.MinEntry == newSubtree.Last+1 {
lw.LogState.MinEntry = newSubtree.First
} else {
return fmt.Errorf("Missing entries")
}
default:
return fmt.Errorf("Unknown work order")
}
// TODO(jms): We could do some sanity checks here. E.g. if the work order is
// Update and LogState.MaxTimestamp is >= 1 MMD ahead of LogState.MinTimestamp
// then LogState.MinTimestamp should not change.
lw.LogState.MinTimestamp = uint64Min(lw.LogState.MinTimestamp, minTimestamp)
lw.LogState.MaxTimestamp = uint64Max(lw.LogState.MaxTimestamp, maxTimestamp)
lw.LogState.LastUpdateTime = time.Now()
saveErr := lw.Database.SaveLogState(lw.LogState)
if saveErr != nil {
return fmt.Errorf("Database error: %s", saveErr)
}
glog.Infof("[%s] Saved log state: %s", lw.Name(), lw.LogState)
return nil
}