storage

package
v0.6.2 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Nov 1, 2018 License: Apache-2.0 Imports: 19 Imported by: 0

Documentation

Overview

Package storage contains ledger storage implementation on top of BadgerDB engine.

Index

Constants

This section is empty.

Variables

View Source
var (
	// ErrNotFound returns if record/index not found in storage.
	ErrNotFound = errors.New("storage object not found")

	// ErrConflictRetriesOver is returned if Update transaction fails on all retry attempts.
	ErrConflictRetriesOver = errors.New("transaction conflict retries limit exceeded")

	// ErrConflict is the alias for badger.ErrConflict.
	ErrConflict = badger.ErrConflict

	// ErrOverride is returned if SetRecord tries update existing record
	ErrOverride = errors.New("records override is forbidden")
)

Functions

This section is empty.

Types

type DB added in v0.0.6

type DB struct {
	// contains filtered or unexported fields
}

DB represents BadgerDB storage implementation.

func NewDB added in v0.0.6

func NewDB(conf configuration.Ledger, opts *badger.Options) (*DB, error)

NewDB returns storage.DB with BadgerDB instance initialized by opts. Creates database in provided dir or in current directory if dir parameter is empty.

func (*DB) AddPulse added in v0.6.0

func (db *DB) AddPulse(ctx context.Context, pulse core.Pulse) error

AddPulse saves new pulse data and updates index.

func (*DB) BeginTransaction added in v0.0.6

func (db *DB) BeginTransaction(update bool) *TransactionManager

BeginTransaction opens a new transaction. All methods called on returned transaction manager will persist changes only after success on "Commit" call.

func (*DB) Bootstrap added in v0.0.6

func (db *DB) Bootstrap(ctx context.Context) error

Bootstrap creates initial records in storage.

func (*DB) Close added in v0.0.6

func (db *DB) Close() error

Close wraps BadgerDB Close method.

From https://godoc.org/github.com/dgraph-io/badger#DB.Close: «It's crucial to call it to ensure all the pending updates make their way to disk. Calling DB.Close() multiple times is not safe and wouldcause panic.»

func (*DB) CreateDrop added in v0.6.0

func (db *DB) CreateDrop(ctx context.Context, pulse core.PulseNumber, prevHash []byte) (
	*jetdrop.JetDrop,
	[][]byte,
	error,
)

CreateDrop creates and stores jet drop for given pulse number.

Previous JetDrop hash should be provided. On success returns saved drop and slot records.

func (*DB) GenesisRef added in v0.6.0

func (db *DB) GenesisRef() *core.RecordRef

GenesisRef returns the genesis record reference.

Genesis record is the parent for all top-level records.

func (*DB) Get added in v0.0.6

func (db *DB) Get(key []byte) ([]byte, error)

Get wraps matching transaction manager method.

func (*DB) GetBadgerDB added in v0.6.1

func (db *DB) GetBadgerDB() *badger.DB

GetBadgerDB return badger.DB instance (for internal usage, like tests)

func (*DB) GetBlob added in v0.6.2

func (db *DB) GetBlob(ctx context.Context, id *core.RecordID) ([]byte, error)

GetBlob returns binary value stored by record ID.

func (*DB) GetDrop added in v0.0.6

func (db *DB) GetDrop(ctx context.Context, pulse core.PulseNumber) (*jetdrop.JetDrop, error)

GetDrop returns jet drop for a given pulse number.

func (*DB) GetLatestPulseNumber added in v0.6.0

func (db *DB) GetLatestPulseNumber(ctx context.Context) (core.PulseNumber, error)

GetLatestPulseNumber returns current pulse number.

func (*DB) GetObjectIndex added in v0.0.6

func (db *DB) GetObjectIndex(
	ctx context.Context,
	id *core.RecordID,
	forupdate bool,
) (*index.ObjectLifeline, error)

GetObjectIndex wraps matching transaction manager method.

func (*DB) GetPulse added in v0.6.0

func (db *DB) GetPulse(ctx context.Context, num core.PulseNumber) (*record.PulseRecord, error)

GetPulse returns pulse for provided pulse number.

func (*DB) GetRecord added in v0.0.6

func (db *DB) GetRecord(ctx context.Context, id *core.RecordID) (record.Record, error)

GetRecord wraps matching transaction manager method.

func (*DB) GetRequest added in v0.5.0

func (db *DB) GetRequest(ctx context.Context, id *core.RecordID) (record.Request, error)

GetRequest wraps matching transaction manager method.

func (*DB) Set added in v0.0.6

func (db *DB) Set(key, value []byte) error

Set wraps matching transaction manager method.

func (*DB) SetBlob added in v0.6.2

func (db *DB) SetBlob(ctx context.Context, pulseNumber core.PulseNumber, blob []byte) (*core.RecordID, error)

SetBlob saves binary value for provided pulse.

func (*DB) SetDrop added in v0.0.6

func (db *DB) SetDrop(ctx context.Context, drop *jetdrop.JetDrop) error

SetDrop saves provided JetDrop in db.

func (*DB) SetMessage added in v0.6.2

func (db *DB) SetMessage(pulseNumber core.PulseNumber, genericMessage core.Message) error

SetMessage persists message to the database

func (*DB) SetObjectIndex added in v0.0.6

func (db *DB) SetObjectIndex(
	ctx context.Context,
	id *core.RecordID,
	idx *index.ObjectLifeline,
) error

SetObjectIndex wraps matching transaction manager method.

func (*DB) SetRecord added in v0.0.6

func (db *DB) SetRecord(ctx context.Context, pulseNumber core.PulseNumber, rec record.Record) (*core.RecordID, error)

SetRecord wraps matching transaction manager method.

func (*DB) SetRecordBinary added in v0.6.0

func (db *DB) SetRecordBinary(key, rec []byte) error

SetRecordBinary saves binary record for specified key.

This method is used for data replication.

func (*DB) SetTxRetiries added in v0.0.6

func (db *DB) SetTxRetiries(n int)

SetTxRetiries sets number of retries on conflict in Update

func (*DB) Update added in v0.0.6

func (db *DB) Update(fn func(*TransactionManager) error) error

Update accepts transaction function and commits changes. All calls to received transaction manager will be consistent and written tp disk or an error will be returned.

func (*DB) View added in v0.0.6

func (db *DB) View(fn func(*TransactionManager) error) error

View accepts transaction function. All calls to received transaction manager will be consistent.

type IDLocker added in v0.6.0

type IDLocker struct {
	// contains filtered or unexported fields
}

IDLocker provides Lock/Unlock methods per record ID.

TODO: for further optimization we could use sync.Pool for mutexes.

func NewIDLocker added in v0.6.0

func NewIDLocker() *IDLocker

NewIDLocker creates new initialized IDLocker.

func (*IDLocker) Lock added in v0.6.0

func (l *IDLocker) Lock(id *core.RecordID)

Lock locks mutex belonged to record ID. If mutex does not exist, it will be created in concurrent safe fashion.

func (*IDLocker) Unlock added in v0.6.0

func (l *IDLocker) Unlock(id *core.RecordID)

Unlock unlocks mutex belonged to record ID.

type Store added in v0.0.5

type Store interface {
	GetRecord(ctx context.Context, ref *core.RecordID) (record.Record, error)
	SetRecord(ctx context.Context, pulseNumber core.PulseNumber, rec record.Record) (*core.RecordID, error)
	GetBlob(ctx context.Context, ref *core.RecordID) ([]byte, error)
	SetBlob(ctx context.Context, number core.PulseNumber, blob []byte) (*core.RecordID, error)
	GetObjectIndex(ctx context.Context, ref *core.RecordID, forupdate bool) (*index.ObjectLifeline, error)
	SetObjectIndex(ctx context.Context, ref *core.RecordID, idx *index.ObjectLifeline) error
	GetLatestPulseNumber(ctx context.Context) (core.PulseNumber, error)
}

Store is used by context unaware clients who can work inside transactions as well as outside.

type TransactionManager added in v0.0.6

type TransactionManager struct {
	// contains filtered or unexported fields
}

TransactionManager is used to ensure persistent writes to disk.

func (*TransactionManager) Commit added in v0.0.6

func (m *TransactionManager) Commit() error

Commit tries to write transaction on disk. Returns error on fail.

func (*TransactionManager) Discard added in v0.0.6

func (m *TransactionManager) Discard()

Discard terminates transaction without disk writes.

func (*TransactionManager) Get added in v0.0.6

func (m *TransactionManager) Get(key []byte) ([]byte, error)

Get returns value by key.

func (*TransactionManager) GetBlob added in v0.6.2

func (m *TransactionManager) GetBlob(ctx context.Context, id *core.RecordID) ([]byte, error)

GetBlob returns binary value stored by record ID.

func (*TransactionManager) GetLatestPulseNumber added in v0.6.0

func (m *TransactionManager) GetLatestPulseNumber(ctx context.Context) (core.PulseNumber, error)

GetLatestPulseNumber returns current pulse number.

func (*TransactionManager) GetObjectIndex added in v0.0.6

func (m *TransactionManager) GetObjectIndex(
	ctx context.Context,
	id *core.RecordID,
	forupdate bool,
) (*index.ObjectLifeline, error)

GetObjectIndex fetches object lifeline index.

func (*TransactionManager) GetRecord added in v0.0.6

func (m *TransactionManager) GetRecord(ctx context.Context, id *core.RecordID) (record.Record, error)

GetRecord returns record from BadgerDB by *record.Reference.

It returns ErrNotFound if the DB does not contain the key.

func (*TransactionManager) GetRequest added in v0.5.0

func (m *TransactionManager) GetRequest(ctx context.Context, id *core.RecordID) (record.Request, error)

GetRequest returns request record from BadgerDB by *record.Reference.

It returns ErrNotFound if the DB does not contain the key.

func (*TransactionManager) Set added in v0.0.6

func (m *TransactionManager) Set(key, value []byte) error

Set stores value by key.

func (*TransactionManager) SetBlob added in v0.6.2

func (m *TransactionManager) SetBlob(ctx context.Context, pulseNumber core.PulseNumber, blob []byte) (*core.RecordID, error)

SetBlob saves binary value for provided pulse.

func (*TransactionManager) SetObjectIndex added in v0.0.6

func (m *TransactionManager) SetObjectIndex(
	ctx context.Context,
	id *core.RecordID,
	idx *index.ObjectLifeline,
) error

SetObjectIndex stores object lifeline index.

func (*TransactionManager) SetRecord added in v0.0.6

func (m *TransactionManager) SetRecord(ctx context.Context, pulseNumber core.PulseNumber, rec record.Record) (*core.RecordID, error)

SetRecord stores record in BadgerDB and returns *record.ID of new record.

If record exists returns both *record.ID and ErrOverride error. If record not found returns nil and ErrNotFound error

Directories

Path Synopsis
Package storagetest contains high level API tests and test utils for other modules.
Package storagetest contains high level API tests and test utils for other modules.

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL