Sirikata
|
Disk Cache keeps track of what files are on disk, and manages a helper thread to retrieve it. More...
#include <DiskCacheLayer.hpp>
Classes | |
struct | CacheData |
struct | DiskRequest |
Public Member Functions | |
void | workerThread () |
void | unserialize () |
void | readDataFromDisk (const Fingerprint &fileId, const Range &requestedRange, const TransferCallback &callback) |
void | serializeRanges (const RangeList &list, std::string &out) |
void | unserializeRanges (RangeList &rlist, std::istream &iranges) |
DiskCacheLayer (CachePolicy *policy, const std::string &prefix, CacheLayer *tryNext) | |
virtual | ~DiskCacheLayer () |
virtual void | purgeFromCache (const Fingerprint &fileId) |
Purges this hash from all subsequent caches. | |
virtual void | getData (const Fingerprint &fileId, const Range &requestedRange, const TransferCallback &callback) |
Query this cache layer. | |
Protected Member Functions | |
virtual void | populateCache (const Fingerprint &fileId, const DenseDataPtr &data) |
Goes up the heirararchy of cache layers filling in data. | |
virtual void | destroyCacheEntry (const Fingerprint &fileId, CacheEntry *cacheLayerData, cache_usize_type releaseSize) |
Called after a cache entry has been destroyed-- Does not remove the item from other caches in the chain. | |
Private Attributes | |
ThreadSafeQueue < std::tr1::shared_ptr < DiskRequest > > | mRequestQueue |
Thread * | mWorkerThread |
CacheMap | mFiles |
std::string | mPrefix |
boost::mutex | destroyLock |
boost::condition_variable | destroyCV |
bool | mCleaningUp |
Disk Cache keeps track of what files are on disk, and manages a helper thread to retrieve it.
Sirikata::Transfer::DiskCacheLayer::DiskCacheLayer | ( | CachePolicy * | policy, |
const std::string & | prefix, | ||
CacheLayer * | tryNext | ||
) |
do nothing
References Sirikata::Path::DIR_TEMP, Sirikata::Logging::fatal, Sirikata::Path::Get(), mFiles, mPrefix, mWorkerThread, Sirikata::Transfer::CacheMap::setOwner(), SILOG, unserialize(), and workerThread().
virtual Sirikata::Transfer::DiskCacheLayer::~DiskCacheLayer | ( | ) | [inline, virtual] |
virtual void Sirikata::Transfer::DiskCacheLayer::destroyCacheEntry | ( | const Fingerprint & | fileId, |
CacheEntry * | cacheLayerData, | ||
cache_usize_type | releaseSize | ||
) | [inline, protected, virtual] |
Called after a cache entry has been destroyed-- Does not remove the item from other caches in the chain.
Should be called only from CacheMap.
Reimplemented from Sirikata::Transfer::CacheLayer.
References Sirikata::SHA256::convertToHexString().
virtual void Sirikata::Transfer::DiskCacheLayer::getData | ( | const Fingerprint & | fileId, |
const Range & | requestedRange, | ||
const TransferCallback & | callback | ||
) | [inline, virtual] |
Query this cache layer.
If successful, call callback with the data and also call populateCache in order to populate the previous cache levels.
fid | A unique identifier corresponding to the file (contains a hash). |
requestedRange | A Range object specifying a single range that you need. |
callback | To be called with the data if successful, or NULL if failed. |
Reimplemented from Sirikata::Transfer::CacheLayer.
References Sirikata::Transfer::DiskCacheLayer::CacheData::contains(), Sirikata::Transfer::CacheMap::read_iterator::find(), Sirikata::Transfer::CacheLayer::getData(), and Sirikata::Transfer::CacheMap::read_iterator::use().
Referenced by workerThread().
virtual void Sirikata::Transfer::DiskCacheLayer::populateCache | ( | const Fingerprint & | fileId, |
const DenseDataPtr & | data | ||
) | [inline, protected, virtual] |
Goes up the heirararchy of cache layers filling in data.
fileId | the Fingerprint to store this data in CacheMap. |
data | Data to be stored in this CacheLayer. |
Reimplemented from Sirikata::Transfer::CacheLayer.
References Sirikata::Transfer::CacheLayer::populateParentCaches().
virtual void Sirikata::Transfer::DiskCacheLayer::purgeFromCache | ( | const Fingerprint & | fileId | ) | [inline, virtual] |
Purges this hash from all subsequent caches.
In general, it is not useful to do this manually, since the CachePolicy handles freeing extra data, and it is usually assumed that the cache is correct.
Validity checking should probably be added elsewhere--though it is not really feasable for incomplete downloads if we used a range.
Reimplemented from Sirikata::Transfer::CacheLayer.
References Sirikata::Transfer::CacheMap::write_iterator::erase(), Sirikata::Transfer::CacheMap::write_iterator::find(), and Sirikata::Transfer::CacheLayer::purgeFromCache().
void Sirikata::Transfer::DiskCacheLayer::readDataFromDisk | ( | const Fingerprint & | fileId, |
const Range & | requestedRange, | ||
const TransferCallback & | callback | ||
) | [inline] |
void Sirikata::Transfer::DiskCacheLayer::serializeRanges | ( | const RangeList & | list, |
std::string & | out | ||
) | [inline] |
Referenced by workerThread().
void Sirikata::Transfer::DiskCacheLayer::unserialize | ( | ) |
References Sirikata::Transfer::CacheMap::alloc(), Sirikata::SHA256::convertFromHex(), Sirikata::Logging::detailed, Sirikata::Transfer::CacheMap::write_iterator::find(), Sirikata::Transfer::CacheMap::write_iterator::insert(), mFiles, mPrefix, Sirikata::Transfer::DiskCacheLayer::CacheData::mRanges, SILOG, unserializeRanges(), and Sirikata::Transfer::CacheMap::write_iterator::use().
Referenced by DiskCacheLayer().
void Sirikata::Transfer::DiskCacheLayer::unserializeRanges | ( | RangeList & | rlist, |
std::istream & | iranges | ||
) | [inline] |
References Sirikata::Transfer::Range::addToList(), and Sirikata::Transfer::LENGTH.
Referenced by unserialize().
void Sirikata::Transfer::DiskCacheLayer::workerThread | ( | ) |
References Sirikata::Transfer::DenseDataList::addValidData(), Sirikata::Transfer::CacheMap::alloc(), Sirikata::ThreadSafeQueue< T >::blockingPop(), Sirikata::Transfer::DiskCacheLayer::CacheData::contains(), DEFAULT_OPEN_OPTIONS, destroyCV, destroyLock, Sirikata::Logging::error, Sirikata::Transfer::CacheMap::read_iterator::find(), Sirikata::Transfer::CacheMap::write_iterator::find(), getData(), Sirikata::Transfer::CacheMap::write_iterator::insert(), mFiles, mPrefix, Sirikata::Transfer::DiskCacheLayer::CacheData::mRanges, mRequestQueue, Sirikata::Transfer::DiskCacheLayer::DiskRequest::OPDELETE, Sirikata::Transfer::DiskCacheLayer::DiskRequest::OPEXIT, Sirikata::Transfer::DiskCacheLayer::DiskRequest::OPREAD, Sirikata::Transfer::DiskCacheLayer::DiskRequest::OPWRITE, Sirikata::Transfer::CacheLayer::populateParentCaches(), serializeRanges(), SILOG, Sirikata::Transfer::CacheMap::write_iterator::update(), Sirikata::Transfer::CacheMap::write_iterator::use(), and Sirikata::Transfer::DiskCacheLayer::CacheData::wholeFile().
Referenced by DiskCacheLayer().
boost::condition_variable Sirikata::Transfer::DiskCacheLayer::destroyCV [private] |
Referenced by workerThread().
boost::mutex Sirikata::Transfer::DiskCacheLayer::destroyLock [private] |
Referenced by workerThread().
bool Sirikata::Transfer::DiskCacheLayer::mCleaningUp [private] |
Referenced by DiskCacheLayer(), unserialize(), and workerThread().
std::string Sirikata::Transfer::DiskCacheLayer::mPrefix [private] |
Referenced by DiskCacheLayer(), unserialize(), and workerThread().
ThreadSafeQueue<std::tr1::shared_ptr<DiskRequest> > Sirikata::Transfer::DiskCacheLayer::mRequestQueue [private] |
Referenced by workerThread().
Referenced by DiskCacheLayer().