@@ -27,12 +27,12 @@ import (
27
27
"github.com/hyperledger/fabric/core/ledger/history"
28
28
"github.com/hyperledger/fabric/core/ledger/kvledger/txmgmt/couchdbtxmgmt"
29
29
"github.com/hyperledger/fabric/core/ledger/kvledger/txmgmt/statedb/stateleveldb"
30
+ "github.com/hyperledger/fabric/core/ledger/kvledger/txmgmt/txmgr"
30
31
"github.com/hyperledger/fabric/core/ledger/kvledger/txmgmt/txmgr/lockbasedtxmgr"
31
32
"github.com/hyperledger/fabric/core/ledger/ledgerconfig"
32
33
33
34
logging "github.com/op/go-logging"
34
35
35
- "github.com/hyperledger/fabric/core/ledger/kvledger/txmgmt/txmgr"
36
36
"github.com/hyperledger/fabric/protos/common"
37
37
pb "github.com/hyperledger/fabric/protos/peer"
38
38
)
@@ -60,10 +60,9 @@ func NewConf(filesystemPath string, maxBlockfileSize int) *Conf {
60
60
// KVLedger provides an implementation of `ledger.ValidatedLedger`.
61
61
// This implementation provides a key-value based data model
62
62
type KVLedger struct {
63
- blockStore blkstorage.BlockStore
64
- txtmgmt txmgr.TxMgr
65
- historymgmt history.HistMgr
66
- pendingBlockToCommit * common.Block
63
+ blockStore blkstorage.BlockStore
64
+ txtmgmt txmgr.TxMgr
65
+ historymgmt history.HistMgr
67
66
}
68
67
69
68
// NewKVLedger constructs new `KVLedger`
@@ -114,10 +113,13 @@ func NewKVLedger(conf *Conf) (*KVLedger, error) {
114
113
couchDBDef .Username , //enter couchDB id here
115
114
couchDBDef .Password ) //enter couchDB pw here
116
115
}
117
- l := & KVLedger {blockStore , txmgmt , historymgmt , nil }
116
+
117
+ l := & KVLedger {blockStore , txmgmt , historymgmt }
118
+
118
119
if err := recoverStateDB (l ); err != nil {
119
120
panic (fmt .Errorf (`Error during state DB recovery:%s` , err ))
120
121
}
122
+
121
123
return l , nil
122
124
}
123
125
@@ -135,7 +137,7 @@ func recoverStateDB(l *KVLedger) error {
135
137
if savepointValue , err = l .txtmgmt .GetBlockNumFromSavepoint (); err != nil {
136
138
return err
137
139
}
138
- logger . Debugf ( "savepointValue=%d, info.Height=%d" , savepointValue , info . Height )
140
+
139
141
//Checking whether the savepointValue is in sync with block storage height
140
142
if savepointValue == info .Height {
141
143
return nil
@@ -145,19 +147,20 @@ func recoverStateDB(l *KVLedger) error {
145
147
146
148
//Compute updateSet for each missing savepoint and commit to state DB
147
149
for blockNumber := savepointValue + 1 ; blockNumber <= info .Height ; blockNumber ++ {
148
- if l .pendingBlockToCommit , err = l .GetBlockByNumber (blockNumber ); err != nil {
150
+ var block * common.Block
151
+ if block , err = l .GetBlockByNumber (blockNumber ); err != nil {
149
152
return err
150
153
}
151
154
logger .Debugf ("Constructing updateSet for the block %d" , blockNumber )
152
- if _ , _ , err = l .txtmgmt .ValidateAndPrepare (l . pendingBlockToCommit , false ); err != nil {
155
+ if err = l .txtmgmt .ValidateAndPrepare (block , false ); err != nil {
153
156
return err
154
157
}
155
158
logger .Debugf ("Committing block %d to state database" , blockNumber )
156
159
if err = l .txtmgmt .Commit (); err != nil {
157
160
return err
158
161
}
159
162
}
160
- l . pendingBlockToCommit = nil
163
+
161
164
return nil
162
165
}
163
166
@@ -208,54 +211,38 @@ func (l *KVLedger) NewQueryExecutor() (ledger.QueryExecutor, error) {
208
211
return l .txtmgmt .NewQueryExecutor ()
209
212
}
210
213
211
- // RemoveInvalidTransactionsAndPrepare validates all the transactions in the given block
212
- // and returns a block that contains only valid transactions and a list of transactions that are invalid
213
- func (l * KVLedger ) RemoveInvalidTransactionsAndPrepare (block * common.Block ) (* common.Block , []* pb.InvalidTransaction , error ) {
214
- var validBlock * common.Block
215
- var invalidTxs []* pb.InvalidTransaction
214
+ // Commit commits the valid block (returned in the method RemoveInvalidTransactionsAndPrepare) and related state changes
215
+ func (l * KVLedger ) Commit (block * common.Block ) error {
216
216
var err error
217
- validBlock , invalidTxs , err = l .txtmgmt .ValidateAndPrepare (block , true )
218
- if err == nil {
219
- l .pendingBlockToCommit = validBlock
220
- }
221
- return validBlock , invalidTxs , err
222
- }
223
217
224
- // Commit commits the valid block (returned in the method RemoveInvalidTransactionsAndPrepare) and related state changes
225
- func ( l * KVLedger ) Commit () error {
226
- if l . pendingBlockToCommit = = nil {
227
- panic ( fmt . Errorf ( `Nothing to commit. RemoveInvalidTransactionsAndPrepare() method should have been called and should not have thrown error` ))
218
+ logger . Debugf ( "Validating block" )
219
+ err = l . txtmgmt . ValidateAndPrepare ( block , true )
220
+ if err ! = nil {
221
+ return err
228
222
}
229
223
230
224
logger .Debugf ("Committing block to storage" )
231
- if err : = l .blockStore .AddBlock (l . pendingBlockToCommit ); err != nil {
225
+ if err = l .blockStore .AddBlock (block ); err != nil {
232
226
return err
233
227
}
234
228
235
229
logger .Debugf ("Committing block to state database" )
236
- if err : = l .txtmgmt .Commit (); err != nil {
230
+ if err = l .txtmgmt .Commit (); err != nil {
237
231
panic (fmt .Errorf (`Error during commit to txmgr:%s` , err ))
238
232
}
239
233
240
234
//TODO future will want to run async with state db writes. History needs to wait for chain (FSBlock) to write but not the state db
241
235
logger .Debugf ("===HISTORYDB=== Commit() will write to hisotry if enabled else will be by-passed if not enabled: vledgerconfig.IsHistoryDBEnabled(): %v\n " , ledgerconfig .IsHistoryDBEnabled ())
242
236
if ledgerconfig .IsHistoryDBEnabled () == true {
243
237
logger .Debugf ("Committing transactions to history database" )
244
- if err := l .historymgmt .Commit (l . pendingBlockToCommit ); err != nil {
238
+ if err := l .historymgmt .Commit (block ); err != nil {
245
239
panic (fmt .Errorf (`Error during commit to txthistory:%s` , err ))
246
240
}
247
241
}
248
242
249
- l .pendingBlockToCommit = nil
250
243
return nil
251
244
}
252
245
253
- // Rollback rollbacks the changes caused by the last invocation to method `RemoveInvalidTransactionsAndPrepare`
254
- func (l * KVLedger ) Rollback () {
255
- l .txtmgmt .Rollback ()
256
- l .pendingBlockToCommit = nil
257
- }
258
-
259
246
// Close closes `KVLedger`
260
247
func (l * KVLedger ) Close () {
261
248
l .blockStore .Shutdown ()
0 commit comments