Skip to content

Commit c7d60a5

Browse files
authored
Make BatchStatementBuilder.build log warning if statement with (#325)
non-default consistancy level is in the batch When user does: ``` SimpleStatement simpleStatement = SimpleStatement.builder("SELECT * FROM some_table WHERE a = ?") .setConsistencyLevel(DefaultConsistencyLevel.QUORUM).build(); batchStatementBuilder.addStatement(simpleStatement); batchStatementBuilder.build(); ``` Child statement looses it's consistancy level, which is confusing. To warn user it is happening driver will issue log warning.
1 parent e7bff93 commit c7d60a5

File tree

3 files changed

+147
-0
lines changed

3 files changed

+147
-0
lines changed

core/src/main/java/com/datastax/oss/driver/internal/core/cql/DefaultBatchStatement.java

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,9 +42,12 @@
4242
import java.util.List;
4343
import java.util.Map;
4444
import net.jcip.annotations.Immutable;
45+
import org.slf4j.Logger;
46+
import org.slf4j.LoggerFactory;
4547

4648
@Immutable
4749
public class DefaultBatchStatement implements BatchStatement {
50+
private static final Logger LOG = LoggerFactory.getLogger(DefaultBatchStatement.class);
4851

4952
private final BatchType batchType;
5053
private final List<BatchableStatement<?>> statements;
@@ -86,6 +89,18 @@ public DefaultBatchStatement(
8689
Duration timeout,
8790
Node node,
8891
int nowInSeconds) {
92+
for (BatchableStatement<?> statement : statements) {
93+
if (statement != null
94+
&& (statement.getConsistencyLevel() != null
95+
|| statement.getSerialConsistencyLevel() != null)) {
96+
97+
LOG.warn(
98+
"You have submitted statement with non-default [serial] consistency level to the DefaultBatchStatement. "
99+
+ "Be aware that [serial] consistency level of child statements is not preserved by the DefaultBatchStatement. "
100+
+ "Use DefaultBatchStatement.setConsistencyLevel()/DefaultBatchStatement.setSerialConsistencyLevel() instead.");
101+
break;
102+
}
103+
}
89104
this.batchType = batchType;
90105
this.statements = ImmutableList.copyOf(statements);
91106
this.executionProfileName = executionProfileName;
Lines changed: 100 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,100 @@
1+
/*
2+
* Licensed to the Apache Software Foundation (ASF) under one
3+
* or more contributor license agreements. See the NOTICE file
4+
* distributed with this work for additional information
5+
* regarding copyright ownership. The ASF licenses this file
6+
* to you under the Apache License, Version 2.0 (the
7+
* "License"); you may not use this file except in compliance
8+
* with the License. You may obtain a copy of the License at
9+
*
10+
* http://www.apache.org/licenses/LICENSE-2.0
11+
*
12+
* Unless required by applicable law or agreed to in writing, software
13+
* distributed under the License is distributed on an "AS IS" BASIS,
14+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15+
* See the License for the specific language governing permissions and
16+
* limitations under the License.
17+
*/
18+
package com.datastax.oss.driver.internal.core.cql;
19+
20+
import static org.assertj.core.api.Assertions.assertThat;
21+
import static org.mockito.Mockito.times;
22+
import static org.mockito.Mockito.verify;
23+
24+
import ch.qos.logback.classic.Level;
25+
import ch.qos.logback.classic.spi.ILoggingEvent;
26+
import com.datastax.oss.driver.api.core.DefaultConsistencyLevel;
27+
import com.datastax.oss.driver.api.core.cql.BatchStatementBuilder;
28+
import com.datastax.oss.driver.api.core.cql.BatchType;
29+
import com.datastax.oss.driver.api.core.cql.SimpleStatement;
30+
import com.datastax.oss.driver.internal.core.util.LoggerTest;
31+
import org.junit.Test;
32+
33+
public class DefaultBatchStatementTest {
34+
35+
@Test
36+
public void should_issue_log_warn_if_statement_have_consistency_level_set() {
37+
SimpleStatement simpleStatement =
38+
SimpleStatement.builder("SELECT * FROM some_table WHERE a = ?")
39+
.setConsistencyLevel(DefaultConsistencyLevel.QUORUM)
40+
.build();
41+
42+
BatchStatementBuilder batchStatementBuilder = new BatchStatementBuilder(BatchType.LOGGED);
43+
batchStatementBuilder.addStatement(simpleStatement);
44+
45+
LoggerTest.LoggerSetup logger =
46+
LoggerTest.setupTestLogger(DefaultBatchStatement.class, Level.WARN);
47+
48+
batchStatementBuilder.build();
49+
50+
verify(logger.appender).doAppend(logger.loggingEventCaptor.capture());
51+
assertThat(
52+
logger.loggingEventCaptor.getAllValues().stream()
53+
.map(ILoggingEvent::getFormattedMessage))
54+
.contains(
55+
"You have submitted statement with non-default [serial] consistency level to the DefaultBatchStatement. "
56+
+ "Be aware that [serial] consistency level of child statements is not preserved by the DefaultBatchStatement. "
57+
+ "Use DefaultBatchStatement.setConsistencyLevel()/DefaultBatchStatement.setSerialConsistencyLevel() instead.");
58+
}
59+
60+
@Test
61+
public void should_issue_log_warn_if_statement_have_serial_consistency_level_set() {
62+
SimpleStatement simpleStatement =
63+
SimpleStatement.builder("SELECT * FROM some_table WHERE a = ?")
64+
.setSerialConsistencyLevel(DefaultConsistencyLevel.LOCAL_SERIAL)
65+
.build();
66+
67+
BatchStatementBuilder batchStatementBuilder = new BatchStatementBuilder(BatchType.LOGGED);
68+
batchStatementBuilder.addStatement(simpleStatement);
69+
70+
LoggerTest.LoggerSetup logger =
71+
LoggerTest.setupTestLogger(DefaultBatchStatement.class, Level.WARN);
72+
73+
batchStatementBuilder.build();
74+
75+
verify(logger.appender).doAppend(logger.loggingEventCaptor.capture());
76+
assertThat(
77+
logger.loggingEventCaptor.getAllValues().stream()
78+
.map(ILoggingEvent::getFormattedMessage))
79+
.contains(
80+
"You have submitted statement with non-default [serial] consistency level to the DefaultBatchStatement. "
81+
+ "Be aware that [serial] consistency level of child statements is not preserved by the DefaultBatchStatement. "
82+
+ "Use DefaultBatchStatement.setConsistencyLevel()/DefaultBatchStatement.setSerialConsistencyLevel() instead.");
83+
}
84+
85+
@Test
86+
public void should_not_issue_log_warn_if_statement_have_no_consistency_level_set() {
87+
SimpleStatement simpleStatement =
88+
SimpleStatement.builder("SELECT * FROM some_table WHERE a = ?").build();
89+
90+
BatchStatementBuilder batchStatementBuilder = new BatchStatementBuilder(BatchType.LOGGED);
91+
batchStatementBuilder.addStatement(simpleStatement);
92+
93+
LoggerTest.LoggerSetup logger =
94+
LoggerTest.setupTestLogger(DefaultBatchStatement.class, Level.WARN);
95+
96+
batchStatementBuilder.build();
97+
98+
verify(logger.appender, times(0)).doAppend(logger.loggingEventCaptor.capture());
99+
}
100+
}

integration-tests/src/test/java/com/datastax/oss/driver/core/cql/BatchStatementIT.java

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,11 @@
2525

2626
import static org.assertj.core.api.Assertions.assertThat;
2727
import static org.assertj.core.api.Assertions.assertThatThrownBy;
28+
import static org.mockito.Mockito.verify;
2829

30+
import ch.qos.logback.classic.Level;
31+
import ch.qos.logback.classic.spi.ILoggingEvent;
32+
import com.datastax.oss.driver.api.core.ConsistencyLevel;
2933
import com.datastax.oss.driver.api.core.CqlSession;
3034
import com.datastax.oss.driver.api.core.config.DefaultDriverOption;
3135
import com.datastax.oss.driver.api.core.config.DriverConfigLoader;
@@ -45,6 +49,8 @@
4549
import com.datastax.oss.driver.api.testinfra.session.SessionRule;
4650
import com.datastax.oss.driver.api.testinfra.session.SessionUtils;
4751
import com.datastax.oss.driver.categories.ParallelizableTests;
52+
import com.datastax.oss.driver.internal.core.cql.DefaultBatchStatement;
53+
import com.datastax.oss.driver.internal.core.util.LoggerTest;
4854
import java.util.Iterator;
4955
import java.util.List;
5056
import org.junit.Before;
@@ -88,6 +94,32 @@ public void createTable() {
8894
}
8995
}
9096

97+
@Test
98+
public void should_issue_log_warn_if_batched_statement_have_consistency_level_set() {
99+
SimpleStatement simpleStatement =
100+
SimpleStatement.builder("INSERT INTO test (k0, k1, v) values ('123123', ?, ?)").build();
101+
102+
try (CqlSession session = SessionUtils.newSession(ccmRule, sessionRule.keyspace())) {
103+
PreparedStatement prep = session.prepare(simpleStatement);
104+
BatchStatementBuilder batch = BatchStatement.builder(DefaultBatchType.UNLOGGED);
105+
batch.addStatement(prep.bind(1, 2).setConsistencyLevel(ConsistencyLevel.QUORUM));
106+
107+
LoggerTest.LoggerSetup logger =
108+
LoggerTest.setupTestLogger(DefaultBatchStatement.class, Level.WARN);
109+
110+
batch.build();
111+
112+
verify(logger.appender).doAppend(logger.loggingEventCaptor.capture());
113+
assertThat(
114+
logger.loggingEventCaptor.getAllValues().stream()
115+
.map(ILoggingEvent::getFormattedMessage))
116+
.contains(
117+
"You have submitted statement with non-default [serial] consistency level to the DefaultBatchStatement. "
118+
+ "Be aware that [serial] consistency level of child statements is not preserved by the DefaultBatchStatement. "
119+
+ "Use DefaultBatchStatement.setConsistencyLevel()/DefaultBatchStatement.setSerialConsistencyLevel() instead.");
120+
}
121+
}
122+
91123
@Test
92124
public void should_execute_batch_of_simple_statements_with_variables() {
93125
// Build a batch of batchCount simple statements, each with their own positional variables.

0 commit comments

Comments
 (0)