mirror of
https://github.com/nspcc-dev/neo-go.git
synced 2024-11-22 09:29:38 +00:00
core: fix data race in notary test
I don't think it's possible with regular service functioning, but it happens during testing because of pointer reuse: WARNING: DATA RACE Read at 0x00c003a0e3f0 by goroutine 114: github.com/nspcc-dev/neo-go/pkg/services/notary.(*Notary).verifyIncompleteWitnesses() /home/runner/work/neo-go/neo-go/pkg/services/notary/notary.go:441 +0x1dc github.com/nspcc-dev/neo-go/pkg/services/notary.(*Notary).OnNewRequest() /home/runner/work/neo-go/neo-go/pkg/services/notary/notary.go:188 +0x205 github.com/nspcc-dev/neo-go/pkg/core.TestNotary.func11() /home/runner/work/neo-go/neo-go/pkg/core/notary_test.go:347 +0x612 github.com/nspcc-dev/neo-go/pkg/core.TestNotary() /home/runner/work/neo-go/neo-go/pkg/core/notary_test.go:443 +0xe33 testing.tRunner() /opt/hostedtoolcache/go/1.16.10/x64/src/testing/testing.go:1193 +0x202 Previous write at 0x00c003a0e3f0 by goroutine 104: github.com/nspcc-dev/neo-go/pkg/services/notary.(*Notary).finalize() /home/runner/work/neo-go/neo-go/pkg/services/notary/notary.go:338 +0x50a github.com/nspcc-dev/neo-go/pkg/services/notary.(*Notary).PostPersist() /home/runner/work/neo-go/neo-go/pkg/services/notary/notary.go:314 +0x297 github.com/nspcc-dev/neo-go/pkg/services/notary.(*Notary).Run() /home/runner/work/neo-go/neo-go/pkg/services/notary/notary.go:169 +0x4a7
This commit is contained in:
parent
f48dffe0e6
commit
65016e8070
1 changed files with 15 additions and 3 deletions
|
@ -55,6 +55,18 @@ func getTestNotary(t *testing.T, bc *Blockchain, walletPath, pass string, onTx f
|
|||
return w.Accounts[0], ntr, mp
|
||||
}
|
||||
|
||||
// dupNotaryRequest duplicates notary request by serializing/deserializing it. Use
|
||||
// it to avoid data races when reusing the same payload. Normal OnNewRequest handler
|
||||
// never receives the same (as in the same pointer) payload multiple times, even if
|
||||
// the contents is the same it would be a separate buffer.
|
||||
func dupNotaryRequest(t *testing.T, p *payload.P2PNotaryRequest) *payload.P2PNotaryRequest {
|
||||
b, err := p.Bytes()
|
||||
require.NoError(t, err)
|
||||
r, err := payload.NewP2PNotaryRequestFromBytes(b)
|
||||
require.NoError(t, err)
|
||||
return r
|
||||
}
|
||||
|
||||
func TestNotary(t *testing.T) {
|
||||
bc := newTestChain(t)
|
||||
var (
|
||||
|
@ -344,7 +356,7 @@ func TestNotary(t *testing.T) {
|
|||
completedCount := len(completedTxes)
|
||||
|
||||
// check that the same request won't be processed twice
|
||||
ntr1.OnNewRequest(requests[sendOrder[i]])
|
||||
ntr1.OnNewRequest(dupNotaryRequest(t, requests[sendOrder[i]]))
|
||||
checkMainTx(t, requesters, requests, i+1, shouldComplete)
|
||||
require.Equal(t, completedCount, len(completedTxes))
|
||||
}
|
||||
|
@ -380,7 +392,7 @@ func TestNotary(t *testing.T) {
|
|||
checkMainTx(t, requesters, submittedRequests, i+1, shouldComplete)
|
||||
|
||||
// check that the same request won't be processed twice
|
||||
ntr1.OnNewRequest(requests[sendOrder[i]])
|
||||
ntr1.OnNewRequest(dupNotaryRequest(t, requests[sendOrder[i]]))
|
||||
checkMainTx(t, requesters, submittedRequests, i+1, shouldComplete)
|
||||
}
|
||||
|
||||
|
@ -424,7 +436,7 @@ func TestNotary(t *testing.T) {
|
|||
completedCount := len(completedTxes)
|
||||
|
||||
// check that the same request won't be processed twice
|
||||
ntr1.OnNewRequest(requests[i])
|
||||
ntr1.OnNewRequest(dupNotaryRequest(t, requests[i]))
|
||||
checkMainTx(t, requesters, requests, i+1, shouldComplete)
|
||||
require.Equal(t, completedCount, len(completedTxes))
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue