consensus: timeout params in toml used as overrides (#8186)

Replaces the set of timeout parameters in the config.toml file with unsafe-*override versions of the corresponding ConsensusParams.Timeout field. These fields can be used for the duration of v0.36 to override the consensus param in case of emergency.

Adds a set to the ./internal/consensus/State type for correctly calculating the value of each timeout based on the set of overrides specified.
This commit is contained in:
William Banfield
2022-03-28 17:33:23 -04:00
committed by GitHub
parent 9d56520f76
commit 462c475abc
7 changed files with 260 additions and 184 deletions

View File

@@ -247,24 +247,24 @@ func (params ConsensusParams) ValidateConsensusParams() error {
params.Synchrony.Precision)
}
if params.Timeout.Propose < 0 {
return fmt.Errorf("timeout.ProposeDelta must not be negative. Got: %d", params.Timeout.Propose)
if params.Timeout.Propose <= 0 {
return fmt.Errorf("timeout.ProposeDelta must be greater than 0. Got: %d", params.Timeout.Propose)
}
if params.Timeout.ProposeDelta < 0 {
return fmt.Errorf("timeout.ProposeDelta must not be negative. Got: %d", params.Timeout.ProposeDelta)
if params.Timeout.ProposeDelta <= 0 {
return fmt.Errorf("timeout.ProposeDelta must be greater than 0. Got: %d", params.Timeout.ProposeDelta)
}
if params.Timeout.Vote < 0 {
return fmt.Errorf("timeout.Vote must not be negative. Got: %d", params.Timeout.Vote)
if params.Timeout.Vote <= 0 {
return fmt.Errorf("timeout.Vote must be greater than 0. Got: %d", params.Timeout.Vote)
}
if params.Timeout.VoteDelta < 0 {
return fmt.Errorf("timeout.VoteDelta must not be negative. Got: %d", params.Timeout.VoteDelta)
if params.Timeout.VoteDelta <= 0 {
return fmt.Errorf("timeout.VoteDelta must be greater than 0. Got: %d", params.Timeout.VoteDelta)
}
if params.Timeout.Commit < 0 {
return fmt.Errorf("timeout.Commit must not be negative. Got: %d", params.Timeout.Commit)
if params.Timeout.Commit <= 0 {
return fmt.Errorf("timeout.Commit must be greater than 0. Got: %d", params.Timeout.Commit)
}
if len(params.Validator.PubKeyTypes) == 0 {

View File

@@ -19,11 +19,13 @@ var (
func TestConsensusParamsValidation(t *testing.T) {
testCases := []struct {
name string
params ConsensusParams
valid bool
}{
// test block params
{
name: "block params valid",
params: makeParams(makeParamsArgs{
blockBytes: 1,
evidenceAge: 2,
@@ -32,6 +34,7 @@ func TestConsensusParamsValidation(t *testing.T) {
valid: true,
},
{
name: "block params invalid MaxBytes",
params: makeParams(makeParamsArgs{
blockBytes: 0,
evidenceAge: 2,
@@ -40,6 +43,7 @@ func TestConsensusParamsValidation(t *testing.T) {
valid: false,
},
{
name: "block params large MaxBytes",
params: makeParams(makeParamsArgs{
blockBytes: 47 * 1024 * 1024,
evidenceAge: 2,
@@ -48,6 +52,7 @@ func TestConsensusParamsValidation(t *testing.T) {
valid: true,
},
{
name: "block params small MaxBytes",
params: makeParams(makeParamsArgs{
blockBytes: 10,
evidenceAge: 2,
@@ -56,6 +61,7 @@ func TestConsensusParamsValidation(t *testing.T) {
valid: true,
},
{
name: "block params 100MB MaxBytes",
params: makeParams(makeParamsArgs{
blockBytes: 100 * 1024 * 1024,
evidenceAge: 2,
@@ -64,6 +70,7 @@ func TestConsensusParamsValidation(t *testing.T) {
valid: true,
},
{
name: "block params MaxBytes too large",
params: makeParams(makeParamsArgs{
blockBytes: 101 * 1024 * 1024,
evidenceAge: 2,
@@ -72,14 +79,7 @@ func TestConsensusParamsValidation(t *testing.T) {
valid: false,
},
{
params: makeParams(makeParamsArgs{
blockBytes: 1024 * 1024 * 1024,
evidenceAge: 2,
precision: 1,
messageDelay: 1}),
valid: false,
},
{
name: "block params 1GB MaxBytes",
params: makeParams(makeParamsArgs{
blockBytes: 1024 * 1024 * 1024,
evidenceAge: 2,
@@ -89,6 +89,7 @@ func TestConsensusParamsValidation(t *testing.T) {
},
// test evidence params
{
name: "evidence MaxAge and MaxBytes 0",
params: makeParams(makeParamsArgs{
blockBytes: 1,
evidenceAge: 0,
@@ -98,6 +99,7 @@ func TestConsensusParamsValidation(t *testing.T) {
valid: false,
},
{
name: "evidence MaxBytes greater than Block.MaxBytes",
params: makeParams(makeParamsArgs{
blockBytes: 1,
evidenceAge: 2,
@@ -107,6 +109,7 @@ func TestConsensusParamsValidation(t *testing.T) {
valid: false,
},
{
name: "evidence size below Block.MaxBytes",
params: makeParams(makeParamsArgs{
blockBytes: 1000,
evidenceAge: 2,
@@ -116,6 +119,7 @@ func TestConsensusParamsValidation(t *testing.T) {
valid: true,
},
{
name: "evidence MaxAgeDuration < 0",
params: makeParams(makeParamsArgs{
blockBytes: 1,
evidenceAge: -1,
@@ -124,8 +128,8 @@ func TestConsensusParamsValidation(t *testing.T) {
messageDelay: 1}),
valid: false,
},
// test no pubkey type provided
{
name: "no pubkey types",
params: makeParams(makeParamsArgs{
evidenceAge: 2,
pubkeyTypes: []string{},
@@ -133,8 +137,8 @@ func TestConsensusParamsValidation(t *testing.T) {
messageDelay: 1}),
valid: false,
},
// test invalid pubkey type provided
{
name: "invalid pubkey types",
params: makeParams(makeParamsArgs{
evidenceAge: 2,
pubkeyTypes: []string{"potatoes make good pubkeys"},
@@ -142,8 +146,8 @@ func TestConsensusParamsValidation(t *testing.T) {
messageDelay: 1}),
valid: false,
},
// test invalid pubkey type provided
{
name: "negative MessageDelay",
params: makeParams(makeParamsArgs{
evidenceAge: 2,
precision: 1,
@@ -151,6 +155,7 @@ func TestConsensusParamsValidation(t *testing.T) {
valid: false,
},
{
name: "negative Precision",
params: makeParams(makeParamsArgs{
evidenceAge: 2,
precision: -1,
@@ -159,11 +164,13 @@ func TestConsensusParamsValidation(t *testing.T) {
},
}
for i, tc := range testCases {
if tc.valid {
assert.NoErrorf(t, tc.params.ValidateConsensusParams(), "expected no error for valid params (#%d)", i)
} else {
assert.Errorf(t, tc.params.ValidateConsensusParams(), "expected error for non valid params (#%d)", i)
}
t.Run(tc.name, func(t *testing.T) {
if tc.valid {
assert.NoErrorf(t, tc.params.ValidateConsensusParams(), "expected no error for valid params (#%d)", i)
} else {
assert.Errorf(t, tc.params.ValidateConsensusParams(), "expected error for non valid params (#%d)", i)
}
})
}
}
@@ -175,18 +182,34 @@ type makeParamsArgs struct {
pubkeyTypes []string
precision time.Duration
messageDelay time.Duration
propose time.Duration
proposeDelta time.Duration
vote time.Duration
voteDelta time.Duration
commit time.Duration
bypassCommitTimeout bool
propose *time.Duration
proposeDelta *time.Duration
vote *time.Duration
voteDelta *time.Duration
commit *time.Duration
}
func makeParams(args makeParamsArgs) ConsensusParams {
if args.pubkeyTypes == nil {
args.pubkeyTypes = valEd25519
}
if args.propose == nil {
args.propose = durationPtr(1)
}
if args.proposeDelta == nil {
args.proposeDelta = durationPtr(1)
}
if args.vote == nil {
args.vote = durationPtr(1)
}
if args.voteDelta == nil {
args.voteDelta = durationPtr(1)
}
if args.commit == nil {
args.commit = durationPtr(1)
}
return ConsensusParams{
Block: BlockParams{
MaxBytes: args.blockBytes,
@@ -205,11 +228,11 @@ func makeParams(args makeParamsArgs) ConsensusParams {
MessageDelay: args.messageDelay,
},
Timeout: TimeoutParams{
Propose: args.propose,
ProposeDelta: args.proposeDelta,
Vote: args.vote,
VoteDelta: args.voteDelta,
Commit: args.commit,
Propose: *args.propose,
ProposeDelta: *args.proposeDelta,
Vote: *args.vote,
VoteDelta: *args.voteDelta,
Commit: *args.commit,
BypassCommitTimeout: args.bypassCommitTimeout,
},
}
@@ -268,11 +291,11 @@ func TestConsensusParamsUpdate(t *testing.T) {
{
// update timeout params
intialParams: makeParams(makeParamsArgs{
propose: 3 * time.Second,
proposeDelta: 500 * time.Millisecond,
vote: time.Second,
voteDelta: 500 * time.Millisecond,
commit: time.Second,
propose: durationPtr(3 * time.Second),
proposeDelta: durationPtr(500 * time.Millisecond),
vote: durationPtr(time.Second),
voteDelta: durationPtr(500 * time.Millisecond),
commit: durationPtr(time.Second),
bypassCommitTimeout: false,
}),
updates: &tmproto.ConsensusParams{
@@ -286,11 +309,11 @@ func TestConsensusParamsUpdate(t *testing.T) {
},
},
updatedParams: makeParams(makeParamsArgs{
propose: 2 * time.Second,
proposeDelta: 400 * time.Millisecond,
vote: 5 * time.Second,
voteDelta: 400 * time.Millisecond,
commit: time.Minute,
propose: durationPtr(2 * time.Second),
proposeDelta: durationPtr(400 * time.Millisecond),
vote: durationPtr(5 * time.Second),
voteDelta: durationPtr(400 * time.Millisecond),
commit: durationPtr(time.Minute),
bypassCommitTimeout: true,
}),
},