naver / arcus-memcached

ARCUS memory cache server
https://github.com/naver/arcus
Apache License 2.0
71 stars 55 forks source link

multiple key delete 기능 추가. #386

Open jhpark816 opened 4 years ago

jhpark816 commented 4 years ago

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

computerphilosopher commented 4 years ago

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

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

jhpark816 commented 4 years ago

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

computerphilosopher commented 4 years ago

현재 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와 같은 블락 관련된 다른 변수도 변화를 주어야 하는지 검토중입니다.

MinWooJin commented 4 years ago

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

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

jhpark816 commented 4 years ago

@computerphilosopher

computerphilosopher commented 4 years ago

pipe 기능 제공 명령

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

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

모두 read 명령입니다.