From 39c378313ba1a8986e4ff2e6e0b006f1dbfd93e6 Mon Sep 17 00:00:00 2001 From: Arkadiusz Osowski Date: Tue, 3 Sep 2024 16:02:48 +0200 Subject: [PATCH] ARCO-184: save callback duplicates; change callbacks table from heap to clustered --- .../000001_create_callbacks.down.sql | 2 -- .../migrations/000001_create_callbacks.up.sql | 2 +- .../callbacker/store/postgresql/postgres.go | 6 ++-- .../store/postgresql/postgres_test.go | 31 ++++--------------- 4 files changed, 10 insertions(+), 31 deletions(-) diff --git a/internal/callbacker/store/postgresql/migrations/000001_create_callbacks.down.sql b/internal/callbacker/store/postgresql/migrations/000001_create_callbacks.down.sql index 73146df55..4fd5cdbde 100644 --- a/internal/callbacker/store/postgresql/migrations/000001_create_callbacks.down.sql +++ b/internal/callbacker/store/postgresql/migrations/000001_create_callbacks.down.sql @@ -1,5 +1,3 @@ -DROP INDEX IF EXISTS callbacker.ux_callbacker_callbacks_unique; - DROP TABLE IF EXISTS callbacker.callbacks; DROP SCHEMA IF EXISTS callbacker; diff --git a/internal/callbacker/store/postgresql/migrations/000001_create_callbacks.up.sql b/internal/callbacker/store/postgresql/migrations/000001_create_callbacks.up.sql index 289836e99..8787a06e2 100644 --- a/internal/callbacker/store/postgresql/migrations/000001_create_callbacks.up.sql +++ b/internal/callbacker/store/postgresql/migrations/000001_create_callbacks.up.sql @@ -1,6 +1,7 @@ CREATE SCHEMA callbacker; CREATE TABLE callbacker.callbacks ( + id BIGSERIAL PRIMARY KEY, url TEXT NOT NULL, token TEXT NOT NULL, tx_id TEXT NOT NULL, @@ -13,4 +14,3 @@ CREATE TABLE callbacker.callbacks ( timestamp TIMESTAMPTZ NOT NULL ); -CREATE UNIQUE INDEX ux_callbacker_callbacks_unique ON callbacker.callbacks (url, token, tx_id, tx_status); diff --git a/internal/callbacker/store/postgresql/postgres.go b/internal/callbacker/store/postgresql/postgres.go index bc906192e..7867749d2 100644 --- a/internal/callbacker/store/postgresql/postgres.go +++ b/internal/callbacker/store/postgresql/postgres.go @@ -131,9 +131,9 @@ func (p *PostgreSQL) PopMany(ctx context.Context, limit int) (res []*store.Callb }() const q = `DELETE FROM callbacker.callbacks - WHERE ctid IN ( - SELECT ctid FROM callbacker.callbacks - ORDER BY timestamp + WHERE id IN ( + SELECT id FROM callbacker.callbacks + ORDER BY id LIMIT $1 FOR UPDATE ) diff --git a/internal/callbacker/store/postgresql/postgres_test.go b/internal/callbacker/store/postgresql/postgres_test.go index 9ce9729eb..7a478fe2b 100644 --- a/internal/callbacker/store/postgresql/postgres_test.go +++ b/internal/callbacker/store/postgresql/postgres_test.go @@ -195,44 +195,25 @@ func TestPostgresDBt(t *testing.T) { // then require.NoError(t, err) - // check if every UNIQUE record has been saved - uniqueRecords := make(map[*store.CallbackData]struct{}) - - for _, dr := range data { - duplicate := false - - for ur := range uniqueRecords { - if tutils.CallbackRecordEqual(ur, dr) { - duplicate = true - break - } - } - - if !duplicate { - uniqueRecords[dr] = struct{}{} - } - } - require.NotEmpty(t, uniqueRecords) - // read all from db dbCallbacks := tutils.ReadAllCallbacks(t, postgresDB.db) for _, c := range dbCallbacks { - // check if exists in unique records - for ur := range uniqueRecords { + found := false + for i, ur := range data { if ur == nil { continue } if tutils.CallbackRecordEqual(ur, c) { // remove if found - delete(uniqueRecords, ur) + data[i] = nil + found = true break } } - } - // uniqueRecords map should be empty if all entries have been visited - require.Empty(t, uniqueRecords) + require.True(t, found) + } }) t.Run("pop many", func(t *testing.T) {