~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/transport/trace.py

  • Committer: Robert Collins
  • Date: 2010-04-08 04:34:03 UTC
  • mfrom: (5138 +trunk)
  • mto: This revision was merged to the branch mainline in revision 5139.
  • Revision ID: robertc@robertcollins.net-20100408043403-56z0d07vdqrx7f3t
Update bugfix for 528114 to trunk.

Show diffs side-by-side

added added

removed removed

Lines of Context:
12
12
#
13
13
# You should have received a copy of the GNU General Public License
14
14
# along with this program; if not, write to the Free Software
15
 
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 
15
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
16
16
 
17
17
"""Implementation of Transport that traces transport operations.
18
18
 
20
20
and then delegates it.
21
21
"""
22
22
 
23
 
from bzrlib.transport.decorator import TransportDecorator, DecoratorServer
24
 
 
25
 
 
26
 
class TransportTraceDecorator(TransportDecorator):
 
23
from bzrlib.transport import decorator
 
24
 
 
25
 
 
26
class TransportTraceDecorator(decorator.TransportDecorator):
27
27
    """A tracing decorator for Transports.
28
28
 
29
29
    Calls that potentially perform IO are logged to self._activity. The
34
34
    operation please add a test to the tests of this transport, for the logging
35
35
    of the operation you want logged.
36
36
 
37
 
    Another future enhancement would be to log to bzrlib.trace.mutter when
38
 
    trace+ is used from the command line (or perhaps as well/instead use
39
 
    -Dtransport), to make tracing operations of the entire program easily.
 
37
    See also TransportLogDecorator, that records a machine-readable log in 
 
38
    memory for eg testing.
40
39
    """
41
40
 
42
41
    def __init__(self, url, _decorated=None, _from_transport=None):
43
42
        """Set the 'base' path where files will be stored.
44
 
        
 
43
 
45
44
        _decorated is a private parameter for cloning.
46
45
        """
47
 
        TransportDecorator.__init__(self, url, _decorated)
 
46
        super(TransportTraceDecorator, self).__init__(url, _decorated)
48
47
        if _from_transport is None:
49
48
            # newly created
50
49
            self._activity = []
62
61
 
63
62
    def delete(self, relpath):
64
63
        """See Transport.delete()."""
 
64
        self._activity.append(('delete', relpath))
65
65
        return self._decorated.delete(relpath)
66
66
 
67
67
    def delete_tree(self, relpath):
75
75
 
76
76
    def get(self, relpath):
77
77
        """See Transport.get()."""
78
 
        self._activity.append(('get', relpath))
 
78
        self._trace(('get', relpath))
79
79
        return self._decorated.get(relpath)
80
80
 
81
81
    def get_smart_client(self):
91
91
 
92
92
    def mkdir(self, relpath, mode=None):
93
93
        """See Transport.mkdir()."""
 
94
        self._trace(('mkdir', relpath, mode))
94
95
        return self._decorated.mkdir(relpath, mode)
95
96
 
96
97
    def open_write_stream(self, relpath, mode=None):
100
101
    def put_file(self, relpath, f, mode=None):
101
102
        """See Transport.put_file()."""
102
103
        return self._decorated.put_file(relpath, f, mode)
103
 
    
 
104
 
104
105
    def put_bytes(self, relpath, bytes, mode=None):
105
106
        """See Transport.put_bytes()."""
106
 
        self._activity.append(('put_bytes', relpath, len(bytes), mode))
 
107
        self._trace(('put_bytes', relpath, len(bytes), mode))
107
108
        return self._decorated.put_bytes(relpath, bytes, mode)
108
109
 
 
110
    def put_bytes_non_atomic(self, relpath, bytes, mode=None,
 
111
        create_parent_dir=False, dir_mode=None):
 
112
        """See Transport.put_bytes_non_atomic."""
 
113
        self._trace(('put_bytes_non_atomic', relpath, len(bytes), mode,
 
114
            create_parent_dir, dir_mode))
 
115
        return self._decorated.put_bytes_non_atomic(relpath, bytes, mode=mode,
 
116
            create_parent_dir=create_parent_dir, dir_mode=dir_mode)
 
117
 
109
118
    def listable(self):
110
119
        """See Transport.listable."""
111
120
        return self._decorated.listable()
113
122
    def iter_files_recursive(self):
114
123
        """See Transport.iter_files_recursive()."""
115
124
        return self._decorated.iter_files_recursive()
116
 
    
 
125
 
117
126
    def list_dir(self, relpath):
118
127
        """See Transport.list_dir()."""
119
128
        return self._decorated.list_dir(relpath)
120
129
 
121
130
    def readv(self, relpath, offsets, adjust_for_latency=False,
122
131
        upper_limit=None):
123
 
        """See Transport.readv."""
124
 
        self._activity.append(('readv', relpath, offsets, adjust_for_latency,
 
132
        # we override at the readv() level rather than _readv() so that any
 
133
        # latency adjustments will be done by the underlying transport
 
134
        self._trace(('readv', relpath, offsets, adjust_for_latency,
125
135
            upper_limit))
126
136
        return self._decorated.readv(relpath, offsets, adjust_for_latency,
127
137
            upper_limit)
131
141
        return self._decorated.recommended_page_size()
132
142
 
133
143
    def rename(self, rel_from, rel_to):
 
144
        self._activity.append(('rename', rel_from, rel_to))
134
145
        return self._decorated.rename(rel_from, rel_to)
135
 
    
 
146
 
136
147
    def rmdir(self, relpath):
137
148
        """See Transport.rmdir."""
 
149
        self._trace(('rmdir', relpath))
138
150
        return self._decorated.rmdir(relpath)
139
151
 
140
152
    def stat(self, relpath):
149
161
        """See Transport.lock_write."""
150
162
        return self._decorated.lock_write(relpath)
151
163
 
152
 
 
153
 
class TraceServer(DecoratorServer):
154
 
    """Server for the TransportTraceDecorator for testing with."""
155
 
 
156
 
    def get_decorator_class(self):
157
 
        return TransportTraceDecorator
 
164
    def _trace(self, operation_tuple):
 
165
        """Record that a transport operation occured.
 
166
 
 
167
        :param operation: Tuple of transport call name and arguments.
 
168
        """
 
169
        self._activity.append(operation_tuple)
158
170
 
159
171
 
160
172
def get_test_permutations():
161
173
    """Return the permutations to be used in testing."""
162
 
    return [(TransportTraceDecorator, TraceServer)]
 
174
    from bzrlib.tests import test_server
 
175
    return [(TransportTraceDecorator, test_server.TraceServer)]