internal/gitaly/storage/storagemgr/partition/migration/state.go (33 lines of code) (raw):
package migration
import (
"fmt"
"gitlab.com/gitlab-org/gitaly/v16/internal/gitaly/storage"
)
// StateManager is used to manipulate the stored state of migrations.
type StateManager interface {
// RecordKeyCreation initializes the migration key for a new repository.
RecordKeyCreation(txn storage.Transaction, relativePath string) error
// RecordKeyDeletion records in the provided transaction a migration key deletion.
RecordKeyDeletion(txn storage.Transaction, relativePath string) error
}
type stateManager struct {
migrations []Migration
}
// RecordKeyCreation initializes the migration key for a new repository.
func (m stateManager) RecordKeyCreation(txn storage.Transaction, relativePath string) error {
// Generally, migration keys should be initialized to the latest migration because we should not
// be created repositories with outdated state. The ID of the latest configured migration is
// recorded in the transaction. If no migrations are configured, the ID is set to zero.
var migr Migration
if len(m.migrations) > 0 {
migr = m.migrations[len(m.migrations)-1]
}
if err := migr.recordID(txn, relativePath); err != nil {
return fmt.Errorf("initializing key: %w", err)
}
return nil
}
// RecordKeyDeletion records in the provided transaction a migration key deletion.
func (stateManager) RecordKeyDeletion(txn storage.Transaction, relativePath string) error {
if err := txn.KV().Delete(migrationKey(relativePath)); err != nil {
return fmt.Errorf("deleting key: %w", err)
}
return nil
}
// NewStateManager returns an implementation of the StateManager interface.
func NewStateManager(migrations []Migration) StateManager {
return stateManager{
migrations: migrations,
}
}