CommonStorageDB implements interface DB. This implementation uses a single database to maintain both the public and private data
type CommonStorageDB struct { statedb.VersionedDB // contains filtered or unexported fields }
func (s *CommonStorageDB) ApplyPrivacyAwareUpdates(updates *UpdateBatch, height *version.Height) error
ApplyPrivacyAwareUpdates implements corresponding function in interface DB
func (s *CommonStorageDB) ApplyUpdates(batch *statedb.UpdateBatch, height *version.Height) error
ApplyUpdates overrides the function in statedb.VersionedDB and throws appropriate error message Otherwise, somewhere in the code, usage of this function could lead to updating only public data.
func (s *CommonStorageDB) ChaincodeDeployDone(succeeded bool)
ChaincodeDeployDone is a noop for couchdb state impl
func (s *CommonStorageDB) ClearCachedVersions()
ClearCachedVersions implements corresponding function in interface DB
func (s CommonStorageDB) ExecuteQueryOnPrivateData(namespace, collection, query string) (statedb.ResultsIterator, error)
ExecuteQueryOnPrivateData implements corresponding function in interface DB
func (s *CommonStorageDB) GetCachedKeyHashVersion(namespace, collection string, keyHash []byte) (*version.Height, bool)
GetCachedKeyHashVersion retrieves the keyhash version from cache
func (s *CommonStorageDB) GetChaincodeEventListener() cceventmgmt.ChaincodeLifecycleEventListener
GetChaincodeEventListener implements corresponding function in interface DB
func (s *CommonStorageDB) GetKeyHashVersion(namespace, collection string, keyHash []byte) (*version.Height, error)
GetKeyHashVersion implements corresponding function in interface DB
func (s *CommonStorageDB) GetPrivateData(namespace, collection, key string) (*statedb.VersionedValue, error)
GetPrivateData implements corresponding function in interface DB
func (s *CommonStorageDB) GetPrivateDataMetadataByHash(namespace, collection string, keyHash []byte) ([]byte, error)
GetPrivateDataMetadataByHash implements corresponding function in interface DB. For additional details, see description of the similar function 'GetStateMetadata'
func (s *CommonStorageDB) GetPrivateDataMultipleKeys(namespace, collection string, keys []string) ([]*statedb.VersionedValue, error)
GetPrivateDataMultipleKeys implements corresponding function in interface DB
func (s *CommonStorageDB) GetPrivateDataRangeScanIterator(namespace, collection, startKey, endKey string) (statedb.ResultsIterator, error)
GetPrivateDataRangeScanIterator implements corresponding function in interface DB
func (s *CommonStorageDB) GetStateMetadata(namespace, key string) ([]byte, error)
GetStateMetadata implements corresponding function in interface DB. This implementation provides an optimization such that it keeps track if a namespaces has never stored metadata for any of its items, the value 'nil' is returned without going to the db. This is intended to be invoked in the validation and commit path. This saves the chaincodes from paying unnecessary performance penalty if they do not use features that leverage metadata (such as key-level endorsement),
func (s *CommonStorageDB) GetValueHash(namespace, collection string, keyHash []byte) (*statedb.VersionedValue, error)
GetValueHash implements corresponding function in interface DB
func (s *CommonStorageDB) HandleChaincodeDeploy(chaincodeDefinition *cceventmgmt.ChaincodeDefinition, dbArtifactsTar []byte) error
HandleChaincodeDeploy initializes database artifacts for the database associated with the namespace This function deliberately suppresses the errors that occur during the creation of the indexes on couchdb. This is because, in the present code, we do not differentiate between the errors because of couchdb interaction and the errors because of bad index files - the later being unfixable by the admin. Note that the error suppression is acceptable since peer can continue in the committing role without the indexes. However, executing chaincode queries may be affected, until a new chaincode with fixed indexes is installed and instantiated
func (s *CommonStorageDB) IsBulkOptimizable() bool
IsBulkOptimizable implements corresponding function in interface DB
func (s *CommonStorageDB) LoadCommittedVersionsOfPubAndHashedKeys(pubKeys []*statedb.CompositeKey, hashedKeys []*HashedCompositeKey) error
LoadCommittedVersionsOfPubAndHashedKeys implements corresponding function in interface DB
CommonStorageDBProvider implements interface DBProvider
type CommonStorageDBProvider struct { statedb.VersionedDBProvider HealthCheckRegistry ledger.HealthCheckRegistry // contains filtered or unexported fields }
func (p *CommonStorageDBProvider) Close()
Close implements function from interface DBProvider
func (p *CommonStorageDBProvider) GetDBHandle(id string) (DB, error)
GetDBHandle implements function from interface DBProvider
func (p *CommonStorageDBProvider) RegisterHealthChecker() error
CouchDBCommonStorageTestEnv implements TestEnv interface for couchdb based storage
type CouchDBCommonStorageTestEnv struct {
// contains filtered or unexported fields
}
func (env *CouchDBCommonStorageTestEnv) Cleanup()
Cleanup implements corresponding function from interface TestEnv
func (env *CouchDBCommonStorageTestEnv) GetDBHandle(id string) DB
GetDBHandle implements corresponding function from interface TestEnv
func (env *CouchDBCommonStorageTestEnv) GetName() string
GetName implements corresponding function from interface TestEnv
func (env *CouchDBCommonStorageTestEnv) Init(t testing.TB)
Init implements corresponding function from interface TestEnv
DB extends VersionedDB interface. This interface provides additional functions for managing private data state
type DB interface { statedb.VersionedDB IsBulkOptimizable() bool LoadCommittedVersionsOfPubAndHashedKeys(pubKeys []*statedb.CompositeKey, hashedKeys []*HashedCompositeKey) error GetCachedKeyHashVersion(namespace, collection string, keyHash []byte) (*version.Height, bool) ClearCachedVersions() GetChaincodeEventListener() cceventmgmt.ChaincodeLifecycleEventListener GetPrivateData(namespace, collection, key string) (*statedb.VersionedValue, error) GetValueHash(namespace, collection string, keyHash []byte) (*statedb.VersionedValue, error) GetKeyHashVersion(namespace, collection string, keyHash []byte) (*version.Height, error) GetPrivateDataMultipleKeys(namespace, collection string, keys []string) ([]*statedb.VersionedValue, error) GetPrivateDataRangeScanIterator(namespace, collection, startKey, endKey string) (statedb.ResultsIterator, error) GetStateMetadata(namespace, key string) ([]byte, error) GetPrivateDataMetadataByHash(namespace, collection string, keyHash []byte) ([]byte, error) ExecuteQueryOnPrivateData(namespace, collection, query string) (statedb.ResultsIterator, error) ApplyPrivacyAwareUpdates(updates *UpdateBatch, height *version.Height) error }
func NewCommonStorageDB(vdb statedb.VersionedDB, ledgerid string, metadataHint *metadataHint) (DB, error)
NewCommonStorageDB wraps a VersionedDB instance. The public data is managed directly by the wrapped versionedDB. For managing the hashed data and private data, this implementation creates separate namespaces in the wrapped db
DBProvider provides handle to a PvtVersionedDB
type DBProvider interface { // GetDBHandle returns a handle to a PvtVersionedDB GetDBHandle(id string) (DB, error) // Close closes all the PvtVersionedDB instances and releases any resources held by VersionedDBProvider Close() }
func NewCommonStorageDBProvider(bookkeeperProvider bookkeeping.Provider, metricsProvider metrics.Provider, healthCheckRegistry ledger.HealthCheckRegistry) (DBProvider, error)
NewCommonStorageDBProvider constructs an instance of DBProvider
HashedCompositeKey encloses Namespace, CollectionName and KeyHash components
type HashedCompositeKey struct { Namespace string CollectionName string KeyHash string }
func (hck *HashedCompositeKey) String() string
String returns a print friendly form of HashedCompositeKey
HashedUpdateBatch contains updates for the hashes of the private data
type HashedUpdateBatch struct { UpdateMap }
func NewHashedUpdateBatch() *HashedUpdateBatch
NewHashedUpdateBatch creates an empty HashedUpdateBatch
func (h HashedUpdateBatch) Contains(ns, coll string, keyHash []byte) bool
Contains returns true if the given <ns,coll,keyHash> tuple is present in the batch
func (h HashedUpdateBatch) Delete(ns, coll string, key []byte, version *version.Height)
Delete overrides the function in UpdateMap for allowing the key to be a []byte instead of a string
func (h HashedUpdateBatch) Put(ns, coll string, key []byte, value []byte, version *version.Height)
Put overrides the function in UpdateMap for allowing the key to be a []byte instead of a string
func (h HashedUpdateBatch) PutValHashAndMetadata(ns, coll string, key []byte, value []byte, metadata []byte, version *version.Height)
PutValHashAndMetadata adds a key with value and metadata TODO introducing a new function to limit the refactoring. Later in a separate CR, the 'Put' function above should be removed
func (h HashedUpdateBatch) ToCompositeKeyMap() map[HashedCompositeKey]*statedb.VersionedValue
ToCompositeKeyMap rearranges the update batch data in the form of a single map
type KVWriteProto struct { Namespace string `protobuf:"bytes,1,opt,name=namespace,proto3" json:"namespace,omitempty"` Collection string `protobuf:"bytes,2,opt,name=collection,proto3" json:"collection,omitempty"` Key []byte `protobuf:"bytes,3,opt,name=key,proto3" json:"key,omitempty"` IsDelete bool `protobuf:"varint,4,opt,name=isDelete,proto3" json:"isDelete,omitempty"` Value []byte `protobuf:"bytes,5,opt,name=value,proto3" json:"value,omitempty"` VersionBytes []byte `protobuf:"bytes,6,opt,name=version_bytes,json=versionBytes,proto3" json:"version_bytes,omitempty"` XXX_NoUnkeyedLiteral struct{} `json:"-"` XXX_unrecognized []byte `json:"-"` XXX_sizecache int32 `json:"-"` }
func (*KVWriteProto) Descriptor() ([]byte, []int)
func (m *KVWriteProto) GetCollection() string
func (m *KVWriteProto) GetIsDelete() bool
func (m *KVWriteProto) GetKey() []byte
func (m *KVWriteProto) GetNamespace() string
func (m *KVWriteProto) GetValue() []byte
func (m *KVWriteProto) GetVersionBytes() []byte
func (*KVWriteProto) ProtoMessage()
func (m *KVWriteProto) Reset()
func (m *KVWriteProto) String() string
func (m *KVWriteProto) XXX_DiscardUnknown()
func (m *KVWriteProto) XXX_Marshal(b []byte, deterministic bool) ([]byte, error)
func (dst *KVWriteProto) XXX_Merge(src proto.Message)
func (m *KVWriteProto) XXX_Size() int
func (m *KVWriteProto) XXX_Unmarshal(b []byte) error
type KVWritesBatchProto struct { Kvwrites []*KVWriteProto `protobuf:"bytes,1,rep,name=kvwrites,proto3" json:"kvwrites,omitempty"` XXX_NoUnkeyedLiteral struct{} `json:"-"` XXX_unrecognized []byte `json:"-"` XXX_sizecache int32 `json:"-"` }
func (*KVWritesBatchProto) Descriptor() ([]byte, []int)
func (m *KVWritesBatchProto) GetKvwrites() []*KVWriteProto
func (*KVWritesBatchProto) ProtoMessage()
func (m *KVWritesBatchProto) Reset()
func (m *KVWritesBatchProto) String() string
func (m *KVWritesBatchProto) XXX_DiscardUnknown()
func (m *KVWritesBatchProto) XXX_Marshal(b []byte, deterministic bool) ([]byte, error)
func (dst *KVWritesBatchProto) XXX_Merge(src proto.Message)
func (m *KVWritesBatchProto) XXX_Size() int
func (m *KVWritesBatchProto) XXX_Unmarshal(b []byte) error
LevelDBCommonStorageTestEnv implements TestEnv interface for leveldb based storage
type LevelDBCommonStorageTestEnv struct {
// contains filtered or unexported fields
}
func (env *LevelDBCommonStorageTestEnv) Cleanup()
Cleanup implements corresponding function from interface TestEnv
func (env *LevelDBCommonStorageTestEnv) GetDBHandle(id string) DB
GetDBHandle implements corresponding function from interface TestEnv
func (env *LevelDBCommonStorageTestEnv) GetName() string
GetName implements corresponding function from interface TestEnv
func (env *LevelDBCommonStorageTestEnv) Init(t testing.TB)
Init implements corresponding function from interface TestEnv
PubUpdateBatch contains update for the public data
type PubUpdateBatch struct { *statedb.UpdateBatch }
func NewPubUpdateBatch() *PubUpdateBatch
NewPubUpdateBatch creates an empty PubUpdateBatch
PvtKVWrite encloses Key, IsDelete, Value, and Version components
type PvtKVWrite struct { Key string IsDelete bool Value []byte Version *version.Height }
PvtUpdateBatch contains updates for the private data
type PvtUpdateBatch struct { UpdateMap }
func NewPvtUpdateBatch() *PvtUpdateBatch
NewPvtUpdateBatch creates an empty PvtUpdateBatch
func (p PvtUpdateBatch) ToCompositeKeyMap() PvtdataCompositeKeyMap
ToCompositeKeyMap rearranges the update batch data in the form of a single map
PvtdataCompositeKey encloses Namespace, CollectionName and Key components
type PvtdataCompositeKey struct { Namespace string CollectionName string Key string }
PvtdataCompositeKeyMap is a map of PvtdataCompositeKey to VersionedValue
type PvtdataCompositeKeyMap map[PvtdataCompositeKey]*statedb.VersionedValue
TestEnv - an interface that a test environment implements
type TestEnv interface { Init(t testing.TB) GetDBHandle(id string) DB GetName() string Cleanup() }
UpdateBatch encapsulates the updates to Public, Private, and Hashed data. This is expected to contain a consistent set of updates
type UpdateBatch struct { PubUpdates *PubUpdateBatch HashUpdates *HashedUpdateBatch PvtUpdates *PvtUpdateBatch }
func NewUpdateBatch() *UpdateBatch
NewUpdateBatch creates and empty UpdateBatch
UpdateMap maintains entries of tuple <Namespace, UpdatesForNamespace>
type UpdateMap map[string]nsBatch
func (b UpdateMap) Contains(ns, coll, key string) bool
Contains returns true if the given <ns,coll,key> tuple is present in the batch
func (b UpdateMap) Delete(ns, coll, key string, version *version.Height)
Delete adds a delete marker in the batch for a given combination of namespace and collection name
func (b UpdateMap) Get(ns, coll, key string) *statedb.VersionedValue
Get retrieves the value from the batch for a given combination of namespace and collection name
func (b UpdateMap) IsEmpty() bool
IsEmpty returns true if there exists any updates
func (b UpdateMap) Put(ns, coll, key string, value []byte, version *version.Height)
Put sets the value in the batch for a given combination of namespace and collection name
func (b UpdateMap) PutValAndMetadata(ns, coll, key string, value []byte, metadata []byte, version *version.Height)
PutValAndMetadata adds a key with value and metadata
type UpdatesBytesBuilder struct { }
func (bb *UpdatesBytesBuilder) DeterministicBytesForPubAndHashUpdates(u *UpdateBatch) ([]byte, error)
DeterministicBytesForPubAndHashUpdates constructs the bytes for a given UpdateBatch while constructing the bytes, it considers only public writes and hashed writes for the collections. For achieving the determinism, it constructs a slice of proto messages of type 'KVWriteProto'. In the slice, all the writes for a namespace "ns1" appear before the writes for another namespace "ns2" if "ns1" < "ns2" (lexicographically). Within a namespace, all the public writes appear before the collection writes. Like namespaces, the collections writes within a namespace appear in the order of lexicographical order. If an entry has the same namespace as its preceding entry, the namespace field is skipped. A Similar treatment is given to the repetitive entries for a collection within a namespace. For illustration, see the corresponding unit tests