Skip to content

Commit a0ec07d

Browse files
Fix lost data
1 parent 3a6b23e commit a0ec07d

File tree

3 files changed

+76
-0
lines changed

3 files changed

+76
-0
lines changed

db/migrations/state/validium-001.sql

+32
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
-- +migrate Up
2+
3+
CREATE TABLE IF NOT EXISTS state.batch_data_backup
4+
(
5+
batch_num BIGINT,
6+
data BYTEA,
7+
created_at TIMESTAMP WITH TIME ZONE NOT NULL DEFAULT CURRENT_TIMESTAMP,
8+
PRIMARY KEY (batch_num, created_at)
9+
);
10+
11+
-- +migrate StatementBegin
12+
CREATE OR REPLACE FUNCTION backup_batch() RETURNS trigger AS $$
13+
BEGIN
14+
INSERT INTO state.batch_data_backup (batch_num, data)
15+
VALUES (OLD.batch_num, OLD.raw_txs_data)
16+
ON CONFLICT (batch_num, created_at) DO UPDATE SET
17+
data = EXCLUDED.data;
18+
RETURN OLD;
19+
END;
20+
$$
21+
LANGUAGE plpgsql;
22+
-- +migrate StatementEnd
23+
24+
CREATE TRIGGER backup_batch
25+
BEFORE DELETE ON state.batch FOR EACH ROW
26+
EXECUTE PROCEDURE backup_batch();
27+
28+
-- +migrate Down
29+
30+
DROP TRIGGER IF EXISTS backup_batch ON state.batch;
31+
DROP FUNCTION IF EXISTS backup_batch();
32+
DROP TABLE IF EXISTS state.batch_data_backup;

state/pgstatestorage.go

+18
Original file line numberDiff line numberDiff line change
@@ -591,7 +591,25 @@ func (p *PostgresStorage) GetBatchL2DataByNumber(ctx context.Context, batchNumbe
591591
q := p.getExecQuerier(dbTx)
592592
var batchL2Data []byte
593593
err := q.QueryRow(ctx, getBatchL2DataByBatchNumber, batchNumber).Scan(&batchL2Data)
594+
if errors.Is(err, pgx.ErrNoRows) {
595+
return p.GetBatchL2DataByNumberFromBackup(ctx, batchNumber, dbTx)
596+
} else if err != nil {
597+
return nil, err
598+
}
599+
return batchL2Data, nil
600+
}
594601

602+
// GetBatchL2DataByNumberFromBackup returns the batch L2 data of the given batch number from the backup table
603+
func (p *PostgresStorage) GetBatchL2DataByNumberFromBackup(ctx context.Context, batchNumber uint64, dbTx pgx.Tx) ([]byte, error) {
604+
getBatchL2DataByBatchNumber := `
605+
SELECT data FROM state.batch_data_backup
606+
WHERE batch_num = $1
607+
ORDER BY created_at DESC
608+
LIMIT 1
609+
`
610+
q := p.getExecQuerier(dbTx)
611+
var batchL2Data []byte
612+
err := q.QueryRow(ctx, getBatchL2DataByBatchNumber, batchNumber).Scan(&batchL2Data)
595613
if errors.Is(err, pgx.ErrNoRows) {
596614
return nil, ErrNotFound
597615
} else if err != nil {

state/pgstatestorage_test.go

+26
Original file line numberDiff line numberDiff line change
@@ -464,6 +464,32 @@ func TestGetBatchL2DataByNumber(t *testing.T) {
464464
actualData, err := testState.GetBatchL2DataByNumber(ctx, batchNum, tx)
465465
require.NoError(t, err)
466466
assert.Equal(t, expectedData, actualData)
467+
468+
// Force backup
469+
_, err = tx.Exec(ctx, "DELETE FROM state.batch")
470+
require.NoError(t, err)
471+
472+
// Get batch 4 from backup
473+
batchNum = 4
474+
data, err = testState.GetBatchL2DataByNumber(ctx, batchNum, tx)
475+
require.NoError(t, err)
476+
assert.Nil(t, data)
477+
478+
// Get batch 5 from backup
479+
batchNum = 5
480+
actualData, err = testState.GetBatchL2DataByNumber(ctx, batchNum, tx)
481+
require.NoError(t, err)
482+
assert.Equal(t, expectedData, actualData)
483+
484+
// Update batch 5 and get it from backup
485+
expectedData = []byte("new foo bar")
486+
_, err = tx.Exec(ctx, openBatchSQL, batchNum, expectedData)
487+
require.NoError(t, err)
488+
_, err = tx.Exec(ctx, "DELETE FROM state.batch")
489+
require.NoError(t, err)
490+
actualData, err = testState.GetBatchL2DataByNumber(ctx, batchNum, tx)
491+
require.NoError(t, err)
492+
assert.Equal(t, expectedData, actualData)
467493
}
468494
func TestForkIDs(t *testing.T) {
469495
initOrResetDB()

0 commit comments

Comments
 (0)