From e196242215bbc0eb8dea4dd49d1c607e1bcc4566 Mon Sep 17 00:00:00 2001 From: ScarletRedMan Date: Fri, 15 Mar 2024 00:28:58 +0700 Subject: [PATCH] Fixed memory leak --- .../repository/impl/UserRepositoryImpl.java | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/server/src/main/java/ru/dragonestia/picker/repository/impl/UserRepositoryImpl.java b/server/src/main/java/ru/dragonestia/picker/repository/impl/UserRepositoryImpl.java index 6bdd5dc..58dc224 100644 --- a/server/src/main/java/ru/dragonestia/picker/repository/impl/UserRepositoryImpl.java +++ b/server/src/main/java/ru/dragonestia/picker/repository/impl/UserRepositoryImpl.java @@ -10,6 +10,7 @@ import ru.dragonestia.picker.repository.impl.cache.NodeId2PickerModeCache; import ru.dragonestia.picker.repository.impl.picker.LeastPickedPicker; import java.util.*; +import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.atomic.AtomicInteger; import java.util.concurrent.locks.ReadWriteLock; import java.util.concurrent.locks.ReentrantReadWriteLock; @@ -19,8 +20,8 @@ import java.util.concurrent.locks.ReentrantReadWriteLock; public class UserRepositoryImpl implements UserRepository { private final NodeId2PickerModeCache nodeId2PickerModeCache; - private final Map> usersMap = new HashMap<>(); - private final Map> roomUsers = new HashMap<>(); + private final Map> usersMap = new ConcurrentHashMap<>(); + private final Map> roomUsers = new ConcurrentHashMap<>(); private final ReadWriteLock lock = new ReentrantReadWriteLock(true); @Override @@ -115,8 +116,10 @@ public class UserRepositoryImpl implements UserRepository { public void onRemoveRoom(Room room) { lock.writeLock().lock(); try { - usersMap.forEach((user, set) -> { + roomUsers.remove(new NodeRoomPath(room.getNodeIdentifier(), room.getIdentifier())).forEach(user -> { + var set = usersMap.getOrDefault(user, new HashSet<>()); set.remove(room); + if (set.isEmpty()) { usersMap.remove(user); } @@ -175,11 +178,11 @@ public class UserRepositoryImpl implements UserRepository { return map; } - private record NodeRoomPath(String node, String bucket) { + private record NodeRoomPath(String node, String room) { @Override public int hashCode() { - return Objects.hash(node, bucket); + return Objects.hash(node, room); } @Override @@ -187,7 +190,7 @@ public class UserRepositoryImpl implements UserRepository { if (o == null) return false; if (o == this) return true; if (o instanceof NodeRoomPath other) { - return other.node().equals(node()) && other.bucket().equals(bucket()); + return other.node().equals(node()) && other.room().equals(room()); } return false; }