naver / arcus-c-client

ARCUS C client
https://github.com/naver/arcus
Apache License 2.0
12 stars 16 forks source link

sop exist 연산에서 NOT_EXIST 시에 응답 검토 #181

Open SuhwanJang opened 2 years ago

SuhwanJang commented 2 years ago

sop exist 연산에서 NOT_EXIST 시에 응답이 실제 코드와 가이드 문서에 차이가 있다.

코드 : NOT_EXIST 시 NOT_EXIST 리턴

 static memcached_return_t do_coll_exist(memcached_st *ptr,
                                         const char *key, size_t key_length,
                                         const char *value, size_t value_length,
                                         memcached_coll_action_t verb)
 {
   rc= memcached_vdo(instance, vector, 5, to_write);

   if (rc == MEMCACHED_SUCCESS)
   {
     if (to_write == false)
     {
       rc= MEMCACHED_BUFFERED;
     }
     else if (ptr->flags.no_reply)
     {
       rc= MEMCACHED_SUCCESS;
     }
     else
     {
       char result[MEMCACHED_DEFAULT_COMMAND_SIZE];
       rc= memcached_coll_response(instance, result, MEMCACHED_DEFAULT_COMMAND_SIZE, NULL);

       if (rc == MEMCACHED_EXIST)
       {
         rc= MEMCACHED_SUCCESS;
       }
     }
   }

   if (rc == MEMCACHED_WRITE_FAILURE)
   {
     memcached_io_reset(instance);
   }

   return rc;
 }

가이드문서 : NOT_EXIST 인 경우에 SUCCESS 응답을 기대 https://github.com/naver/arcus-c-client/blob/master/docs/05-set-API.md

void arcus_set_element_exist(memcached_st *memc)
{
    uint32_t flags= 10;
    uint32_t exptime= 600;
    uint32_t maxcount= 1000;

    memcached_coll_create_attrs_st attributes;
    memcached_coll_create_attrs_init(&attributes, flags, exptime, maxcount);

    memcached_return_t rc;

    // 테스트 데이터를 입력한다.
    rc= memcached_sop_insert(memc, "set:a_set", strlen("set:a_set"),
                             "value", strlen("value"), &attributes);
    assert(MEMCACHED_SUCCESS == rc);
    assert(MEMCACHED_CREATED_STORED == memcached_get_last_response_code(memc));

    // 요청한 데이터가 존재하는 않는 경우
    rc= memcached_sop_exist(memc, "set:a_set", strlen("set:a_set"),
                            "no value", strlen("no value"));
    assert(MEMCACHED_SUCCESS == rc);
    assert(MEMCACHED_NOT_EXIST == memcached_get_last_response_code(memc));

    // 요청한 데이터가 존재하는 경우
    rc= memcached_sop_exist(memc, "set:a_set", strlen("set:a_set"),
                            "value", strlen("value"));
    assert(MEMCACHED_SUCCESS == rc);
    assert(MEMCACHED_EXIST == memcached_get_last_response_code(memc));
}
jhpark816 commented 2 years ago

@SuhwanJang

ing-eoking commented 6 months ago

@jhpark816

가이드문서 : NOT_EXIST 인 경우에 SUCCESS 응답을 기대

자연스러운 코드 형식으로는 문서를 따라 고치는게 맞다고 생각됩니다. 하지만 만약 완전히 Backward compatibility를 고려해야 한다면, 오히려 문서를 수정하는 게 맞지 않나 생각됩니다.

backward compatibility 문제는 응용이 last_response_code 를 통해 NOT_EXIST 처리를 해두었다면 현재 코드를 수정해도 문제되지 않습니다. last_response_code 가 아닌 rc 로 NOT_EXIST 처리를 한다면 현재와 같이 NOT_EXIST 응답을 주어야 되므로 가이드 문서를 수정해야 합니다.

사용자가 문서가 안내하고 있는 상황을 그대로 따를시 assert가 되게 유도됩니다. 만약 아직 C Client를 사용하고 있고, Sop exist를 사용 중인 사용자라면 문서를 따르지 않고, 아래의 형태를 따르고 있지 않을까 생각됩니다.

// 요청한 데이터가 존재하는 않는 경우
    rc= memcached_sop_exist(memc, "set:a_set", strlen("set:a_set"),
                            "no value", strlen("no value"));
    assert(MEMCACHED_NOT_EXIST == rc);
    assert(MEMCACHED_NOT_EXIST == memcached_get_last_response_code(memc));

Backward compatibility 조사를 도와주는 도구가 있으면 좋을 것 같습니다.

  • ZK ensemble 목록을 주면 c client 사용하는 클러스터 목록 확인하는 도구
  • 클러스터 목록과 특정 연산을 주면, 그 연산을 요청하는 클러스터 확인하는 도구

이거는 원격에서 zk ensemble에서 client list를 조회하여, 해당 클라이언트가 c client를 사용하는지 확인하는 도구인가요? 지금으로서는 가능해보이는 방안은 떠오르진 않습니다.