Я читал об упрощенных транзакциях и о том, как записи работают в Кассандре, но я не уверен, как решить проблему. Я вижу, где иногда записи перезаписываются, но в большинстве случаев это не так..
Я храню пути к файлам в Кассандре, где ключом к пути является 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 и проверить существование, или возникнет та же проблема, если два потока пишут то, что они считают начальным путем в наборе одновременно?