Skip to content

Commit 40e0e0a

Browse files
authored
Get last config block API (#180)
Signed-off-by: May Rosenbaum <mayro1595@gmail.com>
1 parent a28c0c2 commit 40e0e0a

File tree

3 files changed

+119
-0
lines changed

3 files changed

+119
-0
lines changed

pkg/bcdb/config_tx_context.go

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -80,6 +80,9 @@ type ConfigTxContext interface {
8080
// pending config was set is permitted. Those methods are applied to the pending config (e.g. AddAdmin() will add
8181
// an admin, etc.).
8282
SetClusterConfig(newConfig *types.ClusterConfig) error
83+
84+
// GetLastConfigBlock returns the last config block.
85+
GetLastConfigBlock() ([]byte, error)
8386
}
8487

8588
type configTxContext struct {
@@ -347,6 +350,26 @@ func (c *configTxContext) SetClusterConfig(newConfig *types.ClusterConfig) error
347350
return nil
348351
}
349352

353+
func (c *configTxContext) GetLastConfigBlock() ([]byte, error) {
354+
configResponseEnv := &types.GetConfigBlockResponseEnvelope{}
355+
path := constants.GetLastConfigBlock
356+
err := c.handleRequest(
357+
path,
358+
&types.GetConfigBlockQuery{
359+
UserId: c.userID,
360+
},
361+
configResponseEnv,
362+
)
363+
if err != nil {
364+
c.logger.Errorf("failed to execute cluster config query path %s, due to %s", path, err)
365+
return nil, err
366+
}
367+
368+
confResp := configResponseEnv.GetResponse()
369+
370+
return confResp.GetBlock(), nil
371+
}
372+
350373
func (c *configTxContext) queryClusterConfig() error {
351374
if c.oldConfig != nil {
352375
return nil

pkg/bcdb/config_tx_context_test.go

Lines changed: 94 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,8 @@ import (
88
"testing"
99
"time"
1010

11+
"github.com/golang/protobuf/proto"
12+
1113
sdkConfig "github.com/hyperledger-labs/orion-sdk-go/pkg/config"
1214
"github.com/hyperledger-labs/orion-server/pkg/server/testutils"
1315
"github.com/hyperledger-labs/orion-server/pkg/types"
@@ -762,3 +764,95 @@ func TestConfigTx_CommitAbortFinality(t *testing.T) {
762764
}
763765
}
764766
}
767+
768+
func TestGetLastConfigBlock(t *testing.T) {
769+
cryptoDir := testutils.GenerateTestCrypto(t, []string{"admin", "server"})
770+
testServer, _, _, err := SetupTestServer(t, cryptoDir)
771+
defer func() {
772+
if testServer != nil {
773+
_ = testServer.Stop()
774+
}
775+
}()
776+
require.NoError(t, err)
777+
StartTestServer(t, testServer)
778+
779+
serverPort, err := testServer.Port()
780+
require.NoError(t, err)
781+
782+
bcdb := createDBInstance(t, cryptoDir, serverPort)
783+
session := openUserSession(t, bcdb, "admin", cryptoDir)
784+
785+
t.Run("GetLastConfigBlock returns genesis config block", func(t *testing.T) {
786+
tx, err := session.ConfigTx()
787+
require.NoError(t, err)
788+
789+
txBlk, err := tx.GetLastConfigBlock()
790+
require.NoError(t, err)
791+
require.NotNil(t, txBlk)
792+
793+
var block = &types.Block{}
794+
err = proto.Unmarshal(txBlk, block)
795+
require.NoError(t, err)
796+
require.NotNil(t, block)
797+
require.Equal(t, uint64(1), block.GetHeader().GetBaseHeader().GetNumber())
798+
require.Equal(t, 1, len(block.GetConfigTxEnvelope().GetPayload().GetNewConfig().GetNodes()))
799+
})
800+
801+
t.Run("GetLastConfigBlock returns the last config block", func(t *testing.T) {
802+
// 1. tx1 - set raft config MaxInflightBlocks param
803+
tx, err := session.ConfigTx()
804+
require.NoError(t, err)
805+
806+
clusterConfig, version, err := tx.GetClusterConfig()
807+
require.NoError(t, err)
808+
require.NotNil(t, version)
809+
raftConf := clusterConfig.GetConsensusConfig().GetRaftConfig()
810+
raftConf.MaxInflightBlocks++
811+
err = tx.UpdateRaftConfig(raftConf)
812+
require.NoError(t, err)
813+
814+
txID, receiptEnv, err := tx.Commit(true)
815+
require.NoError(t, err)
816+
require.True(t, txID != "")
817+
require.NotNil(t, receiptEnv)
818+
819+
txBlk, err := tx.GetLastConfigBlock()
820+
require.NoError(t, err)
821+
require.NotNil(t, txBlk)
822+
823+
// check the last config block
824+
var block = &types.Block{}
825+
err = proto.Unmarshal(txBlk, block)
826+
require.NoError(t, err)
827+
require.NotNil(t, block)
828+
require.Equal(t, uint64(2), block.GetHeader().GetBaseHeader().GetNumber())
829+
require.Equal(t, 1, len(block.GetConfigTxEnvelope().GetPayload().GetNewConfig().GetNodes()))
830+
831+
// 2. tx2 - set raft config HeartbeatTicks param
832+
tx, err = session.ConfigTx()
833+
require.NoError(t, err)
834+
835+
clusterConfig, version, err = tx.GetClusterConfig()
836+
require.NoError(t, err)
837+
require.NotNil(t, version)
838+
raftConf = clusterConfig.GetConsensusConfig().GetRaftConfig()
839+
raftConf.HeartbeatTicks++
840+
err = tx.UpdateRaftConfig(raftConf)
841+
require.NoError(t, err)
842+
843+
txID, receiptEnv, err = tx.Commit(true)
844+
require.NoError(t, err)
845+
require.True(t, txID != "")
846+
require.NotNil(t, receiptEnv)
847+
848+
txBlk, err = tx.GetLastConfigBlock()
849+
require.NoError(t, err)
850+
require.NotNil(t, txBlk)
851+
852+
// check the last config block
853+
err = proto.Unmarshal(txBlk, block)
854+
require.NoError(t, err)
855+
require.NotNil(t, block)
856+
require.Equal(t, uint64(3), block.GetHeader().GetBaseHeader().GetNumber())
857+
})
858+
}

pkg/bcdb/tx_context.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -390,6 +390,8 @@ func ResponseSelector(envelop ResponseEnvelop) (ResponseWithHeader, error) {
390390
return envelop.(*types.GetDataRangeResponseEnvelope).GetResponse(), nil
391391
case *types.GetTxResponseEnvelope:
392392
return envelop.(*types.GetTxResponseEnvelope).GetResponse(), nil
393+
case *types.GetConfigBlockResponseEnvelope:
394+
return envelop.(*types.GetConfigBlockResponseEnvelope).GetResponse(), nil
393395

394396
default:
395397
return nil, errors.Errorf("unknown response type %T", t)

0 commit comments

Comments
 (0)