gastownhall/beads · warning

uow: close init db: %w

Error message

uow: close init db: %w

What it means

After successfully initializing the schema, openAndInitSchema closes the temporary bootstrap connection that had no default database. If sql.DB.Close returns an error, it is wrapped as 'uow: close init db'. This is rare — Close on a healthy *sql.DB seldom errors — and usually indicates driver-level connection teardown trouble.

Source

Thrown at internal/storage/uow/dolt_sql_provider.go:413

		return nil, err
	}

	initProvider := &doltSQLProvider{
		defaultBranch:     defaultBranch,
		db:                initDB,
		serverEndpoint:    "tcp:" + ep.Address(),
		teamServer:        teamServer,
		expectedProjectID: expectedProjectID,
		preview:           opts.preview,
	}

	if err := initProvider.initSchema(ctx, database); err != nil {
		_ = initDB.Close()
		return nil, fmt.Errorf("uow: init schema: %w", err)
	}

	if err := initDB.Close(); err != nil {
		return nil, fmt.Errorf("uow: close init db: %w", err)
	}

	dbConn, err := openDB(ctx, buildDSN(ep, database, rootUser, rootPassword, tlsConfigName))
	if err != nil {
		return nil, err
	}

	return &doltSQLProvider{
		defaultBranch:     defaultBranch,
		db:                dbConn,
		serverEndpoint:    "tcp:" + ep.Address(),
		teamServer:        teamServer,
		expectedProjectID: expectedProjectID,
		preview:           opts.preview,
	}, nil
}

View on GitHub (pinned to 71377f2769)

Solutions

  1. Retry the provider construction — transient teardown failures usually do not persist
  2. Check server logs for a crash or connection reset right after schema init
  3. Confirm network stability / no aggressive idle-connection killing between client and server
  4. If reproducible, report with the wrapped driver error since Close failing consistently signals a driver/server bug

Example fix

// before
prov, err := NewDoltServerUOWProvider(...)
if err != nil && strings.Contains(err.Error(), "close init db") { panic(err) }
// after
prov, err := NewDoltServerUOWProvider(...)
if err != nil {
    if strings.Contains(err.Error(), "uow: close init db") {
        prov, err = NewDoltServerUOWProvider(...) // retry once; teardown is transient
    }
    if err != nil { return err }
}
Defensive patterns

Strategy: retry

Validate before calling

// No pre-call validation is practical; ensure the server is healthy first
if err := pingEndpoint(ctx, ep); err != nil { return err }

Type guard

func isCloseInitDBError(err error) bool {
    return err != nil && strings.Contains(err.Error(), "uow: close init db:")
}

Try / catch

prov, err := NewDoltServerUOWProvider(...)
if isCloseInitDBError(err) {
    // transient teardown failure; safe to retry once
    prov, err = NewDoltServerUOWProvider(...)
}
if err != nil { return err }

Prevention

When it happens

Trigger: NewDoltServerUOWProvider / NewExternalDoltServerUOWProvider completing schema init but failing to close the initial no-database connection: driver returning errors from pooled-connection close, or the connection being already broken/timed out at teardown.

Common situations: Dolt server dropped the connection between initSchema and Close (idle kill, crash); network interruption during teardown; MySQL driver edge cases when the server closes the socket first.

Related errors


AI-assisted analysis of gastownhall/beads@71377f2769 (2026-08-30). Data as JSON: /api/errors/f27cae689bb0b727. Report an issue: GitHub.