Skip to content

Commit da5ff1c

Browse files
author
Jason Yellick
committed
FAB-14618 Store only nodeIDs in metadata
Presently, the block metadata encodes the TLS certificates of all of the Raft consenters in the system for each block. Because these TLS certs are non-trivial in size, and there may be a large set of consenters, this actually creates a significant amount of waste on the filesystem. As a small optimization, this CR modifies the block metadata to only store the nodeIDs instead of the full set of consenter info. It then correlates the consenter slice found in the channel config data with this slice of nodeIDs to build a mapping between the two (which was previously persisted). Change-Id: Iaa66dacbcc48a041318c8a718099a873b9626240 Signed-off-by: Jason Yellick <jyellick@us.ibm.com>
1 parent fa61345 commit da5ff1c

File tree

7 files changed

+172
-158
lines changed

7 files changed

+172
-158
lines changed

orderer/consensus/etcdraft/chain.go

Lines changed: 16 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -112,9 +112,13 @@ type Options struct {
112112
MaxSizePerMsg uint64
113113
MaxInflightMsgs int
114114

115+
// BlockMetdata and Consenters should only be modified while under lock
116+
// of raftMetadataLock
115117
BlockMetadata *etcdraft.BlockMetadata
116-
Metrics *Metrics
117-
Cert []byte
118+
Consenters map[uint64]*etcdraft.Consenter
119+
120+
Metrics *Metrics
121+
Cert []byte
118122

119123
EvictionSuspicion time.Duration
120124
LeaderCheckInterval time.Duration
@@ -313,7 +317,7 @@ func (c *Chain) MigrationStatus() migration.Status {
313317
func (c *Chain) Start() {
314318
c.logger.Infof("Starting Raft node")
315319

316-
c.Metrics.ClusterSize.Set(float64(len(c.opts.BlockMetadata.Consenters)))
320+
c.Metrics.ClusterSize.Set(float64(len(c.opts.BlockMetadata.ConsenterIds)))
317321
// all nodes start out as followers
318322
c.Metrics.IsLeader.Set(float64(0))
319323
if err := c.configureComm(); err != nil {
@@ -719,7 +723,7 @@ func (c *Chain) serveRequest() {
719723
select {
720724
case <-c.errorC:
721725
default:
722-
nodeCount := len(c.opts.BlockMetadata.Consenters)
726+
nodeCount := len(c.opts.BlockMetadata.ConsenterIds)
723727
// Only close the error channel (to signal the broadcast/deliver front-end a consensus backend error)
724728
// If we are a cluster of size 3 or more, otherwise we can't expand a cluster of size 1 to 2 nodes.
725729
if nodeCount > 2 {
@@ -945,6 +949,7 @@ func (c *Chain) catchUp(snap *raftpb.Snapshot) error {
945949

946950
c.raftMetadataLock.Lock()
947951
c.opts.BlockMetadata = configMembership.NewBlockMetadata
952+
c.opts.Consenters = configMembership.NewConsenters
948953
c.raftMetadataLock.Unlock()
949954

950955
if err := c.configureComm(); err != nil {
@@ -978,7 +983,7 @@ func (c *Chain) detectConfChange(block *common.Block) *MembershipChanges {
978983
c.logger.Infof("Snapshot interval is updated to %d bytes (was %d)", c.sizeLimit, old)
979984
}
980985

981-
changes, err := ComputeMembershipChanges(c.opts.BlockMetadata, configMetadata.Consenters)
986+
changes, err := ComputeMembershipChanges(c.opts.BlockMetadata, c.opts.Consenters, configMetadata.Consenters)
982987
if err != nil {
983988
c.logger.Panicf("illegal configuration change detected: %s", err)
984989
}
@@ -1054,7 +1059,7 @@ func (c *Chain) apply(ents []raftpb.Entry) {
10541059
c.confChangeInProgress = nil
10551060
c.configInflight = false
10561061
// report the new cluster size
1057-
c.Metrics.ClusterSize.Set(float64(len(c.opts.BlockMetadata.Consenters)))
1062+
c.Metrics.ClusterSize.Set(float64(len(c.opts.BlockMetadata.ConsenterIds)))
10581063
}
10591064

10601065
if cc.Type == raftpb.ConfChangeRemoveNode && cc.NodeID == c.raftID {
@@ -1130,7 +1135,7 @@ func (c *Chain) configureComm() error {
11301135

11311136
func (c *Chain) remotePeers() ([]cluster.RemoteNode, error) {
11321137
var nodes []cluster.RemoteNode
1133-
for raftID, consenter := range c.opts.BlockMetadata.Consenters {
1138+
for raftID, consenter := range c.opts.Consenters {
11341139
// No need to know yourself
11351140
if raftID == c.raftID {
11361141
continue
@@ -1175,7 +1180,7 @@ func (c *Chain) checkConsentersSet(configValue *common.ConfigValue) error {
11751180
}
11761181

11771182
c.raftMetadataLock.RLock()
1178-
_, err = ComputeMembershipChanges(c.opts.BlockMetadata, updatedMetadata.Consenters)
1183+
_, err = ComputeMembershipChanges(c.opts.BlockMetadata, c.opts.Consenters, updatedMetadata.Consenters)
11791184
c.raftMetadataLock.RUnlock()
11801185

11811186
return err
@@ -1196,11 +1201,12 @@ func (c *Chain) writeConfigBlock(block *common.Block, index uint64) {
11961201
case common.HeaderType_CONFIG:
11971202
configMembership := c.detectConfChange(block)
11981203

1204+
c.opts.BlockMetadata.RaftIndex = index
11991205
c.raftMetadataLock.Lock()
12001206
if configMembership != nil {
12011207
c.opts.BlockMetadata = configMembership.NewBlockMetadata
1208+
c.opts.Consenters = configMembership.NewConsenters
12021209
}
1203-
c.opts.BlockMetadata.RaftIndex = index
12041210
c.raftMetadataLock.Unlock()
12051211

12061212
blockMetadataBytes := protoutil.MarshalOrPanic(c.opts.BlockMetadata)
@@ -1285,7 +1291,7 @@ func (c *Chain) getInFlightConfChange() *raftpb.ConfChange {
12851291
// extracting current Raft configuration state
12861292
confState := c.Node.ApplyConfChange(raftpb.ConfChange{})
12871293

1288-
if len(confState.Nodes) == len(c.opts.BlockMetadata.Consenters) {
1294+
if len(confState.Nodes) == len(c.opts.BlockMetadata.ConsenterIds) {
12891295
// since configuration change could only add one node or
12901296
// remove one node at a time, if raft nodes state size
12911297
// equal to membership stored in block metadata field,

0 commit comments

Comments
 (0)