commit 152c6abb86f41e3fdf0992501f500571e806091b
parent 9505a203d8de6596f7bd9e04900652a613a7d998
Author: SomberNight <somber.night@protonmail.com>
Date: Wed, 12 Sep 2018 16:58:15 +0200
network: fix another race in session.subscribe
key in session.subscriptions does not imply key in session.cache
Diffstat:
1 file changed, 6 insertions(+), 4 deletions(-)
diff --git a/electrum/interface.py b/electrum/interface.py
@@ -29,6 +29,7 @@ import sys
import traceback
import asyncio
from typing import Tuple, Union
+from collections import defaultdict
import aiorpcx
from aiorpcx import ClientSession, Notification
@@ -46,7 +47,7 @@ class NotificationSession(ClientSession):
def __init__(self, *args, **kwargs):
super(NotificationSession, self).__init__(*args, **kwargs)
- self.subscriptions = {}
+ self.subscriptions = defaultdict(list)
self.cache = {}
async def handle_request(self, request):
@@ -70,12 +71,13 @@ class NotificationSession(ClientSession):
timeout)
async def subscribe(self, method, params, queue):
+ # note: until the cache is written for the first time,
+ # each 'subscribe' call might make a request on the network.
key = self.get_index(method, params)
- if key in self.subscriptions:
- self.subscriptions[key].append(queue)
+ self.subscriptions[key].append(queue)
+ if key in self.cache:
result = self.cache[key]
else:
- self.subscriptions[key] = [queue]
result = await self.send_request(method, params)
self.cache[key] = result
await queue.put(params + [result])