fix: connection handling in setup after migration steps 40, 64 and 70 (#12293)

# Which Problems Are Solved

During the setup step we saw rare cases which caused setup to fail after
executing steps 40, 64 and 70.

# How the Problems Are Solved

Close currently open database connections so that they fetch the correct
type mapping for the `eventstore.command2` database type.

# Additional Changes

Ensure correct order of setup steps 64 and 70.

# Additional Context

None

---------

Co-authored-by: Livio Spring <[email protected]>
This commit is contained in:
Silvan
2026-06-16 15:09:00 +00:00
committed by GitHub
co-authored by Livio Spring
parent dbb0da71af
commit 10087e7389
4 changed files with 29 additions and 3 deletions
+6
View File
@@ -52,6 +52,12 @@ func (mig *InitPushFunc) Execute(ctx context.Context, _ eventstore.Event) (err e
return fmt.Errorf("%s %s: %w", mig.String(), stmt.file, err)
}
}
// close idle connections to prevent them from using the old prepared statement with the wrong type
// and having wrong plan of `eventstore.command2`-type
for _, conn := range mig.dbClient.Pool.AcquireAllIdle(ctx) {
logging.OnError(ctx, conn.Conn().Close(ctx)).Debug("failed to close idle connection")
conn.Release()
}
return nil
}
+11 -1
View File
@@ -6,6 +6,7 @@ import (
_ "embed"
"fmt"
"github.com/zitadel/zitadel/backend/v3/instrumentation/logging"
"github.com/zitadel/zitadel/internal/database"
"github.com/zitadel/zitadel/internal/eventstore"
)
@@ -26,7 +27,16 @@ func (mig *ChangePushPosition) Execute(ctx context.Context, _ eventstore.Event)
}
stmt := fmt.Sprintf(changePushPosition, inTxOrderType)
_, err = mig.dbClient.ExecContext(ctx, stmt)
return err
if err != nil {
return err
}
// close idle connections to prevent them from using the old prepared statement with the wrong type
// and having wrong plan of `eventstore.command2`-type
for _, conn := range mig.dbClient.Pool.AcquireAllIdle(ctx) {
logging.OnError(ctx, conn.Conn().Close(ctx)).Debug("failed to close idle connection")
conn.Release()
}
return nil
}
func (mig *ChangePushPosition) String() string {
+11 -1
View File
@@ -5,6 +5,7 @@ import (
_ "embed"
"fmt"
"github.com/zitadel/zitadel/backend/v3/instrumentation/logging"
"github.com/zitadel/zitadel/internal/database"
"github.com/zitadel/zitadel/internal/eventstore"
)
@@ -26,7 +27,16 @@ func (mig *AddEventStoreCommandEnforceOwnerColumn) Execute(ctx context.Context,
stmt := fmt.Sprintf(addEventStoreCommandEnforceOwnerColumn, inTxOrderType)
_, err = mig.dbClient.ExecContext(ctx, stmt)
return err
if err != nil {
return err
}
// close idle connections to prevent them from using the old prepared statement with the wrong type
// and having wrong plan of `eventstore.command2`-type
for _, conn := range mig.dbClient.Pool.AcquireAllIdle(ctx) {
logging.OnError(ctx, conn.Conn().Close(ctx)).Debug("failed to close idle connection")
conn.Release()
}
return nil
}
func (mig *AddEventStoreCommandEnforceOwnerColumn) String() string {
+1 -1
View File
@@ -263,7 +263,6 @@ func Setup(ctx context.Context, config *Config, steps *Steps, masterKey string)
for _, step := range []migration.Migration{
steps.s14NewEventsTable,
steps.s40InitPushFunc,
steps.s70AddEventStoreCommandEnforceOwner,
steps.s1ProjectionTable,
steps.s2AssetsTable,
steps.s28AddFieldTable,
@@ -312,6 +311,7 @@ func Setup(ctx context.Context, config *Config, steps *Steps, masterKey string)
steps.s65FixUserMetadata5Index,
steps.s67SyncMemberRoleFields,
steps.s69CacheTablesLogged,
steps.s70AddEventStoreCommandEnforceOwner,
} {
setupErr = executeMigration(ctx, eventstoreClient, step, "migration failed")
if setupErr != nil {