Невозможно установить ключ, так как 'redisClusterCommand ()' возвращает нулевой указатель - PullRequest
0 голосов
/ 19 марта 2019

Я пытаюсь запустить простую программу, которая вставит значение ключа в мой кластер redis из 6 экземпляров (3 master, 3 replica).Я использую hiredis-vip .

Вот программа:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <hircluster.h>

int main(int argc, char **argv) 
{
struct timeval timeout = { 1, 500000 }; // 1.5 seconds
redisClusterContext *cc = redisClusterContextInit();
redisClusterSetOptionAddNodes(cc, "172.16.129.68:6379");
redisClusterSetOptionConnectTimeout(cc, timeout);
redisClusterConnect2(cc);
if (cc != NULL && cc->err) {
    printf("Error: %s\n", cc->errstr);
    // handle error
exit(-1);
}
redisReply *reply;
    reply = (redisReply*)(redisClusterCommand(cc,"SET %s %s", "foo", "hello vishal"));
    printf("SET: %s\n", reply->str);
    freeReplyObject(reply);
    redisClusterFree(cc);
    return 0;
}

При запуске программы возникает ошибка сегментации:

Program received signal SIGSEGV, Segmentation fault.
0x00000000004009ed in main (argc=1, argv=0x7fffffffe508) at cluster-example.c:30
30          printf("SET: %s\n", reply->str);
Missing separate debuginfos, use: debuginfo-install glibc-2.12-1.209.el6_9.2.x86_64 libgcc-4.4.7-18.el6_9.2.x86_64 libstdc++-4.4.7-18.el6_9.2.x86_64
(gdb) bt f
#0  0x00000000004009ed in main (argc=1, argv=0x7fffffffe508) at cluster-example.c:30
        timeout = {tv_sec = 1, tv_usec = 500000}
        cc = 0x7ffff7fdb010
        reply = 0x0

redisReply * имеет значение NULL, которое приводит кв ошибке сегментации, когда я использую этот указатель в printf().

Что не так в программе?

Изменить 1

Я обновилчасть моей программы после предложения @Stamatis Liatsos:

    reply = (redisReply*)(redisClusterCommand(cc,"SET %s %s", "foo", "hello vishal"));
if(cc->err)
    printf("\n[%s::%d]Error: %s\n", __FILE__,__LINE__,cc->errstr);
else
    printf("SET: %s\n", reply->str);

Вот вывод, который я получаю:

[cluster-example.c::31]Error: ctx get by node is null

1 Ответ

0 голосов
/ 19 марта 2019

Я нашел решение этой проблемы более чем здесь .

Мы должны настроить контекст для использования слотов перед подключением.

struct timeval timeout = { 1, 500000 }; // 1.5 seconds
redisClusterContext *cc = redisClusterContextInit();
redisClusterSetOptionAddNodes(cc, "172.16.129.68:6379");
redisClusterSetOptionConnectTimeout(cc, timeout);
redisClusterSetOptionRouteUseSlots(cc);  //The function that has to be called.
redisClusterConnect2(cc);
if (cc != NULL && cc->err) {
    printf("Error: %s\n", cc->errstr);
    // handle error
exit(-1);
}
...