Skip to content

Commit 57dc021

Browse files
BenHuddlestondaverigby
authored andcommitted
MB-33332: Rename OSV::deletedTime to OSV::completedOrDeletedTime
To purge completed prepares only after the metadata purge interval we need to know when the prepare was completed (committed or aborted). We do similar for deleted items, we set a deleted time on deletion of the OSV and use this time in the HTTombstonePurger to determine if we should purge the metadata (tombstone) for the delete. We can simply re-use the field for completed time. Rename the functions to something more appropriate. They will be used in a later change. Change-Id: Ia37b3a6bba9f3945280ed9c1dc2568998cc0e122 Reviewed-on: http://review.couchbase.org/109839 Reviewed-by: Dave Rigby <[email protected]> Tested-by: Build Bot <[email protected]>
1 parent 88cebff commit 57dc021

File tree

8 files changed

+44
-36
lines changed

8 files changed

+44
-36
lines changed

engines/ep/src/dcp/backfill_memory.cc

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -306,7 +306,8 @@ backfill_status_t DCPBackfillMemoryBuffered::scan() {
306306
// time field, this must be copied to the expiry time so that DCP
307307
// can transmit the original time of deletion
308308
if (item->isDeleted()) {
309-
item->setExpTime(ep_abs_time((*rangeItr).getDeletedTime()));
309+
item->setExpTime(
310+
ep_abs_time((*rangeItr).getCompletedOrDeletedTime()));
310311
}
311312
} catch (const std::bad_alloc&) {
312313
stream->log(spdlog::level::level_enum::warn,

engines/ep/src/ephemeral_tombstone_purger.cc

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -48,9 +48,8 @@ bool EphemeralVBucket::HTTombstonePurger::visit(
4848
// that we do not get a -ve value when we check if the time difference
4949
// is >= purgeAge. This is preferable to updating the task start time for
5050
// every visit and has little impact as this task runs frequently.
51-
if (osv->isDeleted() &&
52-
(now >= osv->getDeletedTime()) &&
53-
(now - osv->getDeletedTime() >= purgeAge)) {
51+
if (osv->isDeleted() && (now >= osv->getCompletedOrDeletedTime()) &&
52+
(now - osv->getCompletedOrDeletedTime() >= purgeAge)) {
5453
// This item should be purged. Remove from the HashTable and move over
5554
// to being owned by the sequence list.
5655
auto ownedSV = vbucket->ht.unlocked_release(hbl, v.getKey());

engines/ep/src/ephemeral_vb.cc

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -618,7 +618,7 @@ EphemeralVBucket::softDeleteStoredValue(const HashTable::HashBucketLock& hbl,
618618
// The deleted time is relative and the replicated tombstone time is
619619
// absolute and held in the expiry field, convert the abs to rel
620620
// using ep_reltime
621-
newSv->toOrderedStoredValue()->setDeletedTime(
621+
newSv->toOrderedStoredValue()->setCompletedOrDeletedTime(
622622
ep_reltime(newSv->getExptime()));
623623
}
624624

engines/ep/src/stored-value.cc

Lines changed: 19 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@ StoredValue::StoredValue(const Item& itm,
3838
chain_next_or_replacement(std::move(n)),
3939
cas(itm.getCas()),
4040
bySeqno(itm.getBySeqno()),
41-
lock_expiry_or_delete_time(0),
41+
lock_expiry_or_delete_or_complete_time(0),
4242
exptime(itm.getExptime()),
4343
flags(itm.getFlags()),
4444
revSeqno(itm.getRevSeqno()),
@@ -86,7 +86,8 @@ StoredValue::StoredValue(const StoredValue& other, UniquePtr n, EPStats& stats)
8686
chain_next_or_replacement(std::move(n)),
8787
cas(other.cas),
8888
bySeqno(other.bySeqno),
89-
lock_expiry_or_delete_time(other.lock_expiry_or_delete_time),
89+
lock_expiry_or_delete_or_complete_time(
90+
other.lock_expiry_or_delete_or_complete_time),
9091
exptime(other.exptime),
9192
flags(other.flags),
9293
revSeqno(other.revSeqno),
@@ -292,7 +293,8 @@ const OrderedStoredValue* StoredValue::toOrderedStoredValue() const {
292293
bool StoredValue::operator==(const StoredValue& other) const {
293294
return (cas == other.cas && revSeqno == other.revSeqno &&
294295
bySeqno == other.bySeqno &&
295-
lock_expiry_or_delete_time == other.lock_expiry_or_delete_time &&
296+
lock_expiry_or_delete_or_complete_time ==
297+
other.lock_expiry_or_delete_or_complete_time &&
296298
exptime == other.exptime && flags == other.flags &&
297299
isDirty() == other.isDirty() && isDeleted() == other.isDeleted() &&
298300
// Note: deletionCause is only checked if the item is deleted
@@ -368,7 +370,7 @@ void StoredValue::setValueImpl(const Item& itm) {
368370
datatype = itm.getDataType();
369371
bySeqno = itm.getBySeqno();
370372
cas = itm.getCas();
371-
lock_expiry_or_delete_time = 0;
373+
lock_expiry_or_delete_or_complete_time = 0;
372374
exptime = itm.getExptime();
373375
revSeqno = itm.getRevSeqno();
374376

@@ -518,7 +520,7 @@ std::ostream& operator<<(std::ostream& os, const StoredValue& sv) {
518520
os << " cas:" << sv.getCas();
519521
os << " key:\"" << sv.getKey() << "\"";
520522
if (sv.isOrdered() && sv.isDeleted()) {
521-
os << " del_time:" << sv.lock_expiry_or_delete_time;
523+
os << " del_time:" << sv.lock_expiry_or_delete_or_complete_time;
522524
} else {
523525
os << " exp:" << sv.getExptime();
524526
}
@@ -552,11 +554,12 @@ size_t OrderedStoredValue::getRequiredStorage(const DocKey& key) {
552554
}
553555

554556
/**
555-
* Return the time the item was deleted. Only valid for deleted items.
557+
* Return the time the item was deleted. Only valid for completed or deleted
558+
* items.
556559
*/
557-
rel_time_t OrderedStoredValue::getDeletedTime() const {
558-
if (isDeleted()) {
559-
return lock_expiry_or_delete_time;
560+
rel_time_t OrderedStoredValue::getCompletedOrDeletedTime() const {
561+
if (isDeleted() || isPending()) {
562+
return lock_expiry_or_delete_or_complete_time;
560563
} else {
561564
throw std::logic_error(
562565
"OrderedStoredValue::getDeletedItem: Called on Alive item");
@@ -567,7 +570,7 @@ bool OrderedStoredValue::deleteImpl(DeleteSource delSource) {
567570
if (StoredValue::deleteImpl(delSource)) {
568571
// Need to record the time when an item is deleted for subsequent
569572
//purging (ephemeral_metadata_purge_age).
570-
setDeletedTime(ep_current_time());
573+
setCompletedOrDeletedTime(ep_current_time());
571574
return true;
572575
}
573576
return false;
@@ -579,14 +582,15 @@ void OrderedStoredValue::setValueImpl(const Item& itm) {
579582
// Update the deleted time (note - even if it was already deleted we should
580583
// refresh this).
581584
if (isDeleted()) {
582-
setDeletedTime(ep_current_time());
585+
setCompletedOrDeletedTime(ep_current_time());
583586
}
584587
}
585588

586-
void OrderedStoredValue::setDeletedTime(rel_time_t time) {
587-
if (!isDeleted()) {
589+
void OrderedStoredValue::setCompletedOrDeletedTime(rel_time_t time) {
590+
if (!isDeleted() && !isPending()) {
588591
throw std::logic_error(
589-
"OrderedStoredValue::setDeletedTime: Called on Alive item");
592+
"OrderedStoredValue::setCompletedOrDeletedTime: Called on "
593+
"Alive item");
590594
}
591-
lock_expiry_or_delete_time = time;
595+
lock_expiry_or_delete_or_complete_time = time;
592596
}

engines/ep/src/stored-value.h

Lines changed: 13 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -398,7 +398,7 @@ class StoredValue {
398398
throw std::logic_error(
399399
"StoredValue::lock: Called on Deleted item");
400400
}
401-
lock_expiry_or_delete_time = expiry;
401+
lock_expiry_or_delete_or_complete_time = expiry;
402402
}
403403

404404
/**
@@ -409,7 +409,7 @@ class StoredValue {
409409
// Deleted items are not locked - just skip.
410410
return;
411411
}
412-
lock_expiry_or_delete_time = 0;
412+
lock_expiry_or_delete_or_complete_time = 0;
413413
}
414414

415415
/**
@@ -545,8 +545,8 @@ class StoredValue {
545545
return false;
546546
}
547547

548-
if (lock_expiry_or_delete_time == 0 ||
549-
(curtime > lock_expiry_or_delete_time)) {
548+
if (lock_expiry_or_delete_or_complete_time == 0 ||
549+
(curtime > lock_expiry_or_delete_or_complete_time)) {
550550
return false;
551551
}
552552
return true;
@@ -997,8 +997,9 @@ class StoredValue {
997997
// this in ephemeral backfills with different locks (which is true, but the
998998
// access is we believe actually safe)
999999
cb::RelaxedAtomic<int64_t> bySeqno; //!< By sequence id number
1000-
/// For alive items: GETL lock expiration. For deleted items: delete time.
1001-
rel_time_t lock_expiry_or_delete_time;
1000+
// For alive items: GETL lock expiration. For deleted items: delete time.
1001+
// For prepared items: the time at which they were completed.
1002+
rel_time_t lock_expiry_or_delete_or_complete_time;
10021003
uint32_t exptime; //!< Expiration time of this item.
10031004
uint32_t flags; // 4 bytes
10041005
cb::uint48_t revSeqno; //!< Revision id sequence number
@@ -1095,9 +1096,10 @@ class OrderedStoredValue : public StoredValue {
10951096
}
10961097

10971098
/**
1098-
* Return the time the item was deleted. Only valid for deleted items.
1099+
* Return the time the item was deleted. Only valid for completed
1100+
* (SyncWrites) or deleted items.
10991101
*/
1100-
rel_time_t getDeletedTime() const;
1102+
rel_time_t getCompletedOrDeletedTime() const;
11011103

11021104
/**
11031105
* Check if the contents of the StoredValue is same as that of the other
@@ -1123,9 +1125,10 @@ class OrderedStoredValue : public StoredValue {
11231125
}
11241126

11251127
/**
1126-
* Set the time the item was deleted to the specified time.
1128+
* Set the time the item was completed (SyncWrite) or deleted at to the
1129+
* specified time.
11271130
*/
1128-
void setDeletedTime(rel_time_t time);
1131+
void setCompletedOrDeletedTime(rel_time_t time);
11291132

11301133
protected:
11311134
SerialisedDocKey* key() {

engines/ep/tests/module_tests/ephemeral_vb_test.cc

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -762,7 +762,7 @@ TEST_F(EphTombstoneTest, DoubleDeleteTimeCorrect) {
762762
auto key = keys.at(0);
763763
softDeleteOne(key, MutationStatus::WasDirty);
764764
auto* delOSV = findValue(key)->toOrderedStoredValue();
765-
auto initialDelTime = delOSV->getDeletedTime();
765+
auto initialDelTime = delOSV->getCompletedOrDeletedTime();
766766
ASSERT_EQ(2, delOSV->getRevSeqno()) << "Should be initial set + 1";
767767

768768
// Advance to non-zero time.
@@ -780,7 +780,7 @@ TEST_F(EphTombstoneTest, DoubleDeleteTimeCorrect) {
780780
ASSERT_EQ(MutationStatus::WasDirty, public_processSet(item, item.getCas()));
781781
ASSERT_EQ(3, delOSV->getRevSeqno()) << "Should be initial set + 2";
782782

783-
auto secondDelTime = delOSV->getDeletedTime();
783+
auto secondDelTime = delOSV->getCompletedOrDeletedTime();
784784
EXPECT_GE(secondDelTime, initialDelTime + timeJump);
785785
}
786786

engines/ep/tests/module_tests/evp_store_single_threaded_test.cc

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1898,7 +1898,8 @@ TEST_P(STParameterizedBucketTest, MB_27457) {
18981898
auto* sv = ro.storedValue;
18991899
ASSERT_NE(nullptr, sv);
19001900
deleted = sv->isDeleted();
1901-
tombstoneTime = uint64_t(sv->toOrderedStoredValue()->getDeletedTime());
1901+
tombstoneTime = uint64_t(
1902+
sv->toOrderedStoredValue()->getCompletedOrDeletedTime());
19021903
}
19031904

19041905
EXPECT_EQ(1, deleted);
@@ -1935,8 +1936,8 @@ TEST_P(STParameterizedBucketTest, MB_27457) {
19351936
auto* sv = ro.storedValue;
19361937
ASSERT_NE(nullptr, sv);
19371938
deleted = sv->isDeleted();
1938-
tombstoneTime =
1939-
ep_abs_time((sv->toOrderedStoredValue()->getDeletedTime()));
1939+
tombstoneTime = ep_abs_time(
1940+
(sv->toOrderedStoredValue()->getCompletedOrDeletedTime()));
19401941
}
19411942
EXPECT_EQ(1, deleted);
19421943
EXPECT_EQ(PROTOCOL_BINARY_RAW_BYTES, datatype);

engines/ep/tests/module_tests/hash_table_test.cc

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1040,7 +1040,7 @@ TEST_F(HashTableTest, LockAfterDelete) {
10401040

10411041
// Sanity check - deleted time should be set.
10421042
auto* osv = sv->toOrderedStoredValue();
1043-
ASSERT_GE(osv->getDeletedTime(), 1985);
1043+
ASSERT_GE(osv->getCompletedOrDeletedTime(), 1985);
10441044

10451045
// Now re-create the same key (as alive).
10461046
Item i(key, 0, 0, key.data(), key.size());

0 commit comments

Comments
 (0)