~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/smart/medium.py

  • Committer: John Arbash Meinel
  • Date: 2011-09-14 12:58:17 UTC
  • mto: (6133.4.49 2.5-soft-hangup-795025)
  • mto: This revision was merged to the branch mainline in revision 6170.
  • Revision ID: john@arbash-meinel.com-20110914125817-h9csfegz6bvz93yj
It turns out that if we don't explicitly close the socket, it hangs around somewhere.

Which means that the client doesn't *know* that it has been disconnected.

Show diffs side-by-side

added added

removed removed

Lines of Context:
229
229
            while not self.finished:
230
230
                server_protocol = self._build_protocol()
231
231
                self._serve_one_request(server_protocol)
 
232
        except errors.ConnectionTimeout, e:
 
233
            trace.note('%s' % (e,))
 
234
            self._close()
 
235
            raise
232
236
        except Exception, e:
233
237
            stderr.write("%s terminating on exception %s\n" % (self, e))
234
238
            raise
235
239
 
 
240
    def _close(self):
 
241
        """Close the current connection. We stopped due to a timeout/etc."""
 
242
        # The default implementation is a no-op, because that is all we used to
 
243
        # do when disconnecting from a client. I suppose we never had the
 
244
        # *server* initiate a disconnect, before
 
245
 
 
246
    def _wait_for_bytes_with_timeout(self, timeout_seconds):
 
247
        """Wait for more bytes to be read, but timeout if none available.
 
248
 
 
249
        This allows us to detect idle connections, and stop trying to read from
 
250
        them, without setting the socket itself to non-blocking. This also
 
251
        allows us to specify when we watch for idle timeouts.
 
252
 
 
253
        :return: Did we timeout? (True if we timed out, False if there is data
 
254
            to be read)
 
255
        """
 
256
        raise NotImplementedError(self._wait_for_bytes_with_timeout)
 
257
 
236
258
    def _build_protocol(self):
237
259
        """Identifies the version of the incoming request, and returns an
238
260
        a protocol object that can interpret it.
248
270
            #       connecting for us to give a more useful message. :(
249
271
            #       (eg, who is on the other side that we are disconnecting
250
272
            #       from)
251
 
            raise errors.BzrError('Timeout after %.1f seconds, disconnecting'
252
 
                                  % (self._stream_medium_timeout))
 
273
            raise errors.ConnectionTimeout(
 
274
                'disconnecting client after %.1f seconds'
 
275
                % (self._stream_medium_timeout))
253
276
        bytes = self._get_line()
254
277
        protocol_factory, unused_bytes = _get_protocol_factory_for_bytes(bytes)
255
278
        protocol = protocol_factory(
342
365
 
343
366
        self._push_back(protocol.unused_data)
344
367
 
 
368
    def _close(self):
 
369
        """Close the current connection. We stopped due to a timeout/etc."""
 
370
        self.socket.close()
 
371
 
345
372
    def _wait_for_bytes_with_timeout(self, timeout_seconds):
346
373
        """Wait for more bytes to be read, but timeout if none available.
347
374
 
412
439
                return
413
440
            protocol.accept_bytes(bytes)
414
441
 
 
442
    def _close(self):
 
443
        self._in.close()
 
444
        self._out.close()
 
445
 
415
446
    def _wait_for_bytes_with_timeout(self, timeout_seconds):
416
447
        """Wait for more bytes to be read, but timeout if none available.
417
448