Welcome to mirror list, hosted at ThFree Co, Russian Federation.

gitlab.com/gitlab-org/gitaly.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSami Hiltunen <shiltunen@gitlab.com>2023-09-13 18:18:52 +0300
committerSami Hiltunen <shiltunen@gitlab.com>2023-10-09 12:34:00 +0300
commit9f456fa78d613cf59c8852b7a2af67c7b4999bcd (patch)
treea9a4fba39ed36fa0e52d4eabb48bf44d14fecf18
parent1eff34de254216721e26827eeca02035fad42cb5 (diff)
Inject partition ID into TransactionManager
The TransactionManager is currently using the relative path of the repository it is operating on to build database keys. This won't work in the near future as we'll have to support multiple repositories in a partition. Inject the partition ID into the TransactionManager so we can use it to later build the database keys in a partition specific manner without relying on a given repository's relative path.
-rw-r--r--internal/gitaly/storage/storagemgr/partition_manager.go5
-rw-r--r--internal/gitaly/storage/storagemgr/partition_manager_test.go4
-rw-r--r--internal/gitaly/storage/storagemgr/transaction_manager.go4
-rw-r--r--internal/gitaly/storage/storagemgr/transaction_manager_test.go11
4 files changed, 20 insertions, 4 deletions
diff --git a/internal/gitaly/storage/storagemgr/partition_manager.go b/internal/gitaly/storage/storagemgr/partition_manager.go
index e6f2da9fb..dee74dae8 100644
--- a/internal/gitaly/storage/storagemgr/partition_manager.go
+++ b/internal/gitaly/storage/storagemgr/partition_manager.go
@@ -27,6 +27,7 @@ import (
var ErrPartitionManagerClosed = errors.New("partition manager closed")
type transactionManagerFactory func(
+ partitionID partitionID,
storageMgr *storageManager,
cmdFactory git.CommandFactory,
housekeepingManager housekeeping.Manager,
@@ -244,12 +245,14 @@ func NewPartitionManager(
commandFactory: cmdFactory,
housekeepingManager: housekeepingManager,
transactionManagerFactory: func(
+ partitionID partitionID,
storageMgr *storageManager,
cmdFactory git.CommandFactory,
housekeepingManager housekeeping.Manager,
relativePath, absoluteStateDir, stagingDir string,
) *TransactionManager {
return NewTransactionManager(
+ partitionID,
storageMgr.database,
storageMgr.path,
relativePath,
@@ -322,7 +325,7 @@ func (pm *PartitionManager) Begin(ctx context.Context, repo storage.Repository,
return nil, fmt.Errorf("create staging directory: %w", err)
}
- mgr := pm.transactionManagerFactory(storageMgr, pm.commandFactory, pm.housekeepingManager, relativePath, absoluteStateDir, stagingDir)
+ mgr := pm.transactionManagerFactory(partitionID, storageMgr, pm.commandFactory, pm.housekeepingManager, relativePath, absoluteStateDir, stagingDir)
ptn.transactionManager = mgr
diff --git a/internal/gitaly/storage/storagemgr/partition_manager_test.go b/internal/gitaly/storage/storagemgr/partition_manager_test.go
index 59f2b1b65..4ab6c508f 100644
--- a/internal/gitaly/storage/storagemgr/partition_manager_test.go
+++ b/internal/gitaly/storage/storagemgr/partition_manager_test.go
@@ -367,12 +367,14 @@ func TestPartitionManager(t *testing.T) {
},
},
transactionManagerFactory: func(
+ partitionID partitionID,
storageMgr *storageManager,
commandFactory git.CommandFactory,
housekeepingManager housekeeping.Manager,
relativePath, absoluteStateDir, stagingDir string,
) *TransactionManager {
txMgr := NewTransactionManager(
+ partitionID,
storageMgr.database,
storageMgr.path,
relativePath,
@@ -417,12 +419,14 @@ func TestPartitionManager(t *testing.T) {
},
},
transactionManagerFactory: func(
+ partitionID partitionID,
storageMgr *storageManager,
commandFactory git.CommandFactory,
housekeepingManager housekeeping.Manager,
relativePath, absoluteStateDir, stagingDir string,
) *TransactionManager {
txMgr := NewTransactionManager(
+ partitionID,
storageMgr.database,
storageMgr.path,
relativePath,
diff --git a/internal/gitaly/storage/storagemgr/transaction_manager.go b/internal/gitaly/storage/storagemgr/transaction_manager.go
index 984930442..9b36d5b37 100644
--- a/internal/gitaly/storage/storagemgr/transaction_manager.go
+++ b/internal/gitaly/storage/storagemgr/transaction_manager.go
@@ -659,6 +659,8 @@ type TransactionManager struct {
storagePath string
// relativePath is the repository's relative path inside the storage.
relativePath string
+ // partitionID is the ID of the partition this manager is operating on. This is used to determine the database keys.
+ partitionID partitionID
// db is the handle to the key-value store used for storing the write-ahead log related state.
db database
// admissionQueue is where the incoming writes are waiting to be admitted to the transaction
@@ -696,6 +698,7 @@ type TransactionManager struct {
// NewTransactionManager returns a new TransactionManager for the given repository.
func NewTransactionManager(
+ ptnID partitionID,
db *badger.DB,
storagePath,
relativePath,
@@ -715,6 +718,7 @@ func NewTransactionManager(
repositoryFactory: repositoryFactory,
storagePath: storagePath,
relativePath: relativePath,
+ partitionID: ptnID,
db: newDatabaseAdapter(db),
admissionQueue: make(chan *Transaction),
initialized: make(chan struct{}),
diff --git a/internal/gitaly/storage/storagemgr/transaction_manager_test.go b/internal/gitaly/storage/storagemgr/transaction_manager_test.go
index b334236b1..b2aa0b223 100644
--- a/internal/gitaly/storage/storagemgr/transaction_manager_test.go
+++ b/internal/gitaly/storage/storagemgr/transaction_manager_test.go
@@ -260,6 +260,9 @@ func TestTransactionManager(t *testing.T) {
// TransactionManager.Run execution.
errSimulatedCrash := errors.New("simulated crash")
+ // partitionID is the partition ID used in the tests for the TransactionManager.
+ const partitionID partitionID = 1
+
type testHooks struct {
// BeforeApplyLogEntry is called before a log entry is applied to the repository.
BeforeApplyLogEntry hookFunc
@@ -4165,7 +4168,7 @@ func TestTransactionManager(t *testing.T) {
// managerRunning tracks whether the manager is running or closed.
managerRunning bool
// transactionManager is the current TransactionManager instance.
- transactionManager = NewTransactionManager(database, storagePath, relativePath, stateDir, stagingDir, setup.CommandFactory, housekeepingManager, storageScopedFactory)
+ transactionManager = NewTransactionManager(partitionID, database, storagePath, relativePath, stateDir, stagingDir, setup.CommandFactory, housekeepingManager, storageScopedFactory)
// managerErr is used for synchronizing manager closing and returning
// the error from Run.
managerErr chan error
@@ -4212,7 +4215,7 @@ func TestTransactionManager(t *testing.T) {
require.NoError(t, os.RemoveAll(stagingDir))
require.NoError(t, os.Mkdir(stagingDir, perm.PrivateDir))
- transactionManager = NewTransactionManager(database, storagePath, relativePath, stateDir, stagingDir, setup.CommandFactory, housekeepingManager, storageScopedFactory)
+ transactionManager = NewTransactionManager(partitionID, database, storagePath, relativePath, stateDir, stagingDir, setup.CommandFactory, housekeepingManager, storageScopedFactory)
installHooks(t, transactionManager, database, hooks{
beforeReadLogEntry: step.Hooks.BeforeApplyLogEntry,
beforeStoreLogEntry: step.Hooks.BeforeAppendLogEntry,
@@ -4600,7 +4603,9 @@ func BenchmarkTransactionManager(b *testing.B) {
stagingDir := filepath.Join(storagePath, "staging", strconv.Itoa(i))
require.NoError(b, os.MkdirAll(stagingDir, perm.PrivateDir))
- manager := NewTransactionManager(database, storagePath, repo.RelativePath, stateDir, stagingDir, cmdFactory, housekeepingManager, repositoryFactory)
+ // Valid partition IDs are >=1.
+ partitionID := partitionID(i + 1)
+ manager := NewTransactionManager(partitionID, database, storagePath, repo.RelativePath, stateDir, stagingDir, cmdFactory, housekeepingManager, repositoryFactory)
managers = append(managers, manager)