diff options
author | Sami Hiltunen <shiltunen@gitlab.com> | 2023-01-17 13:48:18 +0300 |
---|---|---|
committer | Sami Hiltunen <shiltunen@gitlab.com> | 2023-01-17 13:48:18 +0300 |
commit | 7e80ece2ebfd82776285c83362e6874dacb5b26a (patch) | |
tree | 9743724ec61b44c8e0c768eaeea90603f3ab4ae2 /internal/gitaly/database.go | |
parent | 60e00c9b19ab28605c0b80931683feddcc62d971 (diff) | |
parent | 8a29ef51192cc57770dcd7966d9af8173eb7ff4d (diff) |
Merge branch 'smh-log-worker' into 'master'
Implement basic transaction management with write-ahead logging
See merge request https://gitlab.com/gitlab-org/gitaly/-/merge_requests/5020
Merged-by: Sami Hiltunen <shiltunen@gitlab.com>
Approved-by: Quang-Minh Nguyen <qmnguyen@gitlab.com>
Approved-by: Patrick Steinhardt <psteinhardt@gitlab.com>
Reviewed-by: Patrick Steinhardt <psteinhardt@gitlab.com>
Reviewed-by: Sami Hiltunen <shiltunen@gitlab.com>
Reviewed-by: Quang-Minh Nguyen <qmnguyen@gitlab.com>
Diffstat (limited to 'internal/gitaly/database.go')
-rw-r--r-- | internal/gitaly/database.go | 59 |
1 files changed, 59 insertions, 0 deletions
diff --git a/internal/gitaly/database.go b/internal/gitaly/database.go new file mode 100644 index 000000000..2015de710 --- /dev/null +++ b/internal/gitaly/database.go @@ -0,0 +1,59 @@ +package gitaly + +import ( + "github.com/dgraph-io/badger/v3" +) + +// OpenDatabase opens a new database handle to a database at the given path. +func OpenDatabase(databasePath string) (*badger.DB, error) { + dbOptions := badger.DefaultOptions(databasePath) + // Enable SyncWrites to ensure all writes are persisted to disk before considering + // them committed. + dbOptions.SyncWrites = true + // Badger by default logs fairly verbose statistics when opening a database. Disable the + // logging for now. + dbOptions.Logger = nil + + return badger.Open(dbOptions) +} + +// databaseAdapter adapts a *badger.DB to the internal database interface used by the hooks in tests. +type databaseAdapter struct{ *badger.DB } + +// newDatabaseAdapter adapts a *badger.DB to conform to the internal database interface used for +// hooking into during testing. +func newDatabaseAdapter(db *badger.DB) database { + return databaseAdapter{DB: db} +} + +// NewWriteBatch calls badger.*DB.NewWriteBatch. Refer to Badger's documentation for details. +func (db databaseAdapter) NewWriteBatch() writeBatch { + return db.DB.NewWriteBatch() +} + +// NewWriteBatch calls badger.*DB.View. Refer to Badger's documentation for details. +func (db databaseAdapter) View(handler func(databaseTransaction) error) error { + return db.DB.View(func(txn *badger.Txn) error { return handler(txn) }) +} + +// database is the Badger.DB interface used by TransactionManager. Refer to Badger's documentation +// for details. +type database interface { + NewWriteBatch() writeBatch + View(func(databaseTransaction) error) error +} + +// writeBatch is the interface of Badger.WriteBatch used by TransactionManager. Refer to Badger's +// documentation for details. +type writeBatch interface { + Set([]byte, []byte) error + Flush() error + Cancel() +} + +// databaseTransaction is the interface of *Badger.Txn used by TransactionManager. Refer to Badger's +// documentation for details +type databaseTransaction interface { + Get([]byte) (*badger.Item, error) + NewIterator(badger.IteratorOptions) *badger.Iterator +} |