[ARVADOS] updated: eeeb4aef6e54d5cd3290bdeba91a8009f3e261bc

git at public.curoverse.com git at public.curoverse.com
Tue Sep 8 17:12:24 EDT 2015


Summary of changes:
 services/keepstore/volume.go | 123 +++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 123 insertions(+)

       via  eeeb4aef6e54d5cd3290bdeba91a8009f3e261bc (commit)
      from  20abe07b6780abb3a67292af4f4f8ffab988f9ca (commit)

Those revisions listed above that are new to this repository have
not appeared on any other notification email; so we list those
revisions in full, below.


commit eeeb4aef6e54d5cd3290bdeba91a8009f3e261bc
Author: Tom Clegg <tom at curoverse.com>
Date:   Tue Sep 8 17:12:17 2015 -0400

    7179: Add Volume interface specs.

diff --git a/services/keepstore/volume.go b/services/keepstore/volume.go
index 64fea34..2e80fac 100644
--- a/services/keepstore/volume.go
+++ b/services/keepstore/volume.go
@@ -14,14 +14,137 @@ type Volume interface {
 	// Get a block. IFF the returned error is nil, the caller must
 	// put the returned slice back into the buffer pool when it's
 	// finished with it.
+	//
+	// loc is guaranteed to consist of 32 or more lowercase hex
+	// digits.
+	//
+	// Get should not verify the integrity of the returned data:
+	// it should just return whatever was found in its backing
+	// store.
+	//
+	// If an error is encountered that prevents it from
+	// retrieving the data, that error should be returned so the
+	// caller can log (and send to the client) a more useful
+	// message.
+	//
+	// If the error is "not found", and there's no particular
+	// reason to expect the block to be found (other than that a
+	// caller is asking for it), the returned error should satisfy
+	// os.IsNotExist(err): this is a normal condition and will not
+	// be logged as an error (except that a 404 will appear in the
+	// access log if the block is not found on any other volumes
+	// either).
+	//
+	// If the data in the backing store is bigger than BLOCKSIZE,
+	// Get is permitted to return an error without reading any of
+	// the data.
 	Get(loc string) ([]byte, error)
+
+	// Put writes a block to an underlying storage device.
+	//
+	// loc is as described in Get.
+	//
+	// len(block) is guaranteed to be between 0 and BLOCKSIZE.
+	//
+	// If a block is already stored under the same name (loc) with
+	// different content, Put must either overwrite the existing
+	// data with the new data or return a non-nil error.
+	//
+	// Put must return a non-nil error unless it can guarantee
+	// that the entire block has been written and flushed to
+	// persistent storage. Of course, this guarantee is only as
+	// good as the underlying storage device, but it is Put's
+	// responsibility to at least get whatever guarantee is
+	// offered by the storage device.
+	//
+	// Put should not verify that loc==hash(block): this is the
+	// caller's responsibility.
 	Put(loc string, block []byte) error
+
+	// Touch sets the timestamp for the given locator to the
+	// current time.
+	//
+	// loc is as described in Get.
+	//
+	// Touch must return a non-nil error unless it can guarantee
+	// that a future call to Mtime() will return a timestamp newer
+	// than {now minus one second}.
 	Touch(loc string) error
+
+	// Mtime returns the stored timestamp for the given locator.
+	//
+	// loc is as described in Get.
+	//
+	// Mtime must return a non-nil error if the given block is not
+	// found or the timestamp could not be retrieved.
 	Mtime(loc string) (time.Time, error)
+
+	// IndexTo writes a complete list of locators with the given
+	// prefix for which Get() can retrieve data.
+	//
+	// prefix consists of zero or more lowercase hexadecimal
+	// digits.
+	//
+	// Each locator must be written to the given writer using the
+	// following format:
+	//
+	//   loc "+" size " " timestamp "\n"
+	//
+	// where:
+	//
+	//   - size is the number of bytes of content, given as a
+	//     decimal number with one or more digits
+	//     
+	//   - timestamp is the timestamp stored for the locator,
+	//     given as a decimal number of seconds after January 1,
+	//     1970 UTC.
+	//
+	// IndexTo must not write any other data to writer: for
+	// example, it must not write any blank lines.
+	//
+	// If an error makes it impossible to provide a complete
+	// index, IndexTo must return a non-nil error. It is
+	// acceptable to return a non-nil error after writing a
+	// partial index to writer.
+	//
+	// The resulting index is not expected to be sorted in any
+	// particular order.
 	IndexTo(prefix string, writer io.Writer) error
+
+	// Delete deletes the block data from the underlying storage
+	// device.
+	//
+	// loc is as described in Get.
+	//
+	// If the timestamp for the given locator is newer than
+	// blob_signature_ttl, Delete must not delete the data.
+	//
+	// If callers in different goroutines invoke overlapping
+	// Delete() and Touch() operations on the same locator, the
+	// implementation must guarantee that Touch() returns a
+	// non-nil error, or Delete() does not delete the block, or
+	// both.
 	Delete(loc string) error
+
+	// Status() returns a *VolumeStatus representing the current
+	// in-use and available storage capacity and an
+	// implementation-specific volume identifier (e.g., "mount
+	// point" for a UnixVolume).
 	Status() *VolumeStatus
+
+	// String() returns an identifying label for this volume,
+	// suitable for including in log messages. It should contain
+	// enough information to uniquely identify the underlying
+	// storage device, but should not contain any credentials or
+	// secrets.
 	String() string
+
+	// Writable() returns false if all future Put(), Mtime(), and
+	// Delete() calls are expected to fail.
+	//
+	// If the volume is only temporarily unwritable -- or if Put()
+	// will fail because it is full, but Mtime() or Delete() can
+	// succeed -- then Writable() should return false.
 	Writable() bool
 }
 

-----------------------------------------------------------------------


hooks/post-receive
-- 




More information about the arvados-commits mailing list