mirror of
https://github.com/tahoe-lafs/tahoe-lafs.git
synced 2025-02-20 17:52:50 +00:00
add simple metadata (a single string) to the storage protocol
This commit is contained in:
parent
e29032bc36
commit
78a9e815c5
@ -62,6 +62,9 @@ class Lease(Referenceable):
|
||||
def remote_write(self, data):
|
||||
self._bucket.write(data)
|
||||
|
||||
def remote_set_metadata(self, metadata):
|
||||
self._bucket.set_metadata(metadata)
|
||||
|
||||
def remote_close(self):
|
||||
self._bucket.close()
|
||||
|
||||
@ -93,6 +96,7 @@ class WriteBucket(Bucket):
|
||||
precondition(not os.path.exists(bucket_dir))
|
||||
os.mkdir(bucket_dir)
|
||||
|
||||
self._open = True
|
||||
self._size = size
|
||||
self._data = file(os.path.join(self._bucket_dir, 'data'), 'wb')
|
||||
self._bytes_written = 0
|
||||
@ -103,15 +107,21 @@ class WriteBucket(Bucket):
|
||||
self._write_attr('leases', leaser)
|
||||
|
||||
def write(self, data):
|
||||
precondition(self._open)
|
||||
precondition(len(data) + self._bytes_written <= self._size)
|
||||
self._data.write(data)
|
||||
self._data.flush()
|
||||
self._bytes_written += len(data)
|
||||
|
||||
def set_metadata(self, metadata):
|
||||
precondition(self._open)
|
||||
self._write_attr('metadata', metadata)
|
||||
|
||||
def close(self):
|
||||
precondition(self._bytes_written == self._size)
|
||||
self._data.close()
|
||||
self._write_attr('closed', '')
|
||||
self._open = False
|
||||
|
||||
def is_complete(self):
|
||||
complete = Bucket.is_complete(self)
|
||||
@ -132,3 +142,7 @@ class ReadBucket(Bucket, Referenceable):
|
||||
def read(self):
|
||||
return self._read_attr('data')
|
||||
remote_read = read
|
||||
|
||||
def get_metadata(self):
|
||||
return self._read_attr('metadata')
|
||||
remote_get_metadata = get_metadata
|
||||
|
@ -1,6 +1,6 @@
|
||||
|
||||
from zope.interface import Interface
|
||||
from foolscap.schema import StringConstraint, ListOf, TupleOf, Any, Nothing
|
||||
from foolscap.schema import StringConstraint, ListOf, TupleOf, Any
|
||||
from foolscap import RemoteInterface
|
||||
|
||||
Nodeid = StringConstraint(20) # binary format 20-byte SHA1 hash
|
||||
@ -24,9 +24,9 @@ class RIClient(RemoteInterface):
|
||||
def get_service(name=str):
|
||||
return Referenceable_
|
||||
def add_peers(new_peers=ListOf(TupleOf(Nodeid, PBURL), maxLength=100)):
|
||||
return Nothing()
|
||||
return None
|
||||
def lost_peers(lost_peers=ListOf(Nodeid)):
|
||||
return Nothing()
|
||||
return None
|
||||
|
||||
class RIStorageServer(RemoteInterface):
|
||||
def allocate_bucket(verifierid=Verifierid, bucket_num=int, size=int,
|
||||
@ -38,15 +38,18 @@ class RIStorageServer(RemoteInterface):
|
||||
|
||||
class RIBucketWriter(RemoteInterface):
|
||||
def write(data=ShareData):
|
||||
return Nothing()
|
||||
|
||||
return None
|
||||
def set_metadata(metadata=str):
|
||||
return None
|
||||
def close():
|
||||
return Nothing()
|
||||
return None
|
||||
|
||||
|
||||
class RIBucketReader(RemoteInterface):
|
||||
def read():
|
||||
return ShareData
|
||||
def get_metadata():
|
||||
return str
|
||||
|
||||
|
||||
class RIMutableDirectoryNode(RemoteInterface):
|
||||
@ -63,10 +66,10 @@ class RIMutableDirectoryNode(RemoteInterface):
|
||||
return RIMutableDirectoryNode_
|
||||
|
||||
def add_file(name=str, data=Verifierid):
|
||||
return Nothing()
|
||||
return None
|
||||
|
||||
def remove(name=str):
|
||||
return Nothing()
|
||||
return None
|
||||
|
||||
# need more to move directories
|
||||
|
||||
|
@ -49,6 +49,8 @@ class StorageTest(unittest.TestCase):
|
||||
def write_to_bucket(bucket):
|
||||
def write_some(junk, bytes):
|
||||
return bucket.callRemote('write', data=bytes)
|
||||
def set_metadata(junk, metadata):
|
||||
return bucket.callRemote('set_metadata', metadata)
|
||||
def finalise(junk):
|
||||
return bucket.callRemote('close')
|
||||
off1 = len(data) / 2
|
||||
@ -56,6 +58,7 @@ class StorageTest(unittest.TestCase):
|
||||
d = defer.succeed(None)
|
||||
d.addCallback(write_some, data[:off1])
|
||||
d.addCallback(write_some, data[off1:off2])
|
||||
d.addCallback(set_metadata, "metadata")
|
||||
d.addCallback(write_some, data[off2:])
|
||||
d.addCallback(finalise)
|
||||
return d
|
||||
@ -79,6 +82,11 @@ class StorageTest(unittest.TestCase):
|
||||
self.failUnlessEqual(bytes_read, data)
|
||||
d = bucket.callRemote('read')
|
||||
d.addCallback(check_data)
|
||||
|
||||
def check_metadata(metadata):
|
||||
self.failUnlessEqual(metadata, 'metadata')
|
||||
d.addCallback(lambda res: bucket.callRemote('get_metadata'))
|
||||
d.addCallback(check_metadata)
|
||||
return d
|
||||
rssd.addCallback(read_buckets)
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user