Repository navigation
FEATURE: Add Ketama node locator - #3
Conversation
| def _remove_hash(self, address: str) -> None: | ||
| for point in set(node_points(address)): | ||
| nodes = self._ring[point] | ||
| nodes.remove(address) |
There was a problem hiding this comment.
동일한 노드에 대해 중복으로 삭제 요청이 들어올 경우 문제가 발생할 수 있으므로, remove 대신 해당 항목이 없어도 예외가 발생하지 않는 discard를 사용하는 편이 좋을 것 같습니다.
또한, _ring[point]에 해당하는 항목이 없을 수도 있으므로, _ring.get(point)로 조회한 뒤 None 여부를 확인하여 처리하는 것이 좋을 것 같습니다.
아래 형태로 변경해주시면 될 것 같습니다.
def _remove_hash(self, address: str) -> None:
for point in node_points(address):
nodes = self._ring.get(point)
if nodes is not None:
nodes.discard(address)
if not nodes:
del self._ring[point]There was a problem hiding this comment.
추가, 삭제 대상은 호출부에서 현재 등록된 노드와 새로 발견한 노드를 각각 set으로 변환한 뒤, 아래와 같이 차집합으로 계산하도록 구현하고자 합니다.
to_attach = discovered - registeredto_delete = registered - discovered
이렇게 계산하면 각 집합 내부의 중복뿐 아니라 두 집합 간의 중복도 발생하지 않으며, to_delete에는 현재 등록된 노드만 포함됩니다. 노드 변경은 순서대로 반영하고, 처리 완료 후 등록 목록을 갱신하여 다음 차집합 계산에 사용하도록 하겠습니다.
이 호출 계약을 전제로 하면 미등록 노드나 이미 삭제된 노드를 다시 삭제하는 요청은 발생하지 않으므로, _ring.get()과 discard()로 없는 항목을 무시하는 처리는 추가하지 않아도 될 것으로 봅니다.
또한, Java에서 다룬 한 노드 내부의 중복 해시 포인트 문제는 node_points()가 set을 반환하여 이미 처리하고 있습니다.
| self._points: list[int] = [] | ||
| self.update(addresses, []) | ||
|
|
||
| def update(self, to_attach: list[str], to_delete: list[str]) -> None: |
There was a problem hiding this comment.
to_attach와 to_delete에서 노드가 겹칠 수도 있나요?
6768fce to
3cb2d28
Compare
🔗 Related Issue
⌨️ What I did
ArcusLocator를 구현했습니다.