From 9e5b7aaaa98cec4e62be8dcc3236207f1fd8b03b Mon Sep 17 00:00:00 2001 From: John Sully Date: Tue, 2 Nov 2021 19:31:53 +0000 Subject: [PATCH] This change fixes out of file descriptor issues with FLASH. The change does 3 things: 1. It limits RocksDB to 256 file descriptors instead of unlimited 2. It includes the fd limit in its estimation for total file descriptors needed 3. It raises the system fd limit if possible before we open rocksdb but accounting for the 256 limit we added Former-commit-id: 1447288209c5e7daf8a1203511fc262500ebe5e1 --- src/IStorage.h | 1 + src/config.cpp | 1 + src/server.cpp | 2 ++ src/storage/rocksdbfactory.cpp | 6 ++++++ 4 files changed, 10 insertions(+) diff --git a/src/IStorage.h b/src/IStorage.h index d5808c4c1..d1f316022 100644 --- a/src/IStorage.h +++ b/src/IStorage.h @@ -12,6 +12,7 @@ public: virtual const char *name() const = 0; virtual size_t totalDiskspaceUsed() const = 0; virtual bool FSlow() const = 0; + virtual size_t filedsRequired() const { return 0; } }; class IStorage diff --git a/src/config.cpp b/src/config.cpp index e2028f4cc..7ef995bbd 100644 --- a/src/config.cpp +++ b/src/config.cpp @@ -357,6 +357,7 @@ bool initializeStorageProvider(const char **err) { // Create The Storage Factory (if necessary) serverLog(LL_NOTICE, "Initializing FLASH storage provider (this may take a long time)"); + adjustOpenFilesLimit(); g_pserver->m_pstorageFactory = CreateRocksDBStorageFactory(g_sdsArgs, cserver.dbnum, cserver.storage_conf, cserver.storage_conf ? strlen(cserver.storage_conf) : 0); } else if (!strcasecmp(g_sdsProvider, "test") && g_sdsArgs == nullptr) diff --git a/src/server.cpp b/src/server.cpp index 6540371d5..76a142efe 100644 --- a/src/server.cpp +++ b/src/server.cpp @@ -3476,6 +3476,8 @@ int setOOMScoreAdj(int process_class) { * g_pserver->maxclients to the value that we can actually handle. */ void adjustOpenFilesLimit(void) { rlim_t maxfiles = g_pserver->maxclients+CONFIG_MIN_RESERVED_FDS; + if (g_pserver->m_pstorageFactory) + maxfiles += g_pserver->m_pstorageFactory->filedsRequired(); struct rlimit limit; if (getrlimit(RLIMIT_NOFILE,&limit) == -1) { diff --git a/src/storage/rocksdbfactory.cpp b/src/storage/rocksdbfactory.cpp index 1350c4fd1..a43510093 100644 --- a/src/storage/rocksdbfactory.cpp +++ b/src/storage/rocksdbfactory.cpp @@ -23,6 +23,7 @@ public: virtual size_t totalDiskspaceUsed() const override; virtual bool FSlow() const override { return true; } + virtual size_t filedsRequired() const override; private: void setVersion(rocksdb::ColumnFamilyHandle*); @@ -55,6 +56,7 @@ RocksDBStorageFactory::RocksDBStorageFactory(const char *dbfile, int dbnum, cons options.max_background_compactions = 4; options.max_background_flushes = 2; + options.max_open_files = filedsRequired(); options.bytes_per_sync = 1048576; options.compaction_pri = rocksdb::kMinOverlappingRatio; options.compression = rocksdb::kNoCompression; @@ -130,6 +132,10 @@ void RocksDBStorageFactory::setVersion(rocksdb::ColumnFamilyHandle *handle) throw status.ToString(); } +size_t RocksDBStorageFactory::filedsRequired() const { + return 256; +} + IStorage *RocksDBStorageFactory::create(int db, key_load_iterator iter, void *privdata) { ++db; // skip default col family