Skip to content

Commit

Permalink
bugfix: secret message registered twice
Browse files Browse the repository at this point in the history
  • Loading branch information
hackaugusto committed Sep 16, 2017
1 parent 1b38396 commit ee25ac5
Show file tree
Hide file tree
Showing 3 changed files with 20 additions and 13 deletions.
5 changes: 0 additions & 5 deletions raiden/message_handler.py
Original file line number Diff line number Diff line change
Expand Up @@ -132,11 +132,6 @@ def message_secret(self, message):
except ValueError:
log.info('Message for unknown channel: {}'.format(pex(message.channel)))
else:
channel.register_transfer(
self.raiden.get_block_number(),
message,
)

self.raiden.handle_secret(
identifier,
channel.token_address,
Expand Down
26 changes: 19 additions & 7 deletions raiden/raiden_service.py
Original file line number Diff line number Diff line change
Expand Up @@ -514,6 +514,7 @@ def handle_secret( # pylint: disable=too-many-arguments
revealsecret_message = RevealSecret(secret)
self.sign(revealsecret_message)

messages_to_send = []
for channel in channels_list:
if channel.partner_state.balance_proof.is_unclaimed(hashlock):
secret = channel.create_secret(identifier, secret)
Expand All @@ -524,10 +525,11 @@ def handle_secret( # pylint: disable=too-many-arguments
secret,
)

self.send_async(
messages_to_send.append((
channel.partner_state.address,
secret,
)
))

channels_to_remove.append(channel)

# withdraw a pending lock
Expand All @@ -539,27 +541,37 @@ def handle_secret( # pylint: disable=too-many-arguments
)

if is_balance_proof:
channel.register_transfer(partner_secret_message)
channel.register_transfer(
self.get_block_number(),
partner_secret_message,
)
channels_to_remove.append(channel)
else:
channel.register_secret(secret)
self.send_async(
messages_to_send.append((
channel.partner_state.address,
revealsecret_message,
)
))
else:
channel.register_secret(secret)
self.send_async(
messages_to_send.append((
channel.partner_state.address,
revealsecret_message,
)
))

for channel in channels_to_remove:
channels_list.remove(channel)

if not channels_list:
del self.token_to_hashlock_to_channels[token_address][hashlock]

# send the messages last to avoid races
for recipient, message in messages_to_send:
self.send_async(
recipient,
message,
)

def get_channel_details(self, token_address, netting_channel):
channel_details = netting_channel.detail()
our_state = ChannelEndState(
Expand Down
2 changes: 1 addition & 1 deletion raiden/tests/integration/test_regression.py
Original file line number Diff line number Diff line change
Expand Up @@ -115,7 +115,7 @@ def test_regression_multiple_revealsecret(raiden_network, token_addresses):
The step marked with an asterisk above introduced a context-switch, this
allowed a second Reveal Secret message to be handled before the channel was
unregistered, because the the channel was updated an exception was raised
unregistered, because the channel was already updated an exception was raised
for an unknown secret.
"""
app0, app1 = raiden_network
Expand Down

0 comments on commit ee25ac5

Please sign in to comment.