~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/smart/protocol.py

  • Committer: Patch Queue Manager
  • Date: 2015-09-30 16:43:21 UTC
  • mfrom: (6603.2.2 fix-keep-dirty)
  • Revision ID: pqm@pqm.ubuntu.com-20150930164321-ct2v2qnmvimqt8qf
(vila) Avoid associating dirty patch headers with the previous file in the
 patch. (Colin Watson)

Show diffs side-by-side

added added

removed removed

Lines of Context:
18
18
client and server.
19
19
"""
20
20
 
 
21
from __future__ import absolute_import
 
22
 
21
23
import collections
22
24
from cStringIO import StringIO
23
25
import struct
24
26
import sys
25
27
import thread
26
 
import threading
27
28
import time
28
29
 
29
30
import bzrlib
654
655
        """Make a remote call with a readv array.
655
656
 
656
657
        The body is encoded with one line per readv offset pair. The numbers in
657
 
        each pair are separated by a comma, and no trailing \n is emitted.
 
658
        each pair are separated by a comma, and no trailing \\n is emitted.
658
659
        """
659
660
        if 'hpss' in debug.debug_flags:
660
661
            mutter('hpss call w/readv: %s', repr(args)[1:-1])
1081
1082
        self._real_write_func = write_func
1082
1083
 
1083
1084
    def _write_func(self, bytes):
1084
 
        # TODO: It is probably more appropriate to use sum(map(len, _buf))
1085
 
        #       for total number of bytes to write, rather than buffer based on
1086
 
        #       the number of write() calls
1087
1085
        # TODO: Another possibility would be to turn this into an async model.
1088
1086
        #       Where we let another thread know that we have some bytes if
1089
1087
        #       they want it, but we don't actually block for it
1231
1229
                    if first_chunk is None:
1232
1230
                        first_chunk = chunk
1233
1231
                    self._write_prefixed_body(chunk)
 
1232
                    self.flush()
1234
1233
                    if 'hpssdetail' in debug.debug_flags:
1235
1234
                        # Not worth timing separately, as _write_func is
1236
1235
                        # actually buffered
1291
1290
        _ProtocolThreeEncoder.__init__(self, medium_request.accept_bytes)
1292
1291
        self._medium_request = medium_request
1293
1292
        self._headers = {}
 
1293
        self.body_stream_started = None
1294
1294
 
1295
1295
    def set_headers(self, headers):
1296
1296
        self._headers = headers.copy()
1331
1331
        """Make a remote call with a readv array.
1332
1332
 
1333
1333
        The body is encoded with one line per readv offset pair. The numbers in
1334
 
        each pair are separated by a comma, and no trailing \n is emitted.
 
1334
        each pair are separated by a comma, and no trailing \\n is emitted.
1335
1335
        """
1336
1336
        if 'hpss' in debug.debug_flags:
1337
1337
            mutter('hpss call w/readv: %s', repr(args)[1:-1])
1356
1356
            if path is not None:
1357
1357
                mutter('                  (to %s)', path)
1358
1358
            self._request_start_time = osutils.timer_func()
 
1359
        self.body_stream_started = False
1359
1360
        self._write_protocol_version()
1360
1361
        self._write_headers(self._headers)
1361
1362
        self._write_structure(args)
1363
1364
        #       have finished sending the stream.  We would notice at the end
1364
1365
        #       anyway, but if the medium can deliver it early then it's good
1365
1366
        #       to short-circuit the whole request...
 
1367
        # Provoke any ConnectionReset failures before we start the body stream.
 
1368
        self.flush()
 
1369
        self.body_stream_started = True
1366
1370
        for exc_info, part in _iter_with_errors(stream):
1367
1371
            if exc_info is not None:
1368
1372
                # Iterating the stream failed.  Cleanly abort the request.