From f15260d1cab57ef3e18d288a927c9c14f57d2db1 Mon Sep 17 00:00:00 2001 From: Andrew Ferrazzutti Date: Thu, 11 Aug 2022 10:37:39 -0400 Subject: [PATCH 1/3] Drop postgres schema on failed migration If db-move fails, don't leave behind a partially-created postgres DB that will block attempts at future migrations. Only delete schemas created by the current db-move, lest a valid, pre-existing postgres DB exists that shouldn't be deleted. --- cmd/signaldctl/cmd/db/migrate.go | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/cmd/signaldctl/cmd/db/migrate.go b/cmd/signaldctl/cmd/db/migrate.go index 122e499..416ca3f 100644 --- a/cmd/signaldctl/cmd/db/migrate.go +++ b/cmd/signaldctl/cmd/db/migrate.go @@ -93,6 +93,17 @@ var ( } log.Println("created schema") + ok := false + defer func() { + if !ok { + if err := dropSchema(dest); err != nil { + log.Println("error dropping schema in postgres after failed migration:", err) + } else { + log.Println("dropped schema in postgres after failed migration") + } + } + }() + if err := moveAccounts(source, dest); err != nil { log.Println("error moving accounts table") return err @@ -199,6 +210,7 @@ var ( log.Println("error deleting sqlite file") return err } + ok = true log.Println("sqlite file deleted, your data is now in postgres :)") return nil }, @@ -253,6 +265,11 @@ func createSchema(dest *sql.DB) error { return nil } +func dropSchema(dest *sql.DB) error { + _, err := dest.Exec("DROP OWNED BY CURRENT_ROLE CASCADE") + return err +} + func moveAccounts(source *sql.DB, dest *sql.DB) error { rows, err := source.Query("SELECT uuid, e164, server FROM accounts") if err != nil { From bcaceedabae47f4738945555049cdaf92f8c144b Mon Sep 17 00:00:00 2001 From: Andrew Ferrazzutti Date: Thu, 11 Aug 2022 10:42:43 -0400 Subject: [PATCH 2/3] Refactor migration functions & messages Ensure that success & error migration logs use the same description text for the migration step that they refer to. --- cmd/signaldctl/cmd/db/migrate.go | 102 ++++++++----------------------- 1 file changed, 26 insertions(+), 76 deletions(-) diff --git a/cmd/signaldctl/cmd/db/migrate.go b/cmd/signaldctl/cmd/db/migrate.go index 416ca3f..8a0e1d2 100644 --- a/cmd/signaldctl/cmd/db/migrate.go +++ b/cmd/signaldctl/cmd/db/migrate.go @@ -60,7 +60,7 @@ var ( } return nil }, - RunE: func(cmd *cobra.Command, args []string) error { + RunE: func(cmd *cobra.Command, args []string) (err error) { source, err := sql.Open("sqlite3", sqlitePath) if err != nil { return err @@ -104,83 +104,33 @@ var ( } }() - if err := moveAccounts(source, dest); err != nil { - log.Println("error moving accounts table") - return err + migrate := func(fn func(*sql.DB, *sql.DB) error, targetName string) { + if err = fn(source, dest); err != nil { + log.Println("error moving", targetName) + panic(err) + } + log.Println("moved", targetName) } - log.Println("moved accounts table") + defer func() { + if r := recover(); r != nil && r != err { + // If r is something other than the error returned via the named return, re-panic it + panic(r) + } + }() - if err := moveRecipients(source, dest); err != nil { - log.Println("error moving recipients table") - return err - } - log.Println("moved recipients table") - - if err := movePrekeys(source, dest); err != nil { - log.Println("error moving prekeys table") - return err - } - log.Println("moved prekeys table") - - if err := moveSessions(source, dest); err != nil { - log.Println("error moving sessions table") - return err - } - log.Println("moved sessions table") - - if err := moveSignedPrekeys(source, dest); err != nil { - log.Println("error moving signed prekeys table") - return err - } - log.Println("moved signed prekeys table") - - if err := moveIdentityKeys(source, dest); err != nil { - log.Println("error moving identity keys table") - return err - } - log.Println("moved identity keys table") - - if err := moveAccountData(source, dest); err != nil { - log.Println("error moving account data") - return err - } - log.Println("moved account data table") - - if err := movePendingAccountData(source, dest); err != nil { - log.Println("error moving pending account data tabe") - return err - } - log.Println("moved pending account data table") - - if err := moveSenderKeys(source, dest); err != nil { - log.Println("error moving sender keys table") - return err - } - log.Println("moved sender keys table") - - if err := moveSenderKeyShared(source, dest); err != nil { - log.Println("error moving sender key shared table") - return err - } - log.Println("moved sender key shared table") - - if err := moveGroups(source, dest); err != nil { - log.Println("error moving groups table") - return err - } - log.Println("moved groups table") - - if err := moveGroupCredentials(source, dest); err != nil { - log.Println("error moving group credentials table") - return err - } - log.Println("moved group credentials table") - - if err := moveContacts(source, dest); err != nil { - log.Println("error moving group credentials table") - return err - } - log.Println("moved contacts table") + migrate(moveAccounts, "accounts table") + migrate(moveRecipients, "recipients table") + migrate(movePrekeys, "prekeys table") + migrate(moveSessions, "sessions table") + migrate(moveSignedPrekeys, "signed prekeys table") + migrate(moveIdentityKeys, "identity keys table") + migrate(moveAccountData, "account data") + migrate(movePendingAccountData, "pending account data table") + migrate(moveSenderKeys, "sender keys table") + migrate(moveSenderKeyShared, "sender key shared table") + migrate(moveGroups, "groups table") + migrate(moveGroupCredentials, "group credentials table") + migrate(moveContacts, "contacts table") if err := moveProfileKeys(source, dest); err != nil { log.Println("error moving profile keys table") From f49d4b6301c4066d82f41053c7dcb7fa3df7f811 Mon Sep 17 00:00:00 2001 From: Andrew Ferrazzutti Date: Thu, 11 Aug 2022 10:44:37 -0400 Subject: [PATCH 3/3] Exclude missing accounts from contact migration Otherwise, moveContacts fails with a foreign key constraint violation. --- cmd/signaldctl/cmd/db/migrate.go | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/cmd/signaldctl/cmd/db/migrate.go b/cmd/signaldctl/cmd/db/migrate.go index 8a0e1d2..cec0139 100644 --- a/cmd/signaldctl/cmd/db/migrate.go +++ b/cmd/signaldctl/cmd/db/migrate.go @@ -581,7 +581,9 @@ func moveGroupCredentials(source *sql.DB, dest *sql.DB) error { } func moveContacts(source *sql.DB, dest *sql.DB) error { - rows, err := source.Query("SELECT account_uuid, recipient, name, color, profile_key, message_expiration_time, inbox_position FROM contacts") + rows, err := source.Query("SELECT account_uuid, recipient, name, color, profile_key, message_expiration_time, inbox_position FROM contacts" + + " WHERE account_uuid IN (SELECT DISTINCT uuid FROM accounts)", + ) if err != nil { return err }