Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions THANKS.md
Original file line number Diff line number Diff line change
Expand Up @@ -14,3 +14,4 @@ In no particular order:

### Bug Reports
- Nanyan
- xixisese
8 changes: 4 additions & 4 deletions agreement/coservice.go
Original file line number Diff line number Diff line change
Expand Up @@ -44,8 +44,8 @@ type coserviceMonitor struct {
}

type coserviceListener interface {
inc(sum uint)
dec(sum uint)
inc(sum uint, state map[coserviceType]uint)
dec(sum uint, state map[coserviceType]uint)
}

func (m *coserviceMonitor) inc(t coserviceType) {
Expand All @@ -62,7 +62,7 @@ func (m *coserviceMonitor) inc(t coserviceType) {
m.c[t]++

if m.coserviceListener != nil {
m.coserviceListener.inc(m.sum())
m.coserviceListener.inc(m.sum(), m.c)
}
}

Expand All @@ -83,7 +83,7 @@ func (m *coserviceMonitor) dec(t coserviceType) {
m.c[t]--

if m.coserviceListener != nil {
m.coserviceListener.dec(m.sum())
m.coserviceListener.dec(m.sum(), m.c)
}
}

Expand Down
2 changes: 1 addition & 1 deletion agreement/proposalStore.go
Original file line number Diff line number Diff line change
Expand Up @@ -374,7 +374,7 @@ func (store *proposalStore) lastRelevant(pv proposalValue) (p period, pinned boo
}

for per := range store.Relevant {
if per > p {
if per > p && store.Relevant[per] == pv {
p = per
}
}
Expand Down
106 changes: 106 additions & 0 deletions agreement/proposalStore_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -801,3 +801,109 @@ func TestProposalStoreRegressionBlockRedeliveryBug_b29ea57(t *testing.T) {
}

}

func TestProposalStoreRegressionWrongPipelinePeriodBug_39387501(t *testing.T) {
var msgV1, msgV2, msgP1, msgP2 message
var rv rawVote
var propVal proposalValue
var propPay proposal
curRound := round(10)
proposer := basics.Address(randomBlockHash())

propPay = proposal{
unauthenticatedProposal: unauthenticatedProposal{
OriginalPeriod: 1,
OriginalProposer: proposer,
},
}
propVal = proposalValue{
OriginalPeriod: 1,
OriginalProposer: proposer,
BlockDigest: propPay.Digest(),
EncodingDigest: crypto.HashObj(propPay),
}
rv = rawVote{
Sender: proposer,
Round: curRound,
Period: 1,
Proposal: propVal,
}
msgV1 = message{
Tag: protocol.AgreementVoteTag,
Vote: vote{R: rv},
UnauthenticatedVote: unauthenticatedVote{R: rv},
}
msgP1 = message{
Tag: protocol.ProposalPayloadTag,
Proposal: propPay,
UnauthenticatedProposal: propPay.u(),
}

propPay = proposal{
unauthenticatedProposal: unauthenticatedProposal{
OriginalPeriod: 2,
OriginalProposer: proposer,
},
}
propVal = proposalValue{
OriginalPeriod: 2,
OriginalProposer: proposer,
BlockDigest: propPay.Digest(),
EncodingDigest: crypto.HashObj(propPay),
}
rv = rawVote{
Sender: proposer,
Round: curRound,
Period: 2,
Proposal: propVal,
}
msgV2 = message{
Tag: protocol.AgreementVoteTag,
Vote: vote{R: rv},
UnauthenticatedVote: unauthenticatedVote{R: rv},
}
msgP2 = message{
Tag: protocol.ProposalPayloadTag,
Proposal: propPay,
UnauthenticatedProposal: propPay.u(),
}

period1Trigger := newPeriodEvent{Period: 1, Proposal: bottom}
propVote1Receipt := messageEvent{T: voteVerified, Input: msgV1}
propPayload1Receipt := messageEvent{T: payloadPresent, Input: msgP1}
period2Trigger := newPeriodEvent{Period: 2, Proposal: bottom}
propVote2Receipt := messageEvent{T: voteVerified, Input: msgV2}
propPayload2Receipt := messageEvent{T: payloadPresent, Input: msgP2}

player := player{Round: curRound}

var router router
rr := routerFixture
router = &rr

var res event

res = router.dispatch(&proposalStoreTracer, player, period1Trigger, playerMachine, proposalMachineRound, curRound, 1, 0)
require.Equal(t, res.t(), none)

res = router.dispatch(&proposalStoreTracer, player, propVote1Receipt, playerMachine, proposalMachineRound, curRound, 1, 0)
require.Equal(t, res.t(), proposalAccepted)

res = router.dispatch(&proposalStoreTracer, player, period2Trigger, playerMachine, proposalMachineRound, curRound, 2, 0)
require.Equal(t, res.t(), none)

res = router.dispatch(&proposalStoreTracer, player, propVote2Receipt, playerMachine, proposalMachineRound, curRound, 2, 0)
require.Equal(t, res.t(), proposalAccepted)

res = router.dispatch(&proposalStoreTracer, player, propPayload2Receipt, playerMachine, proposalMachineRound, curRound, 2, 0)
require.Equal(t, res.t(), payloadPipelined)
require.Equal(t, res.(payloadProcessedEvent).Period, period(2))

res = router.dispatch(&proposalStoreTracer, player, propPayload1Receipt, playerMachine, proposalMachineRound, curRound, 1, 0)
if res.(payloadProcessedEvent).Period == 2 {
t.Fatalf("bug b29ea57: a proposal corresponding to an old period is erroneously seen as as corresponding to a new period")
} else {
require.Equal(t, res.t(), payloadPipelined)
require.Equal(t, res.(payloadProcessedEvent).Period, period(1))
}
}
Loading