gastownhall/beads · error
sync backup %s: %w
Error message
sync backup %s: %w
What it means
BackupSync runs `CALL DOLT_BACKUP('sync', ?)` to push the database to a previously registered backup destination, wrapping failures as "sync backup <name>: <cause>". It throws when the push to the backup remote fails or the named backup does not exist. The wrapped driver error carries the underlying reason.
Source
Thrown at internal/storage/versioncontrolops/backup.go:21
import (
"context"
"fmt"
"path/filepath"
"strings"
)
// BackupAdd registers a Dolt backup destination.
func BackupAdd(ctx context.Context, db DBConn, name, url string) error {
if _, err := db.ExecContext(ctx, "CALL DOLT_BACKUP('add', ?, ?)", name, url); err != nil {
return fmt.Errorf("add backup %s: %w", name, err)
}
return nil
}
// BackupSync pushes the database to the named backup destination.
func BackupSync(ctx context.Context, db DBConn, name string) error {
if _, err := db.ExecContext(ctx, "CALL DOLT_BACKUP('sync', ?)", name); err != nil {
return fmt.Errorf("sync backup %s: %w", name, err)
}
return nil
}
// BackupRemove removes a configured Dolt backup destination.
func BackupRemove(ctx context.Context, db DBConn, name string) error {
if _, err := db.ExecContext(ctx, "CALL DOLT_BACKUP('rm', ?)", name); err != nil {
return fmt.Errorf("remove backup %s: %w", name, err)
}
return nil
}
// BackupRestore restores a database from a backup at the given URL into
// the named database. When force is true, an existing database with the
// same name is overwritten. Mirrors the CLI: dolt backup restore [--force] <url> <db_name>
func BackupRestore(ctx context.Context, db DBConn, url, dbName string, force bool) error {
if force {
if _, err := db.ExecContext(ctx, "CALL DOLT_BACKUP('restore', '--force', ?, ?)", url, dbName); err != nil {View on GitHub (pinned to 71377f2769)
Solutions
- Verify the name was registered first via BackupAdd (or `dolt backup add`)
- Check the wrapped cause for unreachable/read-only destination and fix storage or network
- List configured backups (SELECT from dolt_backup or `dolt backup -v`) to confirm the name
- Retry transient network failures with backoff
Example fix
// before
if err := vcops.BackupSync(ctx, db, "offsite"); err != nil { panic(err) }
// after
if err := vcops.BackupAdd(ctx, db, "offsite", backupURL); err != nil { return err }
if err := vcops.BackupSync(ctx, db, "offsite"); err != nil {
return fmt.Errorf("push to offsite backup: %w", err)
} Defensive patterns
Strategy: try-catch
Validate before calling
// ensure backup exists first
if err := vcops.BackupAdd(ctx, db, name, url); err != nil { return err }
// then safe to sync Try / catch
if err := vcops.BackupSync(ctx, db, name); err != nil {
if isTransient(errors.Unwrap(err)) {
return retryWithBackoff(3, func() error { return vcops.BackupSync(ctx, db, name) })
}
return err
} Prevention
- Register the backup (BackupAdd) before the first sync
- Monitor destination disk space and permissions
- Retry network-caused syncs with exponential backoff
When it happens
Trigger: BackupSync(ctx, db, name) when db.ExecContext fails: backup name not registered (no prior BackupAdd), destination unreachable or read-only, or the sync write errors mid-transfer.
Common situations: Syncing a backup registered in a different Dolt directory/DB; destination filesystem full or permissions denied; network outage to a remote backup; typo in the backup name.
Related errors
AI-assisted analysis of gastownhall/beads@71377f2769 (2026-08-30).
Data as JSON: /api/errors/de07de785aa30639.
Report an issue: GitHub.