Skip to content

Commit f0c43f7

Browse files
committed
Use a single leveldb for state maintainance
https://jira.hyperledger.org/browse/FAB-1543 Change-Id: Ib11d1a2fc14cf81dd5380eadf93e73e1c56113e3 Signed-off-by: manish <[email protected]>
1 parent 3e534de commit f0c43f7

29 files changed

+885
-197
lines changed

core/chaincode/configer_test.go

+3
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ import (
2828

2929
"github.com/golang/protobuf/proto"
3030
"github.com/hyperledger/fabric/core/chaincode/shim"
31+
"github.com/hyperledger/fabric/core/ledger/ledgermgmt"
3132
"github.com/hyperledger/fabric/core/peer"
3233
"github.com/hyperledger/fabric/gossip/service"
3334
"github.com/hyperledger/fabric/protos/common"
@@ -98,6 +99,8 @@ func TestConfigerInvokeJoinChainWrongParams(t *testing.T) {
9899
func TestConfigerInvokeJoinChainCorrectParams(t *testing.T) {
99100
//t.Skip("Test CI build")
100101
viper.Set("peer.fileSystemPath", "/var/hyperledger/test/")
102+
ledgermgmt.InitializeTestEnv()
103+
defer ledgermgmt.CleanupTestEnv()
101104
defer os.RemoveAll("/var/hyperledger/test/")
102105

103106
e := new(PeerConfiger)

core/chaincode/exectransaction_test.go

+2-1
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@ import (
3838

3939
"github.com/golang/protobuf/proto"
4040
"github.com/hyperledger/fabric/core/crypto/primitives"
41+
"github.com/hyperledger/fabric/core/ledger/ledgermgmt"
4142
"github.com/hyperledger/fabric/core/peer/msp"
4243
"github.com/hyperledger/fabric/msp"
4344
"github.com/hyperledger/fabric/protos/common"
@@ -114,7 +115,7 @@ func finitPeer(lis net.Listener, chainIDs ...string) {
114115
}
115116
closeListenerAndSleep(lis)
116117
}
117-
118+
ledgermgmt.CleanupTestEnv()
118119
ledgerPath := viper.GetString("peer.fileSystemPath")
119120
os.RemoveAll(ledgerPath)
120121
os.RemoveAll(filepath.Join(os.TempDir(), "hyperledger"))

core/committer/committer_test.go

+7-7
Original file line numberDiff line numberDiff line change
@@ -17,25 +17,25 @@ limitations under the License.
1717
package committer
1818

1919
import (
20-
"os"
2120
"testing"
2221

23-
"github.com/hyperledger/fabric/core/ledger/kvledger"
2422
"github.com/hyperledger/fabric/core/ledger/testutil"
23+
"github.com/spf13/viper"
2524
"github.com/stretchr/testify/assert"
2625

26+
"github.com/hyperledger/fabric/core/ledger/ledgermgmt"
2727
pb "github.com/hyperledger/fabric/protos/peer"
2828
)
2929

3030
func TestKVLedgerBlockStorage(t *testing.T) {
31-
conf := kvledger.NewConf("/tmp/tests/ledger/", 0)
32-
defer os.RemoveAll("/tmp/tests/ledger/")
33-
34-
ledger, _ := kvledger.NewKVLedger(conf)
31+
viper.Set("peer.fileSystemPath", "/tmp/fabric/committertest")
32+
ledgermgmt.InitializeTestEnv()
33+
defer ledgermgmt.CleanupTestEnv()
34+
ledger, err := ledgermgmt.CreateLedger("TestLedger")
35+
assert.NoError(t, err, "Error while creating ledger: %s", err)
3536
defer ledger.Close()
3637

3738
committer := NewLedgerCommitter(ledger)
38-
3939
height, err := committer.LedgerHeight()
4040
assert.Equal(t, uint64(0), height)
4141
assert.NoError(t, err)

core/committer/txvalidator/txvalidator_test.go

+6-6
Original file line numberDiff line numberDiff line change
@@ -17,14 +17,14 @@ limitations under the License.
1717
package txvalidator
1818

1919
import (
20-
"os"
2120
"testing"
2221

23-
"github.com/hyperledger/fabric/core/ledger/kvledger"
22+
"github.com/hyperledger/fabric/core/ledger/ledgermgmt"
2423
"github.com/hyperledger/fabric/core/ledger/testutil"
2524
"github.com/hyperledger/fabric/core/ledger/util"
2625
"github.com/hyperledger/fabric/protos/common"
2726
pb "github.com/hyperledger/fabric/protos/peer"
27+
"github.com/spf13/viper"
2828
"github.com/stretchr/testify/assert"
2929
)
3030

@@ -36,10 +36,10 @@ func (v *mockVsccValidator) VSCCValidateTx(payload *common.Payload, envBytes []b
3636
}
3737

3838
func TestKVLedgerBlockStorage(t *testing.T) {
39-
conf := kvledger.NewConf("/tmp/tests/ledger/", 0)
40-
defer os.RemoveAll("/tmp/tests/ledger/")
41-
42-
ledger, _ := kvledger.NewKVLedger(conf)
39+
viper.Set("peer.fileSystemPath", "/tmp/fabric/txvalidatortest")
40+
ledgermgmt.InitializeTestEnv()
41+
defer ledgermgmt.CleanupTestEnv()
42+
ledger, _ := ledgermgmt.CreateLedger("TestLedger")
4343
defer ledger.Close()
4444

4545
validator := &txValidator{ledger, &mockVsccValidator{}}

core/ledger/kvledger/example/main/example.go

+12-6
Original file line numberDiff line numberDiff line change
@@ -21,15 +21,16 @@ import (
2121
"os"
2222

2323
"github.com/hyperledger/fabric/core/ledger"
24-
"github.com/hyperledger/fabric/core/ledger/kvledger"
2524
"github.com/hyperledger/fabric/core/ledger/kvledger/example"
25+
"github.com/hyperledger/fabric/core/ledger/ledgerconfig"
26+
"github.com/hyperledger/fabric/core/ledger/ledgermgmt"
2627
"github.com/hyperledger/fabric/core/ledger/testutil"
2728
"github.com/hyperledger/fabric/core/ledger/util"
2829
"github.com/hyperledger/fabric/protos/common"
2930
)
3031

3132
const (
32-
ledgerPath = "/tmp/test/ledger/kvledger/example"
33+
ledgerID = "Default"
3334
)
3435

3536
var finalLedger ledger.ValidatedLedger
@@ -47,10 +48,10 @@ func init() {
4748
// Initialization will get a handle to the ledger at the specified path
4849
// Note, if subledgers are supported in the future,
4950
// the various ledgers could be created/managed at this level
50-
os.RemoveAll(ledgerPath)
51-
ledgerConf := kvledger.NewConf(ledgerPath, 0)
51+
cleanup()
52+
ledgermgmt.Initialize()
5253
var err error
53-
finalLedger, err = kvledger.NewKVLedger(ledgerConf)
54+
finalLedger, err = ledgermgmt.CreateLedger(ledgerID)
5455
if err != nil {
5556
panic(fmt.Errorf("Error in NewKVLedger(): %s", err))
5657
}
@@ -60,7 +61,7 @@ func init() {
6061
}
6162

6263
func main() {
63-
defer finalLedger.Close()
64+
defer ledgermgmt.Close()
6465

6566
// Each of the functions here will emulate endorser, orderer,
6667
// and committer by calling ledger APIs to similate the proposal,
@@ -164,3 +165,8 @@ func handleError(err error, quit bool) {
164165
}
165166
}
166167
}
168+
169+
func cleanup() {
170+
ledgerRootPath := ledgerconfig.GetRootPath()
171+
os.RemoveAll(ledgerRootPath)
172+
}

core/ledger/kvledger/kv_ledger.go

+10-28
Original file line numberDiff line numberDiff line change
@@ -19,14 +19,13 @@ package kvledger
1919
import (
2020
"errors"
2121
"fmt"
22-
"strings"
2322

2423
"github.com/hyperledger/fabric/core/ledger"
2524
"github.com/hyperledger/fabric/core/ledger/blkstorage"
2625
"github.com/hyperledger/fabric/core/ledger/blkstorage/fsblkstorage"
2726
"github.com/hyperledger/fabric/core/ledger/history"
2827
"github.com/hyperledger/fabric/core/ledger/kvledger/txmgmt/couchdbtxmgmt"
29-
"github.com/hyperledger/fabric/core/ledger/kvledger/txmgmt/statedb/stateleveldb"
28+
"github.com/hyperledger/fabric/core/ledger/kvledger/txmgmt/statedb"
3029
"github.com/hyperledger/fabric/core/ledger/kvledger/txmgmt/txmgr"
3130
"github.com/hyperledger/fabric/core/ledger/kvledger/txmgmt/txmgr/lockbasedtxmgr"
3231
"github.com/hyperledger/fabric/core/ledger/ledgerconfig"
@@ -39,45 +38,28 @@ import (
3938

4039
var logger = logging.MustGetLogger("kvledger")
4140

42-
// Conf captures `KVLedger` configurations
43-
type Conf struct {
44-
blockStorageDir string
45-
maxBlockfileSize int
46-
txMgrDBPath string
47-
}
48-
49-
// NewConf constructs new `Conf`.
50-
// filesystemPath is the top level directory under which `KVLedger` manages its data
51-
func NewConf(filesystemPath string, maxBlockfileSize int) *Conf {
52-
if !strings.HasSuffix(filesystemPath, "/") {
53-
filesystemPath = filesystemPath + "/"
54-
}
55-
blocksStorageDir := filesystemPath + "blocks"
56-
txMgrDBPath := filesystemPath + "txMgmgt/db"
57-
return &Conf{blocksStorageDir, maxBlockfileSize, txMgrDBPath}
58-
}
59-
6041
// KVLedger provides an implementation of `ledger.ValidatedLedger`.
6142
// This implementation provides a key-value based data model
6243
type KVLedger struct {
44+
ledgerID string
6345
blockStore blkstorage.BlockStore
6446
txtmgmt txmgr.TxMgr
6547
historymgmt history.HistMgr
6648
}
6749

6850
// NewKVLedger constructs new `KVLedger`
69-
func NewKVLedger(conf *Conf) (*KVLedger, error) {
70-
71-
logger.Debugf("Creating KVLedger using config: ", conf)
72-
51+
func NewKVLedger(versionedDBProvider statedb.VersionedDBProvider, ledgerID string) (*KVLedger, error) {
52+
logger.Debugf("Creating KVLedger ledgerID=%s: ", ledgerID)
7353
attrsToIndex := []blkstorage.IndexableAttr{
7454
blkstorage.IndexableAttrBlockHash,
7555
blkstorage.IndexableAttrBlockNum,
7656
blkstorage.IndexableAttrTxID,
7757
blkstorage.IndexableAttrBlockNumTranNum,
7858
}
7959
indexConfig := &blkstorage.IndexConfig{AttrsToIndex: attrsToIndex}
80-
blockStorageConf := fsblkstorage.NewConf(conf.blockStorageDir, conf.maxBlockfileSize)
60+
61+
blockStorageDir := ledgerconfig.GetBlockStoragePath(ledgerID)
62+
blockStorageConf := fsblkstorage.NewConf(blockStorageDir, ledgerconfig.GetMaxBlockfileSize())
8163
blockStore := fsblkstorage.NewFsBlockStore(blockStorageConf, indexConfig)
8264

8365
//State and History database managers
@@ -91,14 +73,14 @@ func NewKVLedger(conf *Conf) (*KVLedger, error) {
9173
couchDBDef := ledgerconfig.GetCouchDBDefinition()
9274

9375
//create new transaction manager based on couchDB
94-
txmgmt = couchdbtxmgmt.NewCouchDBTxMgr(&couchdbtxmgmt.Conf{DBPath: conf.txMgrDBPath},
76+
txmgmt = couchdbtxmgmt.NewCouchDBTxMgr(&couchdbtxmgmt.Conf{DBPath: ""},
9577
couchDBDef.URL, //couchDB connection URL
9678
"system", //couchDB db name matches ledger name, TODO for now use system ledger, eventually allow passing in subledger name
9779
couchDBDef.Username, //enter couchDB id here
9880
couchDBDef.Password) //enter couchDB pw here
9981
} else {
10082
// Fall back to using goleveldb lockbased transaction manager
101-
db := stateleveldb.NewVersionedDBProvider(&stateleveldb.Conf{DBPath: conf.txMgrDBPath}).GetDBHandle("Default")
83+
db := versionedDBProvider.GetDBHandle(ledgerID)
10284
txmgmt = lockbasedtxmgr.NewLockBasedTxMgr(db)
10385
}
10486

@@ -114,7 +96,7 @@ func NewKVLedger(conf *Conf) (*KVLedger, error) {
11496
couchDBDef.Password) //enter couchDB pw here
11597
}
11698

117-
l := &KVLedger{blockStore, txmgmt, historymgmt}
99+
l := &KVLedger{ledgerID, blockStore, txmgmt, historymgmt}
118100

119101
if err := recoverStateDB(l); err != nil {
120102
panic(fmt.Errorf(`Error during state DB recovery:%s`, err))

0 commit comments

Comments
 (0)