From fe0bc6d51173d4aa5c83a2773e56c9163875b3a7 Mon Sep 17 00:00:00 2001
From: Holger <holger@nahrstaedt.de>
Date: Fri, 22 Jun 2018 23:32:37 +0200
Subject: [PATCH] New steem instance for each thread

* "Bad or missing upstream response" is handled
---
 beem/blockchain.py      | 18 ++++++++++++++----
 beemapi/steemnoderpc.py |  3 +++
 2 files changed, 17 insertions(+), 4 deletions(-)

diff --git a/beem/blockchain.py b/beem/blockchain.py
index 04e63425..195c2671 100644
--- a/beem/blockchain.py
+++ b/beem/blockchain.py
@@ -19,11 +19,13 @@ from datetime import datetime, timedelta
 from .utils import formatTimeString, addTzInfo
 from .block import Block
 from beemapi.node import Nodes
+from beemapi.steemnoderpc import SteemNodeRPC
 from .exceptions import BatchedCallsNotSupported, BlockDoesNotExistsException, BlockWaitTimeExceeded, OfflineHasNoRPCException
 from beemapi.exceptions import NumRetriesReached
 from beemgraphenebase.py23 import py23_bytes
 from beem.instance import shared_steem_instance
 from .amount import Amount
+import beem as stm
 log = logging.getLogger(__name__)
 if sys.version_info < (3, 0):
     from Queue import Queue
@@ -394,6 +396,13 @@ class Blockchain(object):
             pool = ThreadPoolExecutor(max_workers=thread_num)
         elif threading:
             pool = Pool(thread_num, batch_mode=True)
+        if threading:
+            steem_instance = []
+            for i in range(thread_num):
+                steem_instance.append(stm.Steem(node=self.steem.rpc.nodes,
+                                                num_retries=self.steem.rpc.num_retries,
+                                                num_retries_call=self.steem.rpc.num_retries_call,
+                                                timeout=self.steem.rpc.timeout))
         # We are going to loop indefinitely
         while True:
 
@@ -424,9 +433,9 @@ class Blockchain(object):
                         block_num_list.append(blocknum + i)
                         results = []
                         if FUTURES_MODULE is not None:
-                            futures.append(pool.submit(Block, blocknum + i, only_ops=only_ops, only_virtual_ops=only_virtual_ops, steem_instance=self.steem))
+                            futures.append(pool.submit(Block, blocknum + i, only_ops=only_ops, only_virtual_ops=only_virtual_ops, steem_instance=steem_instance[i]))
                         else:
-                            pool.enqueue(Block, blocknum + i, only_ops=only_ops, only_virtual_ops=only_virtual_ops, steem_instance=self.steem)
+                            pool.enqueue(Block, blocknum + i, only_ops=only_ops, only_virtual_ops=only_virtual_ops, steem_instance=steem_instance[i])
                         i += 1
                     if FUTURES_MODULE is not None:
                         try:
@@ -867,8 +876,9 @@ class Blockchain(object):
 
             >>> from beem.blockchain import Blockchain
             >>> blockchain = Blockchain()
-            >>> print(blockchain.get_similar_account_names("test", limit=5))
-            ['test', 'test-1', 'test-2', 'test-ico', 'test-ilionx-123']
+            >>> ret = blockchain.get_similar_account_names("test", limit=5)
+            >>> ret == ['test', 'test-1', 'test-2', 'test-ico', 'test-ilionx-123']
+            True
 
         """
         if not self.steem.is_connected():
diff --git a/beemapi/steemnoderpc.py b/beemapi/steemnoderpc.py
index 1cd0d7dd..ae0c16fc 100644
--- a/beemapi/steemnoderpc.py
+++ b/beemapi/steemnoderpc.py
@@ -132,6 +132,9 @@ class SteemNodeRPC(GrapheneRPC):
         elif re.search("Request Timeout", msg):
             self.nodes.sleep_and_check_retries(str(msg), call_retry=True)
             doRetry = True
+        elif re.search("Bad or missing upstream response", msg):
+            self.nodes.sleep_and_check_retries(str(msg), call_retry=True)
+            doRetry = True
         elif re.search("Internal Error", msg) or re.search("Unknown exception", msg):
             self.nodes.sleep_and_check_retries(str(msg), call_retry=True)
             doRetry = True
-- 
GitLab