Skip to content

Commit

Permalink
Merge changes from topic 'fab-2178-b'
Browse files Browse the repository at this point in the history
* changes:
  [FAB-2589] Clean up top-level orderer pkg
  [FAB-2588] Fix unkeyed fields in composite literal
  [FAB-2581] Fix if-else statements in deliver tests
  [FAB-2580] Fix return of unexported type
  [FAB-2579] Fix inconsistencies in ledger package
  • Loading branch information
christo4ferris authored and Gerrit Code Review committed Mar 6, 2017
2 parents 22d98b9 + 7f35ba5 commit ec1bbdf
Show file tree
Hide file tree
Showing 25 changed files with 596 additions and 537 deletions.
6 changes: 3 additions & 3 deletions orderer/common/deliver/deliver.go
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@ import (
"github.com/hyperledger/fabric/common/policies"
"github.com/hyperledger/fabric/orderer/common/filter"
"github.com/hyperledger/fabric/orderer/common/sigfilter"
ordererledger "github.com/hyperledger/fabric/orderer/ledger"
"github.com/hyperledger/fabric/orderer/ledger"
cb "github.com/hyperledger/fabric/protos/common"
ab "github.com/hyperledger/fabric/protos/orderer"
"github.com/op/go-logging"
Expand All @@ -50,7 +50,7 @@ type Support interface {
PolicyManager() policies.Manager

// Reader returns the chain Reader for the chain
Reader() ordererledger.Reader
Reader() ledger.Reader

// SharedConfig returns the shared config manager for this chain
SharedConfig() configvaluesapi.Orderer
Expand Down Expand Up @@ -83,7 +83,7 @@ func (ds *deliverServer) Handle(srv ab.AtomicBroadcast_DeliverServer) error {
}

if payload.Header == nil /* || payload.Header.ChannelHeader == nil */ {
err := fmt.Errorf("Malformed envelope recieved with bad header")
err = fmt.Errorf("Malformed envelope received with bad header")
logger.Error(err)
return err
}
Expand Down
67 changes: 32 additions & 35 deletions orderer/common/deliver/deliver_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@ import (
mockconfigvaluesorderer "github.com/hyperledger/fabric/common/mocks/configvalues/channel/orderer"
mockpolicies "github.com/hyperledger/fabric/common/mocks/policies"
"github.com/hyperledger/fabric/common/policies"
ordererledger "github.com/hyperledger/fabric/orderer/ledger"
"github.com/hyperledger/fabric/orderer/ledger"
ramledger "github.com/hyperledger/fabric/orderer/ledger/ram"
cb "github.com/hyperledger/fabric/protos/common"
ab "github.com/hyperledger/fabric/protos/orderer"
Expand Down Expand Up @@ -81,7 +81,7 @@ func (mm *mockSupportManager) GetChain(chainID string) (Support, bool) {
}

type mockSupport struct {
ledger ordererledger.ReadWriter
ledger ledger.ReadWriter
sharedConfig *mockconfigvaluesorderer.SharedConfig
policyManager *mockpolicies.Manager
}
Expand All @@ -90,11 +90,11 @@ func (mcs *mockSupport) PolicyManager() policies.Manager {
return mcs.policyManager
}

func (mcs *mockSupport) Reader() ordererledger.Reader {
func (mcs *mockSupport) Reader() ledger.Reader {
return mcs.ledger
}

func NewRAMLedger() ordererledger.ReadWriter {
func NewRAMLedger() ledger.ReadWriter {
rlf := ramledger.New(ledgerSize + 1)
rl, _ := rlf.GetOrCreate(provisional.TestChainID)
rl.Append(genesisBlock)
Expand All @@ -118,11 +118,11 @@ func newMockMultichainManager() *mockSupportManager {
return mm
}

var seekOldest = &ab.SeekPosition{Type: &ab.SeekPosition_Oldest{&ab.SeekOldest{}}}
var seekNewest = &ab.SeekPosition{Type: &ab.SeekPosition_Newest{&ab.SeekNewest{}}}
var seekOldest = &ab.SeekPosition{Type: &ab.SeekPosition_Oldest{Oldest: &ab.SeekOldest{}}}
var seekNewest = &ab.SeekPosition{Type: &ab.SeekPosition_Newest{Newest: &ab.SeekNewest{}}}

func seekSpecified(number uint64) *ab.SeekPosition {
return &ab.SeekPosition{Type: &ab.SeekPosition_Specified{&ab.SeekSpecified{Number: number}}}
return &ab.SeekPosition{Type: &ab.SeekPosition_Specified{Specified: &ab.SeekSpecified{Number: number}}}
}

func makeSeek(chainID string, seekInfo *ab.SeekInfo) *cb.Envelope {
Expand All @@ -142,8 +142,8 @@ func makeSeek(chainID string, seekInfo *ab.SeekInfo) *cb.Envelope {
func TestOldestSeek(t *testing.T) {
mm := newMockMultichainManager()
for i := 1; i < ledgerSize; i++ {
ledger := mm.chains[systemChainID].ledger
ledger.Append(ordererledger.CreateNextBlock(ledger, []*cb.Envelope{&cb.Envelope{Payload: []byte(fmt.Sprintf("%d", i))}}))
l := mm.chains[systemChainID].ledger
l.Append(ledger.CreateNextBlock(l, []*cb.Envelope{&cb.Envelope{Payload: []byte(fmt.Sprintf("%d", i))}}))
}

m := newMockD()
Expand All @@ -166,10 +166,9 @@ func TestOldestSeek(t *testing.T) {
t.Fatalf("Expected %d blocks but got %d", ledgerSize, count)
}
return
} else {
if deliverReply.GetBlock().Header.Number != count {
t.Fatalf("Expected block %d but got block %d", count, deliverReply.GetBlock().Header.Number)
}
}
if deliverReply.GetBlock().Header.Number != count {
t.Fatalf("Expected block %d but got block %d", count, deliverReply.GetBlock().Header.Number)
}
case <-time.After(time.Second):
t.Fatalf("Timed out waiting to get all blocks")
Expand All @@ -181,8 +180,8 @@ func TestOldestSeek(t *testing.T) {
func TestNewestSeek(t *testing.T) {
mm := newMockMultichainManager()
for i := 1; i < ledgerSize; i++ {
ledger := mm.chains[systemChainID].ledger
ledger.Append(ordererledger.CreateNextBlock(ledger, []*cb.Envelope{&cb.Envelope{Payload: []byte(fmt.Sprintf("%d", i))}}))
l := mm.chains[systemChainID].ledger
l.Append(ledger.CreateNextBlock(l, []*cb.Envelope{&cb.Envelope{Payload: []byte(fmt.Sprintf("%d", i))}}))
}

m := newMockD()
Expand All @@ -200,10 +199,9 @@ func TestNewestSeek(t *testing.T) {
t.Fatalf("Received an error on the reply channel")
}
return
} else {
if deliverReply.GetBlock().Header.Number != uint64(ledgerSize-1) {
t.Fatalf("Expected only the most recent block")
}
}
if deliverReply.GetBlock().Header.Number != uint64(ledgerSize-1) {
t.Fatalf("Expected only the most recent block")
}
case <-time.After(time.Second):
t.Fatalf("Timed out waiting to get all blocks")
Expand All @@ -213,8 +211,8 @@ func TestNewestSeek(t *testing.T) {
func TestSpecificSeek(t *testing.T) {
mm := newMockMultichainManager()
for i := 1; i < ledgerSize; i++ {
ledger := mm.chains[systemChainID].ledger
ledger.Append(ordererledger.CreateNextBlock(ledger, []*cb.Envelope{&cb.Envelope{Payload: []byte(fmt.Sprintf("%d", i))}}))
l := mm.chains[systemChainID].ledger
l.Append(ledger.CreateNextBlock(l, []*cb.Envelope{&cb.Envelope{Payload: []byte(fmt.Sprintf("%d", i))}}))
}

m := newMockD()
Expand All @@ -236,10 +234,9 @@ func TestSpecificSeek(t *testing.T) {
t.Fatalf("Received an error on the reply channel")
}
return
} else {
if expected := specifiedStart + count; deliverReply.GetBlock().Header.Number != expected {
t.Fatalf("Expected block %d but got block %d", expected, deliverReply.GetBlock().Header.Number)
}
}
if expected := specifiedStart + count; deliverReply.GetBlock().Header.Number != expected {
t.Fatalf("Expected block %d but got block %d", expected, deliverReply.GetBlock().Header.Number)
}
case <-time.After(time.Second):
t.Fatalf("Timed out waiting to get all blocks")
Expand All @@ -251,8 +248,8 @@ func TestSpecificSeek(t *testing.T) {
func TestUnauthorizedSeek(t *testing.T) {
mm := newMockMultichainManager()
for i := 1; i < ledgerSize; i++ {
ledger := mm.chains[systemChainID].ledger
ledger.Append(ordererledger.CreateNextBlock(ledger, []*cb.Envelope{&cb.Envelope{Payload: []byte(fmt.Sprintf("%d", i))}}))
l := mm.chains[systemChainID].ledger
l.Append(ledger.CreateNextBlock(l, []*cb.Envelope{&cb.Envelope{Payload: []byte(fmt.Sprintf("%d", i))}}))
}
mm.chains[systemChainID].policyManager.Policy.Err = fmt.Errorf("Fail to evaluate policy")

Expand All @@ -277,8 +274,8 @@ func TestUnauthorizedSeek(t *testing.T) {
func TestBadSeek(t *testing.T) {
mm := newMockMultichainManager()
for i := 1; i < ledgerSize; i++ {
ledger := mm.chains[systemChainID].ledger
ledger.Append(ordererledger.CreateNextBlock(ledger, []*cb.Envelope{&cb.Envelope{Payload: []byte(fmt.Sprintf("%d", i))}}))
l := mm.chains[systemChainID].ledger
l.Append(ledger.CreateNextBlock(l, []*cb.Envelope{&cb.Envelope{Payload: []byte(fmt.Sprintf("%d", i))}}))
}

m := newMockD()
Expand All @@ -302,8 +299,8 @@ func TestBadSeek(t *testing.T) {
func TestFailFastSeek(t *testing.T) {
mm := newMockMultichainManager()
for i := 1; i < ledgerSize; i++ {
ledger := mm.chains[systemChainID].ledger
ledger.Append(ordererledger.CreateNextBlock(ledger, []*cb.Envelope{&cb.Envelope{Payload: []byte(fmt.Sprintf("%d", i))}}))
l := mm.chains[systemChainID].ledger
l.Append(ledger.CreateNextBlock(l, []*cb.Envelope{&cb.Envelope{Payload: []byte(fmt.Sprintf("%d", i))}}))
}

m := newMockD()
Expand Down Expand Up @@ -336,8 +333,8 @@ func TestFailFastSeek(t *testing.T) {
func TestBlockingSeek(t *testing.T) {
mm := newMockMultichainManager()
for i := 1; i < ledgerSize; i++ {
ledger := mm.chains[systemChainID].ledger
ledger.Append(ordererledger.CreateNextBlock(ledger, []*cb.Envelope{&cb.Envelope{Payload: []byte(fmt.Sprintf("%d", i))}}))
l := mm.chains[systemChainID].ledger
l.Append(ledger.CreateNextBlock(l, []*cb.Envelope{&cb.Envelope{Payload: []byte(fmt.Sprintf("%d", i))}}))
}

m := newMockD()
Expand All @@ -363,8 +360,8 @@ func TestBlockingSeek(t *testing.T) {
case <-time.After(50 * time.Millisecond):
}

ledger := mm.chains[systemChainID].ledger
ledger.Append(ordererledger.CreateNextBlock(ledger, []*cb.Envelope{&cb.Envelope{Payload: []byte(fmt.Sprintf("%d", ledgerSize+1))}}))
l := mm.chains[systemChainID].ledger
l.Append(ledger.CreateNextBlock(l, []*cb.Envelope{&cb.Envelope{Payload: []byte(fmt.Sprintf("%d", ledgerSize+1))}}))

select {
case deliverReply := <-m.sendChan:
Expand Down
2 changes: 1 addition & 1 deletion orderer/ledger/blackbox_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ See the License for the specific language governing permissions and
limitations under the License.
*/

package ordererledger_test
package ledger_test

import (
"bytes"
Expand Down
34 changes: 17 additions & 17 deletions orderer/ledger/file/factory.go
Original file line number Diff line number Diff line change
Expand Up @@ -21,58 +21,58 @@ import (

"github.com/hyperledger/fabric/common/ledger/blkstorage"
"github.com/hyperledger/fabric/common/ledger/blkstorage/fsblkstorage"
ordererledger "github.com/hyperledger/fabric/orderer/ledger"
"github.com/hyperledger/fabric/orderer/ledger"
)

type fileLedgerFactory struct {
blkstorageProvider blkstorage.BlockStoreProvider
ledgers map[string]ordererledger.ReadWriter
ledgers map[string]ledger.ReadWriter
mutex sync.Mutex
}

// GetOrCreate gets an existing ledger (if it exists) or creates it if it does not
func (lf *fileLedgerFactory) GetOrCreate(chainID string) (ordererledger.ReadWriter, error) {
lf.mutex.Lock()
defer lf.mutex.Unlock()
func (flf *fileLedgerFactory) GetOrCreate(chainID string) (ledger.ReadWriter, error) {
flf.mutex.Lock()
defer flf.mutex.Unlock()

key := chainID
// check cache
ledger, ok := lf.ledgers[key]
ledger, ok := flf.ledgers[key]
if ok {
return ledger, nil
}
// open fresh
blockStore, err := lf.blkstorageProvider.OpenBlockStore(key)
blockStore, err := flf.blkstorageProvider.OpenBlockStore(key)
if err != nil {
return nil, err
}
ledger = &fileLedger{blockStore: blockStore, signal: make(chan struct{})}
lf.ledgers[key] = ledger
flf.ledgers[key] = ledger
return ledger, nil
}

// ChainIDs returns the chain IDs the Factory is aware of
func (lf *fileLedgerFactory) ChainIDs() []string {
chainIDs, err := lf.blkstorageProvider.List()
// ChainIDs returns the chain IDs the factory is aware of
func (flf *fileLedgerFactory) ChainIDs() []string {
chainIDs, err := flf.blkstorageProvider.List()
if err != nil {
panic(err)
logger.Panic(err)
}
return chainIDs
}

// Close closes the file ledgers served by this factory
func (lf *fileLedgerFactory) Close() {
lf.blkstorageProvider.Close()
// Close releases all resources acquired by the factory
func (flf *fileLedgerFactory) Close() {
flf.blkstorageProvider.Close()
}

// New creates a new ledger factory
func New(directory string) ordererledger.Factory {
func New(directory string) ledger.Factory {
return &fileLedgerFactory{
blkstorageProvider: fsblkstorage.NewProvider(
fsblkstorage.NewConf(directory, -1),
&blkstorage.IndexConfig{
AttrsToIndex: []blkstorage.IndexableAttr{blkstorage.IndexableAttrBlockNum}},
),
ledgers: make(map[string]ordererledger.ReadWriter),
ledgers: make(map[string]ledger.ReadWriter),
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -18,13 +18,13 @@ package fileledger

import (
"github.com/hyperledger/fabric/common/ledger/blkstorage"
ordererledger "github.com/hyperledger/fabric/orderer/ledger"
ledger "github.com/hyperledger/fabric/orderer/ledger"
cb "github.com/hyperledger/fabric/protos/common"
ab "github.com/hyperledger/fabric/protos/orderer"
"github.com/op/go-logging"
)

var logger = logging.MustGetLogger("ordererledger/fileledger")
var logger = logging.MustGetLogger("orderer/fileledger")
var closedChan chan struct{}

func init() {
Expand Down Expand Up @@ -69,33 +69,33 @@ func (i *fileLedgerIterator) ReadyChan() <-chan struct{} {

// Iterator returns an Iterator, as specified by a cb.SeekInfo message, and its
// starting block number
func (fl *fileLedger) Iterator(startPosition *ab.SeekPosition) (ordererledger.Iterator, uint64) {
func (fl *fileLedger) Iterator(startPosition *ab.SeekPosition) (ledger.Iterator, uint64) {
switch start := startPosition.Type.(type) {
case *ab.SeekPosition_Oldest:
return &fileLedgerIterator{ledger: fl, blockNumber: 0}, 0
case *ab.SeekPosition_Newest:
info, err := fl.blockStore.GetBlockchainInfo()
if err != nil {
panic(err)
logger.Panic(err)
}
newestBlockNumber := info.Height - 1
return &fileLedgerIterator{ledger: fl, blockNumber: newestBlockNumber}, newestBlockNumber
case *ab.SeekPosition_Specified:
height := fl.Height()
if start.Specified.Number > height {
return &ordererledger.NotFoundErrorIterator{}, 0
return &ledger.NotFoundErrorIterator{}, 0
}
return &fileLedgerIterator{ledger: fl, blockNumber: start.Specified.Number}, start.Specified.Number
}
// This line should be unreachable, but the compiler requires it
return &ordererledger.NotFoundErrorIterator{}, 0
return &ledger.NotFoundErrorIterator{}, 0
}

// Height returns the number of blocks on the ledger
func (fl *fileLedger) Height() uint64 {
info, err := fl.blockStore.GetBlockchainInfo()
if err != nil {
panic(err)
logger.Panic(err)
}
return info.Height
}
Expand Down
Loading

0 comments on commit ec1bbdf

Please sign in to comment.