Skip to content

Commit 080bffc

Browse files
Stephanie Wehnerclaude
andcommitted
Fix virtRoot race condition in nativeMode server nodes
When the initiating node (Alice/Bob) finishes setup and immediately calls a remote method on a peer, that peer may not have finished connecting to its virtual node yet, leaving virtRoot as None. Add a deferLater polling loop (matching the pattern already used in extendGHZ/bobTest.py) to each remote handler that uses virtRoot, so it waits until setup_local has set the connection before proceeding. Affected: corrRNG/bobTest, teleport/bobTest, extendGHZ/charlieTest, graphState/bobTest, graphState/charlieTest, graphState/davidTest. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
1 parent 05f3493 commit 080bffc

6 files changed

Lines changed: 42 additions & 0 deletions

File tree

examples/nativeMode/corrRNG/bobTest.py

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,9 @@
3333
from simulaqron.local.setup import setup_local
3434
from simulaqron.general.host_config import SocketsConfig
3535
from simulaqron.settings import network_config
36+
from twisted.internet import reactor
3637
from twisted.internet.defer import inlineCallbacks
38+
from twisted.internet.task import deferLater
3739
from twisted.spread import pb
3840

3941
from qutip import Qobj
@@ -98,6 +100,11 @@ def remote_process_qubit(self, virtualNum):
98100
virtualNum number of the virtual qubit corresponding to the EPR pair received
99101
"""
100102

103+
# Wait until our virtual node connection is ready — Alice may call us
104+
# before setup_local has finished connecting to the virtual node.
105+
while self.virtRoot is None:
106+
yield deferLater(reactor, 0.05, lambda: None)
107+
101108
qB = yield self.virtRoot.callRemote("get_virtual_ref", virtualNum)
102109

103110
# Measure

examples/nativeMode/extendGHZ/charlieTest.py

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,9 @@
3232
from simulaqron.local.setup import setup_local
3333
from simulaqron.general.host_config import SocketsConfig
3434
from simulaqron.settings import network_config
35+
from twisted.internet import reactor
3536
from twisted.internet.defer import inlineCallbacks
37+
from twisted.internet.task import deferLater
3638
from twisted.spread import pb
3739

3840

@@ -97,6 +99,11 @@ def remote_receive_ghz(self, virtualNum):
9799

98100
logging.debug("LOCAL %s: Getting reference to qubit number %d.", self.node.name, virtualNum)
99101

102+
# Wait until our virtual node connection is ready — Bob may call us
103+
# before setup_local has finished connecting to the virtual node.
104+
while self.virtRoot is None:
105+
yield deferLater(reactor, 0.05, lambda: None)
106+
100107
q = yield self.virtRoot.callRemote("get_virtual_ref", virtualNum)
101108

102109
# Measure it

examples/nativeMode/graphState/bobTest.py

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,9 @@
3333
from simulaqron.local.setup import setup_local
3434
from simulaqron.general.host_config import SocketsConfig
3535
from simulaqron.settings import network_config
36+
from twisted.internet import reactor
3637
from twisted.internet.defer import inlineCallbacks
38+
from twisted.internet.task import deferLater
3739
from twisted.spread import pb
3840

3941

@@ -94,6 +96,11 @@ def remote_receive_qubit(self, virtualNum):
9496

9597
logging.debug("LOCAL %s: Getting reference to qubit number %d.", self.node.name, virtualNum)
9698

99+
# Wait until our virtual node connection is ready — Alice may call us
100+
# before setup_local has finished connecting to the virtual node.
101+
while self.virtRoot is None:
102+
yield deferLater(reactor, 0.05, lambda: None)
103+
97104
# Get ref of qubit
98105
qB = yield self.virtRoot.callRemote("get_virtual_ref", virtualNum)
99106

examples/nativeMode/graphState/charlieTest.py

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,9 @@
3333
from simulaqron.local.setup import setup_local
3434
from simulaqron.general.host_config import SocketsConfig
3535
from simulaqron.settings import network_config
36+
from twisted.internet import reactor
3637
from twisted.internet.defer import inlineCallbacks
38+
from twisted.internet.task import deferLater
3739
from twisted.spread import pb
3840

3941

@@ -97,6 +99,11 @@ def remote_receive_qubit(self, virtualNum, sender):
9799

98100
logging.debug("LOCAL %s: Getting reference to qubit number %d.", self.node.name, virtualNum)
99101

102+
# Wait until our virtual node connection is ready — Bob may call us
103+
# before setup_local has finished connecting to the virtual node.
104+
while self.virtRoot is None:
105+
yield deferLater(reactor, 0.05, lambda: None)
106+
100107
# Get ref of qubit
101108
self.qC = yield self.virtRoot.callRemote("get_virtual_ref", virtualNum)
102109
qC = self.qC

examples/nativeMode/graphState/davidTest.py

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,9 @@
3333
from simulaqron.local.setup import setup_local
3434
from simulaqron.general.host_config import SocketsConfig
3535
from simulaqron.settings import network_config
36+
from twisted.internet import reactor
3637
from twisted.internet.defer import inlineCallbacks
38+
from twisted.internet.task import deferLater
3739
from twisted.spread import pb
3840

3941

@@ -94,6 +96,11 @@ def remote_receive_qubit(self, virtualNum):
9496

9597
logging.debug("LOCAL %s: Getting reference to qubit number %d.", self.node.name, virtualNum)
9698

99+
# Wait until our virtual node connection is ready — Charlie may call us
100+
# before setup_local has finished connecting to the virtual node.
101+
while self.virtRoot is None:
102+
yield deferLater(reactor, 0.05, lambda: None)
103+
97104
# Get ref of qubit
98105
qD = yield self.virtRoot.callRemote("get_virtual_ref", virtualNum)
99106

examples/nativeMode/teleport/bobTest.py

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,9 @@
3636
from simulaqron.general.host_config import SocketsConfig
3737
from simulaqron.settings import simulaqron_settings, network_config, LOCAL_SIMULAQRON_SETTINGS, LOCAL_NETWORK_SETTINGS
3838
from simulaqron.toolbox.stabilizer_states import StabilizerState
39+
from twisted.internet import reactor
3940
from twisted.internet.defer import inlineCallbacks
41+
from twisted.internet.task import deferLater
4042
from twisted.spread import pb
4143

4244

@@ -102,6 +104,11 @@ def remote_recover_teleport(self, a, b, virtualNum):
102104

103105
logging.debug("LOCAL %s: Getting reference to qubit number %d.", self.node.name, virtualNum)
104106

107+
# Wait until our virtual node connection is ready — Alice may call us
108+
# before setup_local has finished connecting to the virtual node.
109+
while self.virtRoot is None:
110+
yield deferLater(reactor, 0.05, lambda: None)
111+
105112
eprB = yield self.virtRoot.callRemote("get_virtual_ref", virtualNum)
106113

107114
# Apply the desired correction info

0 commit comments

Comments
 (0)