Closed ing-eoking closed 4 weeks ago
@ing-eoking μλ λ©λ΄μΌλ μ°Έκ³ νμ¬, μ€λͺ μ 보κ°νλ μμ λ λ€λ₯Έ PRλ‘ μ§ννλ©΄ μ’κ² μ΅λλ€. https://docs.oracle.com/cd/E88353_01/html/E37842/memcached-get-3libmemcached.html
@jhpark816
νμ¬ PRμ κΈ°μ‘΄ λ¬Έμμ μ μ¬ν ꡬ쑰λ₯Ό κ°λλ‘ μμ±λμλλ°μ. (assert
λ±)
λ§μ½ μ΄λ¬ν κ΅¬μ‘°κ° μ μ νμ§ μλ€λ©΄ μ΄ PRμ λ΄μ©λ§ μμ νλ κ²μΌλ‘λ μΆ©λΆνμ§ μμ΅λλ€.
μμ λ λ΄μ©μ λ§κ² κΈ°μ‘΄ λͺ¨λ λ¬Έμλ₯Ό λ€μ μ 리ν΄μΌ νλλ°, μ΄ PRμμ λ¬Έμ ꡬ쑰λ₯Ό κ²°μ ν기보λ€λ
λ³λμ μ΄μλ₯Ό λ§λ€μ΄ μκ²¬μ΄ μΆ©λΆν μ 리λ λ€μ μΌκ΄ μ μ©νλ κ²μ΄ μ’κ² μ΅λλ€.
κ°μΈμ μΌλ‘λ, μ€ν¨ μ μ²λ¦¬ λ°©λ² λ±μ νΉμ APIμ κ΅νλλ κ²μ΄ μλλ―λ‘ ν¨μλ§λ€ μμΈ μ²λ¦¬νλ μμλ₯Ό 맀 λ² μμ±ν΄ λλ κ²μ λΉν¨μ¨μ΄λΌκ³ λ΄ λλ€. ν κ°μ§ μμ μ¬νμ΄ μκΈΈ λλ§λ€ λͺ¨λ API λ¬Έμλ₯Ό ν¨κ» λ³κ²½ν΄μΌ ν κ²μ΄κ³ , μκ°μ΄ νλ₯΄λ©΄ λ¬Έμ κ° μΌκ΄μ±μ΄ κΉ¨μ Έ μ΄λ₯Ό λ§μΆλ μμ μ λ€μ μ§ννκ² λ κ²μ λλ€.
μΊμ μλ²μ λ¬Έμμ²λΌ κ° ν¨μμ κ²°κ³Όλ‘ λ°νλ μ μλ rc λͺ©λ‘κ³Ό κ·Έ μλ―Έ μ λλ§ λμ΄ν΄ λκ³ , μμΈ μ²λ¦¬ λ° λ‘κΉ λ±μ ARCUS C Clientμ κ°μ κ³΅ν΅ λ¬Έμμ μμ±ν΄ λλ©΄ μΆ©λΆν κ²μ λλ€.
μλ λ©λ΄μΌλ μ°Έκ³ νμ¬, μ€λͺ μ 보κ°νλ μμ λ λ€λ₯Έ PRλ‘ μ§ννλ©΄ μ’κ² μ΅λλ€. https://docs.oracle.com/cd/E88353_01/html/E37842/memcached-get-3libmemcached.html
μ λ§ν¬μ λ΄μ© μ체λ arcus-c-clientμλ μλ λ΄μ©μ λλ€. λ§μ½ λ§ν¬μ κ°μ ννμ λ©λ΄μΌμ΄ νμνλ€λ©΄, μ΄λ―Έ μλ λ΄μ©μ μ€λ³΅μΌλ‘ μμ±ν κ²μ΄ μλλΌ man2htmlκ³Ό κ°μ λꡬλ₯Ό μ¬μ©νλ κ²μΌλ‘ μΆ©λΆν κ²μ λλ€.
@ing-eoking λ³Έ μμ λ μ§νν΄ μ£ΌμΈμ.
μμ μ½λλ₯Ό ν΅ν΄ 보μ΄κ³ μ νλ μ¬νμ
μ μ¬νμ 보μ΄λ μμ μ½λλ₯Ό νλ μ€λΉνμ¬ λ¦¬λ·° λ° λ Όμλ₯Ό κ±°μ³ μμ μ½λ ννλ₯Ό κ²°μ νκ³ , κ·Έ ννλ‘ μΌκ΄ μ μ©νμμ£ .
@jhpark816
νμ¬ ν΄λΉ PRμ λνμ¬ μ κ° μκ°νκ³ μλ μμλ μλμ κ°μ΅λλ€.
int arcus_kv_store(memcached_st *memc)
{
const char *key= "item:a_key";
const char *value= "value";
uint32_t exptime= 600;
uint32_t flags= 0;
memcached_return_t rc;
rc= memcached_set(memc, key, strlen(key), value, strlen(value), exptime, flags);
if (memcached_failed(rc)) {
fprintf(stderr, "Failed to memcached_set: %d(%s)\n", rc, memcached_strerror(mc, rc));
return -1;
}
assert(rc == MEMCACHED_SUCCESS);
return 0;
}
λ¦¬ν΄ κ°μ μ¬μ©λ² (μ±κ³΅, μ€ν¨)
μ±κ³΅κ³Ό μ€ν¨μ νλ¨ κΈ°μ€μ ν¨μμ λ¦¬ν΄ κ°λ³΄λ€λ APIμμ μ 곡νλ μλ¬κ°μ λλ κ²μ΄ λ μ μ νλ€κ³ μκ°ν©λλ€.
μλ₯Ό λ€μ΄, memcached_get λͺ λ Ήμ΄λ₯Ό μννμ λ λ°νλ μλ¬κ°μ΄ MEMCACHED_SUCCESSμΈ κ²½μ°, valueκ° NULLμ΄κ³ value_lengthκ° 0μ΄λΌλ©΄, μ΄λ μ±κ³΅μ μΈ μνμ΄μ§λ§ λ°μ΄ν°κ° μμμ μλ―Έν©λλ€.
μ΄μ λν μμ λ λ€λ₯Έ μ±κ³΅κ³Ό λμΌνκ² μ²λ¦¬νλ©΄ λμ§ μμκΉ μκ°ν©λλ€.
fprintf(stdout, "[DEBUG] memcached_get: %.*s=%.*s\n", key_len, key, value_len, value);
@jhpark816 @namsic
λ³κ²½λ μ½λ 보μκ³ , 리뷰 μ§νν΄μ£Όμλ©΄ λ κ² κ°μ΅λλ€.
@namsic
μμ μ½λ μΆκ° μΈ λ€λ₯Έ μ€λͺ μ νμ¬ μνλ‘ μΆ©λΆνλ€κ³ 보λ κ²μΈκ°μ?
κ°μΈμ μΌλ‘ μμ λͺ©μ νλ λ λλ νΈμ΄ λ κΉλν΄λ³΄μ¬ λ³κ²½ν΄λ³΄μμ΅λλ€. 리뷰 μ§νν΄μ£Όμλ©΄ λ κ² κ°μ΅λλ€.
μλλ μμμ λλ€.
key-value itemμ μ μ₯νλ APIλ‘ set, add, replace, prepend/appendκ° μλ€
μλ‘μ΄ μμ΄ν μ μ μ₯νκ±°λ κ΅μ²΄νλ APIλ λ€μκ³Ό κ°λ€.
memcached_return_t memcached_set(...)
memcached_return_t memcached_add(...)
memcached_return_t memcached_replace(...)
λνμ μΌλ‘ setμ νμ©νλ μμ λ λ€μκ³Ό κ°λ€.
int arcus_kv_store(memcached_st *memc)
{
...
}
...
...
@namsic 리뷰 μλ£ν μνκ° μλμ£ ?
리뷰 μλ£ν μνκ° μλμ£ ?
μ. μμ§ νμΈ μ€ μ λλ€.
@jhpark816
(μ΄ λ¬Έμ λ getμμλ λμΌνκ² λ°μν©λλ€.)
memcached_fetch ν¨μλ₯Ό μ΄ν΄λ³΄λ©΄, μλμ κ°μ΄ result ꡬ쑰체 λ΄μμ κ°μ κ°μ Έμ λ¬Έμμ΄ ννλ‘ λ°νν©λλ€.
char *memcached_fetch(...)
{
...
return memcached_string_take_value(&result_buffer->value);
}
memcached_string_take_value ν¨μ λ΄λΆλ λ€μκ³Ό κ°μ΄ ꡬνλμ΄ μμ΅λλ€.
char *memcached_string_take_value(memcached_string_st *self)
{
assert_msg(self, "Invalid memcached_string_st");
// If we fail at adding the null, we copy and move on
if (memcached_success(memcached_string_append_null(self)))
{
return memcached_string_c_copy(self);
}
char *value= self->string;
_init_string(self);
return value;
}
μ΄ ν¨μλ λ¬Έμμ΄ λμ null λ¬Έμλ₯Ό μ±κ³΅μ μΌλ‘ μΆκ°ν κ²½μ°(μ€ν¨ μΌμ΄μ€λ λͺ¨λ₯΄κ² μ΅λλ€), memcached_string_c_copyλ₯Ό νΈμΆνμ¬ λ³΅μ¬ν κ°μ λ°νν©λλ€.
memcached_string_c_copy ν¨μλ λ€μκ³Ό κ°μ΄ ꡬνλμ΄ μμ΅λλ€.
char *memcached_string_c_copy(memcached_string_st *string)
{
if (not memcached_string_length(string))
return NULL;
char *c_ptr= static_cast<char *>(libmemcached_malloc(string->root, (memcached_string_length(string)+1) * sizeof(char)));
if (not c_ptr)
return NULL;
memcpy(c_ptr, memcached_string_value(string), memcached_string_length(string));
c_ptr[memcached_string_length(string)]= 0;
return c_ptr;
}
첫 λ²μ§Έ 쑰건문μμ memcached_string_lengthκ° 0μΌ κ²½μ° NULLμ΄ λ°νλλλ‘ λμ΄ μμ΅λλ€.
μ΅μ libmemcachedλ λμΌνκ² μ²λ¦¬νκ³ μλμ?
@jhpark816
μ΅μ libmemcachedλ λμΌνκ² μ²λ¦¬νκ³ μλμ?
λ‘μ§μ μ‘°κΈ λ³κ²½λμμ§λ§ κΈΈμ΄κ° 0μ΄λ©΄, NULLμ λ°ννλ λμ μ체λ λμΌν©λλ€.
char *memcached_string_take_value(memcached_string_st *self) {
char *value = NULL;
assert_msg(self, "Invalid memcached_string_st");
if (self) {
if (memcached_string_length(self)) {
// If we fail at adding the null, we copy and move on
if (memcached_failed(memcached_string_append_null(self))) {
return NULL;
}
value = self->string;
_init_string(self);
}
}
return value;
}
fetchκ° μ€ν¨ν κ²½μ° λ°νλλ μλ¬λ λ€μκ³Ό κ°μ΅λλ€. (μμ§ νμ€νμ§λ μμ§λ§, λλΆλΆμ μν©μμ μλμ μλ¬λ§ λ°νλλ κ²μΌλ‘ 보μ λλ€.)
MEMCACHED_NOTFOUND : λͺ¨λ μλ²μμ μ½μ μ μλ κ²°κ³Όκ° μλ κ²½μ°μ λ°νλ©λλ€. MEMCACHED_CONNECTION_FAILURE : νΉμ μλ²μμ μ°κ²°μ λ¬Έμ κ° μλ κ²½μ°(μ: μλͺ»λ μμΌ νμΌ) λ°νλ©λλ€.
νΉν MEMCACHED_CONNECTION_FAILUREκ° λ°μνλλΌλ, λ€λ₯Έ μλ²μμ μ½μ μ μλ κ²°κ³Όκ° μλ κ²½μ°μλ MEMCACHED_SUCCESSλ‘ μ²λ¦¬λ©λλ€.
mget μ€ν¨νλ κ²½μ°κ° failure, some_errros 2κ°μ§ μλκ°μ? λ€λ₯Έ κ²½μ°μ μ€λ₯λ₯Ό μ€λͺ νλ κ°μ?
κ·Έλμ, get, mget μμ μ½λλ μ΄λ»κ² νλ©΄ λλμ?
@jhpark816
mget μ€ν¨νλ κ²½μ°κ° failure, some_errros 2κ°μ§ μλκ°μ? λ€λ₯Έ κ²½μ°μ μ€λ₯λ₯Ό μ€λͺ νλ κ°μ?
μ κ° μλͺ» μμ±νλ€μ. fetchμ λν μ€λͺ μ΄μμ΅λλ€. κ²°λ‘ μ μΌλ‘, fetch μν κ³Όμ μμ μ€ν¨ν κ²½μ°μλ λλ¨Έμ§ μ°μ°μ κ³μ μ§ννμ§ μκ³ λ°λ‘ 리ν΄νλ κ²μ΄ λ λμ κ² κ°μ΅λλ€.
@jhpark816
μλ¬ μ²λ¦¬λ₯Ό
value == NULL
νΉμmemcached_failed(rc)
μ€ μ΄λ€ λ°©μμ νμ©νλκ°?
λΉ λ¬Έμμ΄μ μ μ₯νλ κ²½μ° valueκ° NULLμΈ κ²½μ°κ° λ°μνλ―λ‘ memcached_failed(rc)
κ° μ ν©ν©λλ€.
memcached_fetch
μ€ μλ¬κ° λ°μνλ κ²½μ° μ€μ§νμ§ λ§κ³ , κ³μ μ§ννλ κ²μ΄ λ§λμ§?
μΌλ°μ μΌλ‘ memcached_fetch μμ memcached_failed
λ₯Ό ν΅ν΄ μλ¬λ‘ κ°μ§λλ μλ¬λ MEMCACHED_NOTFOUND
μ MEMCACHED_CONNECTION_FAILURE
μ
λλ€.
λ μλ¬ λͺ¨λ λ μ΄μ μ±κ³΅μ μΌλ‘ κ°μ μ½μ μ μλ κ²½μ°μ λ°νλλ κ²μΌλ‘ 보μ΄κΈ°μ λ°λ‘ 리ν΄νλ νΈμ΄ μ’μ κ² κ°μ΅λλ€.
κ·Έλμ, get, mget μμ μ½λλ μ΄λ»κ² νλ©΄ λλμ?
νμ¬ PRμ λ°μλ μνλ‘ κ°λ νΈμ΄ μ’λ€κ³ μκ°ν©λλ€.
int arcus_kv_get(memcached_st *memc)
{
const char *key= "item:a_key";
const char *value;
size_t value_length;
uint32_t flags;
memcached_return_t rc;
value= memcached_get(memc, key, strlen(key), &value_length, &flags, &rc);
if (memcached_failed(rc)) {
fprintf(stderr, "Failed to memcached_get: %d(%s)\n", rc, memcached_strerror(mc, rc));
return -1;
}
assert(rc == MEMCACHED_SUCCESS);
if (value != NULL) {
fprintf(stdout, "memcached_get: %s=%s\n", key, value);
free((void*)value);
} else {
fprintf(stdout, "memcached_get: %s=<empty value>.\n", key);
}
return 0;
}
int arcus_kv_mget(memcached_st *memc)
{
const char * const keys[]= { "item:a_key1", "item:a_key2", "item:a_key3" };
size_t keys_len[3];
size_t number_of_keys = 3;
uint32_t flags;
memcached_return_t rc;
for (size_t i=0; i<number_of_keys; i++)
{
keys_len[i]= strlen(keys[i]);
}
rc= memcached_mget(memc, keys, keys_len, number_of_keys);
if (rc == MEMCACHED_FAILURE) {
fprintf(stderr, "Failed to memcached_get: %d(%s)\n", rc, memcached_strerror(mc, rc));
return -1;
}
assert(rc == MEMCACHED_SUCCESS || rc == MEMCACHED_SOME_ERRORS);
while (true)
{
char key[MEMCACHED_MAX_KEY];
size_t key_length;
size_t value_length;
char *value= memcached_fetch(mc, key, &key_length, &value_length, &flags, &rc);
if (memcached_failed(rc)) {
fprintf(stderr, "Failed to memcached_fetch: %d(%s)\n", rc, memcached_strerror(mc, rc));
return -1;
}
if (rc == MEMCACHED_END) {
break;
}
assert(rc == MEMCACHED_SUCCESS);
if (value != NULL) {
fprintf(stdout, "memcached_mget: %s=%s\n", key, value);
free((void*)value);
} else {
fprintf(stdout, "memcached_mget: %s=<empty value>.\n", key);
}
}
return 0;
}
@jhpark816 @namsic
리뷰 λΆνλ립λλ€.
@jhpark816
μΌκ΄ μμ λμμ΅λλ€.
@ing-eoking cas μ°μ°μ λ³λ PRλ‘ μΆκ°ν΄ μ£Όμμ£ .
π Related Issue
β¨οΈ What I did