From fb507590344bdbb2e7c46d379e2ca70cabc299ab Mon Sep 17 00:00:00 2001 From: Forrest Voight Date: Tue, 26 Jul 2011 15:00:57 -0400 Subject: [PATCH 1/4] sliding window long polling rate limit --- HttpTransport.py | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/HttpTransport.py b/HttpTransport.py index 5fe5971..dd94a17 100644 --- a/HttpTransport.py +++ b/HttpTransport.py @@ -136,8 +136,13 @@ def send_internal(self, result, nonce): def long_poll_thread(self): last_host = None + times = [] while True: - sleep(1) + # limit to 5 in the last 5 seconds + times.append(time()) + if len(times) > 5: + time_5_ago = times.pop(0) + sleep(max(0, min(1, time_5_ago + 5 - time()))) url = self.long_poll_url if url != '': proto = self.proto From aa5aa93cca7a411d764b1b6bf0e234143af79926 Mon Sep 17 00:00:00 2001 From: Forrest Voight Date: Thu, 28 Jul 2011 14:56:18 -0400 Subject: [PATCH 2/4] instead try only delaying on errors --- HttpTransport.py | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/HttpTransport.py b/HttpTransport.py index dd94a17..e542a01 100644 --- a/HttpTransport.py +++ b/HttpTransport.py @@ -136,13 +136,7 @@ def send_internal(self, result, nonce): def long_poll_thread(self): last_host = None - times = [] while True: - # limit to 5 in the last 5 seconds - times.append(time()) - if len(times) > 5: - time_5_ago = times.pop(0) - sleep(max(0, min(1, time_5_ago + 5 - time()))) url = self.long_poll_url if url != '': proto = self.proto @@ -170,12 +164,17 @@ def long_poll_thread(self): say_line('long poll: new block %s%s', (result['result']['data'][56:64], result['result']['data'][48:56])) except NotAuthorized: say_line('long poll: Wrong username or password') + sleep(.5) except RPCError as e: say_line('long poll: %s', e) + sleep(.5) except (IOError, httplib.HTTPException, ValueError): say_line('long poll: IO error') #traceback.print_exc() self.close_lp_connection() + sleep(.5) + else: + sleep(.5) def stop(self): self.should_stop = True From fe9858fc9f8c0104673917599413fc73683d4378 Mon Sep 17 00:00:00 2001 From: Forrest Voight Date: Fri, 29 Jul 2011 03:56:55 -0400 Subject: [PATCH 3/4] X-Work-Identifier implementation --- HttpTransport.py | 5 +++-- Transport.py | 4 ++-- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/HttpTransport.py b/HttpTransport.py index e542a01..7d7c924 100644 --- a/HttpTransport.py +++ b/HttpTransport.py @@ -183,7 +183,7 @@ def stop(self): def set_server(self, server): super(HttpTransport, self).set_server(server) user, pwd = server[1:3] - self.headers = {"User-Agent": self.user_agent, "Authorization": 'Basic ' + b64encode('%s:%s' % (user, pwd))} + self.headers = {"User-Agent": self.user_agent, "Authorization": 'Basic ' + b64encode('%s:%s' % (user, pwd)), 'X-Work-Identifier': 1} self.long_poll_url = '' if self.connection: self.connection.close() @@ -215,7 +215,8 @@ def decode(self, work): job.f = np.zeros(8, np.uint32) job.state2 = partial(job.state, job.merkle_end, job.time, job.difficulty, job.f) job.targetQ = 2**256 / int(''.join(list(chunks(work['target'], 2))[::-1]), 16) + job.identifier = (1, work['identifier']) if 'identifier' in work else (0, job.header[25:29]) calculateF(job.state, job.merkle_end, job.time, job.difficulty, job.f, job.state2) - return job \ No newline at end of file + return job diff --git a/Transport.py b/Transport.py index 69fda49..b42e256 100644 --- a/Transport.py +++ b/Transport.py @@ -117,8 +117,8 @@ def queue_work(self, work): self.miner.work_queue.put(work) if work: self.update = False; self.last_work = time() - if self.last_block != work.header[25:29]: - self.last_block = work.header[25:29] + if self.last_block != work.identifier: + self.last_block = work.identifier self.clear_result_queue() def clear_result_queue(self): From 5590e7c2d78c30cc029aeacd93261d2b225c98df Mon Sep 17 00:00:00 2001 From: Forrest Voight Date: Sun, 31 Jul 2011 01:17:42 -0400 Subject: [PATCH 4/4] make header a string for completeness' sake --- HttpTransport.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/HttpTransport.py b/HttpTransport.py index 7d7c924..4092228 100644 --- a/HttpTransport.py +++ b/HttpTransport.py @@ -183,7 +183,7 @@ def stop(self): def set_server(self, server): super(HttpTransport, self).set_server(server) user, pwd = server[1:3] - self.headers = {"User-Agent": self.user_agent, "Authorization": 'Basic ' + b64encode('%s:%s' % (user, pwd)), 'X-Work-Identifier': 1} + self.headers = {"User-Agent": self.user_agent, "Authorization": 'Basic ' + b64encode('%s:%s' % (user, pwd)), 'X-Work-Identifier': '1'} self.long_poll_url = '' if self.connection: self.connection.close()