From 623afb9646e7f978e5f8e3bbe8c6e22747c1cd99 Mon Sep 17 00:00:00 2001 From: andy-shi88 Date: Mon, 13 Apr 2020 14:36:43 +0800 Subject: [PATCH 1/4] immediately release rows after converted to model --- core/service/receiptService.go | 49 ++++++++++++++++------------------ 1 file changed, 23 insertions(+), 26 deletions(-) diff --git a/core/service/receiptService.go b/core/service/receiptService.go index 9e14343a9..d9b969b5c 100644 --- a/core/service/receiptService.go +++ b/core/service/receiptService.go @@ -98,6 +98,7 @@ func (rs *ReceiptService) SelectReceipts( pickedRecipients = make(map[string]bool) lowerBlockHeight uint32 linkedReceiptTree = make(map[string][]byte) + err error ) if numberOfReceipt < 1 { // possible no connected node @@ -108,38 +109,35 @@ func (rs *ReceiptService) SelectReceipts( lowerBlockHeight = lastBlockHeight - constant.MinRollbackBlocks } - err := func() error { + linkedReceiptTree, err = func() (map[string][]byte, error) { treeQ := rs.MerkleTreeQuery.SelectMerkleTree( lowerBlockHeight, lastBlockHeight, numberOfReceipt*constant.ReceiptBatchPickMultiplier) linkedTreeRows, err := rs.QueryExecutor.ExecuteSelect(treeQ, false) if err != nil { - return err + return linkedReceiptTree, err } defer linkedTreeRows.Close() - linkedReceiptTree, err = rs.MerkleTreeQuery.BuildTree(linkedTreeRows) - if err != nil { - return err - } - return nil + return rs.MerkleTreeQuery.BuildTree(linkedTreeRows) }() if err != nil { return nil, err } - for linkedRoot := range linkedReceiptTree { var nodeReceipts []*model.Receipt - nodeReceiptsQ, rootArgs := rs.NodeReceiptQuery.GetReceiptByRoot([]byte(linkedRoot)) - rows, err := rs.QueryExecutor.ExecuteSelect(nodeReceiptsQ, false, rootArgs...) - if err != nil { - return nil, err - } - nodeReceipts, err = rs.NodeReceiptQuery.BuildModel(nodeReceipts, rows) + nodeReceipts, err = func() ([]*model.Receipt, error) { + nodeReceiptsQ, rootArgs := rs.NodeReceiptQuery.GetReceiptByRoot([]byte(linkedRoot)) + rows, err := rs.QueryExecutor.ExecuteSelect(nodeReceiptsQ, false, rootArgs...) + if err != nil { + return nil, err + } + defer rows.Close() + return rs.NodeReceiptQuery.BuildModel(nodeReceipts, rows) + }() if err != nil { - rows.Close() return nil, err } for _, rc := range nodeReceipts { @@ -148,9 +146,6 @@ func (rs *ReceiptService) SelectReceipts( linkedReceiptList[linkedRoot] = append(linkedReceiptList[linkedRoot], rc) } } - if rows != nil { - rows.Close() - } } // limit the selected portion to `numberOfReceipt` receipts // filter the selected receipts on second phase @@ -210,14 +205,16 @@ func (rs *ReceiptService) pickReceipts( lowerBlockHeight, upperBlockHeight uint32, ) ([]*model.PublishedReceipt, error) { var receipts []*model.Receipt - receiptsQ := rs.NodeReceiptQuery.GetReceiptsWithUniqueRecipient( - numberOfReceipt*constant.ReceiptBatchPickMultiplier, lowerBlockHeight, upperBlockHeight) - rows, err := rs.QueryExecutor.ExecuteSelect(receiptsQ, false) - if err != nil { - return nil, err - } - defer rows.Close() - receipts, err = rs.NodeReceiptQuery.BuildModel(receipts, rows) + receipts, err := func() ([]*model.Receipt, error) { + receiptsQ := rs.NodeReceiptQuery.GetReceiptsWithUniqueRecipient( + numberOfReceipt*constant.ReceiptBatchPickMultiplier, lowerBlockHeight, upperBlockHeight) + rows, err := rs.QueryExecutor.ExecuteSelect(receiptsQ, false) + if err != nil { + return nil, err + } + defer rows.Close() + return rs.NodeReceiptQuery.BuildModel(receipts, rows) + }() if err != nil { return nil, err } From 79f71c70903dce240d10e9dd29f9ec15d6686a05 Mon Sep 17 00:00:00 2001 From: andy-shi88 Date: Mon, 13 Apr 2020 15:29:22 +0800 Subject: [PATCH 2/4] add unique index to published_receipt.datum_hash --- common/database/migration.go | 3 +++ 1 file changed, 3 insertions(+) diff --git a/common/database/migration.go b/common/database/migration.go index b71f6ce7f..fdc265c49 100644 --- a/common/database/migration.go +++ b/common/database/migration.go @@ -342,6 +342,9 @@ func (m *Migration) Init() error { ` CREATE INDEX "node_receipt_reference_block_height_idx" ON "node_receipt" ("reference_block_height") `, + ` + CREATE UNIQUE INDEX "published_receipt_datum_hash_idx" ON "published_receipt" ("published_receipt") + `, } return nil } From 26f34d90ce4152f1f305f1c6da38b982e8adb92b Mon Sep 17 00:00:00 2001 From: andy-shi88 Date: Mon, 13 Apr 2020 15:34:10 +0800 Subject: [PATCH 3/4] fix: wrong column name --- common/database/migration.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/common/database/migration.go b/common/database/migration.go index fdc265c49..34ddc76ab 100644 --- a/common/database/migration.go +++ b/common/database/migration.go @@ -343,7 +343,7 @@ func (m *Migration) Init() error { CREATE INDEX "node_receipt_reference_block_height_idx" ON "node_receipt" ("reference_block_height") `, ` - CREATE UNIQUE INDEX "published_receipt_datum_hash_idx" ON "published_receipt" ("published_receipt") + CREATE UNIQUE INDEX "published_receipt_datum_hash_idx" ON "published_receipt" ("datum_hash") `, } return nil From a4ffe4d1babb11288b365204283708d07242cd73 Mon Sep 17 00:00:00 2001 From: andy-shi88 Date: Mon, 13 Apr 2020 15:55:59 +0800 Subject: [PATCH 4/4] temporary fix, omit the unique --- common/database/migration.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/common/database/migration.go b/common/database/migration.go index 34ddc76ab..634e1af96 100644 --- a/common/database/migration.go +++ b/common/database/migration.go @@ -343,7 +343,7 @@ func (m *Migration) Init() error { CREATE INDEX "node_receipt_reference_block_height_idx" ON "node_receipt" ("reference_block_height") `, ` - CREATE UNIQUE INDEX "published_receipt_datum_hash_idx" ON "published_receipt" ("datum_hash") + CREATE INDEX "published_receipt_datum_hash_idx" ON "published_receipt" ("datum_hash") `, } return nil