Skip to content

Commit ce9a81b

Browse files
committed
Polishing.
Add LWT insert guards to route writes through Paxos timestamps to ensure proper happens-before relationships. See #1651
1 parent 00c1367 commit ce9a81b

4 files changed

Lines changed: 29 additions & 11 deletions

File tree

spring-data-cassandra/src/test/java/org/springframework/data/cassandra/core/AsyncCassandraTemplateIntegrationTests.java

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -295,21 +295,23 @@ void deleteByIdShouldRemoveEntity() {
295295
@Test // DATACASS-606
296296
void deleteShouldRemoveEntityWithLwt() {
297297

298+
InsertOptions seedOptions = InsertOptions.builder().withIfNotExists().build();
298299
DeleteOptions lwtOptions = DeleteOptions.builder().withIfExists().build();
299300

300301
User user = new User("heisenberg", "Walter", "White");
301-
getUninterruptibly(template.insert(user));
302+
assertThat(getUninterruptibly(template.insert(user, seedOptions)).wasApplied()).isTrue();
302303

303304
assertThat(getUninterruptibly(template.delete(user, lwtOptions)).wasApplied()).isTrue();
304305
}
305306

306307
@Test // DATACASS-606
307308
void deleteByQueryShouldRemoveEntityWithLwt() {
308309

310+
InsertOptions seedOptions = InsertOptions.builder().withIfNotExists().build();
309311
DeleteOptions lwtOptions = DeleteOptions.builder().withIfExists().build();
310312

311313
User user = new User("heisenberg", "Walter", "White");
312-
getUninterruptibly(template.insert(user));
314+
assertThat(getUninterruptibly(template.insert(user, seedOptions)).wasApplied()).isTrue();
313315

314316
Query query = Query.query(where("id").is("heisenberg")).queryOptions(lwtOptions);
315317
assertThat(getUninterruptibly(template.delete(query, User.class))).isTrue();

spring-data-cassandra/src/test/java/org/springframework/data/cassandra/core/CassandraTemplateIntegrationTests.java

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -368,11 +368,12 @@ void updateShouldNotCreateEntityWithLwt() {
368368
@Test // DATACASS-292
369369
void updateShouldUpdateEntityWithLwt() {
370370

371+
InsertOptions seedOptions = InsertOptions.builder().withIfNotExists().build();
371372
UpdateOptions lwtOptions = UpdateOptions.builder().withIfExists().build();
372373

373374
User user = new User("heisenberg", "Walter", "White");
374375

375-
template.insert(user);
376+
assertThat(template.insert(user, seedOptions).wasApplied()).isTrue();
376377

377378
user.setFirstname("Walter Hartwell");
378379

@@ -447,21 +448,23 @@ void deleteByIdShouldRemoveEntity() {
447448
@Test // DATACASS-606
448449
void deleteShouldRemoveEntityWithLwt() {
449450

451+
InsertOptions seedOptions = InsertOptions.builder().withIfNotExists().build();
450452
DeleteOptions lwtOptions = DeleteOptions.builder().withIfExists().build();
451453

452454
User user = new User("heisenberg", "Walter", "White");
453-
template.insert(user);
455+
assertThat(template.insert(user, seedOptions).wasApplied()).isTrue();
454456

455457
assertThat(template.delete(user, lwtOptions).wasApplied()).isTrue();
456458
}
457459

458460
@Test // DATACASS-606
459461
void deleteByQueryShouldRemoveEntityWithLwt() {
460462

463+
InsertOptions seedOptions = InsertOptions.builder().withIfNotExists().build();
461464
DeleteOptions lwtOptions = DeleteOptions.builder().withIfExists().build();
462465

463466
User user = new User("heisenberg", "Walter", "White");
464-
template.insert(user);
467+
assertThat(template.insert(user, seedOptions).wasApplied()).isTrue();
465468

466469
Query query = Query.query(where("id").is("heisenberg")).queryOptions(lwtOptions);
467470
assertThat(template.delete(query, User.class)).isTrue();

spring-data-cassandra/src/test/java/org/springframework/data/cassandra/core/ReactiveCassandraTemplateIntegrationTests.java

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -195,10 +195,12 @@ void updateShouldNotCreateEntityWithLwt() {
195195
@Test // DATACASS-292
196196
void updateShouldUpdateEntityWithLwt() {
197197

198+
InsertOptions seedOptions = InsertOptions.builder().withIfNotExists().build();
198199
UpdateOptions lwtOptions = UpdateOptions.builder().withIfExists().build();
199200

200201
User user = new User("heisenberg", "Walter", "White");
201-
template.insert(user).as(StepVerifier::create).expectNextCount(1).verifyComplete();
202+
template.insert(user, seedOptions).map(WriteResult::wasApplied).as(StepVerifier::create).expectNext(true)
203+
.verifyComplete();
202204

203205
user.setFirstname("Walter Hartwell");
204206

@@ -276,10 +278,14 @@ void deleteByIdShouldRemoveEntity() {
276278
@Test // DATACASS-606
277279
void deleteShouldRemoveEntityWithLwt() {
278280

281+
InsertOptions seedOptions = InsertOptions.builder().withIfNotExists().build();
279282
DeleteOptions lwtOptions = DeleteOptions.builder().withIfExists().build();
280283

281284
User user = new User("heisenberg", "Walter", "White");
282-
template.insert(user).as(StepVerifier::create).expectNextCount(1).verifyComplete();
285+
template.insert(user, seedOptions).map(WriteResult::wasApplied) //
286+
.as(StepVerifier::create) //
287+
.expectNext(true) //
288+
.verifyComplete();
283289

284290
template.delete(user, lwtOptions).map(WriteResult::wasApplied) //
285291
.as(StepVerifier::create) //
@@ -295,10 +301,14 @@ void deleteShouldRemoveEntityWithLwt() {
295301
@Test // DATACASS-606
296302
void deleteByQueryShouldRemoveEntityWithLwt() {
297303

304+
InsertOptions seedOptions = InsertOptions.builder().withIfNotExists().build();
298305
DeleteOptions lwtOptions = DeleteOptions.builder().withIfExists().build();
299306

300307
User user = new User("heisenberg", "Walter", "White");
301-
template.insert(user).as(StepVerifier::create).expectNextCount(1).verifyComplete();
308+
template.insert(user, seedOptions).map(WriteResult::wasApplied) //
309+
.as(StepVerifier::create) //
310+
.expectNext(true) //
311+
.verifyComplete();
302312

303313
Query query = Query.query(where("id").is("heisenberg")).queryOptions(lwtOptions);
304314

spring-data-cassandra/src/test/java/org/springframework/data/cassandra/core/legacy/AsyncCassandraTemplateIntegrationTests.java

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -223,10 +223,11 @@ void updateShouldNotCreateEntityWithLwt() {
223223
@Test // DATACASS-292
224224
void updateShouldUpdateEntityWithLwt() throws InterruptedException {
225225

226+
InsertOptions seedOptions = InsertOptions.builder().withIfNotExists().build();
226227
UpdateOptions lwtOptions = UpdateOptions.builder().withIfExists().build();
227228

228229
User user = new User("heisenberg", "Walter", "White");
229-
getUninterruptibly(template.insert(user));
230+
assertThat(getUninterruptibly(template.insert(user, seedOptions)).wasApplied()).isTrue();
230231

231232
user.setFirstname("Walter Hartwell");
232233

@@ -305,21 +306,23 @@ void deleteByIdShouldRemoveEntity() {
305306
@Test // DATACASS-606
306307
void deleteShouldRemoveEntityWithLwt() {
307308

309+
InsertOptions seedOptions = InsertOptions.builder().withIfNotExists().build();
308310
DeleteOptions lwtOptions = DeleteOptions.builder().withIfExists().build();
309311

310312
User user = new User("heisenberg", "Walter", "White");
311-
getUninterruptibly(template.insert(user));
313+
assertThat(getUninterruptibly(template.insert(user, seedOptions)).wasApplied()).isTrue();
312314

313315
assertThat(getUninterruptibly(template.delete(user, lwtOptions)).wasApplied()).isTrue();
314316
}
315317

316318
@Test // DATACASS-606
317319
void deleteByQueryShouldRemoveEntityWithLwt() {
318320

321+
InsertOptions seedOptions = InsertOptions.builder().withIfNotExists().build();
319322
DeleteOptions lwtOptions = DeleteOptions.builder().withIfExists().build();
320323

321324
User user = new User("heisenberg", "Walter", "White");
322-
getUninterruptibly(template.insert(user));
325+
assertThat(getUninterruptibly(template.insert(user, seedOptions)).wasApplied()).isTrue();
323326

324327
Query query = Query.query(where("id").is("heisenberg")).queryOptions(lwtOptions);
325328
assertThat(getUninterruptibly(template.delete(query, User.class))).isTrue();

0 commit comments

Comments
 (0)