3795cc2bd2
This paves the way for better object lifetime management. Concretely, it makes it possible to: - have different stores backing chain and state data. - having the same datastore library, but using different parameters. - attach different caching layers/policies to each class of data, e.g. sizing caches differently. - specifying different retention policies for chain and state data. This separation is important because: - access patterns/frequency of chain and state data are different. - state is derivable from chain, so one could never expunge the chain store, and only retain state objects reachable from the last finality in the state store.
94 lines
3.0 KiB
Go
94 lines
3.0 KiB
Go
package repo
|
|
|
|
import (
|
|
"context"
|
|
"errors"
|
|
|
|
"github.com/ipfs/go-datastore"
|
|
"github.com/multiformats/go-multiaddr"
|
|
|
|
"github.com/filecoin-project/lotus/blockstore"
|
|
"github.com/filecoin-project/lotus/extern/sector-storage/fsutil"
|
|
"github.com/filecoin-project/lotus/extern/sector-storage/stores"
|
|
|
|
"github.com/filecoin-project/lotus/chain/types"
|
|
)
|
|
|
|
// BlockstoreDomain represents the domain of a blockstore.
|
|
type BlockstoreDomain string
|
|
|
|
const (
|
|
// UniversalBlockstore represents the blockstore domain for all data.
|
|
// Right now, this includes chain objects (tipsets, blocks, messages), as
|
|
// well as state. In the future, they may get segregated into different
|
|
// domains.
|
|
UniversalBlockstore = BlockstoreDomain("universal")
|
|
)
|
|
|
|
var (
|
|
ErrNoAPIEndpoint = errors.New("API not running (no endpoint)")
|
|
ErrNoAPIToken = errors.New("API token not set")
|
|
ErrRepoAlreadyLocked = errors.New("repo is already locked (lotus daemon already running)")
|
|
ErrClosedRepo = errors.New("repo is no longer open")
|
|
|
|
// ErrInvalidBlockstoreDomain is returned by LockedRepo#Blockstore() when
|
|
// an unrecognized domain is requested.
|
|
ErrInvalidBlockstoreDomain = errors.New("invalid blockstore domain")
|
|
)
|
|
|
|
type Repo interface {
|
|
// APIEndpoint returns multiaddress for communication with Lotus API
|
|
APIEndpoint() (multiaddr.Multiaddr, error)
|
|
|
|
// APIToken returns JWT API Token for use in operations that require auth
|
|
APIToken() ([]byte, error)
|
|
|
|
// Lock locks the repo for exclusive use.
|
|
Lock(RepoType) (LockedRepo, error)
|
|
}
|
|
|
|
type LockedRepo interface {
|
|
// Close closes repo and removes lock.
|
|
Close() error
|
|
|
|
// Returns datastore defined in this repo.
|
|
// The supplied context must only be used to initialize the datastore.
|
|
// The implementation should not retain the context for usage throughout
|
|
// the lifecycle.
|
|
Datastore(ctx context.Context, namespace string) (datastore.Batching, error)
|
|
|
|
// Blockstore returns an IPLD blockstore for the requested domain.
|
|
// The supplied context must only be used to initialize the blockstore.
|
|
// The implementation should not retain the context for usage throughout
|
|
// the lifecycle.
|
|
Blockstore(ctx context.Context, domain BlockstoreDomain) (blockstore.Blockstore, error)
|
|
|
|
// SplitstorePath returns the path for the SplitStore
|
|
SplitstorePath() (string, error)
|
|
|
|
// Returns config in this repo
|
|
Config() (interface{}, error)
|
|
SetConfig(func(interface{})) error
|
|
|
|
GetStorage() (stores.StorageConfig, error)
|
|
SetStorage(func(*stores.StorageConfig)) error
|
|
Stat(path string) (fsutil.FsStat, error)
|
|
DiskUsage(path string) (int64, error)
|
|
|
|
// SetAPIEndpoint sets the endpoint of the current API
|
|
// so it can be read by API clients
|
|
SetAPIEndpoint(multiaddr.Multiaddr) error
|
|
|
|
// SetAPIToken sets JWT API Token for CLI
|
|
SetAPIToken([]byte) error
|
|
|
|
// KeyStore returns store of private keys for Filecoin transactions
|
|
KeyStore() (types.KeyStore, error)
|
|
|
|
// Path returns absolute path of the repo
|
|
Path() string
|
|
|
|
// Readonly returns true if the repo is readonly
|
|
Readonly() bool
|
|
}
|