Создание пространства ключей Cassandra происходит в бесконечном цикле с драйвером Cassandra 2.2.0-rc3

Я установил кластер кассандры с 3 узлами на одной машине (Ubantu), и я делаю следующее -

  1. Все три узла работают, и приложение может создавать пространство ключей.
  2. Завершите работу одного из трех работающих узлов, и приложение все еще сможет создать пространство ключей.
  3. Выключите еще один узел из двух запущенных узлов и немедленно запустите его, и теперь приложение не может создать пространство ключей, оно продолжает сообщать (как бесконечный цикл) о -

    2017-09-25 14:42:40 ИНФОРМАЦИЯ RequestHandler:561 - Запрос СОЗДАТЬ KEYSPACE, ЕСЛИ НЕ СУЩЕСТВУЕТ MYKEYSPACE С replication = {'class':'NetworkTopologyStrategy', 'datacenter1':'2'}; не подготовлен на /127.0.0.1:9042, подготовка перед повторной попыткой выполнения. Увидеть это сообщение несколько раз - это хорошо, но его частое обращение может быть источником проблем с производительностью.

Журнал моего приложения залит этими сообщениями, и это привело к ошибке java heap out.

Примечание. Коэффициент репликации равен 2, а версия cassandra с использованием 2.2.6 с драйвером cassandra - 2.2.0-rc3. Когда я возвращаюсь обратно к драйверу Кассандры 2.1.3, все работает нормально, так что просто интересно, есть ли какие-то проблемы на уровне драйвера

Более того, чтобы добавить это, я отлаживал код даже на уровне драйвера cassandra и обнаружил, что это из-за нижеприведенного метода класса com.datastax.driver.core.Connection -

  private void flush(FlushItem item) {
    EventLoop loop = item.channel.eventLoop();
    Flusher flusher = flusherLookup.get(loop);
    if (flusher == null) {
        Flusher alt = flusherLookup.putIfAbsent(loop, flusher = new Flusher(loop));
        if (alt != null)
            flusher = alt;
    }

    flusher.queued.add(item);
    flusher.start();
}

Таким образом, после перевода узла в оперативный режим (2 узла теперь работают из 3), RequestHandler продолжает сообщать о не подготовленном запросе, следовательно, готовится до повторной попытки, когда этот вызов сделан -

public ResponseHandler write(ResponseCallback callback, boolean startTimeout)
{
 ....
 ....
 ....
flush(new FlushItem(channel, request, writeHandler(request, handler)));
 ....
 ....
}

1 ответ

После обновления версии драйвера cassandra до версии 3.3.0 проблема не возникла. Я полагаю, что есть некоторые ошибки в 2.2.0-RC3, который является версией-кандидатом.

Другие вопросы по тегам