Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

ingest/ledgerbackend: Check if there are newer ledger when requested ledger does not exist #4198

Merged
merged 2 commits into from
Jan 28, 2022
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
45 changes: 38 additions & 7 deletions ingest/ledgerbackend/database_backend.go
Original file line number Diff line number Diff line change
Expand Up @@ -13,13 +13,14 @@ import (
)

const (
latestLedgerSeqQuery = "select ledgerseq, closetime from ledgerheaders order by ledgerseq desc limit 1"
txHistoryQuery = "select txbody, txresult, txmeta, txindex from txhistory where ledgerseq = ? "
ledgerHeaderQuery = "select ledgerhash, data from ledgerheaders where ledgerseq = ? "
txFeeHistoryQuery = "select txchanges, txindex from txfeehistory where ledgerseq = ? "
upgradeHistoryQuery = "select ledgerseq, upgradeindex, upgrade, changes from upgradehistory where ledgerseq = ? order by upgradeindex asc"
orderBy = "order by txindex asc"
dbDriver = "postgres"
latestLedgerSeqQuery = "select ledgerseq, closetime from ledgerheaders order by ledgerseq desc limit 1"
txHistoryQuery = "select txbody, txresult, txmeta, txindex from txhistory where ledgerseq = ? "
ledgerHeaderQuery = "select ledgerhash, data from ledgerheaders where ledgerseq = ? "
ledgerSequenceAfterQuery = "select ledgerseq from ledgerheaders where ledgerseq > ? "
txFeeHistoryQuery = "select txchanges, txindex from txfeehistory where ledgerseq = ? "
upgradeHistoryQuery = "select ledgerseq, upgradeindex, upgrade, changes from upgradehistory where ledgerseq = ? order by upgradeindex asc"
orderBy = "order by txindex asc"
dbDriver = "postgres"
)

// Ensure DatabaseBackend implements LedgerBackend
Expand Down Expand Up @@ -128,11 +129,41 @@ func (dbb *DatabaseBackend) GetLedger(ctx context.Context, sequence uint32) (xdr
if exists {
return meta, nil
} else {
// Check if there are ledgers after `sequence`. If so, it's likely
// the requested sequence was removed during maintenance so return
// error.
ledgerAfterExist, oldestSequenceAfter, err := dbb.getLedgerAfterExist(ctx, sequence)
if err != nil {
return xdr.LedgerCloseMeta{}, err
}

if ledgerAfterExist {
return xdr.LedgerCloseMeta{}, errors.Errorf("requested ledger already removed (oldest sequence after %d is %d)", sequence, oldestSequenceAfter)
}
time.Sleep(time.Second)
}
}
}

// getLedgerAfterExist returns true (and sequence number) if there's a ledger in
// the Stellar-Core DB with the sequence number higher than sequence.
func (dbb *DatabaseBackend) getLedgerAfterExist(ctx context.Context, sequence uint32) (bool, uint32, error) {
var fetchedSequence uint32
bartekn marked this conversation as resolved.
Show resolved Hide resolved
err := dbb.session.GetRaw(ctx, &fetchedSequence, ledgerSequenceAfterQuery, sequence)
// Return errors...
if err != nil {
switch err {
case sql.ErrNoRows:
// Ledger was not found
return false, fetchedSequence, nil
default:
return false, fetchedSequence, errors.Wrapf(err, "Error getting ledger after %d", sequence)
}
}

return true, fetchedSequence, nil
}

// getLedgerQuery returns the LedgerCloseMeta for the given ledger sequence number.
// The first returned value is false when the ledger does not exist in the database.
func (dbb *DatabaseBackend) getLedgerQuery(ctx context.Context, sequence uint32) (bool, xdr.LedgerCloseMeta, error) {
Expand Down