繁体   English   中英

Redis模块RESTORE命令调用

[英]Redis module RESTORE command call

我想将序列化的密钥从文件还原到模块中的redis内存。

这是代码:

int Unarchive_RedisCommand(RedisModuleCtx *ctx, RedisModuleString **argv, int argc) {

    if (argc != 2) {
        RedisModule_WrongArity(ctx);
    } else {

        RedisModuleString *keyName = argv[1];
        long long unarchiedKeys = 0;
        const char *filename = RedisModule_StringPtrLen(keyName, NULL);
        FILE *f = fopen(filename, "r");

        if (f != NULL && access(filename, F_OK) != -1) {

            struct stat info;

            if (stat(filename, &info) != 0) {

                RedisModule_ReplyWithError(ctx, "Error during file read");
            }

            size_t valueSize = info.st_size * sizeof(char);
            char *keyValue = RedisModule_Alloc(valueSize);
            fread(&keyValue, (size_t) info.st_size, 1, f);
            fclose(f);
            RedisModule_ReplyWithCallReply(ctx, RedisModule_Call(ctx, "RESTORE", "slbc", keyName, 0, keyValue, "REPLACE"));

            remove(filename);
            unarchiedKeys++;
        }

        RedisModule_ReplyWithLongLong(ctx, unarchiedKeys);
    }
    return REDISMODULE_OK;
}

当我运行此命令时,执行行RedisModule_ReplyWithCallReply(ctx, RedisModule_Call(ctx, "RESTORE", "slcc", keyName, 0, keyValue, "REPLACE"));会收到SIGSEGV (Segmentation fault) RedisModule_ReplyWithCallReply(ctx, RedisModule_Call(ctx, "RESTORE", "slcc", keyName, 0, keyValue, "REPLACE"));

谁能帮我解决这个问题?

提前致谢。

段错误通常是由取消引用空指针引起的,该空指针通常指向一个不属于进程地址空间的地址。 最好打个赌,这是您的问题。 通常,看起来您在使用变量之前已经完成了相当不错的验证变量,但有一些值得注意的例外:

  • 第一次使用ctx (除非argc计数错误,或者stat != 0)在对RedisModule_ReplyWithCallReply的调用中。 使用前应检查它是否不为null。
  • RedisModule_Call的返回值作为另一个函数的参数调用时,无法检查该返回值。 并且根据此API文档 ,此函数针对错误的回复类型返回NULL。

建议删除对RedisModule_Call的嵌入式调用,以便在将其作为参数传递给RedisModule_ReplyWithCallReply()之前,可以测试它的返回值。

RedisModuleCallReply *reply = RedisModule_Call(ctx, "RESTORE", "slbc", keyName, 0, keyValue, valueSize, "REPLACE");
if(!reply)
{
   // handle error;
}
else
{
    RedisModule_ReplyWithCallReply(ctx, reply);
}

编辑:
另一想,这行:

    fread(&keyValue, (size_t) info.st_size, 1, f);
          ^//not needed

应该:

    fread(keyValue, (size_t) info.st_size, 1, f);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM