MCPcopy
hub / github.com/benbjohnson/litestream / syncLocked

Method syncLocked

db.go:1174–1235  ·  view source on GitHub ↗
(ctx context.Context)

Source from the content-addressed store, hash-verified

1172}
1173
1174func (db *DB) syncLocked(ctx context.Context) (err error) {
1175 // Track total sync metrics.
1176 t := time.Now()
1177 defer func() {
1178 db.syncNCounter.Inc()
1179 if err != nil {
1180 db.syncErrorNCounter.Inc()
1181 }
1182 db.syncSecondsCounter.Add(float64(time.Since(t).Seconds()))
1183 }()
1184
1185 exec, err := db.newSyncExecutor(ctx)
1186 if err != nil {
1187 return err
1188 } else if exec == nil {
1189 db.Logger.Debug("sync: no database found")
1190 return nil
1191 }
1192 defer db.applySyncExecutor(exec, true)
1193
1194 // Ensure WAL has at least one frame in it.
1195 db.setSyncDiagPhase(diagPhaseEnsureWAL, func(s *diagState) {
1196 s.lastSyncedWALOffset = exec.state.lastSyncedWALOffset
1197 })
1198 if err := db.ensureWALExists(ctx); err != nil {
1199 return fmt.Errorf("ensure wal exists: %w", err)
1200 }
1201
1202 db.setSyncDiagPhase(diagPhaseVerifyAndSync)
1203 result, err := db.verifyAndSyncWithExecutor(ctx, false, exec)
1204 if err != nil {
1205 return err
1206 }
1207 exec.applySyncResult(result)
1208
1209 // Track that data was synced for time-based checkpoint decisions.
1210 if result.synced {
1211 exec.state.syncedSinceCheckpoint = true
1212 }
1213
1214 db.setSyncDiagPhase(diagPhaseCheckpointIfNeeded, func(s *diagState) {
1215 s.lastSyncedWALOffset = exec.state.lastSyncedWALOffset
1216 })
1217 if err := db.checkpointIfNeeded(ctx, exec, result.origWALSize, result.newWALSize); err != nil {
1218 return fmt.Errorf("checkpoint: %w", err)
1219 }
1220
1221 db.setSyncDiagPhase(diagPhaseUpdateMetrics, func(s *diagState) {
1222 s.lastSyncedWALOffset = exec.state.lastSyncedWALOffset
1223 })
1224
1225 // Compute current index and total shadow WAL size.
1226 db.txIDGauge.Set(float64(exec.pos.TXID))
1227
1228 // Update file size metrics.
1229 if fi, err := os.Stat(db.path); err == nil {
1230 db.dbSizeGauge.Set(float64(fi.Size()))
1231 }

Callers 2

CloseMethod · 0.95
SyncMethod · 0.95

Calls 8

newSyncExecutorMethod · 0.95
applySyncExecutorMethod · 0.95
setSyncDiagPhaseMethod · 0.95
ensureWALExistsMethod · 0.95
checkpointIfNeededMethod · 0.95
applySyncResultMethod · 0.45
SetMethod · 0.45

Tested by

no test coverage detected