mirror of https://github.com/aria2/aria2
Disard cache when checking checksum
This will slow down checksum checking but does not thrash cache.pull/251/head
parent
0b6501043a
commit
8750d7be99
|
@ -724,6 +724,7 @@ AC_CHECK_FUNCS([__argz_count \
|
|||
mmap \
|
||||
munmap \
|
||||
nl_langinfo \
|
||||
posix_fadvise \
|
||||
posix_memalign \
|
||||
pow \
|
||||
putenv \
|
||||
|
|
|
@ -38,6 +38,7 @@
|
|||
#ifdef HAVE_MMAP
|
||||
# include <sys/mman.h>
|
||||
#endif // HAVE_MMAP
|
||||
#include <fcntl.h>
|
||||
|
||||
#include <cerrno>
|
||||
#include <cstring>
|
||||
|
@ -547,4 +548,11 @@ void AbstractDiskWriter::enableMmap()
|
|||
enableMmap_ = true;
|
||||
}
|
||||
|
||||
void AbstractDiskWriter::dropCache(int64_t len, int64_t offset)
|
||||
{
|
||||
#ifdef HAVE_POSIX_FADVISE
|
||||
posix_fadvise(fd_, offset, len, POSIX_FADV_DONTNEED);
|
||||
#endif // HAVE_POSIX_FADVISE
|
||||
}
|
||||
|
||||
} // namespace aria2
|
||||
|
|
|
@ -96,6 +96,8 @@ public:
|
|||
virtual void disableReadOnly() CXX11_OVERRIDE;
|
||||
|
||||
virtual void enableMmap() CXX11_OVERRIDE;
|
||||
|
||||
virtual void dropCache(int64_t len, int64_t offset) CXX11_OVERRIDE;
|
||||
};
|
||||
|
||||
} // namespace aria2
|
||||
|
|
|
@ -83,6 +83,18 @@ ssize_t AbstractSingleDiskAdaptor::readData
|
|||
return diskWriter_->readData(data, len, offset);
|
||||
}
|
||||
|
||||
ssize_t AbstractSingleDiskAdaptor::readDataDropCache
|
||||
(unsigned char* data, size_t len, int64_t offset)
|
||||
{
|
||||
auto rv = readData(data, len, offset);
|
||||
|
||||
if(rv > 0) {
|
||||
diskWriter_->dropCache(len, offset);
|
||||
}
|
||||
|
||||
return rv;
|
||||
}
|
||||
|
||||
void AbstractSingleDiskAdaptor::writeCache(const WrDiskCacheEntry* entry)
|
||||
{
|
||||
// Write cached data in 4KiB aligned offset. This reduces disk
|
||||
|
|
|
@ -66,6 +66,10 @@ public:
|
|||
virtual ssize_t readData(unsigned char* data, size_t len, int64_t offset)
|
||||
CXX11_OVERRIDE;
|
||||
|
||||
virtual ssize_t readDataDropCache(unsigned char* data, size_t len,
|
||||
int64_t offset)
|
||||
CXX11_OVERRIDE;
|
||||
|
||||
virtual void writeCache(const WrDiskCacheEntry* entry) CXX11_OVERRIDE;
|
||||
|
||||
virtual bool fileExists() CXX11_OVERRIDE;
|
||||
|
|
|
@ -107,6 +107,10 @@ public:
|
|||
// successfully changed.
|
||||
virtual size_t utime(const Time& actime, const Time& modtime) = 0;
|
||||
|
||||
// Just like readData(), but drop cache after read.
|
||||
virtual ssize_t readDataDropCache(unsigned char* data, size_t len,
|
||||
int64_t offset) = 0;
|
||||
|
||||
// Writes cached data to the underlying disk.
|
||||
virtual void writeCache(const WrDiskCacheEntry* entry) = 0;
|
||||
|
||||
|
|
|
@ -82,6 +82,9 @@ public:
|
|||
|
||||
// Enables mmap.
|
||||
virtual void enableMmap() {}
|
||||
|
||||
// Drops cache in range [offset, offset + len)
|
||||
virtual void dropCache(int64_t len, int64_t offset) {}
|
||||
};
|
||||
|
||||
} // namespace aria2
|
||||
|
|
|
@ -64,7 +64,7 @@ void IteratableChecksumValidator::validateChunk()
|
|||
// Don't guard with !finished() to allow zero-length file to be
|
||||
// verified.
|
||||
unsigned char buf[4096];
|
||||
size_t length = pieceStorage_->getDiskAdaptor()->readData
|
||||
size_t length = pieceStorage_->getDiskAdaptor()->readDataDropCache
|
||||
(buf, sizeof(buf), currentOffset_);
|
||||
ctx_->update(buf, length);
|
||||
currentOffset_ += length;
|
||||
|
|
|
@ -125,7 +125,7 @@ std::string IteratableChunkChecksumValidator::digest(int64_t offset, size_t leng
|
|||
ctx_->reset();
|
||||
int64_t max = offset+length;
|
||||
while(offset < max) {
|
||||
size_t r = pieceStorage_->getDiskAdaptor()->readData
|
||||
size_t r = pieceStorage_->getDiskAdaptor()->readDataDropCache
|
||||
(buf, std::min(static_cast<int64_t>(sizeof(buf)), max-offset), offset);
|
||||
if(r == 0) {
|
||||
throw DL_ABORT_EX
|
||||
|
|
|
@ -366,6 +366,18 @@ void MultiDiskAdaptor::writeData(const unsigned char* data, size_t len,
|
|||
|
||||
ssize_t MultiDiskAdaptor::readData
|
||||
(unsigned char* data, size_t len, int64_t offset)
|
||||
{
|
||||
return readData(data, len, offset, false);
|
||||
}
|
||||
|
||||
ssize_t MultiDiskAdaptor::readDataDropCache
|
||||
(unsigned char* data, size_t len, int64_t offset)
|
||||
{
|
||||
return readData(data, len, offset, true);
|
||||
}
|
||||
|
||||
ssize_t MultiDiskAdaptor::readData
|
||||
(unsigned char* data, size_t len, int64_t offset, bool dropCache)
|
||||
{
|
||||
auto first = findFirstDiskWriterEntry(diskWriterEntries_, offset);
|
||||
ssize_t rem = len;
|
||||
|
@ -380,6 +392,9 @@ ssize_t MultiDiskAdaptor::readData
|
|||
totalReadLength +=
|
||||
(*i)->getDiskWriter()->readData(data+(len-rem), readLength, fileOffset);
|
||||
rem -= readLength;
|
||||
if(dropCache) {
|
||||
(*i)->getDiskWriter()->dropCache(readLength, fileOffset);
|
||||
}
|
||||
fileOffset = 0;
|
||||
if(rem == 0) {
|
||||
break;
|
||||
|
|
|
@ -123,6 +123,9 @@ private:
|
|||
|
||||
void openIfNot(DiskWriterEntry* entry, void (DiskWriterEntry::*f)());
|
||||
|
||||
ssize_t readData(unsigned char* data, size_t len, int64_t offset,
|
||||
bool dropCache);
|
||||
|
||||
static const int DEFAULT_MAX_OPEN_FILES = 100;
|
||||
|
||||
public:
|
||||
|
@ -143,6 +146,10 @@ public:
|
|||
virtual ssize_t readData(unsigned char* data, size_t len, int64_t offset)
|
||||
CXX11_OVERRIDE;
|
||||
|
||||
virtual ssize_t readDataDropCache(unsigned char* data, size_t len,
|
||||
int64_t offset)
|
||||
CXX11_OVERRIDE;
|
||||
|
||||
virtual void writeCache(const WrDiskCacheEntry* entry) CXX11_OVERRIDE;
|
||||
|
||||
virtual bool fileExists() CXX11_OVERRIDE;
|
||||
|
|
Loading…
Reference in New Issue