Skip to content

Commit f1b76c6

Browse files
Envelope store alternative implementation
Signed-off-by: Alexandros Filios <alexandros.filios@ibm.com>
1 parent cce77c6 commit f1b76c6

File tree

19 files changed

+307
-82
lines changed

19 files changed

+307
-82
lines changed

platform/fabric/sdk/dig/generic/providers.go

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -216,3 +216,21 @@ func NewMetadataStore(in struct {
216216
}
217217
return nil, errors.New("driver not found")
218218
}
219+
220+
func NewEnvelopeStore(in struct {
221+
dig.In
222+
KVS *kvs.KVS
223+
Config vdriver.ConfigService
224+
Drivers []dbdriver.NamedDriver `group:"db-drivers"`
225+
}) (driver.EnvelopeStore, error) {
226+
driverName := driver2.PersistenceType(utils.DefaultString(in.Config.GetString("fsc.envelope.persistence.type"), string(mem.MemoryPersistence)))
227+
if sdk.UnsupportedStores.Contains(driverName) {
228+
return services.NewKVSBasedEnvelopeStore(in.KVS), nil
229+
}
230+
for _, d := range in.Drivers {
231+
if d.Name == driverName {
232+
return services.NewDBBasedEnvelopeStore(d.Driver, "_default", in.Config)
233+
}
234+
}
235+
return nil, errors.New("driver not found")
236+
}

platform/fabric/sdk/dig/sdk.go

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,6 @@ import (
2626
"github.com/hyperledger-labs/fabric-smart-client/platform/fabric/sdk/dig/fns"
2727
generic2 "github.com/hyperledger-labs/fabric-smart-client/platform/fabric/sdk/dig/generic"
2828
finality2 "github.com/hyperledger-labs/fabric-smart-client/platform/fabric/sdk/finality"
29-
"github.com/hyperledger-labs/fabric-smart-client/platform/fabric/services"
3029
"github.com/hyperledger-labs/fabric-smart-client/platform/fabric/services/state"
3130
"github.com/hyperledger-labs/fabric-smart-client/platform/fabric/services/state/vault"
3231
"github.com/hyperledger-labs/fabric-smart-client/platform/view/core/endpoint"
@@ -73,7 +72,7 @@ func (p *SDK) Install() error {
7372
p.Container().Provide(generic2.NewEndorserTransactionHandlerProvider),
7473
p.Container().Provide(committer2.NewSerialDependencyResolver, dig.As(new(committer2.DependencyResolver))),
7574
p.Container().Provide(generic2.NewMetadataStore, dig.As(new(driver.MetadataStore))),
76-
p.Container().Provide(services.NewKVSBasedEnvelopeStore, dig.As(new(driver.EnvelopeStore))),
75+
p.Container().Provide(generic2.NewEnvelopeStore, dig.As(new(driver.EnvelopeStore))),
7776
p.Container().Provide(generic2.NewEndorseTxStore, dig.As(new(driver.EndorseTxStore))),
7877
)
7978
if err != nil {

platform/fabric/services/store.go

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,3 +41,7 @@ func NewDBBasedEndorseTxStore(dbDriver driver2.Driver, namespace string, cp db.C
4141
func NewDBBasedMetadataStore(dbDriver driver2.Driver, namespace string, cp db.Config) (driver.MetadataStore, error) {
4242
return metadata.NewWithConfig[driver.Key, driver.TransientMap](dbDriver, namespace, cp)
4343
}
44+
45+
func NewDBBasedEnvelopeStore(dbDriver driver2.Driver, namespace string, cp db.Config) (driver.EnvelopeStore, error) {
46+
return envelope.NewWithConfig[driver.Key](dbDriver, namespace, cp)
47+
}

platform/orion/sdk/dig/providers.go

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -55,3 +55,21 @@ func NewMetadataStore(in struct {
5555
}
5656
return nil, errors.New("driver not found")
5757
}
58+
59+
func NewEnvelopeStore(in struct {
60+
dig.In
61+
KVS *kvs.KVS
62+
Config driver.ConfigService
63+
Drivers []dbdriver.NamedDriver `group:"db-drivers"`
64+
}) (driver3.EnvelopeStore, error) {
65+
driverName := driver2.PersistenceType(utils.DefaultString(in.Config.GetString("fsc.envelope.persistence.type"), string(mem.MemoryPersistence)))
66+
if sdk.UnsupportedStores.Contains(driverName) {
67+
return services.NewKVSBasedEnvelopeStore(in.KVS), nil
68+
}
69+
for _, d := range in.Drivers {
70+
if d.Name == driverName {
71+
return services.NewDBBasedEnvelopeStore(d.Driver, "_default", in.Config)
72+
}
73+
}
74+
return nil, errors.New("driver not found")
75+
}

platform/orion/sdk/dig/sdk.go

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,6 @@ import (
2121
"github.com/hyperledger-labs/fabric-smart-client/platform/orion/core/generic"
2222
driver2 "github.com/hyperledger-labs/fabric-smart-client/platform/orion/driver"
2323
finality2 "github.com/hyperledger-labs/fabric-smart-client/platform/orion/sdk/finality"
24-
"github.com/hyperledger-labs/fabric-smart-client/platform/orion/services"
2524
"github.com/hyperledger-labs/fabric-smart-client/platform/view/driver"
2625
viewsdk "github.com/hyperledger-labs/fabric-smart-client/platform/view/sdk/dig"
2726
"github.com/hyperledger-labs/fabric-smart-client/platform/view/sdk/finality"
@@ -80,7 +79,7 @@ func (p *SDK) Install() error {
8079
p.Container().Provide(finality2.NewHandler, dig.Group("finality-handlers")),
8180
p.Container().Provide(NewMetadataStore, dig.As(new(driver2.MetadataStore))),
8281
p.Container().Provide(NewEndorseTxStore, dig.As(new(driver2.EndorseTxStore))),
83-
p.Container().Provide(services.NewKVSBasedEnvelopeStore, dig.As(new(driver2.EnvelopeStore))),
82+
p.Container().Provide(NewEnvelopeStore, dig.As(new(driver2.EnvelopeStore))),
8483
)
8584
if err != nil {
8685
return err

platform/orion/services/store.go

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,3 +39,7 @@ func NewDBBasedEndorseTxStore(dbDriver driver2.Driver, namespace string, cp db.C
3939
func NewDBBasedMetadataStore(dbDriver driver2.Driver, namespace string, cp db.Config) (driver.MetadataStore, error) {
4040
return metadata.NewWithConfig[driver.Key, driver.TransientMap](dbDriver, namespace, cp)
4141
}
42+
43+
func NewDBBasedEnvelopeStore(dbDriver driver2.Driver, namespace string, cp db.Config) (driver.EnvelopeStore, error) {
44+
return envelope.NewWithConfig[driver.Key](dbDriver, namespace, cp)
45+
}

platform/view/services/db/driver/badger/driver.go

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -84,3 +84,7 @@ func (d *Driver) NewEndorseTx(string, driver.Config) (driver.EndorseTxPersistenc
8484
func (d *Driver) NewMetadata(string, driver.Config) (driver.MetadataPersistence, error) {
8585
panic("not implemented")
8686
}
87+
88+
func (d *Driver) NewEnvelope(string, driver.Config) (driver.EnvelopePersistence, error) {
89+
panic("not implemented")
90+
}

platform/view/services/db/driver/driver.go

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,8 @@ type EndorseTxPersistence = driver.EndorseTxStore[string]
5555

5656
type MetadataPersistence = driver.MetadataStore[string, []byte]
5757

58+
type EnvelopePersistence = driver.EnvelopeStore[string]
59+
5860
type BasePersistence[V any, R any] interface {
5961
// SetState sets the given value for the given namespace, key, and version
6062
SetState(namespace driver.Namespace, key driver.PKey, value V) error
@@ -166,6 +168,8 @@ type Driver interface {
166168
NewEndorseTx(string, Config) (EndorseTxPersistence, error)
167169
// NewMetadata returns a new MetadataPersistence for the passed data source and config
168170
NewMetadata(string, Config) (MetadataPersistence, error)
171+
// NewEnvelope returns a new EnvelopePersistence for the passed data source and config
172+
NewEnvelope(string, Config) (EnvelopePersistence, error)
169173
}
170174

171175
type (

platform/view/services/db/driver/memory/driver.go

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -80,3 +80,7 @@ func (d *Driver) NewEndorseTx(string, driver.Config) (driver.EndorseTxPersistenc
8080
func (d *Driver) NewMetadata(string, driver.Config) (driver.MetadataPersistence, error) {
8181
return sql.NewPersistenceWithOpts(utils.GenerateUUIDOnlyLetters(), opts, sql.MetadataConstructors)
8282
}
83+
84+
func (d *Driver) NewEnvelope(string, driver.Config) (driver.EnvelopePersistence, error) {
85+
return sql.NewPersistenceWithOpts(utils.GenerateUUIDOnlyLetters(), opts, sql.EnvelopeConstructors)
86+
}

platform/view/services/db/driver/sql/common/endorsetx.go

Lines changed: 7 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -8,62 +8,30 @@ package common
88

99
import (
1010
"database/sql"
11-
"fmt"
1211

1312
"github.com/hyperledger-labs/fabric-smart-client/platform/view/services/db/driver"
14-
"github.com/pkg/errors"
1513
)
1614

1715
func NewEndorseTxPersistence(writeDB *sql.DB, readDB *sql.DB, table string, errorWrapper driver.SQLErrorWrapper, ci Interpreter) *EndorseTxPersistence {
18-
return &EndorseTxPersistence{
19-
table: table,
20-
errorWrapper: errorWrapper,
21-
readDB: readDB,
22-
writeDB: writeDB,
23-
ci: ci,
24-
}
16+
return &EndorseTxPersistence{p: newSimpleKeyDataPersistence(writeDB, readDB, table, errorWrapper, ci)}
2517
}
2618

2719
type EndorseTxPersistence struct {
28-
table string
29-
errorWrapper driver.SQLErrorWrapper
30-
readDB *sql.DB
31-
writeDB *sql.DB
32-
ci Interpreter
20+
p *simpleKeyDataPersistence
3321
}
3422

3523
func (db *EndorseTxPersistence) GetEndorseTx(key string) ([]byte, error) {
36-
where, params := Where(db.ci.Cmp("key", "=", key))
37-
query := fmt.Sprintf("SELECT data FROM %s %s", db.table, where)
38-
logger.Debug(query, params)
39-
40-
return QueryUnique[[]byte](db.readDB, query, params...)
24+
return db.p.GetData(key)
4125
}
4226

4327
func (db *EndorseTxPersistence) ExistsEndorseTx(key string) (bool, error) {
44-
data, err := db.GetEndorseTx(key)
45-
return len(data) > 0, err
28+
return db.p.ExistData(key)
4629
}
4730

48-
func (db *EndorseTxPersistence) PutEndorseTx(key string, etx []byte) error {
49-
query := fmt.Sprintf("INSERT INTO %s (key, data) VALUES ($1, $2)", db.table)
50-
logger.Debugf(query, key, len(etx))
51-
_, err := db.writeDB.Exec(query, key, etx)
52-
if err != nil && errors.Is(db.errorWrapper.WrapError(err), driver.UniqueKeyViolation) {
53-
logger.Warnf("Endorse TX [%s] already in db. Skipping...", key)
54-
return nil
55-
}
56-
if err != nil {
57-
return errors.Wrapf(err, "failed executing query [%s]", query)
58-
}
59-
logger.Debugf("Endorse TX [%s] registered", key)
60-
return nil
31+
func (db *EndorseTxPersistence) PutEndorseTx(key string, data []byte) error {
32+
return db.p.PutData(key, data)
6133
}
6234

6335
func (db *EndorseTxPersistence) CreateSchema() error {
64-
return InitSchema(db.writeDB, fmt.Sprintf(`
65-
CREATE TABLE IF NOT EXISTS %s (
66-
key TEXT NOT NULL PRIMARY KEY,
67-
data BYTEA NOT NULL
68-
);`, db.table))
36+
return db.p.CreateSchema()
6937
}

0 commit comments

Comments
 (0)