Skip to content

Commit 41e9524

Browse files
Backport to branch(3) : Remove version from prepare-records condition in Consensus Commit (#2682)
Co-authored-by: Toshihiro Suzuki <[email protected]>
1 parent 7a48af2 commit 41e9524

File tree

4 files changed

+35
-118
lines changed

4 files changed

+35
-118
lines changed

core/src/main/java/com/scalar/db/transaction/consensuscommit/PrepareMutationComposer.java

Lines changed: 2 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
package com.scalar.db.transaction.consensuscommit;
22

33
import static com.scalar.db.transaction.consensuscommit.Attribute.ID;
4-
import static com.scalar.db.transaction.consensuscommit.Attribute.VERSION;
54
import static com.scalar.db.transaction.consensuscommit.ConsensusCommitOperationAttributes.isInsertModeEnabled;
65
import static com.scalar.db.transaction.consensuscommit.ConsensusCommitUtils.getNextTxVersion;
76

@@ -73,13 +72,10 @@ private void add(Put base, @Nullable TransactionResult result) throws ExecutionE
7372
if (result.isDeemedAsCommitted()) {
7473
// record is deemed-commit state
7574
putBuilder.condition(
76-
ConditionBuilder.putIf(ConditionBuilder.column(ID).isNullText())
77-
.and(ConditionBuilder.column(VERSION).isNullInt())
78-
.build());
75+
ConditionBuilder.putIf(ConditionBuilder.column(ID).isNullText()).build());
7976
} else {
8077
putBuilder.condition(
8178
ConditionBuilder.putIf(ConditionBuilder.column(ID).isEqualToText(result.getId()))
82-
.and(ConditionBuilder.column(VERSION).isEqualToInt(version))
8379
.build());
8480
}
8581
} else { // initial record or insert mode enabled
@@ -113,13 +109,10 @@ private void add(Delete base, @Nullable TransactionResult result) throws Executi
113109
// check if the record is not interrupted by other conflicting transactions
114110
if (result.isDeemedAsCommitted()) {
115111
putBuilder.condition(
116-
ConditionBuilder.putIf(ConditionBuilder.column(ID).isNullText())
117-
.and(ConditionBuilder.column(VERSION).isNullInt())
118-
.build());
112+
ConditionBuilder.putIf(ConditionBuilder.column(ID).isNullText()).build());
119113
} else {
120114
putBuilder.condition(
121115
ConditionBuilder.putIf(ConditionBuilder.column(ID).isEqualToText(result.getId()))
122-
.and(ConditionBuilder.column(VERSION).isEqualToInt(version))
123116
.build());
124117
}
125118
} else {

core/src/main/java/com/scalar/db/transaction/consensuscommit/Snapshot.java

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -497,9 +497,9 @@ void toSerializable(DistributedStorage storage)
497497
tasks.add(
498498
() -> {
499499
Optional<TransactionResult> originalResult = getSet.get(get);
500-
// Only get tx_id and tx_version columns because we use only them to compare
500+
// Only get the tx_id column because we use only them to compare
501501
get.clearProjections();
502-
get.withProjection(Attribute.ID).withProjection(Attribute.VERSION);
502+
get.withProjection(Attribute.ID);
503503

504504
// Check if a read record is not changed
505505
Optional<TransactionResult> latestResult = storage.get(get).map(TransactionResult::new);
@@ -537,9 +537,9 @@ private void validateScanResults(
537537
throws ExecutionException, ValidationConflictException {
538538
Scanner scanner = null;
539539
try {
540-
// Only get tx_id, tx_version and primary key columns because we use only them to compare
540+
// Only get tx_id and primary key columns because we use only them to compare
541541
scan.clearProjections();
542-
scan.withProjection(Attribute.ID).withProjection(Attribute.VERSION);
542+
scan.withProjection(Attribute.ID);
543543
ScalarDbUtils.addProjectionsForKeys(scan, getTableMetadata(scan));
544544

545545
if (scan.getLimit() == 0) {
@@ -653,8 +653,7 @@ private boolean isChanged(
653653
}
654654

655655
private boolean isChanged(TransactionResult latestResult, TransactionResult result) {
656-
return !Objects.equals(latestResult.getId(), result.getId())
657-
|| latestResult.getVersion() != result.getVersion();
656+
return !Objects.equals(latestResult.getId(), result.getId());
658657
}
659658

660659
private void throwExceptionDueToAntiDependency() throws ValidationConflictException {

core/src/test/java/com/scalar/db/transaction/consensuscommit/PrepareMutationComposerTest.java

Lines changed: 4 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,7 @@
22

33
import static com.scalar.db.api.ConditionalExpression.Operator;
44
import static com.scalar.db.transaction.consensuscommit.Attribute.ID;
5-
import static com.scalar.db.transaction.consensuscommit.Attribute.VERSION;
65
import static com.scalar.db.transaction.consensuscommit.Attribute.toIdValue;
7-
import static com.scalar.db.transaction.consensuscommit.Attribute.toVersionValue;
86
import static org.assertj.core.api.Assertions.assertThat;
97
import static org.assertj.core.api.Assertions.assertThatThrownBy;
108
import static org.mockito.ArgumentMatchers.any;
@@ -182,10 +180,7 @@ public void add_PutAndResultGiven_ShouldComposePutWithPutIfCondition() throws Ex
182180
// Assert
183181
Put actual = (Put) composer.get().get(0);
184182
put.withConsistency(Consistency.LINEARIZABLE);
185-
put.withCondition(
186-
new PutIf(
187-
new ConditionalExpression(ID, toIdValue(ANY_ID_2), Operator.EQ),
188-
new ConditionalExpression(VERSION, toVersionValue(2), Operator.EQ)));
183+
put.withCondition(new PutIf(new ConditionalExpression(ID, toIdValue(ANY_ID_2), Operator.EQ)));
189184
put.withValue(Attribute.toPreparedAtValue(ANY_TIME_5));
190185
put.withValue(Attribute.toIdValue(ANY_ID_3));
191186
put.withValue(Attribute.toStateValue(TransactionState.PREPARED));
@@ -226,10 +221,7 @@ public void add_PutAndResultGiven_ShouldComposePutWithPutIfCondition() throws Ex
226221
.intValue(Attribute.BEFORE_STATE, null)
227222
.intValue(Attribute.BEFORE_VERSION, 0)
228223
.intValue(Attribute.BEFORE_PREFIX + ANY_NAME_3, ANY_INT_2)
229-
.condition(
230-
ConditionBuilder.putIf(ConditionBuilder.column(ID).isNullText())
231-
.and(ConditionBuilder.column(VERSION).isNullInt())
232-
.build())
224+
.condition(ConditionBuilder.putIf(ConditionBuilder.column(ID).isNullText()).build())
233225
.build();
234226
assertThat(actual).isEqualTo(expected);
235227
}
@@ -321,9 +313,7 @@ public void add_DeleteAndResultGiven_ShouldComposePutWithPutIfCondition()
321313
.forTable(delete.forTable().get());
322314
expected.withConsistency(Consistency.LINEARIZABLE);
323315
expected.withCondition(
324-
new PutIf(
325-
new ConditionalExpression(ID, toIdValue(ANY_ID_2), Operator.EQ),
326-
new ConditionalExpression(VERSION, toVersionValue(2), Operator.EQ)));
316+
new PutIf(new ConditionalExpression(ID, toIdValue(ANY_ID_2), Operator.EQ)));
327317
expected.withValue(Attribute.toPreparedAtValue(ANY_TIME_5));
328318
expected.withValue(Attribute.toIdValue(ANY_ID_3));
329319
expected.withValue(Attribute.toStateValue(TransactionState.DELETED));
@@ -368,10 +358,7 @@ public void add_DeleteAndResultGiven_ShouldComposePutWithPutIfCondition()
368358
.intValue(Attribute.BEFORE_STATE, null)
369359
.intValue(Attribute.BEFORE_VERSION, 0)
370360
.intValue(Attribute.BEFORE_PREFIX + ANY_NAME_3, ANY_INT_2)
371-
.condition(
372-
ConditionBuilder.putIf(ConditionBuilder.column(ID).isNullText())
373-
.and(ConditionBuilder.column(VERSION).isNullInt())
374-
.build())
361+
.condition(ConditionBuilder.putIf(ConditionBuilder.column(ID).isNullText()).build())
375362
.build();
376363
assertThat(actual).isEqualTo(expected);
377364
}

0 commit comments

Comments
 (0)