Одновременная запись и предотвращение перезаписи - PullRequest
0 голосов
/ 03 октября 2018

Я читал об упрощенных транзакциях и о том, как записи работают в Кассандре, но я не уверен, как решить проблему. Я вижу, где иногда записи перезаписываются, но в большинстве случаев это не так..

Я храню пути к файлам в Кассандре, где ключом к пути является sha1 самого файла и sha1 большего окружающего «файла изображения», в котором он содержится, есть дубликаты реальных файлов, которыесуществует по разным путям:

Определение таблицы

CREATE TABLE IF NOT EXISTS path_data (
   image_sha1 blob, 
   file_sha1 blob, 
   path text, 
   PRIMARY KEY((image_sha1, file_sha1), path));

Код:

CassError insert_path_data(const char * image_sha1, const char * file_sha1, char * path)
    { 
      CassError rc = CASS_OK;
      CassStatement * statement = NULL;
      CassFuture * future = NULL;
      statement = cass_prepared_bind(insert_path_data_prepared);

      cass_statement_bind_bytes_by_name(statement, "image_sha1", (const cass_byte_t*) image_sha1, 20);
      cass_statement_bind_bytes_by_name(statement, "file_sha1", (const cass_byte_t*) file_sha1, 20);
      cass_statement_bind_string_by_name(statement, "path", path);

      future = cass_session_execute(session, statement);
      cass_future_wait(future);
      if (rc != CASS_OK)
        print_error(future);

      cass_future_free(future);

      return rc;
    }

Код подготовки имеет: INSERT INTO path_data (image_sha1, file_sha1, path) VALUES (?,?,?);

Запись выполняетсяотправлено из нескольких потоков, и я вижу, что большинство путей накапливаются и объединяются в кластеры для одного и того же файла, что я и хочу:

abc..  ef1..  /usr/local/file1
abc..  ef1..  /usr/local/otherpath/file1
abc..  ef1..  /var/a/third/path/fileone_again

В данном случае это один и тот же файл, возможно, с именем diff ив трех местах на окружающем изображении.Это желаемое поведение, но я также нахожу случаи, когда отсутствуют пути, поэтому я подозреваю, что две (начальные) вставки для нового файла находятся в конфликте.Мой вопрос заключается в том, каков наилучший подход, чтобы гарантировать захват всех путей, и в то же время разрешать поиск в будущем, причем ключом являются только два ша1.Я не вижу, как сначала поможет проверка существования, потому что я не знаю, какое поведение я мог бы изменить в зависимости от наличия или отсутствия исходной записи.Я не хочу ничего обновлять, я просто хочу, чтобы кластеризация обрабатывала пути к одному и тому же файлу на одном и том же изображении вместе.Должен ли я сначала использовать a и проверить существование, или возникнет та же проблема, если два потока пишут то, что они считают начальным путем в наборе одновременно?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...