Запрос CQL SELECT зависает при подключении к промежуточным серверам Cassandra?

0

У меня есть поле DEV, из которого я пытаюсь подключиться к моим серверам STAGING Cassandra на порту 9042, поскольку я использую новый бинарный протокол. Я запускаю свой C++ код из окна DEV, используя libcql library для Cassandra..

Но каким-то образом, я думаю, я могу установить соединение с моими промежуточными серверами Cassandra на порту 9042, поскольку Connected Successfully будет распечатано.

Ниже приведен код, который у меня есть в моих заголовочных файлах -

static cql_client_t* client;
shared_future<cql_future_connection_t> connect_future;

const string server = "sc-host01.vip.slc.qa.host.com"; //"localhost";


//Open the connection
void connection_open() {
    connect_future = client->connect(server, 9042);

    cout<<"Connected Successfully"<< endl;
    connect_future.wait();
}

//Execute a Query
cql_result_t& execute_query(string query) {
    bool error = false;
    cql_result_t* result=NULL;
    try{
        if (!connect_future.get().error.is_err()) {
            cout << "query " << query << endl;
            shared_future<cql_future_result_t> future = client->query(query,CQL_CONSISTENCY_ONE);
            future.wait();
            error = future.get().error.is_err();
            result = &*future.get().result;
        } else{
            cout << "Query status... " << (!error ? "true" : "false") << std::endl;
        }
    }catch (int e){
        cout << "An exception occurred when executing query. " << e << endl;
    }
    return *result;
}

#endif

И ниже приведен код, который у меня есть в .cc file который попытается выполнить соединение, используя вышеприведенный класс. И затем выполните запрос.

/**
 * This method will retrieve the data from Cassandra..
 * And then call print_rows method to print it out on the console
 */
void get_attributes(string id){
    try{

        // some code

        cout << "id " << id << endl;

        //Connection open
        connection_open();

        execute_query("USE profileks;");

        //this will give me the result back of the select query
        cql_result_t& result = execute_query("select * from profile_user where key ='"+id+"';");

        // and this is printing it out on the console
        print_rows(result);

        // some code
    } catch (int e){
        // some code here
    }
}

Теперь проблема, с которой я столкнулась, это не возвращает мне никакого результата назад. Он как-то повесился на выбранном запросе -

Это то, что я вижу на моей консоли -

id 1
Connected Successfully
query USE profileks;
query select record_name, record_value from user_data where user_id ='1';

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

Я также проверил, что порты (9042) открыты нормально.. Тогда почему запрос подвешивается?

Я предполагаю, могут быть некоторые изменения, которые мне нужно сделать в методе execute_query чтобы заставить его работать?

Версия Cassandra, которую я запускаю на промежуточных серверах, составляет 1.2.9, а локально - 1.2.8

Обновить:-

Я провел некоторое исследование, и эта строка не возвращает мне ничего, что означает, что future.get не работает нормально каким-то образом..

result = &*future.get().result;

после того, как он попытается выполнить мой запрос CQL Select. USE profileks работает отлично, но только запрос CQL Select подвешивается.

Теги:
cassandra
cql
libcql

2 ответа

0
Лучший ответ

Вы пытались запустить тот же запрос из CQLsh? Я думаю, что ваш запрос - это время, возможно, из-за большого количества возвращенных строк, возможно, если вы добавите ограничение X, это поможет. Если вы хотите получить все данные с помощью "SELECT * FROM mycolumnfamily", вы можете просмотреть свою архитектуру данных. Взгляните на документацию SELECT http://cassandra.apache.org/doc/cql/CQL.html#SELECT Также из документации. При использовании диапазона иногда полезно ограничить количество столбцов, которые могут быть возвращены как часть каждой строки (поскольку Cassandra является схематичной, необязательно заранее определить, сколько столбцов будет в наборе результатов). Для этого используйте предложение FIRST с целым числом, чтобы указать верхний предел количества столбцов, возвращаемых в строке. Предел по умолчанию - 10 000 столбцов. '

  • 0
    Да, из cqlsh, он работает нормально ... Как я уже упоминал в своем вопросе, он отлично работает для кластера localhost cassandra ... И, кстати, у меня есть только две строки в этой таблице, поэтому нет смысла не возвращайся ...
0

Я столкнулся с чем-то смутно похожим. Результат future.get() всегда имел нулевые указатели для одного и того же кода, который работал в другом месте. Я проследил его до опции командной строки g++:

скомпилировать с "g++ -std = gnu ++ 0x...", и он не скомпилируется с "g++...", и он работает

Ещё вопросы

Сообщество Overcoder
Наверх
Меню