Index: net/disk_cache/disk_cache.h |
=================================================================== |
--- net/disk_cache/disk_cache.h (revision 17450) |
+++ net/disk_cache/disk_cache.h (working copy) |
@@ -154,6 +154,59 @@ |
net::CompletionCallback* completion_callback, |
bool truncate) = 0; |
+ // Sparse entries support: |
+ // |
+ // A Backend implementation can support sparse entries, so the cache keeps |
+ // track of which parts of the entry have been written before. The backend |
+ // will never return data that was not written previously, so reading from |
+ // such region will return 0 bytes read (or actually the number of bytes read |
+ // before reaching that region). |
+ // |
+ // There are only two streams for sparse entries: a regular control stream |
+ // (index 0) that must be accessed through the regular API (ReadData and |
+ // WriteData), and one sparse stream that must me accessed through the sparse- |
+ // aware API that follows. Calling a non-sparse aware method with an index |
+ // argument other than 0 is a mistake that results in implementation specific |
+ // behavior. Using a sparse-aware method with an entry that was not stored |
+ // using the same API, or with a backend that doesn't support sparse entries |
+ // will return ERR_CACHE_INVALID_REQUEST. |
+ // |
+ // The storage granularity of the implementation should be at least 1 KB. In |
+ // other words, storing less than 1 KB may result in an implementation |
+ // dropping the data completely, and writing at offsets not aligned with 1 KB, |
+ // or with lengths not a multiple of 1 KB may result in the first or last part |
+ // of the data being discarded. However, two consecutive writes should not |
+ // result in a hole in between the two parts as long as they are sequential |
+ // (the second one starts where the first one ended), and there is no other |
+ // write between them. |
+ // |
+ // The Backend implementation is free to evict any range from the cache at any |
+ // moment, so in practice, the previously stated granularity of 1 KB is not |
+ // as bad as it sounds. |
+ |
+ // Behaves like ReadData() except that this method is used to access sparse |
+ // entries. |
+ virtual int ReadSparseData(int64 offset, net::IOBuffer* buf, int buf_len, |
+ net::CompletionCallback* completion_callback) = 0; |
+ |
+ // Behaves like WriteData() except that this method is used to access sparse |
+ // entries. |truncate| is not part of this interface because a sparse entry |
+ // is not expected to be reused with new data. To delete the old data and |
+ // start again, or to reduce the total size of the stream data (which implies |
+ // that the content has changed), the whole entry should be doomed and |
+ // re-created. |
+ virtual int WriteSparseData(int64 offset, net::IOBuffer* buf, int buf_len, |
+ net::CompletionCallback* completion_callback) = 0; |
+ |
+ // Returns information about the currently stored portion of a sparse entry. |
+ // |offset| and |len| describe a particular range that should be scanned to |
+ // find out if it is stored or not. |start| will contain the offset of the |
+ // first byte that is stored within this range, and the return value is the |
+ // minimum number of consecutive stored bytes. Note that it is possible that |
+ // this entry has stored more than the returned value. This method returns a |
+ // net error code whenever the request cannot be completed successfully. |
+ virtual int GetAvailableRange(int64 offset, int len, int64* start) = 0; |
+ |
protected: |
virtual ~Entry() {} |
}; |