From 68139417ccc886bf8079b14005dfc4da4e8ddcb1 Mon Sep 17 00:00:00 2001 From: Jason Yellick Date: Tue, 22 Nov 2016 10:35:36 -0500 Subject: [PATCH] Expose ChainID for orderer common components The orderer components have been being slowly transformed to accomodate multiple chain IDs. However, in order to utilize these components in a true multi-chain system, their external APIs must expose their backing chain IDs. This changeset adds simple Getters for the chain ids associated with the configuration manager and the rawledgers. Change-Id: I5d2ad4f88975cd271b69f8aa38225c68499c18f2 Signed-off-by: Jason Yellick --- orderer/common/blockcutter/blockcutter_test.go | 4 ++++ orderer/common/broadcast/broadcast_test.go | 4 ++++ .../configfilter/configfilter_test.go | 4 ++++ orderer/common/configtx/configtx.go | 10 +++++++++- orderer/rawledger/fileledger/fileledger.go | 14 ++++++++++++++ orderer/rawledger/ramledger/ramledger.go | 15 +++++++++++++++ orderer/rawledger/rawledger.go | 3 +++ orderer/solo/consensus_test.go | 4 ++++ 8 files changed, 57 insertions(+), 1 deletion(-) diff --git a/orderer/common/blockcutter/blockcutter_test.go b/orderer/common/blockcutter/blockcutter_test.go index 1aea9704530..a4361a17bd4 100644 --- a/orderer/common/blockcutter/blockcutter_test.go +++ b/orderer/common/blockcutter/blockcutter_test.go @@ -42,6 +42,10 @@ func (mcm *mockConfigManager) Apply(message *cb.ConfigurationEnvelope) error { panic("Unimplemented") } +func (mcm *mockConfigManager) ChainID() []byte { + panic("Unimplemented") +} + type mockConfigFilter struct { manager configtx.Manager } diff --git a/orderer/common/broadcast/broadcast_test.go b/orderer/common/broadcast/broadcast_test.go index 41fd57597d9..a827e986ce0 100644 --- a/orderer/common/broadcast/broadcast_test.go +++ b/orderer/common/broadcast/broadcast_test.go @@ -57,6 +57,10 @@ func (mcm *mockConfigManager) Apply(message *cb.ConfigurationEnvelope) error { return mcm.applyErr } +func (mcm *mockConfigManager) ChainID() []byte { + panic("Unimplemented") +} + type mockConfigFilter struct { manager configtx.Manager } diff --git a/orderer/common/broadcastfilter/configfilter/configfilter_test.go b/orderer/common/broadcastfilter/configfilter/configfilter_test.go index 069760dd117..d83afa9d694 100644 --- a/orderer/common/broadcastfilter/configfilter/configfilter_test.go +++ b/orderer/common/broadcastfilter/configfilter/configfilter_test.go @@ -38,6 +38,10 @@ func (mcm *mockConfigManager) Apply(configtx *cb.ConfigurationEnvelope) error { return mcm.err } +func (mcm *mockConfigManager) ChainID() []byte { + panic("Unimplemented") +} + func TestForwardNonConfig(t *testing.T) { cf := New(&mockConfigManager{}) result := cf.Apply(&cb.Envelope{ diff --git a/orderer/common/configtx/configtx.go b/orderer/common/configtx/configtx.go index d94d2a98e6d..6e13cc34147 100644 --- a/orderer/common/configtx/configtx.go +++ b/orderer/common/configtx/configtx.go @@ -48,6 +48,9 @@ type Manager interface { // Validate attempts to validate a new configtx against the current config state Validate(configtx *cb.ConfigurationEnvelope) error + + // ChainID retrieves the chain ID associated with this manager + ChainID() []byte } // DefaultModificationPolicyID is the ID of the policy used when no other policy can be resolved, for instance when attempting to create a new config item @@ -81,7 +84,7 @@ func computeChainIDAndSequence(configtx *cb.ConfigurationEnvelope) ([]byte, uint item := &cb.ConfigurationItem{} err := proto.Unmarshal(signedItem.ConfigurationItem, item) if err != nil { - return nil, 0, err + return nil, 0, fmt.Errorf("Error unmarshaling signedItem.ConfigurationItem: %s", err) } if item.LastModified > m { @@ -295,3 +298,8 @@ func (cm *configurationManager) Apply(configtx *cb.ConfigurationEnvelope) error cm.commitHandlers() return nil } + +// ChainID retrieves the chain ID associated with this manager +func (cm *configurationManager) ChainID() []byte { + return cm.chainID +} diff --git a/orderer/rawledger/fileledger/fileledger.go b/orderer/rawledger/fileledger/fileledger.go index 53ae1df1dc4..81a9720e027 100644 --- a/orderer/rawledger/fileledger/fileledger.go +++ b/orderer/rawledger/fileledger/fileledger.go @@ -110,6 +110,20 @@ func New(directory string, systemGenesis *cb.Block) (rawledger.Factory, rawledge return flf, fl } +func (flf *fileLedgerFactory) ChainIDs() [][]byte { + flf.mutex.Lock() + defer flf.mutex.Unlock() + ids := make([][]byte, len(flf.ledgers)) + + i := 0 + for key := range flf.ledgers { + ids[i] = []byte(key) + i++ + } + + return ids +} + func (flf *fileLedgerFactory) GetOrCreate(chainID []byte) (rawledger.ReadWriter, error) { flf.mutex.Lock() defer flf.mutex.Unlock() diff --git a/orderer/rawledger/ramledger/ramledger.go b/orderer/rawledger/ramledger/ramledger.go index cfa696facca..9a25a2da6f5 100644 --- a/orderer/rawledger/ramledger/ramledger.go +++ b/orderer/rawledger/ramledger/ramledger.go @@ -95,6 +95,20 @@ func (rlf *ramLedgerFactory) GetOrCreate(chainID []byte) (rawledger.ReadWriter, return ch, nil } +func (rlf *ramLedgerFactory) ChainIDs() [][]byte { + rlf.mutex.Lock() + defer rlf.mutex.Unlock() + ids := make([][]byte, len(rlf.ledgers)) + + i := 0 + for key := range rlf.ledgers { + ids[i] = []byte(key) + i++ + } + + return ids +} + // newChain creates a new instance of the ram ledger for a chain func newChain(maxSize int) rawledger.ReadWriter { preGenesis := &cb.Block{ @@ -145,6 +159,7 @@ func (rl *ramLedger) Iterator(startType ab.SeekInfo_StartType, specified uint64) oldest := rl.oldest // Note the two +1's here is to accomodate the 'preGenesis' block of ^uint64(0) if specified+1 < oldest.block.Header.Number+1 || specified > rl.newest.block.Header.Number+1 { + logger.Debugf("Returning error iterator because specified seek was %d with oldest %d and newest %d", specified, rl.oldest.block.Header.Number, rl.newest.block.Header.Number) return &rawledger.NotFoundErrorIterator{}, 0 } diff --git a/orderer/rawledger/rawledger.go b/orderer/rawledger/rawledger.go index 9b48ffaebc5..af209c110fa 100644 --- a/orderer/rawledger/rawledger.go +++ b/orderer/rawledger/rawledger.go @@ -25,6 +25,9 @@ import ( type Factory interface { // GetOrCreate gets an existing ledger (if it exists) or creates it if it does not GetOrCreate(chainID []byte) (ReadWriter, error) + + // ChainIDs returns the chain IDs the Factory is aware of + ChainIDs() [][]byte } // Iterator is useful for a chain Reader to stream blocks as they are created diff --git a/orderer/solo/consensus_test.go b/orderer/solo/consensus_test.go index b790121b93f..0d48ad483a2 100644 --- a/orderer/solo/consensus_test.go +++ b/orderer/solo/consensus_test.go @@ -52,6 +52,10 @@ func (mcm *mockConfigManager) Apply(message *cb.ConfigurationEnvelope) error { return mcm.applyErr } +func (mcm *mockConfigManager) ChainID() []byte { + panic("Unimplemented") +} + type mockConfigFilter struct { manager configtx.Manager }