From 95fb198597b8d996b396281da8c975f5c9c858b6 Mon Sep 17 00:00:00 2001 From: Ian Norden Date: Wed, 31 Jan 2024 13:49:07 -0500 Subject: [PATCH] perf: api: add indexes to event topics and emitter addr (#11477) * add index to event_entry.key * add index to event.emitter_addr --- chain/events/filter/index.go | 22 +++++++++++++++++++++- 1 file changed, 21 insertions(+), 1 deletion(-) diff --git a/chain/events/filter/index.go b/chain/events/filter/index.go index 2b1890c73..0f4a54c5b 100644 --- a/chain/events/filter/index.go +++ b/chain/events/filter/index.go @@ -46,6 +46,7 @@ var ddls = []string{ )`, `CREATE INDEX IF NOT EXISTS height_tipset_key ON event (height,tipset_key)`, + `CREATE INDEX IF NOT EXISTS event_emitter_addr ON event (emitter_addr)`, `CREATE TABLE IF NOT EXISTS event_entry ( event_id INTEGER, @@ -56,6 +57,8 @@ var ddls = []string{ value BLOB NOT NULL )`, + `CREATE INDEX IF NOT EXISTS event_entry_key_index ON event_entry (key)`, + // metadata containing version of schema `CREATE TABLE IF NOT EXISTS _meta ( version UINT64 NOT NULL UNIQUE @@ -63,6 +66,7 @@ var ddls = []string{ `INSERT OR IGNORE INTO _meta (version) VALUES (1)`, `INSERT OR IGNORE INTO _meta (version) VALUES (2)`, + `INSERT OR IGNORE INTO _meta (version) VALUES (3)`, } var ( @@ -70,7 +74,7 @@ var ( ) const ( - schemaVersion = 2 + schemaVersion = 3 eventExists = `SELECT MAX(id) FROM event WHERE height=? AND tipset_key=? AND tipset_key_cid=? AND emitter_addr=? AND event_index=? AND message_cid=? AND message_index=?` insertEvent = `INSERT OR IGNORE INTO event(height, tipset_key, tipset_key_cid, emitter_addr, event_index, message_cid, message_index, reverted) VALUES(?, ?, ?, ?, ?, ?, ?, ?)` @@ -321,6 +325,22 @@ func NewEventIndex(ctx context.Context, path string, chainStore *store.ChainStor version = 2 } + if version == 2 { + log.Infof("upgrading event index from version 2 to version 3") + + // to upgrade to version 3 we only need to create an index on the event_entry.key column + // and on the event.emitter_addr column + // which means we can just reapply the schema (it will not have any effect on existing data) + for _, ddl := range ddls { + if _, err := db.Exec(ddl); err != nil { + _ = db.Close() + return nil, xerrors.Errorf("could not upgrade index to version 3, exec ddl %q: %w", ddl, err) + } + } + + version = 3 + } + if version != schemaVersion { _ = db.Close() return nil, xerrors.Errorf("invalid database version: got %d, expected %d", version, schemaVersion)