@@ -277,34 +277,13 @@ MutationStatus HashTable::unlocked_updateStoredValue(
277277
278278 MutationStatus status =
279279 v.isDirty () ? MutationStatus::WasDirty : MutationStatus::WasClean;
280- if (!v.isResident () && !v.isDeleted () && !v.isTempItem ()) {
281- decrNumNonResidentItems ();
282- }
283-
284- if (v.isTempItem ()) {
285- --numTempItems;
286- ++numItems;
287- ++numTotalItems;
288- }
289-
290- if (v.isDeleted () && !itm.isDeleted ()) {
291- --numDeletedItems;
292- }
293- if (!v.isDeleted () && itm.isDeleted ()) {
294- ++numDeletedItems;
295- }
296280
297- // Update datatype counts (which only count non-temp, non-deleted
298- // documents).
299- if (!v.isDeleted () && !v.isTempItem ()) {
300- --datatypeCounts[v.getDatatype ()];
301- }
302- if (!itm.isDeleted ()) {
303- ++datatypeCounts[itm.getDataType ()];
304- }
281+ statsPrologue (v);
305282
306283 /* setValue() will mark v as undeleted if required */
307- setValue (itm, v);
284+ v.setValue (itm);
285+
286+ statsEpilogue (v);
308287
309288 return status;
310289}
@@ -325,23 +304,55 @@ StoredValue* HashTable::unlocked_addNewStoredValue(const HashBucketLock& hbl,
325304
326305 // Create a new StoredValue and link it into the head of the bucket chain.
327306 auto v = (*valFact)(itm, std::move (values[hbl.getBucketNum ()]));
328- increaseMetaDataSize (stats, v->metaDataSize ());
329- increaseCacheSize (v->size ());
330307
331- if (v->isTempItem ()) {
308+ statsEpilogue (*v);
309+
310+ values[hbl.getBucketNum ()] = std::move (v);
311+ return values[hbl.getBucketNum ()].get ();
312+ }
313+
314+ void HashTable::statsPrologue (const StoredValue& v) {
315+ // Decrease all statistics which sv matches.
316+ reduceMetaDataSize (stats, v.metaDataSize ());
317+ reduceCacheSize (v.size ());
318+
319+ if (!v.isResident () && !v.isDeleted () && !v.isTempItem ()) {
320+ decrNumNonResidentItems ();
321+ }
322+
323+ if (v.isTempItem ()) {
324+ --numTempItems;
325+ } else {
326+ --numItems;
327+ --numTotalItems;
328+ if (v.isDeleted ()) {
329+ --numDeletedItems;
330+ } else {
331+ --datatypeCounts[v.getDatatype ()];
332+ }
333+ }
334+ }
335+
336+ void HashTable::statsEpilogue (const StoredValue& v) {
337+ // After performing updates to sv; increase all statistics which sv matches.
338+ increaseMetaDataSize (stats, v.metaDataSize ());
339+ increaseCacheSize (v.size ());
340+
341+ if (!v.isResident () && !v.isDeleted () && !v.isTempItem ()) {
342+ ++numNonResidentItems;
343+ }
344+
345+ if (v.isTempItem ()) {
332346 ++numTempItems;
333347 } else {
334348 ++numItems;
335349 ++numTotalItems;
350+ if (v.isDeleted ()) {
351+ ++numDeletedItems;
352+ } else {
353+ ++datatypeCounts[v.getDatatype ()];
354+ }
336355 }
337- if (v->isDeleted ()) {
338- ++numDeletedItems;
339- } else {
340- ++datatypeCounts[v->getDatatype ()];
341- }
342- values[hbl.getBucketNum ()] = std::move (v);
343-
344- return values[hbl.getBucketNum ()].get ();
345356}
346357
347358std::pair<StoredValue*, StoredValue::UniquePtr>
@@ -365,53 +376,26 @@ HashTable::unlocked_replaceByCopy(const HashBucketLock& hbl,
365376 /* Copy the StoredValue and link it into the head of the bucket chain. */
366377 auto newSv = valFact->copyStoredValue (
367378 vToCopy, std::move (values[hbl.getBucketNum ()]));
368- increaseMetaDataSize (stats, newSv->metaDataSize ());
369- increaseCacheSize (newSv->size ());
370379
371- if (newSv->isTempItem ()) {
372- ++numTempItems;
373- } else {
374- ++numItems;
375- ++numTotalItems;
376- }
377- if (newSv->isDeleted ()) {
378- ++numDeletedItems;
379- } else {
380- ++datatypeCounts[newSv->getDatatype ()];
381- }
382- values[hbl.getBucketNum ()] = std::move (newSv);
380+ // Adding a new item into the HashTable; update stats.
381+ statsEpilogue (*newSv);
383382
383+ values[hbl.getBucketNum ()] = std::move (newSv);
384384 return {values[hbl.getBucketNum ()].get (), std::move (releasedSv)};
385385}
386386
387387void HashTable::unlocked_softDelete (const std::unique_lock<std::mutex>& htLock,
388388 StoredValue& v,
389389 bool onlyMarkDeleted) {
390- const bool alreadyDeleted = v.isDeleted ();
391- if (!v.isResident () && !v.isDeleted () && !v.isTempItem ()) {
392- decrNumNonResidentItems ();
393- }
394-
395- if (!alreadyDeleted) {
396- --datatypeCounts[v.getDatatype ()];
397- }
390+ statsPrologue (v);
398391
399392 if (onlyMarkDeleted) {
400393 v.markDeleted ();
401394 } else {
402- if (v.isTempItem ()) {
403- --numTempItems;
404- ++numItems;
405- ++numTotalItems;
406- }
407- size_t len = v.valuelen ();
408- if (v.del ()) {
409- reduceCacheSize (len);
410- }
411- }
412- if (!alreadyDeleted) {
413- ++numDeletedItems;
395+ v.del ();
414396 }
397+
398+ statsEpilogue (v);
415399}
416400
417401StoredValue* HashTable::unlocked_find (const DocKey& key,
@@ -464,20 +448,9 @@ StoredValue::UniquePtr HashTable::unlocked_release(
464448 " not found in HashTable; possibly HashTable leak" );
465449 }
466450
467- // Update statistics now the item has been removed.
468- reduceCacheSize (released->size ());
469- reduceMetaDataSize (stats, released->metaDataSize ());
470- if (released->isTempItem ()) {
471- --numTempItems;
472- } else {
473- decrNumItems ();
474- decrNumTotalItems ();
475- if (released->isDeleted ()) {
476- --numDeletedItems;
477- } else {
478- --datatypeCounts[released->getDatatype ()];
479- }
480- }
451+ // Update statistics for the item which is now gone.
452+ statsPrologue (*released);
453+
481454 return released;
482455}
483456
@@ -829,12 +802,6 @@ void HashTable::reduceMetaDataSize(EPStats &st, size_t by) {
829802 st.currentSize .fetch_sub (by);
830803}
831804
832- void HashTable::setValue (const Item& itm, StoredValue& v) {
833- reduceCacheSize (v.size ());
834- v.setValue (itm);
835- increaseCacheSize (v.size ());
836- }
837-
838805std::ostream& operator <<(std::ostream& os, const HashTable& ht) {
839806 os << " HashTable[" << &ht << " ] with"
840807 << " numItems:" << ht.getNumItems ()
0 commit comments