GWAN Key-Value持久性多商店

时间:2014-04-26 01:50:03

标签: c key-value g-wan key-value-store

我想在持久模式下记录键值,但是当我想使用2个或更多不同的商店时,它不起作用。

这是我的剧本:

    ...
    typedef struct{
       kv_t  *kv;
       char  *name;
    } kv_data;

    int main(int argc, char *argv[])
    {
       kv_data **data = (kv_data**)get_env(argv, US_SERVER_DATA);
       if(!data[0]){
          data[0] = (kv_data*)calloc(1, sizeof(kv_data));
          if(!data[0]){
             return 500;
          }
          kv_t users;
          kv_init(&users, "users", 10, 0, 0, 0);
          data[0]->kv = &users;

          kv_item item;
          item.key = "pierre";
          item.klen = sizeof("pierre") - 1;
          item.val = "pierre@example.com";
          item.flags = 0;
          kv_add(data[0]->kv, &item);

          data[0]->name = strdup("users");
       }
    ...

此错误在第15行使用kv_init()函数。

我的愿望是例如使用 data [0] - > kv 来阅读和记录“ 用户 ”商店中的值并使用数据[1] - > kv 来读取和记录 其他 商店中的值......

2 个答案:

答案 0 :(得分:1)

约翰,

你的问题来自于使用指针指针的难度。我们可以修复此代码,但由于其复杂性,它可能会在您的脚本中稍后破解。

从长远来看,应该使用更简单的解决方案来避免错误。

附加到US_SERVER_DATA的结构可以更简单:

typedef struct
{
   char *name;
   kv_t *kv_1;
   kv_t *kv_2;
   void *callback;
   u32   current_time;
}

这是要走的路:用calloc(sizeof(my_struct));分配内存,并将此结构附加到US_SERVER_DATA指针。

然后,假设您在G-WAN处理程序init()调用(或gwan/main.c维护脚本中,甚至在最近添加的gwan/init.c脚本中)执行所有操作,您将拥有独占访问权(一个线程正在进行初始化),您将能够根据需要攻击G-WAN KV存储(和其他对象)。

如果稍后,G-WAN servlet或处理程序正在修改这些结构指针,那么你将不得不使用锁,自旋锁等原子变量或指针本身。

希望这有帮助。

答案 1 :(得分:1)

我只是附加一个kv商店,其中包含我需要的所有kv存储到持久性指针。 G-WAN kv很快,加上记录数量很少,不应该伤害性能。

  xbuf_t *reply = get_reply(argv);
  kv_t **kv_db = (kv_t **)get_env(argv, US_VHOST_DATA);

  if (!kv_db[0])
  {
     kv_db[0] = (kv_t*) malloc(sizeof(kv_t));

     if (!kv_db[0])
     {
        puts("Could not allocate memory for the v-host kv store");
        return 500;
     }

     kv_init(kv_db[0], "kv_db", 10, 0, 0, 0);
  }

  kv_t *blog_db = (kv_t *) kv_get(kv_db[0], "blog_db", 7);

  if (blog_db)
  {
     xbuf_cat(reply, "Blog already installed. GTFO.");
     return 200;
  }

  blog_db = (kv_t *) malloc(sizeof(kv_t));
  kv_init(blog_db, "blog_db", 0, 0, 0, 0);

  if (!blog_db)
  {
     puts("Could not allocate memory for the blog kv store");
     return 500;
  }

  _KV_ADD(kv_db[0], item, blog_db->name, blog_db, 0);

(_ KV_ADD是自定义宏)