(ctx context.Context)
| 1172 | } |
| 1173 | |
| 1174 | func (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 | } |
no test coverage detected