feat(gl): add standalone ledger authority mode
CI/CD Stage / stage (push) Failing after 1m12s

This commit is contained in:
2026-10-06 22:40:07 +03:30
parent 01d13dbbf2
commit 88e227f80c
26 changed files with 2033 additions and 196 deletions
@@ -23,6 +23,14 @@ func NewSettlementRepository(database Database) *SettlementRepository {
return &SettlementRepository{database: database}
}
// Existing normal-mode Wallet clients require SettlementReady; a GL-only
// cutover must not let them continue admitting blockchain-dependent effects.
func (r *SettlementRepository) SettlementAllowed(ctx context.Context) (bool, error) {
var mode string
err := r.database.QueryRow(ctx, "SELECT mode FROM ledger_operating_state WHERE singleton").Scan(&mode)
return mode == string(ledger.ModeNormal), err
}
func (r *SettlementRepository) Stats(ctx context.Context) (ledger.SettlementStats, error) {
var stats ledger.SettlementStats
err := r.database.QueryRow(ctx, `SELECT
@@ -60,6 +68,9 @@ func (r *SettlementRepository) Enqueue(ctx context.Context, s ledger.Settlement)
existing, err := r.Get(ctx, inserted, "")
return existing, true, err
}
if classified := authorityError(err); classified != nil {
return ledger.Settlement{}, false, classified
}
return ledger.Settlement{}, false, fmt.Errorf("enqueue settlement: %w", err)
}
@@ -78,6 +89,13 @@ func (r *SettlementRepository) ClaimDue(ctx context.Context, workerID string, li
return nil, err
}
defer tx.Rollback(ctx)
var mode string
if err := tx.QueryRow(ctx, "SELECT mode FROM ledger_operating_state WHERE singleton FOR SHARE").Scan(&mode); err != nil {
return nil, err
}
if mode == string(ledger.ModeGLOnly) {
return nil, nil
}
if _, err := tx.Exec(ctx, `UPDATE kuknos_settlements SET locked_at=NULL, locked_by='', updated_at=clock_timestamp() WHERE locked_at < clock_timestamp() - interval '10 minutes'`); err != nil {
return nil, fmt.Errorf("release stale settlement locks: %w", err)
}