aboutsummaryrefslogtreecommitdiff
path: root/roomserver/storage/postgres/storage.go
diff options
context:
space:
mode:
authorTill <2353100+S7evinK@users.noreply.github.com>2022-09-09 14:14:52 +0200
committerGitHub <noreply@github.com>2022-09-09 13:14:52 +0100
commit8196b296570de229eb42501ade5aabbe7ba124f9 (patch)
tree92d047a1321ebde90cd1f3690fa029368334e8f7 /roomserver/storage/postgres/storage.go
parent646de03d60fa1ca78dbf0b4d5418600d540fb881 (diff)
Change detection of already executed migrations (#2665)
This changes the detection of already executed migrations for the roomserver state block and keychange refactor. It now uses schema tables provided by the database engine to check if the column was already removed. We now also store the migration in the migrations table. This should stop e.g. Postgres from logging errors like `ERROR: column "event_nid" does not exist at character 8`.
Diffstat (limited to 'roomserver/storage/postgres/storage.go')
-rw-r--r--roomserver/storage/postgres/storage.go58
1 files changed, 33 insertions, 25 deletions
diff --git a/roomserver/storage/postgres/storage.go b/roomserver/storage/postgres/storage.go
index f47a64c8..26178df8 100644
--- a/roomserver/storage/postgres/storage.go
+++ b/roomserver/storage/postgres/storage.go
@@ -16,10 +16,13 @@
package postgres
import (
+ "context"
"database/sql"
+ "errors"
"fmt"
- "github.com/lib/pq"
+ "github.com/sirupsen/logrus"
+
// Import the postgres database driver.
_ "github.com/lib/pq"
@@ -52,30 +55,8 @@ func Open(base *base.BaseDendrite, dbProperties *config.DatabaseOptions, cache c
// Special case, since this migration uses several tables, so it needs to
// be sure that all tables are created first.
- // TODO: Remove when we are sure we are not having goose artefacts in the db
- // This forces an error, which indicates the migration is already applied, since the
- // column event_nid was removed from the table
- var eventNID int
- err = db.QueryRow("SELECT event_nid FROM roomserver_state_block LIMIT 1;").Scan(&eventNID)
- if err == nil {
- m := sqlutil.NewMigrator(db)
- m.AddMigrations(sqlutil.Migration{
- Version: "roomserver: state blocks refactor",
- Up: deltas.UpStateBlocksRefactor,
- })
- if err = m.Up(base.Context()); err != nil {
- return nil, err
- }
- } else {
- switch e := err.(type) {
- case *pq.Error:
- // ignore undefined_column (42703) errors, as this is expected at this point
- if e.Code != "42703" {
- return nil, err
- }
- default:
- return nil, err
- }
+ if err = executeMigration(base.Context(), db); err != nil {
+ return nil, err
}
// Then prepare the statements. Now that the migrations have run, any columns referred
@@ -87,6 +68,33 @@ func Open(base *base.BaseDendrite, dbProperties *config.DatabaseOptions, cache c
return &d, nil
}
+func executeMigration(ctx context.Context, db *sql.DB) error {
+ // TODO: Remove when we are sure we are not having goose artefacts in the db
+ // This forces an error, which indicates the migration is already applied, since the
+ // column event_nid was removed from the table
+ migrationName := "roomserver: state blocks refactor"
+
+ var cName string
+ err := db.QueryRowContext(ctx, "select column_name from information_schema.columns where table_name = 'roomserver_state_block' AND column_name = 'event_nid'").Scan(&cName)
+ if err != nil {
+ if errors.Is(err, sql.ErrNoRows) { // migration was already executed, as the column was removed
+ if err = sqlutil.InsertMigration(ctx, db, migrationName); err != nil {
+ // not a fatal error, log and continue
+ logrus.WithError(err).Warnf("unable to manually insert migration '%s'", migrationName)
+ }
+ return nil
+ }
+ return err
+ }
+ m := sqlutil.NewMigrator(db)
+ m.AddMigrations(sqlutil.Migration{
+ Version: migrationName,
+ Up: deltas.UpStateBlocksRefactor,
+ })
+
+ return m.Up(ctx)
+}
+
func (d *Database) create(db *sql.DB) error {
if err := CreateEventStateKeysTable(db); err != nil {
return err