- cassandra 4.1.7 работает в докере на хосте Ubuntu, один узел
- Java-клиент с драйвером datastax 3.11.5, jdk 11.0.25
Код: Выделить всё
public class Main {
public static void main(String[] args) throws Exception {
try (Cluster cluster = connect()) {
Session session = cluster.connect();
session.execute("DROP KEYSPACE IF EXISTS lwt_test");
session.execute("CREATE KEYSPACE lwt_test WITH REPLICATION = { 'class' : 'SimpleStrategy', 'replication_factor' : 1 } AND DURABLE_WRITES = true");
session.execute("CREATE TABLE lwt_test.lwt (key timeuuid, dummy text, value text, PRIMARY KEY(key))");
session.execute("USE lwt_test");
final UUID key = UUIDs.timeBased();
final String dummy = "ABC";
final String value = "DEF";
session.execute("insert into lwt(key, dummy, value) values(?, ?, ?)", key, dummy, value);
final String value2 = "XYZ";
session.execute("update lwt set value=? where key=?", value2, key);
String actualValue = session.execute("select value from lwt where key=?", key).one().getString("value");
if (!value2.equals(actualValue)) {
throw new RuntimeException("Should be " + value + " but was " + actualValue);
}
// (1) uncomment next line to make the problem go away
// Thread.sleep(1000);
ResultSet rs = session.execute("update lwt set value='MUHAHA' where key=? if value=?", key, value2);
if (rs.wasApplied()) {
actualValue = session.execute("select value from lwt where key=?", key).one().getString("value");
if (!"MUHAHA".equals(actualValue)) {
throw new RuntimeException("Should be MUHAHA but was " + actualValue);
}
System.out.println("SUCCESS: actual value is " + actualValue);
}
}
}
private static Cluster connect() {
return Cluster.builder()
.addContactPoints("remote-cluster")
.withPort(9042)
.withQueryOptions(new QueryOptions().setConsistencyLevel(ConsistencyLevel.LOCAL_QUORUM))
// (2) uncomment next line to make the problem go away
// .withTimestampGenerator(ServerSideTimestampGenerator.INSTANCE)
.build();
}
}
Код: Выделить всё
Exception in thread "main" java.lang.RuntimeException: Should be MUHAHA but was XYZ
at org.example.Main.main(Main.java:37)
В то же время тот же код работает на MacOS без каких-либо ошибок.
Обходным решением является либо подождать перед выполнением обновления с помощью LWT (1), либо использовать временные метки на стороне сервера (2), что может создать другие проблемы в случае кластера с несколькими узлами. согласно обсуждению в https://issues.apache.org/jira/browse/CASSANDRA-6178
Я также пробовал разные версии cassandra (3.11 и 5.0.2) и драйвер Java 4.17.0 - проблема сохраняется во всех комбинациях.
Это не похоже на ожидаемое поведение из-за разных результатов в Windows и MacOS и больше похоже на проблему с драйвером, чем с сервером. сам по себе.
Есть ли способ заставить его работать без «сна», используя генератор меток времени по умолчанию (на стороне водителя) в Windows?
Подробнее здесь: https://stackoverflow.com/questions/792 ... lient-on-w