Skip to content
This repository was archived by the owner on Jan 24, 2025. It is now read-only.

Commit 0d93eea

Browse files
committed
Fix data race on DockerTestFramework nodes
1 parent fc100e2 commit 0d93eea

File tree

1 file changed

+30
-8
lines changed

1 file changed

+30
-8
lines changed

tools/docker-network/tests/dockerframework.go

Lines changed: 30 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ import (
2323
"github.com/iotaledger/hive.go/ierrors"
2424
"github.com/iotaledger/hive.go/lo"
2525
"github.com/iotaledger/hive.go/runtime/options"
26+
"github.com/iotaledger/hive.go/runtime/syncutils"
2627
"github.com/iotaledger/iota-core/pkg/protocol"
2728
"github.com/iotaledger/iota-core/pkg/testsuite/snapshotcreator"
2829
iotago "github.com/iotaledger/iota.go/v4"
@@ -72,7 +73,8 @@ type Account struct {
7273
type DockerTestFramework struct {
7374
Testing *testing.T
7475

75-
nodes map[string]*Node
76+
nodes map[string]*Node
77+
nodesLock syncutils.RWMutex
7678

7779
snapshotPath string
7880
logDirectoryPath string
@@ -129,7 +131,7 @@ func (d *DockerTestFramework) DockerComposeUp(detach ...bool) error {
129131
}
130132

131133
cmd.Env = os.Environ()
132-
for _, node := range d.nodes {
134+
for _, node := range d.Nodes() {
133135
cmd.Env = append(cmd.Env, fmt.Sprintf("ISSUE_CANDIDACY_PAYLOAD_%s=%t", node.Name, node.IssueCandidacyPayload))
134136
}
135137

@@ -194,7 +196,11 @@ loop:
194196
}
195197

196198
func (d *DockerTestFramework) waitForNodesAndGetClients() error {
197-
for _, node := range d.Nodes() {
199+
nodes := d.Nodes()
200+
201+
d.nodesLock.Lock()
202+
defer d.nodesLock.Unlock()
203+
for _, node := range nodes {
198204
client, err := nodeclient.New(node.ClientURL)
199205
if err != nil {
200206
return ierrors.Wrapf(err, "failed to create node client for node %s", node.Name)
@@ -212,7 +218,7 @@ func (d *DockerTestFramework) WaitUntilSync() error {
212218
defer fmt.Println("Wait until the nodes are synced......done")
213219

214220
d.Eventually(func() error {
215-
for _, node := range d.nodes {
221+
for _, node := range d.Nodes() {
216222
for {
217223
synced, err := node.Client.Health(context.TODO())
218224
if err != nil {
@@ -235,6 +241,9 @@ func (d *DockerTestFramework) WaitUntilSync() error {
235241
}
236242

237243
func (d *DockerTestFramework) AddValidatorNode(name string, containerName string, clientURL string, accAddrBech32 string, optIssueCandidacyPayload ...bool) {
244+
d.nodesLock.Lock()
245+
defer d.nodesLock.Unlock()
246+
238247
issueCandidacyPayload := true
239248
if len(optIssueCandidacyPayload) > 0 {
240249
issueCandidacyPayload = optIssueCandidacyPayload[0]
@@ -250,6 +259,9 @@ func (d *DockerTestFramework) AddValidatorNode(name string, containerName string
250259
}
251260

252261
func (d *DockerTestFramework) AddNode(name string, containerName string, clientURL string) {
262+
d.nodesLock.Lock()
263+
defer d.nodesLock.Unlock()
264+
253265
d.nodes[name] = &Node{
254266
Name: name,
255267
ContainerName: containerName,
@@ -258,6 +270,9 @@ func (d *DockerTestFramework) AddNode(name string, containerName string, clientU
258270
}
259271

260272
func (d *DockerTestFramework) Nodes(names ...string) []*Node {
273+
d.nodesLock.RLock()
274+
defer d.nodesLock.RUnlock()
275+
261276
if len(names) == 0 {
262277
nodes := make([]*Node, 0, len(d.nodes))
263278
for _, node := range d.nodes {
@@ -276,6 +291,9 @@ func (d *DockerTestFramework) Nodes(names ...string) []*Node {
276291
}
277292

278293
func (d *DockerTestFramework) Node(name string) *Node {
294+
d.nodesLock.RLock()
295+
defer d.nodesLock.RUnlock()
296+
279297
node, exist := d.nodes[name]
280298
require.True(d.Testing, exist)
281299

@@ -654,7 +672,7 @@ func (d *DockerTestFramework) AssertIndexerFoundry(foundryID iotago.FoundryID) {
654672

655673
func (d *DockerTestFramework) AssertValidatorExists(accountAddr *iotago.AccountAddress) {
656674
d.Eventually(func() error {
657-
for _, node := range d.nodes {
675+
for _, node := range d.Nodes() {
658676
_, err := node.Client.StakingAccount(context.TODO(), accountAddr)
659677
if err != nil {
660678
return err
@@ -682,7 +700,7 @@ func (d *DockerTestFramework) AssertCommittee(expectedEpoch iotago.EpochIndex, e
682700
time.Sleep(secToWait)
683701

684702
d.Eventually(func() error {
685-
for _, node := range d.nodes {
703+
for _, node := range d.Nodes() {
686704
resp, err := node.Client.Committee(context.TODO())
687705
if err != nil {
688706
return err
@@ -708,7 +726,7 @@ func (d *DockerTestFramework) AssertCommittee(expectedEpoch iotago.EpochIndex, e
708726
}
709727

710728
func (d *DockerTestFramework) AssertFinalizedSlot(condition func(iotago.SlotIndex) error) {
711-
for _, node := range d.nodes {
729+
for _, node := range d.Nodes() {
712730
status := d.NodeStatus(node.Name)
713731

714732
err := condition(status.LatestFinalizedSlot)
@@ -769,7 +787,11 @@ func (d *DockerTestFramework) DumpContainerLogsToFiles() {
769787

770788
func (d *DockerTestFramework) GetContainersConfigs() {
771789
// get container configs
772-
for _, node := range d.Nodes() {
790+
nodes := d.Nodes()
791+
792+
d.nodesLock.Lock()
793+
defer d.nodesLock.Unlock()
794+
for _, node := range nodes {
773795
cmd := fmt.Sprintf("docker inspect --format='{{.Config.Cmd}}' %s", node.ContainerName)
774796
containerConfigsBytes, err := exec.Command("bash", "-c", cmd).Output()
775797
require.NoError(d.Testing, err)

0 commit comments

Comments
 (0)