Ticket #1545: readv.diff
File readv.diff, 8.0 KB (added by warner, at 2011-09-27T06:54:45Z) |
---|
-
src/allmydata/immutable/downloader/share.py
diff --git a/src/allmydata/immutable/downloader/share.py b/src/allmydata/immutable/downloader/share.py index d512702..8f60232 100644
a b class Share: 725 725 # Reconsider the removal: maybe bring it back. 726 726 ds = self._download_status 727 727 728 v = self._server.get_version() 729 if (v["http://allmydata.org/tahoe/protocols/storage/v1"] 730 ["has-immutable-readv"]): 731 # new-style readv() form 732 readv = list(ask) 733 if not readv: 734 return # nothing to do 735 lp = log.msg(format="%(share)s send_readv [%(span)s]", 736 share=repr(self), span=ask.dump(), 737 level=log.NOISY, parent=self._lp, umid="nByhWA") 738 block_ev = ds.add_block_request(self._server, self._shnum, 739 readv[0][0], readv[0][1], now()) 740 for (start, length) in readv: 741 self._pending.add(start, length) 742 d = self._rref.callRemote("readv", readv) 743 d.addCallback(self._got_datav, readv, lp) 744 d.addErrback(self._got_error, readv[0][0], readv[0][1], block_ev, lp) 745 d.addCallback(self._trigger_loop) 746 d.addErrback(lambda f: 747 log.err(format="unhandled error during send_request", 748 failure=f, parent=self._lp, 749 level=log.WEIRD, umid="qZu0wg")) 750 return d 751 752 # old-style lots-of-read() form 728 753 for (start, length) in ask: 729 754 # TODO: quantize to reasonably-large blocks 730 755 self._pending.add(start, length) … … class Share: 747 772 def _send_request(self, start, length): 748 773 return self._rref.callRemote("read", start, length) 749 774 775 def _got_datav(self, datav, readv, lp): 776 for i,(start,length) in enumerate(readv): 777 data = datav[i] 778 self._pending.remove(start, length) 779 self._received.add(start, data) 780 if len(data) < length: 781 self._unavailable.add(start+len(data), length-len(data)) 782 750 783 def _got_data(self, data, start, length, block_ev, lp): 751 784 block_ev.finished(len(data), now()) 752 785 if not self._alive: -
src/allmydata/interfaces.py
diff --git a/src/allmydata/interfaces.py b/src/allmydata/interfaces.py index cb45623..a1a6f30 100644
a b WriteEnablerSecret = Hash # used to protect mutable bucket modifications 30 30 LeaseRenewSecret = Hash # used to protect bucket lease renewal requests 31 31 LeaseCancelSecret = Hash # used to protect bucket lease cancellation requests 32 32 33 TestVector = ListOf(TupleOf(Offset, ReadSize, str, str)) 34 # elements are (offset, length, operator, specimen) 35 # operator is one of "lt, le, eq, ne, ge, gt" 36 # nop always passes and is used to fetch data while writing. 37 # you should use length==len(specimen) for everything except nop 38 DataVector = ListOf(TupleOf(Offset, ShareData)) 39 # (offset, data). This limits us to 30 writes of 1MiB each per call 40 TestAndWriteVectorsForShares = DictOf(int, 41 TupleOf(TestVector, 42 DataVector, 43 ChoiceOf(None, Offset), # new_length 44 )) 45 ReadVector = ListOf(TupleOf(Offset, ReadSize)) 46 ReadData = ListOf(ShareData) 47 # returns data[offset:offset+length] for each element of TestVector 48 33 49 class RIStubClient(RemoteInterface): 34 50 """Each client publishes a service announcement for a dummy object called 35 51 the StubClient. This object doesn't actually offer any services, but the … … class RIBucketWriter(RemoteInterface): 59 75 class RIBucketReader(RemoteInterface): 60 76 def read(offset=Offset, length=ReadSize): 61 77 return ShareData 78 def readv(readv=ReadVector): 79 return ReadData 62 80 63 81 def advise_corrupt_share(reason=str): 64 82 """Clients who discover hash failures in shares that they have … … class RIBucketReader(RemoteInterface): 72 90 documentation. 73 91 """ 74 92 75 TestVector = ListOf(TupleOf(Offset, ReadSize, str, str))76 # elements are (offset, length, operator, specimen)77 # operator is one of "lt, le, eq, ne, ge, gt"78 # nop always passes and is used to fetch data while writing.79 # you should use length==len(specimen) for everything except nop80 DataVector = ListOf(TupleOf(Offset, ShareData))81 # (offset, data). This limits us to 30 writes of 1MiB each per call82 TestAndWriteVectorsForShares = DictOf(int,83 TupleOf(TestVector,84 DataVector,85 ChoiceOf(None, Offset), # new_length86 ))87 ReadVector = ListOf(TupleOf(Offset, ReadSize))88 ReadData = ListOf(ShareData)89 # returns data[offset:offset+length] for each element of TestVector90 91 93 class RIStorageServer(RemoteInterface): 92 94 __remote_name__ = "RIStorageServer.tahoe.allmydata.com" 93 95 -
src/allmydata/storage/immutable.py
diff --git a/src/allmydata/storage/immutable.py b/src/allmydata/storage/immutable.py index a50ff42..8ca6a80 100644
a b class BucketReader(Referenceable): 314 314 self.ss.count("read") 315 315 return data 316 316 317 def remote_readv(self, readv): 318 start = time.time() 319 datav = [] 320 for (offset, length) in readv: 321 datav.append(self._share_file.read_share_data(offset, length)) 322 self.ss.add_latency("immutable-readv", time.time() - start) 323 self.ss.count("immutable-readv") 324 self.ss.count("immutable-vectors", len(readv)) 325 return datav 326 317 327 def remote_advise_corrupt_share(self, reason): 318 328 return self.ss.remote_advise_corrupt_share("immutable", 319 329 self.storage_index, -
src/allmydata/storage/server.py
diff --git a/src/allmydata/storage/server.py b/src/allmydata/storage/server.py index 1f39c9c..a9b452e 100644
a b class StorageServer(service.MultiService, Referenceable): 77 77 "write": [], 78 78 "close": [], 79 79 "read": [], 80 "immutable-readv": [], 80 81 "get": [], 81 82 "writev": [], # mutable 82 83 "readv": [], … … class StorageServer(service.MultiService, Referenceable): 224 225 "delete-mutable-shares-with-zero-length-writev": True, 225 226 "fills-holes-with-zero-bytes": True, 226 227 "prevents-read-past-end-of-share-data": True, 228 "has-immutable-readv": True, 227 229 }, 228 230 "application-version": str(allmydata.__full_version__), 229 231 } … … class StorageServer(service.MultiService, Referenceable): 491 493 def remote_slot_readv(self, storage_index, shares, readv): 492 494 start = time.time() 493 495 self.count("readv") 496 self.count("mutable-vectors", len(shares)*len(readv)) 494 497 si_s = si_b2a(storage_index) 495 498 lp = log.msg("storage: slot_readv %s %s" % (si_s, shares), 496 499 facility="tahoe.storage", level=log.OPERATIONAL) -
src/allmydata/storage_client.py
diff --git a/src/allmydata/storage_client.py b/src/allmydata/storage_client.py index aa696ed..d7bb38a 100644
a b class NativeStorageServer: 170 170 { "maximum-immutable-share-size": 2**32, 171 171 "tolerates-immutable-read-overrun": False, 172 172 "delete-mutable-shares-with-zero-length-writev": False, 173 "fills-holes-with-zero-bytes": False, 174 "prevents-read-past-end-of-share-data": False, 175 "has-immutable-readv": False, 173 176 }, 174 177 "application-version": "unknown: no get_version()", 175 178 }