reduced max open files on levelDB
This commit is contained in:
parent
b52f47f273
commit
a84c196916
4 changed files with 27 additions and 20 deletions
|
@ -80,14 +80,14 @@ static void SetMaxOpenFiles(leveldb::Options *options) {
|
||||||
// implementation that does not use extra file descriptors (the fds are
|
// implementation that does not use extra file descriptors (the fds are
|
||||||
// closed after being mmaped).
|
// closed after being mmaped).
|
||||||
//
|
//
|
||||||
// Increasing the value beyond the default is dangerous because LevelDB will
|
// Increasing the value beyond the nmap count is dangerous because LevelDB will
|
||||||
// fall back to a non-mmap implementation when the file count is too large.
|
// fall back to a non-mmap implementation when the file count is too large (thus contending select()).
|
||||||
// On 32-bit Unix host we should decrease the value because the handles use
|
// On 32-bit Unix host we should decrease the value because the handles use
|
||||||
// up real fds, and we want to avoid fd exhaustion issues.
|
// up real fds, and we want to avoid fd exhaustion issues.
|
||||||
//
|
//
|
||||||
// See PR #12495 for further discussion.
|
// See PR #12495 for further discussion.
|
||||||
|
|
||||||
int default_open_files = options->max_open_files;
|
int default_open_files = 400;
|
||||||
#ifndef WIN32
|
#ifndef WIN32
|
||||||
if (sizeof(void*) < 8) {
|
if (sizeof(void*) < 8) {
|
||||||
options->max_open_files = 64;
|
options->max_open_files = 64;
|
||||||
|
|
|
@ -221,6 +221,9 @@ class RandomAccessFile {
|
||||||
// Get a name for the file, only for error reporting
|
// Get a name for the file, only for error reporting
|
||||||
virtual std::string GetName() const = 0;
|
virtual std::string GetName() const = 0;
|
||||||
|
|
||||||
|
virtual char* AllocateScratch(std::size_t size) const { return new char[size]; };
|
||||||
|
virtual void DeallocateScratch(char* pointer) const { delete[] pointer; };
|
||||||
|
|
||||||
private:
|
private:
|
||||||
// No copying allowed
|
// No copying allowed
|
||||||
RandomAccessFile(const RandomAccessFile&);
|
RandomAccessFile(const RandomAccessFile&);
|
||||||
|
|
|
@ -73,15 +73,15 @@ Status ReadBlock(RandomAccessFile* file,
|
||||||
// Read the block contents as well as the type/crc footer.
|
// Read the block contents as well as the type/crc footer.
|
||||||
// See table_builder.cc for the code that built this structure.
|
// See table_builder.cc for the code that built this structure.
|
||||||
size_t n = static_cast<size_t>(handle.size());
|
size_t n = static_cast<size_t>(handle.size());
|
||||||
char* buf = new char[n + kBlockTrailerSize];
|
char* buf = file->AllocateScratch(n + kBlockTrailerSize);
|
||||||
Slice contents;
|
Slice contents;
|
||||||
Status s = file->Read(handle.offset(), n + kBlockTrailerSize, &contents, buf);
|
Status s = file->Read(handle.offset(), n + kBlockTrailerSize, &contents, buf);
|
||||||
if (!s.ok()) {
|
if (!s.ok()) {
|
||||||
delete[] buf;
|
file->DeallocateScratch(buf);
|
||||||
return s;
|
return s;
|
||||||
}
|
}
|
||||||
if (contents.size() != n + kBlockTrailerSize) {
|
if (contents.size() != n + kBlockTrailerSize) {
|
||||||
delete[] buf;
|
file->DeallocateScratch(buf);
|
||||||
return Status::Corruption("truncated block read", file->GetName());
|
return Status::Corruption("truncated block read", file->GetName());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -91,7 +91,7 @@ Status ReadBlock(RandomAccessFile* file,
|
||||||
const uint32_t crc = crc32c::Unmask(DecodeFixed32(data + n + 1));
|
const uint32_t crc = crc32c::Unmask(DecodeFixed32(data + n + 1));
|
||||||
const uint32_t actual = crc32c::Value(data, n + 1);
|
const uint32_t actual = crc32c::Value(data, n + 1);
|
||||||
if (actual != crc) {
|
if (actual != crc) {
|
||||||
delete[] buf;
|
file->DeallocateScratch(buf);
|
||||||
s = Status::Corruption("block checksum mismatch", file->GetName());
|
s = Status::Corruption("block checksum mismatch", file->GetName());
|
||||||
return s;
|
return s;
|
||||||
}
|
}
|
||||||
|
@ -103,7 +103,7 @@ Status ReadBlock(RandomAccessFile* file,
|
||||||
// File implementation gave us pointer to some other data.
|
// File implementation gave us pointer to some other data.
|
||||||
// Use it directly under the assumption that it will be live
|
// Use it directly under the assumption that it will be live
|
||||||
// while the file is open.
|
// while the file is open.
|
||||||
delete[] buf;
|
file->DeallocateScratch(buf);
|
||||||
result->data = Slice(data, n);
|
result->data = Slice(data, n);
|
||||||
result->heap_allocated = false;
|
result->heap_allocated = false;
|
||||||
result->cachable = false; // Do not double-cache
|
result->cachable = false; // Do not double-cache
|
||||||
|
@ -118,23 +118,23 @@ Status ReadBlock(RandomAccessFile* file,
|
||||||
case kSnappyCompression: {
|
case kSnappyCompression: {
|
||||||
size_t ulength = 0;
|
size_t ulength = 0;
|
||||||
if (!port::Snappy_GetUncompressedLength(data, n, &ulength)) {
|
if (!port::Snappy_GetUncompressedLength(data, n, &ulength)) {
|
||||||
delete[] buf;
|
file->DeallocateScratch(buf);
|
||||||
return Status::Corruption("corrupted compressed block contents", file->GetName());
|
return Status::Corruption("corrupted compressed block contents", file->GetName());
|
||||||
}
|
}
|
||||||
char* ubuf = new char[ulength];
|
char* ubuf = new char[ulength];
|
||||||
if (!port::Snappy_Uncompress(data, n, ubuf)) {
|
if (!port::Snappy_Uncompress(data, n, ubuf)) {
|
||||||
delete[] buf;
|
file->DeallocateScratch(buf);
|
||||||
delete[] ubuf;
|
delete[] ubuf;
|
||||||
return Status::Corruption("corrupted compressed block contents", file->GetName());
|
return Status::Corruption("corrupted compressed block contents", file->GetName());
|
||||||
}
|
}
|
||||||
delete[] buf;
|
file->DeallocateScratch(buf);
|
||||||
result->data = Slice(ubuf, ulength);
|
result->data = Slice(ubuf, ulength);
|
||||||
result->heap_allocated = true;
|
result->heap_allocated = true;
|
||||||
result->cachable = true;
|
result->cachable = true;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
default:
|
default:
|
||||||
delete[] buf;
|
file->DeallocateScratch(buf);
|
||||||
return Status::Corruption("bad block type", file->GetName());
|
return Status::Corruption("bad block type", file->GetName());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -162,6 +162,7 @@ class PosixRandomAccessFile: public RandomAccessFile {
|
||||||
}
|
}
|
||||||
|
|
||||||
Status s;
|
Status s;
|
||||||
|
assert(scratch);
|
||||||
ssize_t r = pread(fd, scratch, n, static_cast<off_t>(offset));
|
ssize_t r = pread(fd, scratch, n, static_cast<off_t>(offset));
|
||||||
*result = Slice(scratch, (r < 0) ? 0 : r);
|
*result = Slice(scratch, (r < 0) ? 0 : r);
|
||||||
if (r < 0) {
|
if (r < 0) {
|
||||||
|
@ -188,19 +189,19 @@ class PosixMmapReadableFile: public RandomAccessFile {
|
||||||
|
|
||||||
public:
|
public:
|
||||||
// base[0,length-1] contains the mmapped contents of the file.
|
// base[0,length-1] contains the mmapped contents of the file.
|
||||||
PosixMmapReadableFile(const std::string& fname, void* base, size_t length,
|
PosixMmapReadableFile(std::string fname, void* base, size_t length,
|
||||||
Limiter* limiter)
|
Limiter* limiter)
|
||||||
: filename_(fname), mmapped_region_(base), length_(length),
|
: filename_(std::move(fname)), mmapped_region_(base), length_(length),
|
||||||
limiter_(limiter) {
|
limiter_(limiter) {
|
||||||
}
|
}
|
||||||
|
|
||||||
virtual ~PosixMmapReadableFile() {
|
~PosixMmapReadableFile() override {
|
||||||
munmap(mmapped_region_, length_);
|
munmap(mmapped_region_, length_);
|
||||||
limiter_->Release();
|
limiter_->Release();
|
||||||
}
|
}
|
||||||
|
|
||||||
virtual Status Read(uint64_t offset, size_t n, Slice* result,
|
Status Read(uint64_t offset, size_t n, Slice* result,
|
||||||
char* scratch) const {
|
char* scratch) const override {
|
||||||
Status s;
|
Status s;
|
||||||
if (offset + n > length_) {
|
if (offset + n > length_) {
|
||||||
*result = Slice();
|
*result = Slice();
|
||||||
|
@ -211,7 +212,10 @@ class PosixMmapReadableFile: public RandomAccessFile {
|
||||||
return s;
|
return s;
|
||||||
}
|
}
|
||||||
|
|
||||||
virtual std::string GetName() const { return filename_; }
|
std::string GetName() const override { return filename_; }
|
||||||
|
|
||||||
|
char* AllocateScratch(std::size_t size) const override { return nullptr; }
|
||||||
|
void DeallocateScratch(char* pointer) const override { assert(pointer == nullptr); }
|
||||||
};
|
};
|
||||||
|
|
||||||
class PosixWritableFile : public WritableFile {
|
class PosixWritableFile : public WritableFile {
|
||||||
|
@ -585,8 +589,8 @@ static int MaxMmaps() {
|
||||||
if (mmap_limit >= 0) {
|
if (mmap_limit >= 0) {
|
||||||
return mmap_limit;
|
return mmap_limit;
|
||||||
}
|
}
|
||||||
// Up to 4096 mmaps for 64-bit binaries; none for smaller pointer sizes.
|
// Up to 400 mmaps for 64-bit binaries (800MB); none for smaller pointer sizes.
|
||||||
mmap_limit = sizeof(void*) >= 8 ? 4096 : 0;
|
mmap_limit = sizeof(void*) >= 8 ? 400 : 0;
|
||||||
return mmap_limit;
|
return mmap_limit;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue