2014-04-26 6 views
3

키 - 값을 지속적 모드로 기록하려고하지만 2 개 이상의 다른 점포를 사용하고자 할 때 작동하지 않습니다.GWAN 키 - 값 영구적 인 복수 저장소

... 
    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 = "[email protected]"; 
      item.flags = 0; 
      kv_add(data[0]->kv, &item); 

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

이 오류는 kv_init() 함수와 라인 15에 있습니다

여기 내 스크립트입니다. > KV 읽고 "사용자"저장소에 기록 값과 데이터 [1] 사용하기 - -> KV 읽고 및

내 소원은 [0] 데이터를 사용하는 예를 들어 것 다른 저장소에 기록 값 ...

+0

당신이 얻을 수있는 오류 명확히 수 (_KV_ADD 사용자 지정 매크로입니다)? – Nagi

답변

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); 

+0

도움을 주셔서 감사합니다. 솔루션이 작동합니다. 그러나 Gil이 제안한 솔루션보다 성능 최적화 측면에서 덜 최적화되었음을 암시합니까? (내가 작업을 할 수 없었던 방식으로) 동시에 처리 할 데이터가 매우 많기 때문에. 문안 인사. –

+0

내 솔루션에서 내 blog_db kv에 액세스하고 싶을 때마다 ('* blog_db = (kv_t *) kv_get (kv_db [0], "blog_db", 7);) Gil의 솔루션에서 그는 구조체의 필드 일 뿐이므로 직접 액세스 할 수 있습니다. 물론 내 솔루션은 덜 최적화되어 있습니다. – Nagi

+0

Btw, 내 솔루션에서 중요한 점은 kv 저장소의 수이기 때문에 데이터 집합의 크기 (각 kv 저장소의 크기)는이 경우에는 부적합합니다. 어쨌든, 당신이 너무 많은 kv 매장을 가지고 있다면, 당신은 당신의 디자인을 재고하고 싶어 할 것입니다.예를 들어 키 프리픽스를 대신 사용하여 kv 매장을 병합하는 방법을 생각해보십시오 (예 : 사용자 kv의 경우 'user_db :', 게시물의 경우 'blog_db :'접두사 등) – Nagi

1

존,

귀하의 문제는 포인터에 포인터를 재생하는 어려움에서 비롯됩니다. 이 코드는 수정할 수 있지만 스크립트가 복잡해지기 때문에 나중에 스크립트에서 중단됩니다.

장기적으로는 버그를 피하기 위해 더 간단한 해결책을 사용해야합니다. US_SERVER_DATA에 부착

구조는 간단하게 할 수 있습니다 calloc(sizeof(my_struct));으로 메모리를 할당하고 US_SERVER_DATA 포인터에이 구조를 첨부 :

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

이 길을 가야하는 것입니다. 당신이 G-WAN 처리기 init() 전화 (또는 gwan/main.c 유지 보수 스크립트, 또는 심지어 최근에 추가 된 gwan/init.c 스크립트), 당신은 독점적 인 액세스 할 수있는 모든이를 제공하는 다음

, (하나 개의 스레드가 초기화를하고있다) 필요에 따라 G-WAN KV 매장 (및 기타 객체)을 공격 할 수 있습니다.

나중에 G-WAN 서블릿이나 처리기가 이러한 구조 포인터를 수정하는 경우 포인터 자체에 잠금, 스핀 록 등 또는 원자 변수를 사용해야합니다.

희망이 도움이됩니다.