Summary:
An earlier change (b34cef57b7
) removed apparently unused functionality where an obsolete blob file number is passed for removal from TableCache, which manages SST files. This was actually relying on broken/fragile abstractions wherein TableCache and BlobFileCache share the same Cache and using the TableCache interface to manipulate blob file caching. No unit test was actually checking for removal of obsolete blob files from the cache (which is somewhat tricky to check and a second order correctness requirement).
Here we fix the leak and add a DEBUG+ASAN-only check in DB::Close() that no obsolete files are lingering in the table/blob file cache.
Fixes https://github.com/facebook/rocksdb/issues/13066
Important follow-up (FIXME): The added check discovered some apparent cases of leaked (into table_cache) SST file readers that would stick around until DB::Close(). Need to enable that check, diagnose, and fix.
Pull Request resolved: https://github.com/facebook/rocksdb/pull/13106
Test Plan:
added a check that is called during DB::Close in ASAN builds (to minimize paying the cost in all unit tests). Without the fix, the check failed in at least these tests:
```
db_blob_basic_test DBBlobBasicTest.DynamicallyWarmCacheDuringFlush
db_blob_compaction_test DBBlobCompactionTest.CompactionReadaheadMerge
db_blob_compaction_test DBBlobCompactionTest.MergeBlobWithBase
db_blob_compaction_test DBBlobCompactionTest.CompactionDoNotFillCache
db_blob_compaction_test DBBlobCompactionTest.SkipUntilFilter
db_blob_compaction_test DBBlobCompactionTest.CompactionFilter
db_blob_compaction_test DBBlobCompactionTest.CompactionReadaheadFilter
db_blob_compaction_test DBBlobCompactionTest.CompactionReadaheadGarbageCollection
```
Reviewed By: ltamasi
Differential Revision: D65296123
Pulled By: pdillinger
fbshipit-source-id: 2276d76482beb2c75c9010bc1bec070bb23a24c0
65 lines
2.1 KiB
C++
65 lines
2.1 KiB
C++
// Copyright (c) 2011-present, Facebook, Inc. All rights reserved.
|
|
// This source code is licensed under both the GPLv2 (found in the
|
|
// COPYING file in the root directory) and Apache 2.0 License
|
|
// (found in the LICENSE.Apache file in the root directory).
|
|
|
|
#pragma once
|
|
|
|
#include <cinttypes>
|
|
|
|
#include "cache/typed_cache.h"
|
|
#include "db/blob/blob_file_reader.h"
|
|
#include "rocksdb/rocksdb_namespace.h"
|
|
#include "util/mutexlock.h"
|
|
|
|
namespace ROCKSDB_NAMESPACE {
|
|
|
|
class Cache;
|
|
struct ImmutableOptions;
|
|
struct FileOptions;
|
|
class HistogramImpl;
|
|
class Status;
|
|
class Slice;
|
|
class IOTracer;
|
|
|
|
class BlobFileCache {
|
|
public:
|
|
BlobFileCache(Cache* cache, const ImmutableOptions* immutable_options,
|
|
const FileOptions* file_options, uint32_t column_family_id,
|
|
HistogramImpl* blob_file_read_hist,
|
|
const std::shared_ptr<IOTracer>& io_tracer);
|
|
|
|
BlobFileCache(const BlobFileCache&) = delete;
|
|
BlobFileCache& operator=(const BlobFileCache&) = delete;
|
|
|
|
Status GetBlobFileReader(const ReadOptions& read_options,
|
|
uint64_t blob_file_number,
|
|
CacheHandleGuard<BlobFileReader>* blob_file_reader);
|
|
|
|
// Called when a blob file is obsolete to ensure it is removed from the cache
|
|
// to avoid effectively leaking the open file and assicated memory
|
|
void Evict(uint64_t blob_file_number);
|
|
|
|
// Used to identify cache entries for blob files (not normally useful)
|
|
static const Cache::CacheItemHelper* GetHelper() {
|
|
return CacheInterface::GetBasicHelper();
|
|
}
|
|
|
|
private:
|
|
using CacheInterface =
|
|
BasicTypedCacheInterface<BlobFileReader, CacheEntryRole::kMisc>;
|
|
using TypedHandle = CacheInterface::TypedHandle;
|
|
CacheInterface cache_;
|
|
// Note: mutex_ below is used to guard against multiple threads racing to open
|
|
// the same file.
|
|
Striped<CacheAlignedWrapper<port::Mutex>> mutex_;
|
|
const ImmutableOptions* immutable_options_;
|
|
const FileOptions* file_options_;
|
|
uint32_t column_family_id_;
|
|
HistogramImpl* blob_file_read_hist_;
|
|
std::shared_ptr<IOTracer> io_tracer_;
|
|
|
|
static constexpr size_t kNumberOfMutexStripes = 1 << 7;
|
|
};
|
|
|
|
} // namespace ROCKSDB_NAMESPACE
|