mirror of
https://github.com/git-pkgs/proxy.git
synced 2026-11-09 15:49:16 -05:00
38 lines
933 B
Go
38 lines
933 B
Go
|
|
package server
|
||
|
|
|
||
|
|
import (
|
||
|
|
"context"
|
||
|
|
"log/slog"
|
||
|
|
"time"
|
||
|
|
|
||
|
|
"github.com/git-pkgs/proxy/internal/database"
|
||
|
|
)
|
||
|
|
|
||
|
|
// metadataBackfillBatch bounds each backfill transaction, so other writers
|
||
|
|
// get the database in between.
|
||
|
|
const metadataBackfillBatch = 1000
|
||
|
|
|
||
|
|
// backfillMetadataAccess gives metadata rows cached before last_accessed_at
|
||
|
|
// existed their write time, batch by batch. It is resumable: a restart picks
|
||
|
|
// up whatever rows are still empty.
|
||
|
|
func backfillMetadataAccess(ctx context.Context, db *database.DB, logger *slog.Logger, batch int) {
|
||
|
|
total := 0
|
||
|
|
for ctx.Err() == nil {
|
||
|
|
n, err := db.BackfillMetadataLastAccessed(batch)
|
||
|
|
if err != nil {
|
||
|
|
logger.Warn("metadata backfill failed, retrying", "error", err)
|
||
|
|
select {
|
||
|
|
case <-ctx.Done():
|
||
|
|
case <-time.After(time.Minute):
|
||
|
|
}
|
||
|
|
continue
|
||
|
|
}
|
||
|
|
total += n
|
||
|
|
if n < batch {
|
||
|
|
break
|
||
|
|
}
|
||
|
|
}
|
||
|
|
if total > 0 {
|
||
|
|
logger.Info("metadata backfill: completed", "rows", total)
|
||
|
|
}
|
||
|
|
}
|