}
}
-RCPtr<VBucket> EventuallyPersistentStore::getVBucket(uint16_t vbid,
- vbucket_state_t wanted_state) {
- RCPtr<VBucket> vb = vbMap.getBucket(vbid);
- vbucket_state_t found_state(vb ? vb->getState() : vbucket_state_dead);
- if (found_state == wanted_state) {
- return vb;
- } else {
- RCPtr<VBucket> rv;
- return rv;
- }
-}
-
void
EventuallyPersistentStore::deleteExpiredItem(uint16_t vbid, std::string &key,
time_t startTime,
if (vb->getState() != vbucket_state_active) {
return wantDeleted ? v : NULL;
}
- if (queueExpired) {
+ ReaderLockHolder(vb->getStateLock());
+ // queueDirty only allowed on active VB
+ if (queueExpired && vb->getState() == vbucket_state_active) {
incExpirationStat(vb, false);
vb->ht.unlocked_softDelete(v, 0, eviction_policy);
queueDirty(vb, v, NULL, false, true);
uint8_t nru) {
RCPtr<VBucket> vb = getVBucket(itm.getVBucketId());
- if (!vb || vb->getState() == vbucket_state_dead) {
+ if (!vb) {
+ ++stats.numNotMyVBuckets;
+ return ENGINE_NOT_MY_VBUCKET;
+ }
+
+ // Obtain read-lock on VB state to ensure VB state changes are interlocked
+ // with this set
+ ReaderLockHolder(vb->getStateLock());
+ if (vb->getState() == vbucket_state_dead) {
++stats.numNotMyVBuckets;
return ENGINE_NOT_MY_VBUCKET;
} else if (vb->getState() == vbucket_state_replica && !force) {
const void *cookie)
{
RCPtr<VBucket> vb = getVBucket(itm.getVBucketId());
- if (!vb || vb->getState() == vbucket_state_dead ||
+ if (!vb) {
+ ++stats.numNotMyVBuckets;
+ return ENGINE_NOT_MY_VBUCKET;
+ }
+
+ // Obtain read-lock on VB state to ensure VB state changes are interlocked
+ // with this add
+ ReaderLockHolder(vb->getStateLock());
+ if (vb->getState() == vbucket_state_dead ||
vb->getState() == vbucket_state_replica) {
++stats.numNotMyVBuckets;
return ENGINE_NOT_MY_VBUCKET;
ENGINE_ERROR_CODE EventuallyPersistentStore::replace(const Item &itm,
const void *cookie) {
RCPtr<VBucket> vb = getVBucket(itm.getVBucketId());
- if (!vb || vb->getState() == vbucket_state_dead ||
+ if (!vb) {
+ ++stats.numNotMyVBuckets;
+ return ENGINE_NOT_MY_VBUCKET;
+ }
+
+ // Obtain read-lock on VB state to ensure VB state changes are interlocked
+ // with this replace
+ ReaderLockHolder(vb->getStateLock());
+ if (vb->getState() == vbucket_state_dead ||
vb->getState() == vbucket_state_replica) {
++stats.numNotMyVBuckets;
return ENGINE_NOT_MY_VBUCKET;
bool genBySeqno) {
RCPtr<VBucket> vb = getVBucket(itm.getVBucketId());
- if (!vb ||
- vb->getState() == vbucket_state_dead ||
+ if (!vb) {
+ ++stats.numNotMyVBuckets;
+ return ENGINE_NOT_MY_VBUCKET;
+ }
+
+ // Obtain read-lock on VB state to ensure VB state changes are interlocked
+ // with this add-tapbackfill
+ ReaderLockHolder(vb->getStateLock());
+ if (vb->getState() == vbucket_state_dead ||
vb->getState() == vbucket_state_active) {
++stats.numNotMyVBuckets;
return ENGINE_NOT_MY_VBUCKET;
if (gcb.val.getStatus() == ENGINE_SUCCESS) {
v->unlocked_restoreValue(gcb.val.getValue(), vb->ht);
cb_assert(v->isResident());
+ ReaderLockHolder(vb->getStateLock());
if (vb->getState() == vbucket_state_active &&
v->getExptime() != gcb.val.getValue()->getExptime() &&
v->getCas() == gcb.val.getValue()->getCas()) {
if (status == ENGINE_SUCCESS) {
v->unlocked_restoreValue(fetchedValue, vb->ht);
cb_assert(v->isResident());
+ ReaderLockHolder(vb->getStateLock());
if (vb->getState() == vbucket_state_active &&
v->getExptime() != fetchedValue->getExptime() &&
v->getCas() == fetchedValue->getCas()) {
bool isReplication)
{
RCPtr<VBucket> vb = getVBucket(itm.getVBucketId());
- if (!vb || vb->getState() == vbucket_state_dead) {
+ if (!vb) {
+ ++stats.numNotMyVBuckets;
+ return ENGINE_NOT_MY_VBUCKET;
+ }
+
+ ReaderLockHolder(vb->getStateLock());
+ if (vb->getState() == vbucket_state_dead) {
++stats.numNotMyVBuckets;
return ENGINE_NOT_MY_VBUCKET;
} else if (vb->getState() == vbucket_state_replica && !force) {
ENGINE_SUCCESS, v->getBySeqno());
if (exptime_mutated) {
- // persist the itme in the underlying storage for
- // mutated exptime
- queueDirty(vb, v, &lh);
+ ReaderLockHolder(vb->getStateLock());
+ if (vb->getState() == vbucket_state_active) {
+ // persist the item in the underlying storage for
+ // mutated exptime but only if VB is active.
+ queueDirty(vb, v, &lh);
+ }
}
return rv;
} else {
rel_time_t currentTime,
uint32_t lockTimeout,
const void *cookie) {
- RCPtr<VBucket> vb = getVBucket(vbucket, vbucket_state_active);
- if (!vb) {
+ RCPtr<VBucket> vb = getVBucket(vbucket);
+ if (!vb || vb->getState() != vbucket_state_active) {
++stats.numNotMyVBuckets;
GetValue rv(NULL, ENGINE_NOT_MY_VBUCKET);
cb.callback(rv);
rel_time_t currentTime)
{
- RCPtr<VBucket> vb = getVBucket(vbucket, vbucket_state_active);
- if (!vb) {
+ RCPtr<VBucket> vb = getVBucket(vbucket);
+ if (!vb || vb->getState() != vbucket_state_active) {
++stats.numNotMyVBuckets;
return ENGINE_NOT_MY_VBUCKET;
}