From f5afe0587f2d0ea122943d336d886f388c53a759 Mon Sep 17 00:00:00 2001 From: Mark Travis Date: Fri, 1 Aug 2014 16:55:00 -0700 Subject: [PATCH] Fix filter_policy object leak in NodeStore backends --- src/ripple/nodestore/backend/HyperDBFactory.cpp | 6 ++++-- src/ripple/nodestore/backend/LevelDBFactory.cpp | 6 ++++-- src/ripple/nodestore/backend/RocksDBFactory.cpp | 6 ++++-- 3 files changed, 12 insertions(+), 6 deletions(-) diff --git a/src/ripple/nodestore/backend/HyperDBFactory.cpp b/src/ripple/nodestore/backend/HyperDBFactory.cpp index 95aad76acd..aa480c8e5a 100644 --- a/src/ripple/nodestore/backend/HyperDBFactory.cpp +++ b/src/ripple/nodestore/backend/HyperDBFactory.cpp @@ -35,6 +35,7 @@ public: Scheduler& m_scheduler; BatchWriter m_batch; std::string m_name; + std::unique_ptr m_filter_policy; std::unique_ptr m_db; HyperDBBackend (size_t keyBytes, Parameters const& keyValues, @@ -63,12 +64,13 @@ public: if (keyValues ["filter_bits"].isEmpty()) { if (getConfig ().NODE_SIZE >= 2) - options.filter_policy = hyperleveldb::NewBloomFilterPolicy (10); + m_filter_policy.reset (hyperleveldb::NewBloomFilterPolicy (10)); } else if (keyValues ["filter_bits"].getIntValue() != 0) { - options.filter_policy = hyperleveldb::NewBloomFilterPolicy (keyValues ["filter_bits"].getIntValue ()); + m_filter_policy.reset (hyperleveldb::NewBloomFilterPolicy (keyValues ["filter_bits"].getIntValue ())); } + options.filter_policy = m_filter_policy.get(); if (! keyValues["open_files"].isEmpty ()) { diff --git a/src/ripple/nodestore/backend/LevelDBFactory.cpp b/src/ripple/nodestore/backend/LevelDBFactory.cpp index df88e86d7f..8fabbd9d5f 100644 --- a/src/ripple/nodestore/backend/LevelDBFactory.cpp +++ b/src/ripple/nodestore/backend/LevelDBFactory.cpp @@ -35,6 +35,7 @@ public: Scheduler& m_scheduler; BatchWriter m_batch; std::string m_name; + std::unique_ptr m_filter_policy; std::unique_ptr m_db; LevelDBBackend (int keyBytes, Parameters const& keyValues, @@ -63,12 +64,13 @@ public: if (keyValues["filter_bits"].isEmpty()) { if (getConfig ().NODE_SIZE >= 2) - options.filter_policy = leveldb::NewBloomFilterPolicy (10); + m_filter_policy.reset (leveldb::NewBloomFilterPolicy (10)); } else if (keyValues["filter_bits"].getIntValue() != 0) { - options.filter_policy = leveldb::NewBloomFilterPolicy (keyValues["filter_bits"].getIntValue()); + m_filter_policy.reset (leveldb::NewBloomFilterPolicy (keyValues["filter_bits"].getIntValue())); } + options.filter_policy = m_filter_policy.get(); if (! keyValues["open_files"].isEmpty()) { diff --git a/src/ripple/nodestore/backend/RocksDBFactory.cpp b/src/ripple/nodestore/backend/RocksDBFactory.cpp index 47620d8b43..c657bb96cf 100644 --- a/src/ripple/nodestore/backend/RocksDBFactory.cpp +++ b/src/ripple/nodestore/backend/RocksDBFactory.cpp @@ -85,6 +85,7 @@ public: Scheduler& m_scheduler; BatchWriter m_batch; std::string m_name; + std::unique_ptr m_filter_policy; std::unique_ptr m_db; RocksDBBackend (int keyBytes, Parameters const& keyValues, @@ -114,12 +115,13 @@ public: if (keyValues["filter_bits"].isEmpty()) { if (getConfig ().NODE_SIZE >= 2) - options.filter_policy = rocksdb::NewBloomFilterPolicy (10); + m_filter_policy.reset (rocksdb::NewBloomFilterPolicy (10)); } else if (keyValues["filter_bits"].getIntValue() != 0) { - options.filter_policy = rocksdb::NewBloomFilterPolicy (keyValues["filter_bits"].getIntValue()); + m_filter_policy.reset (rocksdb::NewBloomFilterPolicy (keyValues["filter_bits"].getIntValue())); } + options.filter_policy = m_filter_policy.get(); if (! keyValues["open_files"].isEmpty()) {