-
Notifications
You must be signed in to change notification settings - Fork 16
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
memcached_vdo() 함수의 오류 처리 일관성 보장. #167
Comments
arcus-c-client/libmemcached/do.cc Lines 80 to 85 in 71bcafd
arcus-c-client/libmemcached/do.cc Lines 105 to 116 in 71bcafd
위 쪽 코드와 아래 쪽 코드의 오류 처리에 일관성이 떨어지는 것 같습니다. 아래 쪽 코드를 다음과 같이 수정하면 좋을 것 같습니다. memcached_return_t rc= MEMCACHED_SUCCESS;
...
if (sent_length == -1 or size_t(sent_length) != command_length)
{
rc= MEMCACHED_WRITE_FAILURE;
WATCHPOINT_ERROR(rc);
WATCHPOINT_ERRNO(errno);
return rc;
}
if ((ptr->root->flags.no_reply) == 0 and (ptr->root->flags.piped == false))
{
memcached_server_response_increment(ptr);
}
return rc; |
|
@uhm0311 |
|
의사 코드로 나타낸 모든 return 값memcached_vdo() {
memcached_connect() {
backoff_handling() {
return MEMCACHED_SERVER_MARKED_DEAD // server->server_failure_counter >= server->root->server_failure_limit이고 mc->flags.auto_eject_hosts == true인 경우
return MEMCACHED_SERVER_TEMPORARILY_DISABLED // server->state == MEMCACHED_SERVER_STATE_IN_TIMEOUT이고 retry time 조건을 만족하지 않는 경우
return MEMCACHED_SUCCESS // 성공
}
network_connect() {
set_hostinfo() {
return MEMCACHED_FAILURE // server->port를 string으로 변환하지 못한 경우. hash collision 이슈 PR로 str_port를 미리 들고 있게 되어 고려하지 않아도 됨
return MEMCACHED_TIMEOUT // getaddrinfo() 함수의 return 값이 EAI_AGAIN인 경우
return MEMCACHED_ERRNO // getaddrinfo() 함수의 return 값이 EAI_SYSTEM인 경우
return MEMCACHED_INVALID_ARGUMENTS // getaddrinfo() 함수의 return 값이 EAI_BADFLAGS인 경우
return MEMCACHED_MEMORY_ALLOCATION_FAILURE // getaddrinfo() 함수의 return 값이 EAI_MEMORY인 경우
return MEMCACHED_HOST_LOOKUP_FAILURE // getaddrinfo() 함수의 return 값이 위의 4가지가 아닌 경우
return MEMCACHED_SUCCESS // 성공
}
connect_poll() {
return MEMCACHED_ERRNO // poll() 함수의 return 값이 1이고 getsockopt() 함수의 errcode가 0이 아닌 경우, 혹은 poll() 함수의 return 값이 0이나 1이 아니고 errno가 ERESTART, EINTR, EFAULT, ENOMEM, EINVAL이 아닌 경우
return MEMCACHED_TIMEOUT // mc->poll_timeout == 0인 경우, 혹은 poll() 함수의 return 값이 0인 경우
return MEMCACHED_SUCCESS // 성공
return MEMCACHED_MEMORY_ALLOCATION_FAILURE // poll() 함수의 return 값이 0, 1이 아니고 errno가 EFAULT, ENOMEM, EINVAL인 경우
}
return MEMCACHED_SUCCESS // 성공
return MEMCACHED_TIMEOUT // connect() 함수의 return 값이 SOCKET_ERROR이고 errno가 ETIMEDOUT인 경우, 혹은 connect_poll() 함수의 return 값이 MEMCACHED_TIMEOUT이고 server->state 값이 MEMCACHED_SERVER_STATE_NEW, MEMCACHED_SERVER_STATE_ADDRINFO인 경우
return MEMCACHED_CONNECTION_FAILURE // connect() 함수의 return 값이 SOCKET_ERROR이고 errno가 ETIMEDOUT, EWOULDBLOCK, EINPROGRESS, EALREADY, EINTR가 아닌 경우
return MEMCACHED_ERRNO // socket() 함수의 return 값이 음수인 경우
}
unix_socket_connect() {
return MEMCACHED_CONNECTION_FAILURE // socket() 함수의 return 값이 음수인 경우, 혹은 socket() 함수의 return 값이 음수가 아니고 connect() 함수의 return 값이 음수이면서 errno가 EINPROGRESS, EALREADY, EINTR, EISCONN이 아닌 경우
return MEMCACHED_SUCCESS // 성공
}
memcached_version_instance() {
version_binary_instance() {
return memcached_vdo()
}
version_ascii_instance() {
return memcached_vdo()
}
return MEMCACHED_NOT_SUPPORTED // 연결이 정상적으로 완료되었으나 mc->flags.use_udp == true인 경우
return MEMCACHED_INVALID_ARGUMENTS // mc == NULL 혹은 server == NULL인 경우
}
return MEMCACHED_SERVER_TEMPORARILY_DISABLED // backoff_handling() 함수에서 server->state == MEMCACHED_SERVER_STATE_IN_TIMEOUT이고 retry time 조건을 만족하여 timeout 상태이지만 backoff_handling() 함수의 reutrn 값이 MEMCACHED_SUCCESS인 경우
}
return MEMCACHED_WRITE_FAILURE // memcached_io_writev() 함수가 실패하여 return 값이 -1이거나 write를 했으나 일부는 write가 이뤄지지 않은 경우
}
|
@uhm0311 |
@jhpark816 |
@uhm0311 예를 들어, MEMCACHED_INVALID_ARGUMENTS 오류인 경우,
따라서, 위 코멘트에 아래 사항이 보강되어야 할 것 같습니다.
|
코멘트 수정했습니다. |
@uhm0311 |
중복되는 오류코드가 있어서 각기 다른 상황을 설명하기 위해 |
@uhm0311 |
어떤 정리가 더 필요한지 힌트 주실 수 있을까요? |
@uhm0311 |
memcached_version_instance() 함수의 실패를 따로 관리한다면 != MEMCACHED_SUCCESS로 충분해 보입니다. |
작업을 여러 commit으로 나누어 봤습니다.
|
@uhm0311
|
@uhm0311 @SuhwanJang |
…ls insied of memcached_vdo() naver#167
…ls inside of memcached_vdo() naver#167
…ls inside of memcached_vdo() naver#167
…ls inside of memcached_vdo() naver#167
…ls inside of memcached_vdo() naver#167
…ls inside of memcached_vdo() naver#167
…ls inside of memcached_vdo() naver#167
…ls inside of memcached_vdo() naver#167
…ls inside of memcached_vdo() naver#167
…ling INTERNAL: Move io reset from where calls memcached_vdo() to where fails insied of memcached_vdo() #167
memcached_vdo() 함수의 오류 처리 부분이 일관적인지 검토하고, 필요하면 수정한다.
The text was updated successfully, but these errors were encountered: