From c181f8df82d3a948ad138cd063a071b524638ee2 Mon Sep 17 00:00:00 2001 From: Neil Booth Date: Sat, 10 Dec 2016 10:43:01 +0900 Subject: [PATCH 1/3] Put a try/except around socket.shutdown --- server/protocol.py | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/server/protocol.py b/server/protocol.py index dd6c855..b1be03d 100644 --- a/server/protocol.py +++ b/server/protocol.py @@ -514,14 +514,19 @@ class ServerManager(util.LoggedClass): for session in self.sessions: if session.is_closing(): if session.stop <= shutdown_cutoff and session.socket: - # Should trigger a call to connection_lost very soon - session.socket.shutdown(socket.SHUT_RDWR) + try: + # Force shut down - a call to connection_lost + # should come soon after + session.socket.shutdown(socket.SHUT_RDWR) + except socket.error: + pass else: if session.last_recv < stale_cutoff: self.close_session(session) stale.append(session.id_) if stale: self.logger.info('closing stale connections {}'.format(stale)) + # Clear out empty groups for key in [k for k, v in self.groups.items() if not v]: del self.groups[key] From d1e314a48b5edab413d8906e85bcc4f8317f54fd Mon Sep 17 00:00:00 2001 From: Neil Booth Date: Sat, 10 Dec 2016 11:05:57 +0900 Subject: [PATCH 2/3] Show group session count in the groups RPC call --- server/protocol.py | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/server/protocol.py b/server/protocol.py index b1be03d..170b675 100644 --- a/server/protocol.py +++ b/server/protocol.py @@ -520,10 +520,9 @@ class ServerManager(util.LoggedClass): session.socket.shutdown(socket.SHUT_RDWR) except socket.error: pass - else: - if session.last_recv < stale_cutoff: - self.close_session(session) - stale.append(session.id_) + elif session.last_recv < stale_cutoff: + self.close_session(session) + stale.append(session.id_) if stale: self.logger.info('closing stale connections {}'.format(stale)) @@ -572,13 +571,14 @@ class ServerManager(util.LoggedClass): data is the return value of rpc_groups().''' - fmt = ('{:<6} {:>9} {:>6} {:>6} {:>8}' + fmt = ('{:<6} {:>9} {:>9} {:>6} {:>6} {:>8}' '{:>7} {:>9} {:>7} {:>9}') - yield fmt.format('ID', 'Bw Qta KB', 'Reqs', 'Txs', 'Subs', + yield fmt.format('ID', 'Sessions', 'Bw Qta KB', 'Reqs', 'Txs', 'Subs', 'Recv', 'Recv KB', 'Sent', 'Sent KB') - for (id_, bandwidth, reqs, txs_sent, subs, + for (id_, session_count, bandwidth, reqs, txs_sent, subs, recv_count, recv_size, send_count, send_size) in data: yield fmt.format(id_, + '{:,d}'.format(session_count), '{:,d}'.format(bandwidth // 1024), '{:,d}'.format(reqs), '{:,d}'.format(txs_sent), @@ -594,6 +594,7 @@ class ServerManager(util.LoggedClass): for group_id in sorted(self.groups.keys()): sessions = self.groups[group_id] result.append([group_id, + len(sessions), sum(s.bandwidth_used for s in sessions), sum(s.requests_remaining() for s in sessions), sum(s.txs_sent for s in sessions), From 89d83349e1c83680b4daece4872db95392f55b73 Mon Sep 17 00:00:00 2001 From: Neil Booth Date: Sat, 10 Dec 2016 11:08:44 +0900 Subject: [PATCH 3/3] Prepare 0.8.11 --- RELEASE-NOTES | 6 ++++++ server/protocol.py | 1 + server/version.py | 2 +- 3 files changed, 8 insertions(+), 1 deletion(-) diff --git a/RELEASE-NOTES b/RELEASE-NOTES index 4820bd3..180d6c9 100644 --- a/RELEASE-NOTES +++ b/RELEASE-NOTES @@ -1,3 +1,9 @@ +version 0.8.11 +-------------- + +- catch harmless socket exception +- show session count in groups RPC call + version 0.8.10 -------------- diff --git a/server/protocol.py b/server/protocol.py index 170b675..5811f95 100644 --- a/server/protocol.py +++ b/server/protocol.py @@ -471,6 +471,7 @@ class ServerManager(util.LoggedClass): await asyncio.sleep(2) self.logger.info('{:,d} sessions remaining' .format(len(self.sessions))) + await asyncio.sleep(1) def add_session(self, session): # Some connections are acknowledged after the servers are closed diff --git a/server/version.py b/server/version.py index 646bbdf..654374a 100644 --- a/server/version.py +++ b/server/version.py @@ -1 +1 @@ -VERSION = "ElectrumX 0.8.10" +VERSION = "ElectrumX 0.8.11"