Skip to content

Commit 436b6da

Browse files
authored
Use operation attributes for implicit pre-read and insert mode of Put (#2351)
1 parent 1a11e04 commit 436b6da

File tree

12 files changed

+368
-161
lines changed

12 files changed

+368
-161
lines changed

core/src/main/java/com/scalar/db/api/OperationBuilder.java

Lines changed: 12 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -285,21 +285,24 @@ public interface ClearValues<T> {
285285

286286
public interface ImplicitPreReadEnabled<T> {
287287
/**
288-
* Disables implicit pre-read for this put operation.
288+
* Disables implicit pre-read for this put operation. This is a utility method for Consensus
289+
* Commit.
289290
*
290291
* @return the operation builder
291292
*/
292293
T disableImplicitPreRead();
293294

294295
/**
295-
* Enables implicit pre-read for this put operation.
296+
* Enables implicit pre-read for this put operation. This is a utility method for Consensus
297+
* Commit.
296298
*
297299
* @return the operation builder
298300
*/
299301
T enableImplicitPreRead();
300302

301303
/**
302-
* Sets whether implicit pre-read is enabled or not for this put operation.
304+
* Sets whether implicit pre-read is enabled or not for this put operation. This is a utility
305+
* method for Consensus Commit.
303306
*
304307
* @param implicitPreReadEnabled whether implicit pre-read is enabled or not
305308
* @return the operation builder
@@ -309,21 +312,24 @@ public interface ImplicitPreReadEnabled<T> {
309312

310313
public interface InsertModeEnabled<T> {
311314
/**
312-
* Disables the insert mode for this put operation.
315+
* Disables the insert mode for this put operation. This is a utility method for Consensus
316+
* Commit.
313317
*
314318
* @return the operation builder
315319
*/
316320
T disableInsertMode();
317321

318322
/**
319-
* Enables the insert mode for this put operation.
323+
* Enables the insert mode for this put operation. This is a utility method for Consensus
324+
* Commit.
320325
*
321326
* @return the operation builder
322327
*/
323328
T enableInsertMode();
324329

325330
/**
326-
* Sets whether the insert mode is enabled or not for this put operation.
331+
* Sets whether the insert mode is enabled or not for this put operation. This is a utility
332+
* method for Consensus Commit.
327333
*
328334
* @param insertModeEnabled whether the insert mode is enabled or not
329335
* @return the operation builder

core/src/main/java/com/scalar/db/api/Put.java

Lines changed: 18 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
import com.scalar.db.io.Key;
2020
import com.scalar.db.io.TextColumn;
2121
import com.scalar.db.io.Value;
22+
import com.scalar.db.transaction.consensuscommit.ConsensusCommitOperationAttributes;
2223
import com.scalar.db.util.ScalarDbUtils;
2324
import java.nio.ByteBuffer;
2425
import java.util.Collection;
@@ -42,10 +43,6 @@ public class Put extends Mutation {
4243

4344
private final Map<String, Column<?>> columns;
4445

45-
private boolean implicitPreReadEnabled;
46-
47-
private boolean insertModeEnabled;
48-
4946
Put(
5047
@Nullable String namespace,
5148
String tableName,
@@ -54,13 +51,9 @@ public class Put extends Mutation {
5451
@Nullable Consistency consistency,
5552
ImmutableMap<String, String> attributes,
5653
@Nullable MutationCondition condition,
57-
Map<String, Column<?>> columns,
58-
boolean implicitPreReadEnabled,
59-
boolean insertModeEnabled) {
54+
Map<String, Column<?>> columns) {
6055
super(namespace, tableName, partitionKey, clusteringKey, consistency, attributes, condition);
6156
this.columns = columns;
62-
this.implicitPreReadEnabled = implicitPreReadEnabled;
63-
this.insertModeEnabled = insertModeEnabled;
6457
}
6558

6659
/**
@@ -104,8 +97,6 @@ public Put(Key partitionKey, Key clusteringKey) {
10497
public Put(Put put) {
10598
super(put);
10699
columns = new LinkedHashMap<>(put.columns);
107-
implicitPreReadEnabled = put.implicitPreReadEnabled;
108-
insertModeEnabled = put.insertModeEnabled;
109100
}
110101

111102
/**
@@ -779,41 +770,31 @@ public Optional<MutationCondition> getCondition() {
779770
}
780771

781772
/**
782-
* Returns whether implicit pre-read is enabled for this Put.
773+
* Returns whether implicit pre-read is enabled for this Put. This is a utility method for
774+
* Consensus Commit.
783775
*
784776
* @return whether implicit pre-read is enabled for this Put
777+
* @deprecated As of release 3.15.0. Will be removed in release 5.0.0. Use {@link
778+
* ConsensusCommitOperationAttributes#isImplicitPreReadEnabled(Put)} instead
785779
*/
780+
@SuppressWarnings("InlineMeSuggester")
781+
@Deprecated
786782
public boolean isImplicitPreReadEnabled() {
787-
return implicitPreReadEnabled;
788-
}
789-
790-
/**
791-
* Sets whether implicit pre-read is enabled for this Put.
792-
*
793-
* @param implicitPreReadEnabled whether the implicit pre-read is enabled for this Put
794-
*/
795-
Put setImplicitPreReadEnabled(boolean implicitPreReadEnabled) {
796-
this.implicitPreReadEnabled = implicitPreReadEnabled;
797-
return this;
783+
return ConsensusCommitOperationAttributes.isImplicitPreReadEnabled(this);
798784
}
799785

800786
/**
801-
* Returns whether the insert mode is enabled for this Put.
787+
* Returns whether the insert mode is enabled for this Put. This is a utility method for Consensus
788+
* Commit.
802789
*
803790
* @return whether the insert mode is enabled for this Put
791+
* @deprecated As of release 3.15.0. Will be removed in release 5.0.0. Use {@link
792+
* ConsensusCommitOperationAttributes#isInsertModeEnabled(Put)} instead
804793
*/
794+
@SuppressWarnings("InlineMeSuggester")
795+
@Deprecated
805796
public boolean isInsertModeEnabled() {
806-
return insertModeEnabled;
807-
}
808-
809-
/**
810-
* Sets whether the insert mode is enabled for this Put.
811-
*
812-
* @param insertModeEnabled whether the insert mode is enabled for this Put
813-
*/
814-
Put setInsertModeEnabled(boolean insertModeEnabled) {
815-
this.insertModeEnabled = insertModeEnabled;
816-
return this;
797+
return ConsensusCommitOperationAttributes.isInsertModeEnabled(this);
817798
}
818799

819800
@Override
@@ -846,14 +827,12 @@ public boolean equals(Object o) {
846827
return false;
847828
}
848829
Put other = (Put) o;
849-
return columns.equals(other.columns)
850-
&& implicitPreReadEnabled == other.implicitPreReadEnabled
851-
&& insertModeEnabled == other.insertModeEnabled;
830+
return columns.equals(other.columns);
852831
}
853832

854833
@Override
855834
public int hashCode() {
856-
return Objects.hash(super.hashCode(), columns, implicitPreReadEnabled, insertModeEnabled);
835+
return Objects.hash(super.hashCode(), columns);
857836
}
858837

859838
@Override
@@ -867,8 +846,6 @@ public String toString() {
867846
.add("attributes", getAttributes())
868847
.add("condition", getCondition())
869848
.add("columns", getColumns())
870-
.add("implicitPreReadEnabled", isImplicitPreReadEnabled())
871-
.add("insertModeEnabled", isInsertModeEnabled())
872849
.toString();
873850
}
874851
}

core/src/main/java/com/scalar/db/api/PutBuilder.java

Lines changed: 16 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@
2626
import com.scalar.db.io.IntColumn;
2727
import com.scalar.db.io.Key;
2828
import com.scalar.db.io.TextColumn;
29+
import com.scalar.db.transaction.consensuscommit.ConsensusCommitOperationAttributes;
2930
import java.nio.ByteBuffer;
3031
import java.util.HashMap;
3132
import java.util.LinkedHashMap;
@@ -91,8 +92,6 @@ public static class Buildable extends OperationBuilder.Buildable<Put>
9192
@Nullable com.scalar.db.api.Consistency consistency;
9293
final Map<String, String> attributes = new HashMap<>();
9394
@Nullable MutationCondition condition;
94-
boolean implicitPreReadEnabled;
95-
boolean insertModeEnabled;
9695

9796
private Buildable(@Nullable String namespace, String table, Key partitionKey) {
9897
super(namespace, table, partitionKey);
@@ -235,37 +234,45 @@ public Buildable value(Column<?> column) {
235234

236235
@Override
237236
public Buildable disableImplicitPreRead() {
238-
implicitPreReadEnabled = false;
237+
ConsensusCommitOperationAttributes.disableImplicitPreRead(attributes);
239238
return this;
240239
}
241240

242241
@Override
243242
public Buildable enableImplicitPreRead() {
244-
implicitPreReadEnabled = true;
243+
ConsensusCommitOperationAttributes.enableImplicitPreRead(attributes);
245244
return this;
246245
}
247246

248247
@Override
249248
public Buildable implicitPreReadEnabled(boolean implicitPreReadEnabled) {
250-
this.implicitPreReadEnabled = implicitPreReadEnabled;
249+
if (implicitPreReadEnabled) {
250+
ConsensusCommitOperationAttributes.enableImplicitPreRead(attributes);
251+
} else {
252+
ConsensusCommitOperationAttributes.disableImplicitPreRead(attributes);
253+
}
251254
return this;
252255
}
253256

254257
@Override
255258
public Buildable disableInsertMode() {
256-
insertModeEnabled = false;
259+
ConsensusCommitOperationAttributes.disableInsertMode(attributes);
257260
return this;
258261
}
259262

260263
@Override
261264
public Buildable enableInsertMode() {
262-
insertModeEnabled = true;
265+
ConsensusCommitOperationAttributes.enableInsertMode(attributes);
263266
return this;
264267
}
265268

266269
@Override
267270
public Buildable insertModeEnabled(boolean insertModeEnabled) {
268-
this.insertModeEnabled = insertModeEnabled;
271+
if (insertModeEnabled) {
272+
ConsensusCommitOperationAttributes.enableInsertMode(attributes);
273+
} else {
274+
ConsensusCommitOperationAttributes.disableInsertMode(attributes);
275+
}
269276
return this;
270277
}
271278

@@ -279,9 +286,7 @@ public Put build() {
279286
consistency,
280287
ImmutableMap.copyOf(attributes),
281288
condition,
282-
columns,
283-
implicitPreReadEnabled,
284-
insertModeEnabled);
289+
columns);
285290
}
286291
}
287292

@@ -302,8 +307,6 @@ public static class BuildableFromExisting extends Buildable
302307
this.consistency = put.getConsistency();
303308
this.condition = put.getCondition().orElse(null);
304309
this.attributes.putAll(put.getAttributes());
305-
this.implicitPreReadEnabled = put.isImplicitPreReadEnabled();
306-
this.insertModeEnabled = put.isInsertModeEnabled();
307310
}
308311

309312
@Override
Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,59 @@
1+
package com.scalar.db.transaction.consensuscommit;
2+
3+
import com.scalar.db.api.Put;
4+
import java.util.Map;
5+
import java.util.Optional;
6+
7+
/** A utility class to manipulate the operation attributes for Consensus Commit. */
8+
public final class ConsensusCommitOperationAttributes {
9+
10+
private static final String OPERATION_ATTRIBUTE_PREFIX = "cc-";
11+
public static final String IMPLICIT_PRE_READ_ENABLED =
12+
OPERATION_ATTRIBUTE_PREFIX + "implicit-pre-read-enabled";
13+
public static final String INSERT_MODE_ENABLED =
14+
OPERATION_ATTRIBUTE_PREFIX + "insert-mode-enabled";
15+
16+
private ConsensusCommitOperationAttributes() {}
17+
18+
public static Put enableImplicitPreRead(Put put) {
19+
return Put.newBuilder(put).attribute(IMPLICIT_PRE_READ_ENABLED, "true").build();
20+
}
21+
22+
public static void enableImplicitPreRead(Map<String, String> attributes) {
23+
attributes.put(IMPLICIT_PRE_READ_ENABLED, "true");
24+
}
25+
26+
public static Put disableImplicitPreRead(Put put) {
27+
return Put.newBuilder(put).clearAttribute(IMPLICIT_PRE_READ_ENABLED).build();
28+
}
29+
30+
public static void disableImplicitPreRead(Map<String, String> attributes) {
31+
attributes.remove(IMPLICIT_PRE_READ_ENABLED);
32+
}
33+
34+
public static Put enableInsertMode(Put put) {
35+
return Put.newBuilder(put).attribute(INSERT_MODE_ENABLED, "true").build();
36+
}
37+
38+
public static void enableInsertMode(Map<String, String> attributes) {
39+
attributes.put(INSERT_MODE_ENABLED, "true");
40+
}
41+
42+
public static Put disableInsertMode(Put put) {
43+
return Put.newBuilder(put).clearAttribute(INSERT_MODE_ENABLED).build();
44+
}
45+
46+
public static void disableInsertMode(Map<String, String> attributes) {
47+
attributes.remove(INSERT_MODE_ENABLED);
48+
}
49+
50+
public static boolean isImplicitPreReadEnabled(Put put) {
51+
Optional<String> attribute = put.getAttribute(IMPLICIT_PRE_READ_ENABLED);
52+
return attribute.isPresent() && "true".equalsIgnoreCase(attribute.get());
53+
}
54+
55+
public static boolean isInsertModeEnabled(Put put) {
56+
Optional<String> attribute = put.getAttribute(INSERT_MODE_ENABLED);
57+
return attribute.isPresent() && "true".equalsIgnoreCase(attribute.get());
58+
}
59+
}

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

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

33
import static com.google.common.base.Preconditions.checkNotNull;
4+
import static com.scalar.db.transaction.consensuscommit.ConsensusCommitOperationAttributes.isImplicitPreReadEnabled;
45

56
import com.google.common.annotations.VisibleForTesting;
67
import com.scalar.db.api.Consistency;
@@ -195,15 +196,15 @@ public void put(Put put) throws CrudException {
195196
Snapshot.Key key = new Snapshot.Key(put);
196197

197198
if (put.getCondition().isPresent()
198-
&& (!put.isImplicitPreReadEnabled() && !snapshot.containsKeyInReadSet(key))) {
199+
&& (!isImplicitPreReadEnabled(put) && !snapshot.containsKeyInReadSet(key))) {
199200
throw new IllegalArgumentException(
200201
CoreError
201202
.CONSENSUS_COMMIT_PUT_CANNOT_HAVE_CONDITION_WHEN_TARGET_RECORD_UNREAD_AND_IMPLICIT_PRE_READ_DISABLED
202203
.buildMessage(put));
203204
}
204205

205206
if (put.getCondition().isPresent()) {
206-
if (put.isImplicitPreReadEnabled() && !snapshot.containsKeyInReadSet(key)) {
207+
if (isImplicitPreReadEnabled(put) && !snapshot.containsKeyInReadSet(key)) {
207208
read(key, createGet(key));
208209
}
209210
mutationConditionsValidator.checkIfConditionIsSatisfied(
@@ -233,7 +234,7 @@ public void readIfImplicitPreReadEnabled() throws CrudException {
233234
// For each put in the write set, if implicit pre-read is enabled and the record is not read
234235
// yet, read the record
235236
for (Put put : snapshot.getPutsInWriteSet()) {
236-
if (put.isImplicitPreReadEnabled()) {
237+
if (isImplicitPreReadEnabled(put)) {
237238
Snapshot.Key key = new Snapshot.Key(put);
238239
if (!snapshot.containsKeyInReadSet(key)) {
239240
tasks.add(() -> read(key, createGet(key)));

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

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
import static com.scalar.db.transaction.consensuscommit.Attribute.ID;
44
import static com.scalar.db.transaction.consensuscommit.Attribute.VERSION;
5+
import static com.scalar.db.transaction.consensuscommit.ConsensusCommitOperationAttributes.isInsertModeEnabled;
56
import static com.scalar.db.transaction.consensuscommit.ConsensusCommitUtils.getNextTxVersion;
67

78
import com.google.common.annotations.VisibleForTesting;
@@ -64,7 +65,7 @@ private void add(Put base, @Nullable TransactionResult result) throws ExecutionE
6465
putBuilder.intValue(Attribute.STATE, TransactionState.PREPARED.get());
6566
putBuilder.bigIntValue(Attribute.PREPARED_AT, current);
6667

67-
if (!base.isInsertModeEnabled() && result != null) { // overwrite existing record
68+
if (!isInsertModeEnabled(base) && result != null) { // overwrite existing record
6869
createBeforeColumns(base, result).forEach(putBuilder::value);
6970
int version = result.getVersion();
7071
putBuilder.intValue(Attribute.VERSION, getNextTxVersion(version));

0 commit comments

Comments
 (0)