Skip to content

Commit 7c9d934

Browse files
Two phase init was not passing smartContractGW to receipt store - meaning no WS receipts (#228)
Signed-off-by: Peter Broadhurst <[email protected]> Signed-off-by: Peter Broadhurst <[email protected]>
1 parent 0e6f5b0 commit 7c9d934

File tree

3 files changed

+48
-45
lines changed

3 files changed

+48
-45
lines changed

cmd/ethconnect.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -188,7 +188,7 @@ func startServer() (err error) {
188188
// In this scenario, we can pass the receipt store to the Kafka bridge for it to do
189189
// additional idempotency checks that prevent res-submission of transactions.
190190
if idempotencyCheckReceiptStore == nil {
191-
idempotencyCheckReceiptStore, err = restGateway.InitReceiptStore()
191+
idempotencyCheckReceiptStore, err = restGateway.Init()
192192
if err != nil {
193193
return err
194194
}

internal/rest/restgateway.go

Lines changed: 46 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -216,51 +216,11 @@ func (g *RESTGateway) newAccessTokenContextHandler(parent http.Handler) http.Han
216216
}
217217

218218
// ReceiptStorePersistence allows other components to access the receipt store persistence for idempotency checks, when co-located in the same address space
219-
func (g *RESTGateway) InitReceiptStore() (receipts.ReceiptStorePersistence, error) {
220-
var receiptStoreConf *receipts.ReceiptStoreConf
221-
var receiptStorePersistence receipts.ReceiptStorePersistence
222-
if g.conf.MongoDB.URL != "" {
223-
receiptStoreConf = &g.conf.MongoDB.ReceiptStoreConf
224-
mongoStore := receipts.NewMongoReceipts(&g.conf.MongoDB)
225-
receiptStorePersistence = mongoStore
226-
if err := mongoStore.Connect(); err != nil {
227-
return nil, err
228-
}
229-
} else if g.conf.LevelDB.Path != "" {
230-
receiptStoreConf = &g.conf.LevelDB.ReceiptStoreConf
231-
leveldbStore, err := receipts.NewLevelDBReceipts(&g.conf.LevelDB)
232-
if err != nil {
233-
return nil, err
234-
}
235-
receiptStorePersistence = leveldbStore
236-
} else {
237-
receiptStoreConf = &g.conf.MemStore
238-
memStore := receipts.NewMemoryReceipts(&g.conf.MemStore)
239-
receiptStorePersistence = memStore
240-
}
241-
g.receipts = newReceiptStore(receiptStoreConf, receiptStorePersistence, g.smartContractGW)
242-
return g.receipts.persistence, nil
243-
}
244-
245-
// Start kicks off the HTTP listener and router
246-
func (g *RESTGateway) Start() (err error) {
247-
248-
// Ensure the receipt store is initialized
249-
if g.receipts == nil {
250-
if _, err := g.InitReceiptStore(); err != nil {
251-
return err
252-
}
253-
}
254-
255-
if *g.printYAML {
256-
b, err := utils.MarshalToYAML(&g.conf)
257-
print("# YAML Configuration snippet for REST Gateway\n" + string(b))
258-
return err
259-
}
219+
func (g *RESTGateway) Init() (receipts.ReceiptStorePersistence, error) {
260220

261221
tlsConfig, err := utils.CreateTLSConfiguration(&g.conf.HTTP.TLS)
262222
if err != nil {
263-
return
223+
return nil, err
264224
}
265225

266226
router := httprouter.New()
@@ -270,7 +230,7 @@ func (g *RESTGateway) Start() (err error) {
270230
if g.conf.RPC.URL != "" || g.conf.OpenAPI.StoragePath != "" {
271231
rpcClient, err = eth.RPCConnect(&g.conf.RPC)
272232
if err != nil {
273-
return err
233+
return nil, err
274234
}
275235
processor = tx.NewTxnProcessor(&g.conf.TxnProcessorConf, &g.conf.RPCConf)
276236
processor.Init(rpcClient)
@@ -281,12 +241,35 @@ func (g *RESTGateway) Start() (err error) {
281241
if g.conf.OpenAPI.StoragePath != "" {
282242
g.smartContractGW, err = contractgateway.NewSmartContractGateway(&g.conf.OpenAPI, &g.conf.TxnProcessorConf, rpcClient, processor, g, g.ws)
283243
if err != nil {
284-
return err
244+
return nil, err
285245
}
286246
g.smartContractGW.AddRoutes(router)
287247
}
288248

249+
var receiptStoreConf *receipts.ReceiptStoreConf
250+
var receiptStorePersistence receipts.ReceiptStorePersistence
251+
if g.conf.MongoDB.URL != "" {
252+
receiptStoreConf = &g.conf.MongoDB.ReceiptStoreConf
253+
mongoStore := receipts.NewMongoReceipts(&g.conf.MongoDB)
254+
receiptStorePersistence = mongoStore
255+
if err := mongoStore.Connect(); err != nil {
256+
return nil, err
257+
}
258+
} else if g.conf.LevelDB.Path != "" {
259+
receiptStoreConf = &g.conf.LevelDB.ReceiptStoreConf
260+
leveldbStore, err := receipts.NewLevelDBReceipts(&g.conf.LevelDB)
261+
if err != nil {
262+
return nil, err
263+
}
264+
receiptStorePersistence = leveldbStore
265+
} else {
266+
receiptStoreConf = &g.conf.MemStore
267+
memStore := receipts.NewMemoryReceipts(&g.conf.MemStore)
268+
receiptStorePersistence = memStore
269+
}
270+
289271
router.GET("/status", g.statusHandler)
272+
g.receipts = newReceiptStore(receiptStoreConf, receiptStorePersistence, g.smartContractGW)
290273
g.receipts.addRoutes(router)
291274
if len(g.conf.Kafka.Brokers) > 0 {
292275
wk := newWebhooksKafka(&g.conf.Kafka, g.receipts)
@@ -304,6 +287,25 @@ func (g *RESTGateway) Start() (err error) {
304287
MaxHeaderBytes: MaxHeaderSize,
305288
}
306289

290+
return g.receipts.persistence, nil
291+
}
292+
293+
// Start kicks off the HTTP listener and router
294+
func (g *RESTGateway) Start() (err error) {
295+
296+
if *g.printYAML {
297+
b, err := utils.MarshalToYAML(&g.conf)
298+
print("# YAML Configuration snippet for REST Gateway\n" + string(b))
299+
return err
300+
}
301+
302+
// Check we're initialized (caller can choose to call init explicitly)
303+
if g.receipts == nil {
304+
if _, err = g.Init(); err != nil {
305+
return err
306+
}
307+
}
308+
307309
readyToListen := make(chan bool)
308310
gwDone := make(chan error)
309311
svrDone := make(chan error)

internal/ws/wsserver.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -217,6 +217,7 @@ func (s *webSocketServer) processReplies() {
217217
s.mux.Lock()
218218
wsconns := getConnListFromMap(s.replyMap)
219219
s.mux.Unlock()
220+
log.Debugf("Sending reply to %d WS connections", len(wsconns))
220221
s.broadcastToConnections(wsconns, message)
221222
}
222223
}

0 commit comments

Comments
 (0)