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-06-13 10:31:58 +0300
committerSami Hiltunen <shiltunen@gitlab.com>2023-09-29 14:10:12 +0300
commit63cedd75726a893cb652f566f24e6430e9e5858c (patch)
tree4109470c45ed08e5d196660a046a9afd85e734db
parentff27b2f4bf89a226d18b694d8c5f1eafd45a4c68 (diff)
Drop custom hook MVCC logic
The TransactionManager is currently extracting the hooks to versioned directories and `<repo>/custom_hooks`. The versioned directories were used to isolate the transactions from each other. Each transaction's read snapshot would determine which version of the hooks the transaction reads. This is no longer necessary to do separately as each transaction takes a full snapshot of the repository. Each snapshot also thus covers the '<repo>/custom_hooks' directory leading to each transaction having the correct version of hooks in the snapshot and being isolated from concurrent changes. This commit thus removes the previous custom hook MVCC logic and simplifies the implementation.
-rw-r--r--internal/gitaly/storage/storagemgr/transaction_manager.go154
-rw-r--r--internal/gitaly/storage/storagemgr/transaction_manager_test.go150
2 files changed, 48 insertions, 256 deletions
diff --git a/internal/gitaly/storage/storagemgr/transaction_manager.go b/internal/gitaly/storage/storagemgr/transaction_manager.go
index 0fe5427ba..b4362a44c 100644
--- a/internal/gitaly/storage/storagemgr/transaction_manager.go
+++ b/internal/gitaly/storage/storagemgr/transaction_manager.go
@@ -118,11 +118,6 @@ type ReferenceUpdates map[git.ReferenceName]ReferenceUpdate
type Snapshot struct {
// ReadIndex is the index of the log entry this Transaction is reading the data at.
ReadIndex LogIndex
- // CustomHookIndex is index of the custom hooks on the disk that are included in this Transactions's
- // snapshot and were the latest on the read index.
- CustomHookIndex LogIndex
- // CustomHookPath is an absolute filesystem path to the custom hooks in this snapshot.
- CustomHookPath string
}
type transactionState int
@@ -218,20 +213,10 @@ func (mgr *TransactionManager) Begin(ctx context.Context, opts TransactionOption
txn := &Transaction{
readOnly: opts.ReadOnly,
commit: mgr.commit,
- snapshot: Snapshot{
- ReadIndex: mgr.appendedLogIndex,
- CustomHookIndex: mgr.customHookIndex,
- CustomHookPath: customHookPathForLogIndex(mgr.repositoryPath, mgr.customHookIndex),
- },
+ snapshot: Snapshot{ReadIndex: mgr.appendedLogIndex},
finished: make(chan struct{}),
}
- // If there are no custom hooks stored through the WAL yet, then default to the custom hooks
- // that may already exist in the repository for backwards compatibility.
- if txn.snapshot.CustomHookIndex == 0 {
- txn.snapshot.CustomHookPath = filepath.Join(mgr.repositoryPath, repoutil.CustomHooksDir)
- }
-
mgr.snapshotLocks[txn.snapshot.ReadIndex].activeSnapshotters.Add(1)
defer mgr.snapshotLocks[txn.snapshot.ReadIndex].activeSnapshotters.Done()
readReady := mgr.snapshotLocks[txn.snapshot.ReadIndex].applied
@@ -707,8 +692,6 @@ type TransactionManager struct {
appendedLogIndex LogIndex
// appliedLogIndex holds the index of the last log entry applied to the repository
appliedLogIndex LogIndex
- // customHookIndex stores the log index of the latest committed custom custom hooks in the repository.
- customHookIndex LogIndex
// housekeepingManager access to the housekeeping.Manager.
housekeepingManager housekeeping.Manager
@@ -1167,12 +1150,6 @@ func (mgr *TransactionManager) initialize(ctx context.Context) error {
}
}
- var err error
- mgr.customHookIndex, err = mgr.determineCustomHookIndex(ctx, mgr.appendedLogIndex, mgr.appliedLogIndex)
- if err != nil {
- return fmt.Errorf("determine hook index: %w", err)
- }
-
// Create a snapshot lock for the applied index as it is used for synchronizing
// the snapshotters with the log application.
mgr.snapshotLocks[mgr.appliedLogIndex] = &snapshotLock{applied: make(chan struct{})}
@@ -1229,57 +1206,10 @@ func (mgr *TransactionManager) determineRepositoryExistence() error {
return nil
}
-// determineCustomHookIndex determines the latest custom hooks in the repository.
-//
-// 1. First we iterate through the unapplied log in reverse order. The first log entry that
-// contains custom hooks must have the latest custom hooks since it is the latest log entry.
-// 2. If we don't find any custom hooks in the log, the latest hooks could have been applied
-// to the repository already and the log entry pruned away. Look at the custom hooks on the
-// disk to see which are the latest.
-// 3. If we found no custom hooks in the log nor in the repository, there are no custom hooks
-// configured.
-func (mgr *TransactionManager) determineCustomHookIndex(ctx context.Context, appendedIndex, appliedIndex LogIndex) (LogIndex, error) {
- if !mgr.repositoryExists {
- // If the repository doesn't exist, then there are no hooks either.
- return 0, nil
- }
-
- for i := appendedIndex; appliedIndex < i; i-- {
- logEntry, err := mgr.readLogEntry(i)
- if err != nil {
- return 0, fmt.Errorf("read log entry: %w", err)
- }
-
- if logEntry.CustomHooksUpdate != nil {
- return i, nil
- }
- }
-
- hookDirs, err := os.ReadDir(filepath.Join(mgr.stateDirectory, "hooks"))
- if err != nil {
- return 0, fmt.Errorf("read hook directories: %w", err)
- }
-
- var hookIndex LogIndex
- for _, dir := range hookDirs {
- rawIndex, err := strconv.ParseUint(dir.Name(), 10, 64)
- if err != nil {
- return 0, fmt.Errorf("parse hook index: %w", err)
- }
-
- if index := LogIndex(rawIndex); hookIndex < index {
- hookIndex = index
- }
- }
-
- return hookIndex, err
-}
-
func (mgr *TransactionManager) createStateDirectory() error {
for _, path := range []string{
mgr.stateDirectory,
filepath.Join(mgr.stateDirectory, "wal"),
- filepath.Join(mgr.stateDirectory, "hooks"),
} {
if err := os.Mkdir(path, perm.PrivateDir); err != nil {
if !errors.Is(err, fs.ErrExist) {
@@ -1586,12 +1516,8 @@ func (mgr *TransactionManager) appendLogEntry(nextLogIndex LogIndex, logEntry *g
mgr.mutex.Lock()
mgr.appendedLogIndex = nextLogIndex
mgr.snapshotLocks[nextLogIndex] = &snapshotLock{applied: make(chan struct{})}
- if logEntry.CustomHooksUpdate != nil {
- mgr.customHookIndex = nextLogIndex
- }
if logEntry.RepositoryDeletion != nil {
mgr.repositoryExists = false
- mgr.customHookIndex = 0
}
mgr.mutex.Unlock()
@@ -1727,87 +1653,41 @@ func (mgr *TransactionManager) applyPackFile(ctx context.Context, packPrefix str
return nil
}
-// applyCustomHooks applies the custom hooks to the repository from the log entry. The custom hooks are stored
-// at `<repo>/wal/hooks/<log_index>`. The custom hooks are fsynced prior to returning so it is safe to delete
-// the log entry afterwards.
-//
-// The hooks are also extracted at `<repo>/custom_hooks`. This is done for backwards compatibility, as we want
-// the hooks to be present even if the WAL logic is disabled. This ensures we don't lose data if we have to
-// disable the WAL logic after rollout.
+// applyCustomHooks applies the custom hooks to the repository from the log entry. The hooks are extracted at
+// `<repo>/custom_hooks`. The custom hooks are fsynced prior to returning so it is safe to delete the log entry
+// afterwards.
func (mgr *TransactionManager) applyCustomHooks(ctx context.Context, logIndex LogIndex, update *gitalypb.LogEntry_CustomHooksUpdate) error {
if update == nil {
return nil
}
- targetDirectory := customHookPathForLogIndex(mgr.stateDirectory, logIndex)
- if err := os.Mkdir(targetDirectory, fs.ModePerm); err != nil {
- // The target directory may exist if we previously tried to extract the
- // custom hooks there. TAR overwrites existing files and the custom hooks
- // files are guaranteed to be the same as this is the same log entry.
- if !errors.Is(err, fs.ErrExist) {
- return fmt.Errorf("create directory: %w", err)
- }
+ destinationDir := filepath.Join(mgr.repositoryPath, repoutil.CustomHooksDir)
+ if err := os.RemoveAll(destinationDir); err != nil {
+ return fmt.Errorf("remove directory: %w", err)
}
- syncer := safe.NewSyncer()
- extractHooks := func(destinationDir string) error {
- if err := repoutil.ExtractHooks(ctx, bytes.NewReader(update.CustomHooksTar), destinationDir, true); err != nil {
- return fmt.Errorf("extract hooks: %w", err)
- }
-
- // TAR doesn't sync the extracted files so do it manually here.
- if err := syncer.SyncRecursive(destinationDir); err != nil {
- return fmt.Errorf("sync hooks: %w", err)
- }
-
- return nil
+ if err := os.Mkdir(destinationDir, perm.PrivateDir); err != nil {
+ return fmt.Errorf("create directory: %w", err)
}
- if err := extractHooks(targetDirectory); err != nil {
+ if err := repoutil.ExtractHooks(ctx, bytes.NewReader(update.CustomHooksTar), destinationDir, true); err != nil {
return fmt.Errorf("extract hooks: %w", err)
}
- // Sync the parent directory as well.
- if err := syncer.SyncParent(targetDirectory); err != nil {
- return fmt.Errorf("sync hook directory: %w", err)
- }
-
- // Extract another copy that we can move to `<repo>/custom_hooks` where the hooks exist without the WAL enabled.
- // We make a second copy as if we disable the WAL, we have to clear all of its state prior to re-enabling it.
- // This would clear the hooks so symbolic linking the first copy is not enough.
- tmpDir, err := os.MkdirTemp(mgr.stagingDirectory, "")
- if err != nil {
- return fmt.Errorf("create temporary directory: %w", err)
- }
-
- if err := extractHooks(tmpDir); err != nil {
- return fmt.Errorf("extract legacy hooks: %w", err)
- }
-
- legacyHooksPath := filepath.Join(mgr.repositoryPath, repoutil.CustomHooksDir)
- // The hooks are lost if we perform this removal but fail to perform the remaining operations and the
- // WAL is disabled before succeeding. This is an existing issue already with SetCustomHooks RPC.
- if err := os.RemoveAll(legacyHooksPath); err != nil {
- return fmt.Errorf("remove existing legacy hooks: %w", err)
- }
-
- if err := os.Rename(tmpDir, legacyHooksPath); err != nil {
- return fmt.Errorf("move legacy hooks in place: %w", err)
+ // TAR doesn't sync the extracted files so do it manually here.
+ syncer := safe.NewSyncer()
+ if err := syncer.SyncRecursive(destinationDir); err != nil {
+ return fmt.Errorf("sync hooks: %w", err)
}
- if err := syncer.SyncParent(legacyHooksPath); err != nil {
- return fmt.Errorf("sync legacy hooks directory entry: %w", err)
+ // Sync the parent directory as well.
+ if err := syncer.SyncParent(destinationDir); err != nil {
+ return fmt.Errorf("sync hook directory: %w", err)
}
return nil
}
-// customHookPathForLogIndex returns the filesystem paths where the custom hooks
-// for the given log index are stored.
-func customHookPathForLogIndex(stateDir string, logIndex LogIndex) string {
- return filepath.Join(stateDir, "hooks", logIndex.String())
-}
-
// deleteLogEntry deletes the log entry at the given index from the log.
func (mgr *TransactionManager) deleteLogEntry(index LogIndex) error {
return mgr.deleteKey(keyLogEntry(mgr.relativePath, index))
diff --git a/internal/gitaly/storage/storagemgr/transaction_manager_test.go b/internal/gitaly/storage/storagemgr/transaction_manager_test.go
index afb14bd54..94debf74a 100644
--- a/internal/gitaly/storage/storagemgr/transaction_manager_test.go
+++ b/internal/gitaly/storage/storagemgr/transaction_manager_test.go
@@ -26,7 +26,6 @@ import (
"gitlab.com/gitlab-org/gitaly/v16/internal/git/localrepo"
"gitlab.com/gitlab-org/gitaly/v16/internal/git/updateref"
"gitlab.com/gitlab-org/gitaly/v16/internal/gitaly/config"
- "gitlab.com/gitlab-org/gitaly/v16/internal/gitaly/repoutil"
"gitlab.com/gitlab-org/gitaly/v16/internal/gitaly/transaction"
"gitlab.com/gitlab-org/gitaly/v16/internal/grpc/backchannel"
"gitlab.com/gitlab-org/gitaly/v16/internal/helper/perm"
@@ -1714,8 +1713,7 @@ func TestTransactionManager(t *testing.T) {
Begin{
TransactionID: 2,
ExpectedSnapshot: Snapshot{
- ReadIndex: 1,
- CustomHookIndex: 1,
+ ReadIndex: 1,
},
},
Commit{
@@ -1728,17 +1726,8 @@ func TestTransactionManager(t *testing.T) {
string(keyAppliedLogIndex(relativePath)): LogIndex(2).toProto(),
},
Directory: testhelper.DirectoryState{
- "/": {Mode: fs.ModeDir | perm.PrivateDir},
- "/wal": {Mode: fs.ModeDir | perm.PrivateDir},
- "/hooks": {Mode: fs.ModeDir | perm.PrivateDir},
- "/hooks/1": {Mode: umask.Mask(fs.ModeDir | fs.ModePerm)},
- "/hooks/1/pre-receive": {
- Mode: umask.Mask(fs.ModePerm),
- Content: []byte("hook content"),
- },
- "/hooks/1/private-dir": {Mode: fs.ModeDir | perm.PrivateDir},
- "/hooks/1/private-dir/private-file": {Mode: umask.Mask(perm.PrivateFile), Content: []byte("private content")},
- "/hooks/2": {Mode: umask.Mask(fs.ModeDir | fs.ModePerm)},
+ "/": {Mode: fs.ModeDir | perm.PrivateDir},
+ "/wal": {Mode: fs.ModeDir | perm.PrivateDir},
},
Repositories: RepositoryStates{
relativePath: {
@@ -1798,16 +1787,8 @@ func TestTransactionManager(t *testing.T) {
string(keyAppliedLogIndex(relativePath)): LogIndex(1).toProto(),
},
Directory: testhelper.DirectoryState{
- "/": {Mode: fs.ModeDir | perm.PrivateDir},
- "/wal": {Mode: fs.ModeDir | perm.PrivateDir},
- "/hooks": {Mode: fs.ModeDir | perm.PrivateDir},
- "/hooks/1": {Mode: umask.Mask(fs.ModeDir | fs.ModePerm)},
- "/hooks/1/pre-receive": {
- Mode: umask.Mask(fs.ModePerm),
- Content: []byte("hook content"),
- },
- "/hooks/1/private-dir": {Mode: fs.ModeDir | perm.PrivateDir},
- "/hooks/1/private-dir/private-file": {Mode: umask.Mask(perm.PrivateFile), Content: []byte("private content")},
+ "/": {Mode: fs.ModeDir | perm.PrivateDir},
+ "/wal": {Mode: fs.ModeDir | perm.PrivateDir},
},
Repositories: RepositoryStates{
relativePath: {
@@ -1852,8 +1833,7 @@ func TestTransactionManager(t *testing.T) {
Begin{
TransactionID: 2,
ExpectedSnapshot: Snapshot{
- ReadIndex: 1,
- CustomHookIndex: 1,
+ ReadIndex: 1,
},
},
Commit{
@@ -1863,8 +1843,7 @@ func TestTransactionManager(t *testing.T) {
Begin{
TransactionID: 3,
ExpectedSnapshot: Snapshot{
- ReadIndex: 2,
- CustomHookIndex: 2,
+ ReadIndex: 2,
},
},
CloseManager{},
@@ -1872,8 +1851,7 @@ func TestTransactionManager(t *testing.T) {
Begin{
TransactionID: 4,
ExpectedSnapshot: Snapshot{
- ReadIndex: 2,
- CustomHookIndex: 2,
+ ReadIndex: 2,
},
},
Rollback{
@@ -1885,17 +1863,8 @@ func TestTransactionManager(t *testing.T) {
string(keyAppliedLogIndex(relativePath)): LogIndex(2).toProto(),
},
Directory: testhelper.DirectoryState{
- "/": {Mode: fs.ModeDir | perm.PrivateDir},
- "/hooks": {Mode: fs.ModeDir | perm.PrivateDir},
- "/hooks/1": {Mode: umask.Mask(fs.ModeDir | fs.ModePerm)},
- "/hooks/1/pre-receive": {
- Mode: umask.Mask(fs.ModePerm),
- Content: []byte("hook content"),
- },
- "/hooks/1/private-dir": {Mode: fs.ModeDir | perm.PrivateDir},
- "/hooks/1/private-dir/private-file": {Mode: umask.Mask(perm.PrivateFile), Content: []byte("private content")},
- "/hooks/2": {Mode: umask.Mask(fs.ModeDir | fs.ModePerm)},
- "/wal": {Mode: fs.ModeDir | perm.PrivateDir},
+ "/": {Mode: fs.ModeDir | perm.PrivateDir},
+ "/wal": {Mode: fs.ModeDir | perm.PrivateDir},
},
Repositories: RepositoryStates{
relativePath: {
@@ -2650,8 +2619,7 @@ func TestTransactionManager(t *testing.T) {
Begin{
TransactionID: 3,
ExpectedSnapshot: Snapshot{
- ReadIndex: 1,
- CustomHookIndex: 1,
+ ReadIndex: 1,
},
},
// Transaction 3 is should see the new changes as it began after transaction 1 was committed.
@@ -2691,8 +2659,7 @@ func TestTransactionManager(t *testing.T) {
Begin{
TransactionID: 4,
ExpectedSnapshot: Snapshot{
- ReadIndex: 2,
- CustomHookIndex: 1,
+ ReadIndex: 2,
},
},
Rollback{
@@ -2701,8 +2668,7 @@ func TestTransactionManager(t *testing.T) {
Begin{
TransactionID: 5,
ExpectedSnapshot: Snapshot{
- ReadIndex: 2,
- CustomHookIndex: 1,
+ ReadIndex: 2,
},
},
Commit{
@@ -2715,8 +2681,7 @@ func TestTransactionManager(t *testing.T) {
Begin{
TransactionID: 6,
ExpectedSnapshot: Snapshot{
- ReadIndex: 3,
- CustomHookIndex: 3,
+ ReadIndex: 3,
},
},
Rollback{
@@ -2731,17 +2696,8 @@ func TestTransactionManager(t *testing.T) {
string(keyAppliedLogIndex(relativePath)): LogIndex(3).toProto(),
},
Directory: testhelper.DirectoryState{
- "/": {Mode: fs.ModeDir | perm.PrivateDir},
- "/wal": {Mode: fs.ModeDir | perm.PrivateDir},
- "/hooks": {Mode: fs.ModeDir | perm.PrivateDir},
- "/hooks/1": {Mode: umask.Mask(fs.ModeDir | fs.ModePerm)},
- "/hooks/1/pre-receive": {
- Mode: umask.Mask(fs.ModePerm),
- Content: []byte("hook content"),
- },
- "/hooks/1/private-dir": {Mode: fs.ModeDir | perm.PrivateDir},
- "/hooks/1/private-dir/private-file": {Mode: umask.Mask(perm.PrivateFile), Content: []byte("private content")},
- "/hooks/3": {Mode: umask.Mask(fs.ModeDir | fs.ModePerm)},
+ "/": {Mode: fs.ModeDir | perm.PrivateDir},
+ "/wal": {Mode: fs.ModeDir | perm.PrivateDir},
},
Repositories: RepositoryStates{
relativePath: {
@@ -2791,7 +2747,6 @@ func TestTransactionManager(t *testing.T) {
},
Directory: testhelper.DirectoryState{
"/": {Mode: fs.ModeDir | perm.PrivateDir},
- "/hooks": {Mode: fs.ModeDir | perm.PrivateDir},
"/wal": {Mode: fs.ModeDir | perm.PrivateDir},
"/wal/1": {Mode: fs.ModeDir | perm.PrivateDir},
"/wal/1/objects.idx": indexFileDirectoryEntry(setup.Config),
@@ -2894,7 +2849,6 @@ func TestTransactionManager(t *testing.T) {
},
Directory: testhelper.DirectoryState{
"/": {Mode: fs.ModeDir | perm.PrivateDir},
- "/hooks": {Mode: fs.ModeDir | perm.PrivateDir},
"/wal": {Mode: fs.ModeDir | perm.PrivateDir},
"/wal/1": {Mode: fs.ModeDir | perm.PrivateDir},
"/wal/1/objects.idx": indexFileDirectoryEntry(setup.Config),
@@ -2968,7 +2922,6 @@ func TestTransactionManager(t *testing.T) {
},
Directory: testhelper.DirectoryState{
"/": {Mode: fs.ModeDir | perm.PrivateDir},
- "/hooks": {Mode: fs.ModeDir | perm.PrivateDir},
"/wal": {Mode: fs.ModeDir | perm.PrivateDir},
"/wal/1": {Mode: fs.ModeDir | perm.PrivateDir},
"/wal/1/objects.idx": indexFileDirectoryEntry(setup.Config),
@@ -3056,7 +3009,6 @@ func TestTransactionManager(t *testing.T) {
},
Directory: testhelper.DirectoryState{
"/": {Mode: fs.ModeDir | perm.PrivateDir},
- "/hooks": {Mode: fs.ModeDir | perm.PrivateDir},
"/wal": {Mode: fs.ModeDir | perm.PrivateDir},
"/wal/1": {Mode: fs.ModeDir | perm.PrivateDir},
"/wal/1/objects.idx": indexFileDirectoryEntry(setup.Config),
@@ -3102,9 +3054,8 @@ func TestTransactionManager(t *testing.T) {
string(keyAppliedLogIndex(relativePath)): LogIndex(1).toProto(),
},
Directory: testhelper.DirectoryState{
- "/": {Mode: fs.ModeDir | perm.PrivateDir},
- "/hooks": {Mode: fs.ModeDir | perm.PrivateDir},
- "/wal": {Mode: fs.ModeDir | perm.PrivateDir},
+ "/": {Mode: fs.ModeDir | perm.PrivateDir},
+ "/wal": {Mode: fs.ModeDir | perm.PrivateDir},
},
Repositories: RepositoryStates{
relativePath: {
@@ -3134,7 +3085,6 @@ func TestTransactionManager(t *testing.T) {
},
Directory: testhelper.DirectoryState{
"/": {Mode: fs.ModeDir | perm.PrivateDir},
- "/hooks": {Mode: fs.ModeDir | perm.PrivateDir},
"/wal": {Mode: fs.ModeDir | perm.PrivateDir},
"/wal/1": {Mode: fs.ModeDir | perm.PrivateDir},
"/wal/1/objects.idx": indexFileDirectoryEntry(setup.Config),
@@ -3180,7 +3130,6 @@ func TestTransactionManager(t *testing.T) {
},
Directory: testhelper.DirectoryState{
"/": {Mode: fs.ModeDir | perm.PrivateDir},
- "/hooks": {Mode: fs.ModeDir | perm.PrivateDir},
"/wal": {Mode: fs.ModeDir | perm.PrivateDir},
"/wal/1": {Mode: fs.ModeDir | perm.PrivateDir},
"/wal/1/objects.idx": indexFileDirectoryEntry(setup.Config),
@@ -3266,7 +3215,6 @@ func TestTransactionManager(t *testing.T) {
},
Directory: testhelper.DirectoryState{
"/": {Mode: fs.ModeDir | perm.PrivateDir},
- "/hooks": {Mode: fs.ModeDir | perm.PrivateDir},
"/wal": {Mode: fs.ModeDir | perm.PrivateDir},
"/wal/1": {Mode: fs.ModeDir | perm.PrivateDir},
"/wal/1/objects.idx": indexFileDirectoryEntry(setup.Config),
@@ -3346,7 +3294,6 @@ func TestTransactionManager(t *testing.T) {
},
Directory: testhelper.DirectoryState{
"/": {Mode: fs.ModeDir | perm.PrivateDir},
- "/hooks": {Mode: fs.ModeDir | perm.PrivateDir},
"/wal": {Mode: fs.ModeDir | perm.PrivateDir},
"/wal/1": {Mode: fs.ModeDir | perm.PrivateDir},
"/wal/1/objects.idx": indexFileDirectoryEntry(setup.Config),
@@ -3674,16 +3621,8 @@ func TestTransactionManager(t *testing.T) {
string(keyAppliedLogIndex(relativePath)): LogIndex(2).toProto(),
},
Directory: testhelper.DirectoryState{
- "/": {Mode: fs.ModeDir | perm.PrivateDir},
- "/wal": {Mode: fs.ModeDir | perm.PrivateDir},
- "/hooks": {Mode: fs.ModeDir | perm.PrivateDir},
- "/hooks/1": {Mode: umask.Mask(fs.ModeDir | fs.ModePerm)},
- "/hooks/1/pre-receive": {
- Mode: umask.Mask(fs.ModePerm),
- Content: []byte("hook content"),
- },
- "/hooks/1/private-dir": {Mode: fs.ModeDir | perm.PrivateDir},
- "/hooks/1/private-dir/private-file": {Mode: umask.Mask(perm.PrivateFile), Content: []byte("private content")},
+ "/": {Mode: fs.ModeDir | perm.PrivateDir},
+ "/wal": {Mode: fs.ModeDir | perm.PrivateDir},
},
Repositories: RepositoryStates{},
},
@@ -3931,8 +3870,7 @@ func TestTransactionManager(t *testing.T) {
Begin{
TransactionID: 3,
ExpectedSnapshot: Snapshot{
- ReadIndex: 1,
- CustomHookIndex: 1,
+ ReadIndex: 1,
},
},
// This transaction was started before the commit, so it should see the original state.
@@ -3981,19 +3919,11 @@ func TestTransactionManager(t *testing.T) {
string(keyAppliedLogIndex(relativePath)): LogIndex(1).toProto(),
},
Directory: testhelper.DirectoryState{
- "/": {Mode: fs.ModeDir | perm.PrivateDir},
- "/hooks": {Mode: fs.ModeDir | perm.PrivateDir},
- "/hooks/1": {Mode: umask.Mask(fs.ModeDir | fs.ModePerm)},
- "/hooks/1/pre-receive": {
- Mode: umask.Mask(fs.ModePerm),
- Content: []byte("hook content"),
- },
- "/hooks/1/private-dir": {Mode: umask.Mask(fs.ModeDir | perm.PrivateDir)},
- "/hooks/1/private-dir/private-file": {Mode: umask.Mask(perm.PrivateFile), Content: []byte("private content")},
- "/wal": {Mode: fs.ModeDir | perm.PrivateDir},
- "/wal/1": {Mode: fs.ModeDir | perm.PrivateDir},
- "/wal/1/objects.idx": indexFileDirectoryEntry(setup.Config),
- "/wal/1/objects.rev": reverseIndexFileDirectoryEntry(setup.Config),
+ "/": {Mode: fs.ModeDir | perm.PrivateDir},
+ "/wal": {Mode: fs.ModeDir | perm.PrivateDir},
+ "/wal/1": {Mode: fs.ModeDir | perm.PrivateDir},
+ "/wal/1/objects.idx": indexFileDirectoryEntry(setup.Config),
+ "/wal/1/objects.rev": reverseIndexFileDirectoryEntry(setup.Config),
"/wal/1/objects.pack": packFileDirectoryEntry(
setup.Config,
[]git.ObjectID{
@@ -4002,7 +3932,6 @@ func TestTransactionManager(t *testing.T) {
},
),
},
-
Repositories: RepositoryStates{
relativePath: {
DefaultBranch: "refs/heads/new-head",
@@ -4048,15 +3977,13 @@ func TestTransactionManager(t *testing.T) {
Begin{
TransactionID: 2,
ExpectedSnapshot: Snapshot{
- ReadIndex: 1,
- CustomHookIndex: 1,
+ ReadIndex: 1,
},
},
Begin{
TransactionID: 3,
ExpectedSnapshot: Snapshot{
- ReadIndex: 1,
- CustomHookIndex: 1,
+ ReadIndex: 1,
},
},
Commit{
@@ -4123,14 +4050,6 @@ func TestTransactionManager(t *testing.T) {
setup.Commits.First.OID,
},
),
- "/hooks": {Mode: umask.Mask(fs.ModeDir | perm.PrivateDir)},
- "/hooks/1": {Mode: umask.Mask(fs.ModeDir | fs.ModePerm)},
- "/hooks/1/pre-receive": {
- Mode: umask.Mask(fs.ModePerm),
- Content: []byte("hook content"),
- },
- "/hooks/1/private-dir": {Mode: umask.Mask(fs.ModeDir | perm.PrivateDir)},
- "/hooks/1/private-dir/private-file": {Mode: umask.Mask(perm.PrivateFile), Content: []byte("private content")},
},
Repositories: RepositoryStates{},
},
@@ -4339,13 +4258,7 @@ func TestTransactionManager(t *testing.T) {
transaction, err := transactionManager.Begin(beginCtx, step.TransactionOptions)
require.Equal(t, step.ExpectedError, err)
if err == nil {
- expectedSnapshot := step.ExpectedSnapshot
- expectedSnapshot.CustomHookPath = filepath.Join(repoPath, repoutil.CustomHooksDir)
- if expectedSnapshot.CustomHookIndex > 0 {
- expectedSnapshot.CustomHookPath = customHookPathForLogIndex(repoPath, expectedSnapshot.CustomHookIndex)
- }
-
- require.Equal(t, expectedSnapshot, transaction.Snapshot())
+ require.Equal(t, step.ExpectedSnapshot, transaction.Snapshot())
}
if step.TransactionOptions.ReadOnly {
@@ -4505,9 +4418,8 @@ func TestTransactionManager(t *testing.T) {
// Set the base state as the default so we don't have to repeat it in every test case but it
// gets asserted.
expectedDirectory = testhelper.DirectoryState{
- "/": {Mode: fs.ModeDir | perm.PrivateDir},
- "/wal": {Mode: fs.ModeDir | perm.PrivateDir},
- "/hooks": {Mode: fs.ModeDir | perm.PrivateDir},
+ "/": {Mode: fs.ModeDir | perm.PrivateDir},
+ "/wal": {Mode: fs.ModeDir | perm.PrivateDir},
}
}