Skip to content

Commit 389ff3e

Browse files
author
Jason Yellick
committed
[FAB-4264] Fix peer channel fetch command
The peer channel fetch command has multiple problems. 1. It claims to fetch the configuration block, but actually fetches only the genesis block. 2. The seekHelper in the deliver code claims to accept a seek position start index, and returns one block, but in fact always seeks from oldest to maxuint64 returning an infinite number of blocks. 3. The command outputs to a fixed filename (varying only by channel name). This CR fixes all three of these problems. Change-Id: Ibd6c041f88f736b1948a12d81ee49ce6fe42538a Signed-off-by: Jason Yellick <[email protected]>
1 parent 75294a9 commit 389ff3e

File tree

5 files changed

+97
-30
lines changed

5 files changed

+97
-30
lines changed

peer/channel/create_test.go

+9-6
Original file line numberDiff line numberDiff line change
@@ -114,13 +114,16 @@ func (m *mockDeliverClient) readBlock() (*cb.Block, error) {
114114
return &cb.Block{}, nil
115115
}
116116

117-
func (m *mockDeliverClient) getBlock() (*cb.Block, error) {
118-
b, err := m.readBlock()
119-
if err != nil {
120-
return nil, err
121-
}
117+
func (m *mockDeliverClient) getSpecifiedBlock(num uint64) (*cb.Block, error) {
118+
return m.readBlock()
119+
}
120+
121+
func (m *mockDeliverClient) getOldestBlock() (*cb.Block, error) {
122+
return m.readBlock()
123+
}
122124

123-
return b, nil
125+
func (m *mockDeliverClient) getNewestBlock() (*cb.Block, error) {
126+
return m.readBlock()
124127
}
125128

126129
func (m *mockDeliverClient) Close() error {

peer/channel/deliverclient.go

+37-12
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,6 @@ package channel
1818

1919
import (
2020
"fmt"
21-
"math"
2221
"time"
2322

2423
"github.com/hyperledger/fabric/common/localmsp"
@@ -29,7 +28,9 @@ import (
2928
)
3029

3130
type deliverClientIntf interface {
32-
getBlock() (*common.Block, error)
31+
getSpecifiedBlock(num uint64) (*common.Block, error)
32+
getOldestBlock() (*common.Block, error)
33+
getNewestBlock() (*common.Block, error)
3334
Close() error
3435
}
3536

@@ -43,10 +44,10 @@ func newDeliverClient(conn *grpc.ClientConn, client ab.AtomicBroadcast_DeliverCl
4344
return &deliverClient{conn: conn, client: client, chainID: chainID}
4445
}
4546

46-
func seekHelper(chainID string, start *ab.SeekPosition) *common.Envelope {
47+
func seekHelper(chainID string, position *ab.SeekPosition) *common.Envelope {
4748
seekInfo := &ab.SeekInfo{
48-
Start: &ab.SeekPosition{Type: &ab.SeekPosition_Oldest{Oldest: &ab.SeekOldest{}}},
49-
Stop: &ab.SeekPosition{Type: &ab.SeekPosition_Specified{Specified: &ab.SeekSpecified{Number: math.MaxUint64}}},
49+
Start: position,
50+
Stop: position,
5051
Behavior: ab.SeekInfo_BLOCK_UNTIL_READY,
5152
}
5253

@@ -61,10 +62,18 @@ func seekHelper(chainID string, start *ab.SeekPosition) *common.Envelope {
6162
return env
6263
}
6364

64-
func (r *deliverClient) seek(blockNumber uint64) error {
65+
func (r *deliverClient) seekSpecified(blockNumber uint64) error {
6566
return r.client.Send(seekHelper(r.chainID, &ab.SeekPosition{Type: &ab.SeekPosition_Specified{Specified: &ab.SeekSpecified{Number: blockNumber}}}))
6667
}
6768

69+
func (r *deliverClient) seekOldest() error {
70+
return r.client.Send(seekHelper(r.chainID, &ab.SeekPosition{Type: &ab.SeekPosition_Oldest{Oldest: &ab.SeekOldest{}}}))
71+
}
72+
73+
func (r *deliverClient) seekNewest() error {
74+
return r.client.Send(seekHelper(r.chainID, &ab.SeekPosition{Type: &ab.SeekPosition_Newest{Newest: &ab.SeekNewest{}}}))
75+
}
76+
6877
func (r *deliverClient) readBlock() (*common.Block, error) {
6978
msg, err := r.client.Recv()
7079
if err != nil {
@@ -77,26 +86,42 @@ func (r *deliverClient) readBlock() (*common.Block, error) {
7786
fmt.Println("Got status ", t)
7887
return nil, fmt.Errorf("can't read the block")
7988
case *ab.DeliverResponse_Block:
80-
fmt.Println("Received block: ", t.Block)
89+
fmt.Println("Received block: ", t.Block.Header.Number)
90+
r.client.Recv() // Flush the success message
8191
return t.Block, nil
8292
default:
8393
return nil, fmt.Errorf("response error")
8494
}
8595
}
8696

87-
func (r *deliverClient) getBlock() (*common.Block, error) {
88-
err := r.seek(0)
97+
func (r *deliverClient) getSpecifiedBlock(num uint64) (*common.Block, error) {
98+
err := r.seekSpecified(num)
99+
if err != nil {
100+
fmt.Println("Received error:", err)
101+
return nil, err
102+
}
103+
104+
return r.readBlock()
105+
}
106+
107+
func (r *deliverClient) getOldestBlock() (*common.Block, error) {
108+
err := r.seekOldest()
89109
if err != nil {
90110
fmt.Println("Received error:", err)
91111
return nil, err
92112
}
93113

94-
b, err := r.readBlock()
114+
return r.readBlock()
115+
}
116+
117+
func (r *deliverClient) getNewestBlock() (*common.Block, error) {
118+
err := r.seekNewest()
95119
if err != nil {
120+
fmt.Println("Received error:", err)
96121
return nil, err
97122
}
98123

99-
return b, nil
124+
return r.readBlock()
100125
}
101126

102127
func (r *deliverClient) Close() error {
@@ -113,7 +138,7 @@ func getGenesisBlock(cf *ChannelCmdFactory) (*common.Block, error) {
113138
cf.DeliverClient.Close()
114139
return nil, fmt.Errorf("timeout waiting for channel creation")
115140
default:
116-
if block, err := cf.DeliverClient.getBlock(); err != nil {
141+
if block, err := cf.DeliverClient.getSpecifiedBlock(0); err != nil {
117142
cf.DeliverClient.Close()
118143
cf, err = InitCmdFactory(EndorserNotRequired, OrdererRequired)
119144
if err != nil {

peer/channel/fetchconfig.go

+48-9
Original file line numberDiff line numberDiff line change
@@ -17,26 +17,27 @@ limitations under the License.
1717
package channel
1818

1919
import (
20+
"fmt"
2021
"io/ioutil"
22+
"strconv"
2123

2224
"github.com/golang/protobuf/proto"
2325
cb "github.com/hyperledger/fabric/protos/common"
26+
"github.com/hyperledger/fabric/protos/utils"
2427
"github.com/spf13/cobra"
2528
)
2629

27-
const fetchCmdDescription = "Fetch configuration block."
28-
2930
func fetchCmd(cf *ChannelCmdFactory) *cobra.Command {
30-
createCmd := &cobra.Command{
31-
Use: "fetch",
32-
Short: fetchCmdDescription,
33-
Long: fetchCmdDescription,
31+
fetchCmd := &cobra.Command{
32+
Use: "fetch <newest|oldest|config|(number)> [outputfile]",
33+
Short: "Fetch a block",
34+
Long: "Fetch a specified block, writing it to a file.",
3435
RunE: func(cmd *cobra.Command, args []string) error {
3536
return fetch(cmd, args, cf)
3637
},
3738
}
3839

39-
return createCmd
40+
return fetchCmd
4041
}
4142

4243
func fetch(cmd *cobra.Command, args []string, cf *ChannelCmdFactory) error {
@@ -48,8 +49,40 @@ func fetch(cmd *cobra.Command, args []string, cf *ChannelCmdFactory) error {
4849
}
4950
}
5051

52+
if len(args) == 0 {
53+
return fmt.Errorf("fetch target required, oldest, newest, config, or a number")
54+
}
55+
56+
if len(args) > 2 {
57+
return fmt.Errorf("trailing args detected")
58+
}
59+
5160
var block *cb.Block
52-
if block, err = cf.DeliverClient.getBlock(); err != nil {
61+
62+
switch args[0] {
63+
case "oldest":
64+
block, err = cf.DeliverClient.getOldestBlock()
65+
case "newest":
66+
block, err = cf.DeliverClient.getNewestBlock()
67+
case "config":
68+
iBlock, err := cf.DeliverClient.getNewestBlock()
69+
if err != nil {
70+
return err
71+
}
72+
lc, err := utils.GetLastConfigIndexFromBlock(iBlock)
73+
if err != nil {
74+
return err
75+
}
76+
block, err = cf.DeliverClient.getSpecifiedBlock(lc)
77+
default:
78+
num, err := strconv.Atoi(args[0])
79+
if err != nil {
80+
return fmt.Errorf("fetch target illegal: %s", args[0])
81+
}
82+
block, err = cf.DeliverClient.getSpecifiedBlock(uint64(num))
83+
}
84+
85+
if err != nil {
5386
return err
5487
}
5588

@@ -58,7 +91,13 @@ func fetch(cmd *cobra.Command, args []string, cf *ChannelCmdFactory) error {
5891
return err
5992
}
6093

61-
file := chainID + ".block"
94+
var file string
95+
if len(args) <= 1 {
96+
file = chainID + "_" + args[0] + ".block"
97+
} else {
98+
file = args[1]
99+
}
100+
62101
if err = ioutil.WriteFile(file, b, 0644); err != nil {
63102
return err
64103
}

peer/channel/fetchconfig_test.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,7 @@ func TestFetchChain(t *testing.T) {
5656

5757
AddFlags(cmd)
5858

59-
args = []string{"-c", mockchain}
59+
args = []string{"-c", mockchain, "oldest", mockchain + ".block"}
6060
cmd.SetArgs(args)
6161

6262
assert.NoError(t, cmd.Execute(), "Join command expected to succeed")

test/tools/AuctionApp/api_driver.sh

+2-2
Original file line numberDiff line numberDiff line change
@@ -76,11 +76,11 @@ createChannel() {
7676
if [ -z "$CORE_PEER_TLS_ENABLED" -o "$CORE_PEER_TLS_ENABLED" = "false" ]; then
7777
peer channel create -o $ORDERER_IP -c $CHANNEL_NAME$CH_NUM -f ./channel-artifacts/channel$CH_NUM.tx >&log.txt
7878
wait 5
79-
peer channel fetch -o $ORDERER_IP -c $CHANNEL_NAME$CH_NUM -f ./channel-artifacts/channel$CH_NUM.tx >>log.txt
79+
peer channel fetch config $CHANNEL_NAME$CH_NUM.block -o $ORDERER_IP -c $CHANNEL_NAME$CH_NUM -f ./channel-artifacts/channel$CH_NUM.tx >>log.txt
8080
else
8181
peer channel create -o $ORDERER_IP -c $CHANNEL_NAME$CH_NUM -f ./channel-artifacts/channel$CH_NUM.tx --tls $CORE_PEER_TLS_ENABLED --cafile $ORDERER_CA >&log.txt
8282
wait 5
83-
peer channel fetch -o $ORDERER_IP -c $CHANNEL_NAME$CH_NUM -f ./channel-artifacts/channel$CH_NUM.tx --tls $CORE_PEER_TLS_ENABLED --cafile $ORDERER_CA >>log.txt
83+
peer channel fetch config $CHANNEL_NAME$CH_NUM.block -o $ORDERER_IP -c $CHANNEL_NAME$CH_NUM -f ./channel-artifacts/channel$CH_NUM.tx --tls $CORE_PEER_TLS_ENABLED --cafile $ORDERER_CA >>log.txt
8484
fi
8585

8686
res=$?

0 commit comments

Comments
 (0)