DcpConnMap::DcpConnMap(EventuallyPersistentEngine &e)
: ConnMap(e),
aggrDcpConsumerBufferSize(0) {
- numActiveSnoozingBackfills = 0;
+ backfills.numActiveSnoozing = 0;
updateMaxActiveSnoozingBackfills(engine.getEpStats().getMaxDataSize());
minCompressionRatioForProducer.store(
engine.getConfiguration().getDcpMinCompressionRatio());
bool DcpConnMap::canAddBackfillToActiveQ()
{
- SpinLockHolder lh(&numBackfillsLock);
- if (numActiveSnoozingBackfills < maxActiveSnoozingBackfills) {
- ++numActiveSnoozingBackfills;
+ std::lock_guard<std::mutex> lh(backfills.mutex);
+ if (backfills.numActiveSnoozing < backfills.maxActiveSnoozing) {
+ ++backfills.numActiveSnoozing;
return true;
}
return false;
void DcpConnMap::decrNumActiveSnoozingBackfills()
{
- SpinLockHolder lh(&numBackfillsLock);
- if (numActiveSnoozingBackfills > 0) {
- --numActiveSnoozingBackfills;
- } else {
- LOG(EXTENSION_LOG_WARNING, "ActiveSnoozingBackfills already zero!!!");
+ {
+ std::lock_guard<std::mutex> lh(backfills.mutex);
+ if (backfills.numActiveSnoozing > 0) {
+ --backfills.numActiveSnoozing;
+ return;
+ }
}
+ LOG(EXTENSION_LOG_WARNING, "ActiveSnoozingBackfills already zero!!!");
}
void DcpConnMap::updateMaxActiveSnoozingBackfills(size_t maxDataSize)
double numBackfillsMemThresholdPercent =
static_cast<double>(numBackfillsMemThreshold)/100;
size_t max = maxDataSize * numBackfillsMemThresholdPercent / dbFileMem;
- /* We must have atleast one active/snoozing backfill */
- SpinLockHolder lh(&numBackfillsLock);
- maxActiveSnoozingBackfills =
- std::max(static_cast<size_t>(1),
- std::min(max, static_cast<size_t>(numBackfillsThreshold)));
+ uint16_t newMaxActive;
+ {
+ std::lock_guard<std::mutex> lh(backfills.mutex);
+ /* We must have atleast one active/snoozing backfill */
+ backfills.maxActiveSnoozing =
+ std::max(static_cast<size_t>(1),
+ std::min(max, static_cast<size_t>(numBackfillsThreshold)));
+ newMaxActive = backfills.maxActiveSnoozing;
+ }
LOG(EXTENSION_LOG_DEBUG, "Max active snoozing backfills set to %d",
- maxActiveSnoozingBackfills);
+ newMaxActive);
}
void DcpConnMap::addStats(ADD_STAT add_stat, const void *c) {
void updateMaxActiveSnoozingBackfills(size_t maxDataSize);
uint16_t getNumActiveSnoozingBackfills () {
- SpinLockHolder lh(&numBackfillsLock);
- return numActiveSnoozingBackfills;
+ std::lock_guard<std::mutex> lh(backfills.mutex);
+ return backfills.numActiveSnoozing;
}
uint16_t getMaxActiveSnoozingBackfills () {
- SpinLockHolder lh(&numBackfillsLock);
- return maxActiveSnoozingBackfills;
+ std::lock_guard<std::mutex> lh(backfills.mutex);
+ return backfills.maxActiveSnoozing;
}
ENGINE_ERROR_CODE addPassiveStream(ConnHandler& conn, uint32_t opaque,
*/
static void cancelTasks(CookieToConnectionMap& map);
- SpinLock numBackfillsLock;
/* Db file memory */
static const uint32_t dbFileMem;
- uint16_t numActiveSnoozingBackfills;
- uint16_t maxActiveSnoozingBackfills;
+
+ // Current and maximum number of backfills which are snoozing.
+ struct {
+ std::mutex mutex;
+ uint16_t numActiveSnoozing;
+ uint16_t maxActiveSnoozing;
+ } backfills;
+
/* Max num of backfills we want to have irrespective of memory */
static const uint16_t numBackfillsThreshold;
/* Max percentage of memory we want backfills to occupy */