mirror of
https://github.com/zitadel/zitadel.git
synced 2025-08-11 19:07:30 +00:00
fix(setup): use template for in_tx_order type (#9346)
# Which Problems Are Solved Systems running with PostgreSQL before Zitadel v2.39 are likely to have a wrong type for the `in_tx_order` column in the `eventstore.event2` table. The migration at the time used the `event_sequence` as default value without typecast, which results in a `bigint` type for that column. However, when creating the table from scratch, we explicitly specify the type to be `integer`. Starting from Zitadel v2.67 we use a Pl/PgSQL function to push events. The function requires the types from `eventstore.events2` to the same as the `select` destinations used in the function. In the function `in_tx_order` is also expected to by of `integer` type. CochroachDB systems are not affected because `bigint` is an alias to the `int` type. In other words, CockroachDB uses `int8` when specifying type `int`. Therefore the types already match. # How the Problems Are Solved Retrieve the actual column type currently in use. A template is used to assign the type to the `ordinality` column returned as `in_tx_order`. # Additional Changes - Detailed logging on migration failure # Additional Context - Closes #9180 --------- Co-authored-by: Silvan <27845747+adlerhurst@users.noreply.github.com>
This commit is contained in:
@@ -4,9 +4,11 @@ import (
|
||||
"context"
|
||||
"embed"
|
||||
_ "embed"
|
||||
"errors"
|
||||
"net/http"
|
||||
"path"
|
||||
|
||||
"github.com/jackc/pgx/v5/pgconn"
|
||||
"github.com/spf13/cobra"
|
||||
"github.com/spf13/viper"
|
||||
"github.com/zitadel/logging"
|
||||
@@ -271,7 +273,23 @@ func Setup(ctx context.Context, config *Config, steps *Steps, masterKey string)
|
||||
|
||||
func mustExecuteMigration(ctx context.Context, eventstoreClient *eventstore.Eventstore, step migration.Migration, errorMsg string) {
|
||||
err := migration.Migrate(ctx, eventstoreClient, step)
|
||||
logging.WithFields("name", step.String()).OnError(err).Fatal(errorMsg)
|
||||
if err == nil {
|
||||
return
|
||||
}
|
||||
logFields := []any{
|
||||
"name", step.String(),
|
||||
}
|
||||
pgErr := new(pgconn.PgError)
|
||||
if errors.As(err, &pgErr) {
|
||||
logFields = append(logFields,
|
||||
"severity", pgErr.Severity,
|
||||
"code", pgErr.Code,
|
||||
"message", pgErr.Message,
|
||||
"detail", pgErr.Detail,
|
||||
"hint", pgErr.Hint,
|
||||
)
|
||||
}
|
||||
logging.WithFields(logFields...).WithError(err).Fatal(errorMsg)
|
||||
}
|
||||
|
||||
// readStmt reads a single file from the embedded FS,
|
||||
|
Reference in New Issue
Block a user