Skip to content

Commit 7a6dbc2

Browse files
committed
Introduce FileShmSegment for file-backed shared memory
It's implementation is mostly based on PosixShmSegment. Also, extend ShmManager and ShmSegmentOpts to support this new segment type.
1 parent 7a0f455 commit 7a6dbc2

File tree

12 files changed

+590
-55
lines changed

12 files changed

+590
-55
lines changed

cachelib/allocator/CacheAllocator-inl.h

Lines changed: 28 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -68,7 +68,8 @@ CacheAllocator<CacheTrait>::CacheAllocator(SharedMemNewT, Config config)
6868
AccessContainer::getRequiredSize(
6969
config_.accessConfig.getNumBuckets()),
7070
nullptr,
71-
ShmSegmentOpts(config_.accessConfig.getPageSize()))
71+
ShmSegmentOpts(config_.accessConfig.getPageSize(),
72+
false, config_.usePosixShm))
7273
.addr,
7374
compressor_,
7475
[this](Item* it) -> ItemHandle { return acquire(it); })),
@@ -79,7 +80,8 @@ CacheAllocator<CacheTrait>::CacheAllocator(SharedMemNewT, Config config)
7980
AccessContainer::getRequiredSize(
8081
config_.chainedItemAccessConfig.getNumBuckets()),
8182
nullptr,
82-
ShmSegmentOpts(config_.accessConfig.getPageSize()))
83+
ShmSegmentOpts(config_.accessConfig.getPageSize(),
84+
false, config_.usePosixShm))
8385
.addr,
8486
compressor_,
8587
[this](Item* it) -> ItemHandle { return acquire(it); })),
@@ -89,7 +91,8 @@ CacheAllocator<CacheTrait>::CacheAllocator(SharedMemNewT, Config config)
8991
nvmCacheState_{config_.cacheDir, config_.isNvmCacheEncryptionEnabled(),
9092
config_.isNvmCacheTruncateAllocSizeEnabled()} {
9193
initCommon(false);
92-
shmManager_->removeShm(detail::kShmInfoName);
94+
shmManager_->removeShm(detail::kShmInfoName,
95+
PosixSysVSegmentOpts(config_.usePosixShm));
9396
}
9497

9598
template <typename CacheTrait>
@@ -107,13 +110,15 @@ CacheAllocator<CacheTrait>::CacheAllocator(SharedMemAttachT, Config config)
107110
accessContainer_(std::make_unique<AccessContainer>(
108111
deserializer_->deserialize<AccessSerializationType>(),
109112
config_.accessConfig,
110-
shmManager_->attachShm(detail::kShmHashTableName),
113+
shmManager_->attachShm(detail::kShmHashTableName, nullptr,
114+
ShmSegmentOpts(PageSizeT::NORMAL, false, config_.usePosixShm)),
111115
compressor_,
112116
[this](Item* it) -> ItemHandle { return acquire(it); })),
113117
chainedItemAccessContainer_(std::make_unique<AccessContainer>(
114118
deserializer_->deserialize<AccessSerializationType>(),
115119
config_.chainedItemAccessConfig,
116-
shmManager_->attachShm(detail::kShmChainedItemHashTableName),
120+
shmManager_->attachShm(detail::kShmChainedItemHashTableName, nullptr,
121+
ShmSegmentOpts(PageSizeT::NORMAL, false, config_.usePosixShm)),
117122
compressor_,
118123
[this](Item* it) -> ItemHandle { return acquire(it); })),
119124
chainedItemLocks_(config_.chainedItemsLockPower,
@@ -130,7 +135,8 @@ CacheAllocator<CacheTrait>::CacheAllocator(SharedMemAttachT, Config config)
130135
// We will create a new info shm segment on shutDown(). If we don't remove
131136
// this info shm segment here and the new info shm segment's size is larger
132137
// than this one, creating new one will fail.
133-
shmManager_->removeShm(detail::kShmInfoName);
138+
shmManager_->removeShm(detail::kShmInfoName,
139+
PosixSysVSegmentOpts(config_.usePosixShm));
134140
}
135141

136142
template <typename CacheTrait>
@@ -148,6 +154,7 @@ std::unique_ptr<MemoryAllocator>
148154
CacheAllocator<CacheTrait>::createNewMemoryAllocator() {
149155
ShmSegmentOpts opts;
150156
opts.alignment = sizeof(Slab);
157+
opts.typeOpts = PosixSysVSegmentOpts(config_.usePosixShm);
151158
return std::make_unique<MemoryAllocator>(
152159
getAllocatorConfig(config_),
153160
shmManager_
@@ -162,6 +169,7 @@ std::unique_ptr<MemoryAllocator>
162169
CacheAllocator<CacheTrait>::restoreMemoryAllocator() {
163170
ShmSegmentOpts opts;
164171
opts.alignment = sizeof(Slab);
172+
opts.typeOpts = PosixSysVSegmentOpts(config_.usePosixShm);
165173
return std::make_unique<MemoryAllocator>(
166174
deserializer_->deserialize<MemoryAllocator::SerializationType>(),
167175
shmManager_
@@ -265,7 +273,8 @@ void CacheAllocator<CacheTrait>::initWorkers() {
265273

266274
template <typename CacheTrait>
267275
std::unique_ptr<Deserializer> CacheAllocator<CacheTrait>::createDeserializer() {
268-
auto infoAddr = shmManager_->attachShm(detail::kShmInfoName);
276+
auto infoAddr = shmManager_->attachShm(detail::kShmInfoName, nullptr,
277+
ShmSegmentOpts(PageSizeT::NORMAL, false, config_.usePosixShm));
269278
return std::make_unique<Deserializer>(
270279
reinterpret_cast<uint8_t*>(infoAddr.addr),
271280
reinterpret_cast<uint8_t*>(infoAddr.addr) + infoAddr.size);
@@ -3041,8 +3050,11 @@ void CacheAllocator<CacheTrait>::saveRamCache() {
30413050
std::unique_ptr<folly::IOBuf> ioBuf = serializedBuf.move();
30423051
ioBuf->coalesce();
30433052

3044-
void* infoAddr =
3045-
shmManager_->createShm(detail::kShmInfoName, ioBuf->length()).addr;
3053+
ShmSegmentOpts opts;
3054+
opts.typeOpts = PosixSysVSegmentOpts(config_.usePosixShm);
3055+
3056+
void* infoAddr = shmManager_->createShm(detail::kShmInfoName, ioBuf->length(),
3057+
nullptr, opts).addr;
30463058
Serializer serializer(reinterpret_cast<uint8_t*>(infoAddr),
30473059
reinterpret_cast<uint8_t*>(infoAddr) + ioBuf->length());
30483060
serializer.writeToBuffer(std::move(ioBuf));
@@ -3386,7 +3398,7 @@ bool CacheAllocator<CacheTrait>::stopReaper(std::chrono::seconds timeout) {
33863398

33873399
template <typename CacheTrait>
33883400
bool CacheAllocator<CacheTrait>::cleanupStrayShmSegments(
3389-
const std::string& cacheDir, bool posix) {
3401+
const std::string& cacheDir, bool posix /*TODO(SHM_FILE): const std::vector<CacheMemoryTierConfig>& config */) {
33903402
if (util::getStatIfExists(cacheDir, nullptr) && util::isDir(cacheDir)) {
33913403
try {
33923404
// cache dir exists. clean up only if there are no other processes
@@ -3405,6 +3417,12 @@ bool CacheAllocator<CacheTrait>::cleanupStrayShmSegments(
34053417
ShmManager::removeByName(cacheDir, detail::kShmHashTableName, posix);
34063418
ShmManager::removeByName(cacheDir, detail::kShmChainedItemHashTableName,
34073419
posix);
3420+
3421+
// TODO(SHM_FILE): try to nuke segments of differente types (which require
3422+
// extra info)
3423+
// for (auto &tier : config) {
3424+
// ShmManager::removeByName(cacheDir, tierShmName, config_.memoryTiers[i].opts);
3425+
// }
34083426
}
34093427
return true;
34103428
}

cachelib/allocator/CacheAllocator.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1035,7 +1035,8 @@ class CacheAllocator : public CacheBase {
10351035
// returns true if there was no error in trying to cleanup the segment
10361036
// because another process was attached. False if the user tried to clean up
10371037
// and the cache was actually attached.
1038-
static bool cleanupStrayShmSegments(const std::string& cacheDir, bool posix);
1038+
static bool cleanupStrayShmSegments(const std::string& cacheDir, bool posix
1039+
/*TODO: const std::vector<CacheMemoryTierConfig>& config = {} */);
10391040

10401041
// gives a relative offset to a pointer within the cache.
10411042
uint64_t getItemPtrAsOffset(const void* ptr);

cachelib/allocator/TempShmMapping.cpp

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,8 @@ TempShmMapping::TempShmMapping(size_t size)
3434
TempShmMapping::~TempShmMapping() {
3535
try {
3636
if (addr_) {
37-
shmManager_->removeShm(detail::kTempShmCacheName.str());
37+
shmManager_->removeShm(detail::kTempShmCacheName.str(),
38+
PosixSysVSegmentOpts(false /* posix */));
3839
}
3940
if (shmManager_) {
4041
shmManager_.reset();
@@ -77,7 +78,8 @@ void* TempShmMapping::createShmMapping(ShmManager& shmManager,
7778
return shmAddr;
7879
} catch (...) {
7980
if (shmAddr) {
80-
shmManager.removeShm(detail::kTempShmCacheName.str());
81+
shmManager.removeShm(detail::kTempShmCacheName.str(),
82+
PosixSysVSegmentOpts(false /* posix */));
8183
} else {
8284
munmap(addr, size);
8385
}

cachelib/shm/CMakeLists.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ add_thrift_file(SHM shm.thrift frozen2)
1616

1717
add_library (cachelib_shm
1818
${SHM_THRIFT_FILES}
19+
FileShmSegment.cpp
1920
PosixShmSegment.cpp
2021
ShmCommon.cpp
2122
ShmManager.cpp

0 commit comments

Comments
 (0)