Skip to content
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

multiple key delete 기능 추가. #386

Open
jhpark816 opened this issue Jan 17, 2020 · 6 comments
Open

multiple key delete 기능 추가. #386

jhpark816 opened this issue Jan 17, 2020 · 6 comments
Assignees
Labels

Comments

@jhpark816
Copy link
Collaborator

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

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

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

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

@jhpark816
Copy link
Collaborator Author

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

@computerphilosopher
Copy link
Contributor

현재 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
Copy link
Contributor

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

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

@jhpark816
Copy link
Collaborator Author

@computerphilosopher

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

@computerphilosopher
Copy link
Contributor

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

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Projects
None yet
Development

No branches or pull requests

4 participants