Кластер Cassandra с одним узлом игнорирует обновление LWT при использовании однопоточного Java-клиента в WindowsJAVA

Программисты JAVA общаются здесь
Ответить Пред. темаСлед. тема
Anonymous
 Кластер Cassandra с одним узлом игнорирует обновление LWT при использовании однопоточного Java-клиента в Windows

Сообщение Anonymous »

У меня следующая настройка:
  • 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();
}

}
Когда я запускаю этот код в Windows 10, он завершается с ошибкой:

Код: Выделить всё

Exception in thread "main" java.lang.RuntimeException: Should be MUHAHA but was XYZ
at org.example.Main.main(Main.java:37)
Это означает, что обновление LWT не применилось, несмотря на то, что оно было выполнено позже, и метод wasApplied вернул true.
В то же время тот же код работает на MacOS без каких-либо ошибок.
Обходным решением является либо подождать перед выполнением обновления с помощью LWT (1), либо использовать временные метки на стороне сервера (2), что может создать другие проблемы в случае кластера с несколькими узлами. согласно обсуждению в https://issues.apache.org/jira/browse/CASSANDRA-6178
Я также пробовал разные версии cassandra (3.11 и 5.0.2) и драйвер Java 4.17. .0 — проблема сохраняется во всех комбинациях.
Это не похоже на ожидаемое поведение из-за разных результатов в Windows и MacOS и больше похоже на проблему с драйвером, чем на сам сервер.< /p>
Есть ли способ заставить его работать без «сна», используя генератор меток времени по умолчанию (на стороне водителя) в Windows?

Подробнее здесь: https://stackoverflow.com/questions/792 ... ead-java-c
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «JAVA»