mirror of
https://github.com/tahoe-lafs/tahoe-lafs.git
synced 2025-03-03 04:49:41 +00:00
Split out Foolscap code from BucketReader/Writer.
This commit is contained in:
parent
f7cb4d5c92
commit
476c41e49e
src/allmydata/storage
@ -230,8 +230,10 @@ class ShareFile(object):
|
|||||||
return space_freed
|
return space_freed
|
||||||
|
|
||||||
|
|
||||||
@implementer(RIBucketWriter)
|
class BucketWriter(object):
|
||||||
class BucketWriter(Referenceable): # type: ignore # warner/foolscap#78
|
"""
|
||||||
|
Keep track of the process of writing to a ShareFile.
|
||||||
|
"""
|
||||||
|
|
||||||
def __init__(self, ss, incominghome, finalhome, max_size, lease_info, clock):
|
def __init__(self, ss, incominghome, finalhome, max_size, lease_info, clock):
|
||||||
self.ss = ss
|
self.ss = ss
|
||||||
@ -251,7 +253,7 @@ class BucketWriter(Referenceable): # type: ignore # warner/foolscap#78
|
|||||||
def allocated_size(self):
|
def allocated_size(self):
|
||||||
return self._max_size
|
return self._max_size
|
||||||
|
|
||||||
def remote_write(self, offset, data):
|
def write(self, offset, data):
|
||||||
# Delay the timeout, since we received data:
|
# Delay the timeout, since we received data:
|
||||||
self._timeout.reset(30 * 60)
|
self._timeout.reset(30 * 60)
|
||||||
start = self._clock.seconds()
|
start = self._clock.seconds()
|
||||||
@ -275,9 +277,6 @@ class BucketWriter(Referenceable): # type: ignore # warner/foolscap#78
|
|||||||
self.ss.add_latency("write", self._clock.seconds() - start)
|
self.ss.add_latency("write", self._clock.seconds() - start)
|
||||||
self.ss.count("write")
|
self.ss.count("write")
|
||||||
|
|
||||||
def remote_close(self):
|
|
||||||
self.close()
|
|
||||||
|
|
||||||
def close(self):
|
def close(self):
|
||||||
precondition(not self.closed)
|
precondition(not self.closed)
|
||||||
self._timeout.cancel()
|
self._timeout.cancel()
|
||||||
@ -329,13 +328,10 @@ class BucketWriter(Referenceable): # type: ignore # warner/foolscap#78
|
|||||||
facility="tahoe.storage", level=log.UNUSUAL)
|
facility="tahoe.storage", level=log.UNUSUAL)
|
||||||
self.abort()
|
self.abort()
|
||||||
|
|
||||||
def remote_abort(self):
|
def abort(self):
|
||||||
log.msg("storage: aborting sharefile %s" % self.incominghome,
|
log.msg("storage: aborting sharefile %s" % self.incominghome,
|
||||||
facility="tahoe.storage", level=log.UNUSUAL)
|
facility="tahoe.storage", level=log.UNUSUAL)
|
||||||
self.abort()
|
|
||||||
self.ss.count("abort")
|
self.ss.count("abort")
|
||||||
|
|
||||||
def abort(self):
|
|
||||||
if self.closed:
|
if self.closed:
|
||||||
return
|
return
|
||||||
|
|
||||||
@ -358,8 +354,28 @@ class BucketWriter(Referenceable): # type: ignore # warner/foolscap#78
|
|||||||
self._timeout.cancel()
|
self._timeout.cancel()
|
||||||
|
|
||||||
|
|
||||||
@implementer(RIBucketReader)
|
@implementer(RIBucketWriter)
|
||||||
class BucketReader(Referenceable): # type: ignore # warner/foolscap#78
|
class FoolscapBucketWriter(Referenceable): # type: ignore # warner/foolscap#78
|
||||||
|
"""
|
||||||
|
Foolscap-specific BucketWriter.
|
||||||
|
"""
|
||||||
|
def __init__(self, bucket_writer):
|
||||||
|
self._bucket_writer = bucket_writer
|
||||||
|
|
||||||
|
def remote_write(self, offset, data):
|
||||||
|
return self._bucket_writer.write(offset, data)
|
||||||
|
|
||||||
|
def remote_close(self):
|
||||||
|
return self._bucket_writer.close()
|
||||||
|
|
||||||
|
def remote_abort(self):
|
||||||
|
return self._bucket_writer.abort()
|
||||||
|
|
||||||
|
|
||||||
|
class BucketReader(object):
|
||||||
|
"""
|
||||||
|
Manage the process for reading from a ``ShareFile``.
|
||||||
|
"""
|
||||||
|
|
||||||
def __init__(self, ss, sharefname, storage_index=None, shnum=None):
|
def __init__(self, ss, sharefname, storage_index=None, shnum=None):
|
||||||
self.ss = ss
|
self.ss = ss
|
||||||
@ -374,15 +390,31 @@ class BucketReader(Referenceable): # type: ignore # warner/foolscap#78
|
|||||||
),
|
),
|
||||||
self.shnum)
|
self.shnum)
|
||||||
|
|
||||||
def remote_read(self, offset, length):
|
def read(self, offset, length):
|
||||||
start = time.time()
|
start = time.time()
|
||||||
data = self._share_file.read_share_data(offset, length)
|
data = self._share_file.read_share_data(offset, length)
|
||||||
self.ss.add_latency("read", time.time() - start)
|
self.ss.add_latency("read", time.time() - start)
|
||||||
self.ss.count("read")
|
self.ss.count("read")
|
||||||
return data
|
return data
|
||||||
|
|
||||||
def remote_advise_corrupt_share(self, reason):
|
def advise_corrupt_share(self, reason):
|
||||||
return self.ss.advise_corrupt_share(b"immutable",
|
return self.ss.advise_corrupt_share(b"immutable",
|
||||||
self.storage_index,
|
self.storage_index,
|
||||||
self.shnum,
|
self.shnum,
|
||||||
reason)
|
reason)
|
||||||
|
|
||||||
|
|
||||||
|
@implementer(RIBucketReader)
|
||||||
|
class FoolscapBucketReader(Referenceable): # type: ignore # warner/foolscap#78
|
||||||
|
"""
|
||||||
|
Foolscap wrapper for ``BucketReader``
|
||||||
|
"""
|
||||||
|
|
||||||
|
def __init__(self, bucket_reader):
|
||||||
|
self._bucket_reader = bucket_reader
|
||||||
|
|
||||||
|
def remote_read(self, offset, length):
|
||||||
|
return self._bucket_reader.read(offset, length)
|
||||||
|
|
||||||
|
def remote_advise_corrupt_share(self, reason):
|
||||||
|
return self._bucket_reader.advise_corrupt_share(reason)
|
||||||
|
@ -33,7 +33,10 @@ from allmydata.storage.lease import LeaseInfo
|
|||||||
from allmydata.storage.mutable import MutableShareFile, EmptyShare, \
|
from allmydata.storage.mutable import MutableShareFile, EmptyShare, \
|
||||||
create_mutable_sharefile
|
create_mutable_sharefile
|
||||||
from allmydata.mutable.layout import MAX_MUTABLE_SHARE_SIZE
|
from allmydata.mutable.layout import MAX_MUTABLE_SHARE_SIZE
|
||||||
from allmydata.storage.immutable import ShareFile, BucketWriter, BucketReader
|
from allmydata.storage.immutable import (
|
||||||
|
ShareFile, BucketWriter, BucketReader, FoolscapBucketWriter,
|
||||||
|
FoolscapBucketReader,
|
||||||
|
)
|
||||||
from allmydata.storage.crawler import BucketCountingCrawler
|
from allmydata.storage.crawler import BucketCountingCrawler
|
||||||
from allmydata.storage.expirer import LeaseCheckingCrawler
|
from allmydata.storage.expirer import LeaseCheckingCrawler
|
||||||
|
|
||||||
@ -782,10 +785,18 @@ class FoolscapStorageServer(Referenceable): # type: ignore # warner/foolscap#78
|
|||||||
storage_index, renew_secret, cancel_secret, sharenums, allocated_size,
|
storage_index, renew_secret, cancel_secret, sharenums, allocated_size,
|
||||||
owner_num=owner_num, renew_leases=True,
|
owner_num=owner_num, renew_leases=True,
|
||||||
)
|
)
|
||||||
|
|
||||||
# Abort BucketWriters if disconnection happens.
|
# Abort BucketWriters if disconnection happens.
|
||||||
for bw in bucketwriters.values():
|
for bw in bucketwriters.values():
|
||||||
disconnect_marker = canary.notifyOnDisconnect(bw.disconnected)
|
disconnect_marker = canary.notifyOnDisconnect(bw.disconnected)
|
||||||
self._bucket_writer_disconnect_markers[bw] = (canary, disconnect_marker)
|
self._bucket_writer_disconnect_markers[bw] = (canary, disconnect_marker)
|
||||||
|
|
||||||
|
# Wrap BucketWriters with Foolscap adapter:
|
||||||
|
bucketwriters = {
|
||||||
|
k: FoolscapBucketWriter(bw)
|
||||||
|
for (k, bw) in bucketwriters.items()
|
||||||
|
}
|
||||||
|
|
||||||
return alreadygot, bucketwriters
|
return alreadygot, bucketwriters
|
||||||
|
|
||||||
def remote_add_lease(self, storage_index, renew_secret, cancel_secret,
|
def remote_add_lease(self, storage_index, renew_secret, cancel_secret,
|
||||||
@ -796,7 +807,10 @@ class FoolscapStorageServer(Referenceable): # type: ignore # warner/foolscap#78
|
|||||||
return self._server.renew_lease(storage_index, renew_secret)
|
return self._server.renew_lease(storage_index, renew_secret)
|
||||||
|
|
||||||
def remote_get_buckets(self, storage_index):
|
def remote_get_buckets(self, storage_index):
|
||||||
return self._server.get_buckets(storage_index)
|
return {
|
||||||
|
k: FoolscapBucketReader(bucket)
|
||||||
|
for (k, bucket) in self._server.get_buckets(storage_index).items()
|
||||||
|
}
|
||||||
|
|
||||||
def remote_slot_testv_and_readv_and_writev(self, storage_index,
|
def remote_slot_testv_and_readv_and_writev(self, storage_index,
|
||||||
secrets,
|
secrets,
|
||||||
|
Loading…
x
Reference in New Issue
Block a user