diff --git a/internal/db/diff/migra.go b/internal/db/diff/migra.go index 377e4d35b4..b5c001825b 100644 --- a/internal/db/diff/migra.go +++ b/internal/db/diff/migra.go @@ -143,7 +143,20 @@ func DiffSchemaMigra(ctx context.Context, source, target pgconn.Config, schema [ binds := []string{utils.EdgeRuntimeId + ":/root/.cache/deno:rw"} var stdout, stderr bytes.Buffer if err := utils.RunEdgeRuntimeScript(ctx, env, diffSchemaTypeScript, binds, "error diffing schema", &stdout, &stderr); err != nil { + if shouldFallbackToLegacyMigra(err) { + debugf("DiffSchemaMigra falling back to legacy migra after edge-runtime OOM") + return DiffSchemaMigraBash(ctx, source, target, schema, options...) + } return "", err } return stdout.String(), nil } + +func shouldFallbackToLegacyMigra(err error) bool { + if err == nil { + return false + } + message := err.Error() + return strings.Contains(message, "Fatal JavaScript out of memory") || + strings.Contains(message, "Ineffective mark-compacts near heap limit") +} diff --git a/internal/utils/edgeruntime.go b/internal/utils/edgeruntime.go index fd38cf086a..06a42b464c 100644 --- a/internal/utils/edgeruntime.go +++ b/internal/utils/edgeruntime.go @@ -38,7 +38,7 @@ EOF "", stdout, stderr, - ); err != nil && !strings.HasPrefix(stderr.String(), "main worker has been destroyed") { + ); err != nil && !strings.Contains(stderr.String(), "main worker has been destroyed") { return errors.Errorf("%s: %w:\n%s", errPrefix, err, stderr.String()) } return nil