arcus-memcached icon indicating copy to clipboard operation
arcus-memcached copied to clipboard

multiple key delete 기능 추가.

Open jhpark816 opened this issue 5 years ago • 6 comments

하나의 delete 명령으로 multiple keys를 삭제하는 기능을 제공한다.

  • 요구 사항
    • 응용에서 다수의 키를 삭제하는 경우 현재는 loop 통해 개별 키를 삭제하고 있다.
    • 이 경우, 전체 키를 삭제하는 latency가 길어지는 단점이 있다.
  • 해결 방안
    • 한번의 delete 명령으로 다수의 키를 삭제하도록 한다.
    • 하나의 작업 스레드가 다수 커넥션들의 요청들을 큰 지연없이 처리하여야 한다.
    • 이를 위해 O(small N) 제약을 준수해야 하며, 대략 100개 key들을 한번에 delete하도록 한다.
  • 참조
    • arcus-java-client 이슈 : https://github.com/naver/arcus-java-client/issues/15

jhpark816 avatar Jan 17 '20 02:01 jhpark816

한 번의 delete 명령으로 다수의 키를 삭제한다는 게 캐시락 한 번이 아닌 request 한 번 맞나요?

비슷한 연산인 mget은 한 번에 만 개까지 처리하고 있는데, 100개라는 기준이 어떻게 잡힌 것인지도 궁금합니다.

computerphilosopher avatar Feb 12 '20 08:02 computerphilosopher

설계가 완료될 때까지는 다양한 채널로 @MinWooJin 와 논의해 보기 바랍니다.

jhpark816 avatar Feb 12 '20 08:02 jhpark816

현재 mdelete는 nread과정에서 입력된 키들에 대해 remove 연산을 반복 호출하는 구조입니다.

mget과 유사한 구조이지만 write 연산이기 때문에 이중화 기능을 사용할 경우 ENGINE_EWOULD_BLOCK이 리턴될 수 있습니다.

기존에는 write 연산을 여러번하는 연산이 없기 때문에, ENGINE_EWOULDBLOCK이 리턴될 경우 커넥션의 이벤트 루프를 중단했다가, notify_io_complete가 실행되면 다시 실행하는 방식으로 구현해도 문제가 없었습니다.

그러나 mdelete 과정에서 ENGINE_EWOULDBLOCK이 여러번 리턴될 경우, notify_io_complete가 실행되더라도 모든 연산이 slave에 반영되었다는 보장이 없습니다. 현재 커넥션 구조체의 ewouldblock 멤버는 불리언 변수이기 때문에 몇 개의 연산이 블락되었는지, 마지막으로 블락된 연산이 무엇인지를 확인할 길이 없습니다.

따라서 mdelete 연산을 정상적으로 수행하기 위해선 엔진 블락을 처리하는 구조를 바꾸어야 합니다. 현재 엔진 블락을 한 연산의 갯수를 세는 방향으로 설계하고 있습니다. 블락될 때 마다 카운트를 올리고, notify_io_complete가 호출될 때 마다 카운트를 차감하는 방식입니다.

premature_notify_io_complete, io_blocked와 같은 블락 관련된 다른 변수도 변화를 주어야 하는지 검토중입니다.

computerphilosopher avatar Mar 02 '20 06:03 computerphilosopher

@computerphilosopher block falg를 block count로 변경하는 방법은, count를 올리고, 차감하는 thread들 간의 concurrency가 필수적으로 고려되어야 합니다.

이부분을 위주로 처리에 문제가 없는지, 성능에 오버헤드가 될 여지가 있는지 정리하면 좋겠습니다.

MinWooJin avatar Mar 02 '20 06:03 MinWooJin

@computerphilosopher

  • pipe 기능을 제공하는 명령이 모두 write 성격의 명령인가요 ? 맞다면, 명령 list 알려주세요.
  • 다수 key를 한번에 받아들여 처리하는 연산은 모두 read 성격의 연산인가요 ? 맞다면, 명령 list 알려주세요.

jhpark816 avatar Mar 13 '20 04:03 jhpark816

pipe 기능 제공 명령

sop exist를 제외하면 모두 write 명령입니다.

  • lop 명령들 - lop insert/delete
  • sop 명령들 - sop insert/delete/exist
  • mop 명령들 - mop insert/delete/update
  • bop 명령들 - bop insert/upsert/delete/update/incr/decr

여러 개의 key를 입력받는 명령

모두 read 명령입니다.

  • key-value
    • get(old mget)
    • mget
  • bop
    • mget
    • smget

computerphilosopher avatar Mar 13 '20 08:03 computerphilosopher