in cachelib/allocator/CacheAllocator-inl.h [2966:3029]
folly::IOBufQueue CacheAllocator<CacheTrait>::saveStateToIOBuf() {
if (stats_.numActiveSlabReleases.get() != 0) {
throw std::logic_error(
"There are still slabs being released at the moment");
}
*metadata_.allocatorVersion_ref() = kCachelibVersion;
*metadata_.ramFormatVersion_ref() = kCacheRamFormatVersion;
*metadata_.cacheCreationTime_ref() = static_cast<int64_t>(cacheCreationTime_);
*metadata_.mmType_ref() = MMType::kId;
*metadata_.accessType_ref() = AccessType::kId;
metadata_.compactCachePools_ref()->clear();
const auto pools = getPoolIds();
{
folly::SharedMutex::ReadHolder lock(compactCachePoolsLock_);
for (PoolId pid : pools) {
for (unsigned int cid = 0; cid < (*stats_.fragmentationSize)[pid].size();
++cid) {
metadata_.fragmentationSize_ref()[pid][static_cast<ClassId>(cid)] =
(*stats_.fragmentationSize)[pid][cid].get();
}
if (isCompactCachePool_[pid]) {
metadata_.compactCachePools_ref()->push_back(pid);
}
}
}
*metadata_.numChainedParentItems_ref() = stats_.numChainedParentItems.get();
*metadata_.numChainedChildItems_ref() = stats_.numChainedChildItems.get();
*metadata_.numAbortedSlabReleases_ref() = stats_.numAbortedSlabReleases.get();
auto serializeMMContainers = [](MMContainers& mmContainers) {
MMSerializationTypeContainer state;
for (unsigned int i = 0; i < mmContainers.size(); ++i) {
for (unsigned int j = 0; j < mmContainers[i].size(); ++j) {
if (mmContainers[i][j]) {
state.pools_ref()[i][j] = mmContainers[i][j]->saveState();
}
}
}
return state;
};
MMSerializationTypeContainer mmContainersState =
serializeMMContainers(mmContainers_);
AccessSerializationType accessContainerState = accessContainer_->saveState();
MemoryAllocator::SerializationType allocatorState = allocator_->saveState();
CCacheManager::SerializationType ccState = compactCacheManager_->saveState();
AccessSerializationType chainedItemAccessContainerState =
chainedItemAccessContainer_->saveState();
// serialize to an iobuf queue. The caller can then copy over the serialized
// results into a single buffer.
folly::IOBufQueue queue;
Serializer::serializeToIOBufQueue(queue, metadata_);
Serializer::serializeToIOBufQueue(queue, allocatorState);
Serializer::serializeToIOBufQueue(queue, ccState);
Serializer::serializeToIOBufQueue(queue, mmContainersState);
Serializer::serializeToIOBufQueue(queue, accessContainerState);
Serializer::serializeToIOBufQueue(queue, chainedItemAccessContainerState);
return queue;
}