diff --git a/backend/runner/schemasync/syncer.go b/backend/runner/schemasync/syncer.go index 3e6fbf0457734b..944d62c2c6d703 100644 --- a/backend/runner/schemasync/syncer.go +++ b/backend/runner/schemasync/syncer.go @@ -27,7 +27,6 @@ import ( "github.com/bytebase/bytebase/backend/plugin/db" "github.com/bytebase/bytebase/backend/store" "github.com/bytebase/bytebase/backend/store/model" - "github.com/bytebase/bytebase/backend/utils" storepb "github.com/bytebase/bytebase/proto/generated-go/store" ) @@ -339,16 +338,6 @@ func (s *Syncer) SyncDatabaseSchema(ctx context.Context, database *store.Databas } setClassificationAndUserCommentFromComment(databaseMetadata) - var patchSchemaVersion *model.Version - if force { - // When there are too many databases, this might have performance issue. - schemaVersion, err := utils.GetLatestSchemaVersion(ctx, s.store, instance.UID, database.UID, databaseMetadata.Name) - if err != nil { - return errors.Wrapf(err, "failed to get latest schema version for database %q", database.DatabaseName) - } - patchSchemaVersion = &schemaVersion - } - syncStatus := api.OK ts := time.Now().Unix() if _, err := s.store.UpdateDatabase(ctx, &store.UpdateDatabaseMessage{ @@ -356,7 +345,6 @@ func (s *Syncer) SyncDatabaseSchema(ctx context.Context, database *store.Databas DatabaseName: database.DatabaseName, SyncState: &syncStatus, SuccessfulSyncTimeTs: &ts, - SchemaVersion: patchSchemaVersion, MetadataUpsert: &storepb.DatabaseMetadata{ LastSyncTime: timestamppb.New(time.Unix(ts, 0)), }, diff --git a/backend/runner/taskrun/database_create_executor.go b/backend/runner/taskrun/database_create_executor.go index ae5ed82cf8e342..b69bb01759706f 100644 --- a/backend/runner/taskrun/database_create_executor.go +++ b/backend/runner/taskrun/database_create_executor.go @@ -498,7 +498,7 @@ func (*DatabaseCreateExecutor) getSchemaFromPeerTenantDatabase(ctx context.Conte return nil, model.Version{}, "", err } defer driver.Close(ctx) - schemaVersion, err := utils.GetLatestSchemaVersion(ctx, stores, similarDBInstance.UID, similarDB.UID, similarDB.DatabaseName) + schemaVersion, err := getLatestDoneSchemaVersion(ctx, stores, similarDBInstance.UID, similarDB.UID, similarDB.DatabaseName) if err != nil { return nil, model.Version{}, "", errors.Wrapf(err, "failed to get migration history for database %q", similarDB.DatabaseName) } @@ -510,6 +510,26 @@ func (*DatabaseCreateExecutor) getSchemaFromPeerTenantDatabase(ctx context.Conte return similarDB, schemaVersion, schemaBuf.String(), nil } +// GetLatestDoneSchemaVersion gets the latest schema version for a database. +func getLatestDoneSchemaVersion(ctx context.Context, stores *store.Store, instanceID int, databaseID int, databaseName string) (model.Version, error) { + // TODO(d): support semantic versioning. + limit := 1 + done := db.Done + history, err := stores.ListInstanceChangeHistory(ctx, &store.FindInstanceChangeHistoryMessage{ + InstanceID: &instanceID, + DatabaseID: &databaseID, + Status: &done, + Limit: &limit, + }) + if err != nil { + return model.Version{}, errors.Wrapf(err, "failed to get migration history for database %q", databaseName) + } + if len(history) == 0 { + return model.Version{}, nil + } + return history[0].Version, nil +} + func getPeerTenantDatabase(databaseMatrix [][]*store.DatabaseMessage, environmentID string) *store.DatabaseMessage { var similarDB *store.DatabaseMessage // We try to use an existing tenant with the same environment, if possible. diff --git a/backend/store/instance_change_history.go b/backend/store/instance_change_history.go index 73e4c3208f255a..ac9c9ea423cb73 100644 --- a/backend/store/instance_change_history.go +++ b/backend/store/instance_change_history.go @@ -65,6 +65,7 @@ type FindInstanceChangeHistoryMessage struct { DatabaseID *int SheetID *int Source *db.MigrationSource + Status *db.MigrationStatus Version *model.Version TypeList []db.MigrationType ResourcesFilter *string @@ -467,6 +468,9 @@ func (s *Store) ListInstanceChangeHistory(ctx context.Context, find *FindInstanc if v := find.Source; v != nil { where, args = append(where, fmt.Sprintf("instance_change_history.source = $%d", len(args)+1)), append(args, *v) } + if v := find.Status; v != nil { + where, args = append(where, fmt.Sprintf("instance_change_history.status = $%d", len(args)+1)), append(args, *v) + } if v := find.Version; v != nil { storedVersion, err := find.Version.Marshal() if err != nil { diff --git a/backend/utils/utils.go b/backend/utils/utils.go index 952c511bf15169..565e07699d34d8 100644 --- a/backend/utils/utils.go +++ b/backend/utils/utils.go @@ -39,24 +39,6 @@ import ( v1pb "github.com/bytebase/bytebase/proto/generated-go/v1" ) -// GetLatestSchemaVersion gets the latest schema version for a database. -func GetLatestSchemaVersion(ctx context.Context, stores *store.Store, instanceID int, databaseID int, databaseName string) (model.Version, error) { - // TODO(d): support semantic versioning. - limit := 1 - history, err := stores.ListInstanceChangeHistory(ctx, &store.FindInstanceChangeHistoryMessage{ - InstanceID: &instanceID, - DatabaseID: &databaseID, - Limit: &limit, - }) - if err != nil { - return model.Version{}, errors.Wrapf(err, "failed to get migration history for database %q", databaseName) - } - if len(history) == 0 { - return model.Version{}, nil - } - return history[0].Version, nil -} - // DataSourceFromInstanceWithType gets a typed data source from an instance. func DataSourceFromInstanceWithType(instance *store.InstanceMessage, dataSourceType api.DataSourceType) *store.DataSourceMessage { for _, dataSource := range instance.DataSources {