INTERNAL: Add a swallow handler for mop#835
Conversation
899fe0e to
ae3cfda
Compare
|
@ing-eoking |
|
해당 PR도 작업은 완료되었습니다. |
|
@ing-eoking 리뷰어 지정하세요. |
| if (((lenfields == 0 && numfields > 0) || (lenfields > 0 && numfields == 0)) || | ||
| lenfields > ((numfields*MAX_FIELD_LENG) + numfields-1) || | ||
| numfields > settings.max_map_size || | ||
| numfields > ((lenfields/2) + 1)) { |
There was a problem hiding this comment.
기존 조건문을 하나로 합쳤는데, 아래와 같은 조건은 numfields가 0일 때는 의미상 맞지 않아 보입니다.
lenfields > ((numfields*MAX_FIELD_LENG) + numfields-1)
동작 여부와 별개로 lenfields와 numfields가 0일 때의 비교문으로는 일부 어색한 부분이 있는데,
코드 간결성 측면에서 더 낫다고 보는 것인가요?
There was a problem hiding this comment.
lenfields 또는 numfields가 0인 경우는 이미 앞선 조건문
(lenfields == 0 && numfields > 0) || (lenfields > 0 && numfields == 0)에 의해 걸러지므로,
조건상 제외된다고 볼 수 있습니다.
따라서 코드 간결성 측면에서도 해당 조건들을 별도로 분리하기보다는 하나로 합치는 것이 더 좋을 것 같다고 생각됩니다.
|
변경되었습니다.
두 명령어( |
|
mop get/delete 처리 로직에는 swallow 기능이 들어가 있는 것으로 알고 있습니다. |
lenfields와 numfields 값이 memcached에서 허용되지 않는 경우에 해당합니다. 구체적으로는 다음 조건 중 하나라도 만족하는 경우입니다.
|
|
@ing-eoking |
|
여러 개의 키를 받기 위해 nread를 수행하는 경우, 다른 명령어들(아래의 명령어)에서는
혹시 mop 명령어에서만 이런 방식으로 처리하는 이유가 있을까요? |
|
@ing-eoking @namsic |
|
max_map_size나 허용 가능한 최대 크기 등의 값은 추후에 memcached 버전 변화에 따라 달라질 수 있습니다. 따라서 아래와 같은 기준으로 예외 상황을 핸들링하는 방식이 적절하다고 판단됩니다.
|
|
@ing-eoking
|
|
해당 케이스는
mop 명령어에서 swallow 처리를 하지 않는 것이 의도된 동작이라면, 추후 swallow 처리를 어떻게 할지 논의할 수 있도록 이슈를 생성해두는 것이 좋을 것 같습니다. 현재로서는 swallow 처리가 필요한 경우에도 응답 메시지를 INVALID로 변경하지 않고, 기존대로 CLIENT_ERROR를 유지하여 클라이언트가 reconnect 하도록 하는 방향이 적절해 보입니다. |
|
아래 명령에서는 어떤 경우에 swallow 하나요? mop 연산 과는 어떤 차이가 있나요?
|
mget
bop mget / bop smget
이러한 조건들은 대부분 |
| out_string(c, "CLIENT_ERROR bad value"); | ||
| return; | ||
| } | ||
| if (((lenfields == 0 && numfields > 0) || (lenfields > 0 && numfields == 0)) || |
There was a problem hiding this comment.
lenfields가 0이거나 numfields가 0인 경우는 기존대로 합시다.
mget에서도 그렇게 되어 있습니다.
| (! safe_strtoul(tokens[MOP_KEY_TOKEN+2].value, &numfields))) { | ||
| (! safe_strtoul(tokens[MOP_KEY_TOKEN+2].value, &numfields)) || | ||
| (lenfields > (UINT_MAX-2)) || (lenfields == 0 && numfields > 0) || | ||
| (lenfields > 0 && numfields == 0)) { |
There was a problem hiding this comment.
아래 조건이면 될 것 같습니다.
(lenkeys > (UINT_MAX-2)) || (lenkeys == 0) || (numkeys == 0)) {There was a problem hiding this comment.
이 경우, map 자료구조에서 전체 조회나 전체 삭제 기능이 제공되지 않게 되는데,
문서에서 전체 조회나 전체 삭제에 대한 언급은 따로 없으니 제거하는 편이 좋을까요?
🔗 Related Issue
⌨️ What I did