Tried to enable picking method

This commit is contained in:
Andrey Terentev 2024-01-11 19:57:07 +07:00
parent 0834ae8030
commit 70f02c3841
3 changed files with 73 additions and 4 deletions

View File

@ -16,6 +16,7 @@ import java.util.concurrent.ConcurrentHashMap;
public class NodeRepositoryImpl implements NodeRepository { public class NodeRepositoryImpl implements NodeRepository {
private final RoomRepository roomRepository; private final RoomRepository roomRepository;
private final PickerRepository pickerRepository;
private final Map<String, Node> nodeMap = new ConcurrentHashMap<>(); private final Map<String, Node> nodeMap = new ConcurrentHashMap<>();
@Override @Override
@ -26,6 +27,7 @@ public class NodeRepositoryImpl implements NodeRepository {
} }
nodeMap.put(node.id(), node); nodeMap.put(node.id(), node);
pickerRepository.create(node.id(), node.mode());
} }
roomRepository.onCreateNode(node); roomRepository.onCreateNode(node);
@ -35,6 +37,7 @@ public class NodeRepositoryImpl implements NodeRepository {
public void delete(Node node) { public void delete(Node node) {
synchronized (nodeMap) { synchronized (nodeMap) {
nodeMap.remove(node.id()); nodeMap.remove(node.id());
pickerRepository.remove(node.id());
} }
roomRepository.onRemoveNode(node); roomRepository.onRemoveNode(node);

View File

@ -0,0 +1,59 @@
package ru.dragonestia.picker.repository.impl;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Component;
import ru.dragonestia.picker.model.Room;
import ru.dragonestia.picker.model.User;
import ru.dragonestia.picker.model.type.PickingMode;
import ru.dragonestia.picker.repository.UserRepository;
import ru.dragonestia.picker.repository.impl.picker.LeastPickedPicker;
import ru.dragonestia.picker.repository.impl.picker.Picker;
import ru.dragonestia.picker.repository.impl.picker.RoundRobinPicker;
import ru.dragonestia.picker.repository.impl.picker.SequentialFillingPicker;
import java.security.InvalidParameterException;
import java.util.Collection;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
@Component
@RequiredArgsConstructor
public class PickerRepository {
private final UserRepository userRepository;
private final Map<String, Picker<Room, User>> pickers = new ConcurrentHashMap<>();
public void create(String nodeId, PickingMode mode) {
pickers.put(nodeId, of(mode));
}
public void remove(String nodeId) {
pickers.remove(nodeId);
}
public Picker<Room, User> find(String nodeId) {
return pickers.get(nodeId);
}
public Room pick(String nodeId, Collection<User> users) {
return pickers.get(nodeId).pick(users);
}
private Picker<Room, User> of(PickingMode mode) {
switch (mode) {
case SEQUENTIAL_FILLING -> {
return new SequentialFillingPicker(userRepository);
}
case ROUND_ROBIN -> {
return new RoundRobinPicker(userRepository);
}
case LEAST_PICKED -> {
return new LeastPickedPicker(userRepository);
}
default -> throw new InvalidParameterException("Taken: " + mode);
}
}
}

View File

@ -17,6 +17,7 @@ import java.util.concurrent.atomic.AtomicInteger;
public class RoomRepositoryImpl implements RoomRepository { public class RoomRepositoryImpl implements RoomRepository {
private final UserRepository userRepository; private final UserRepository userRepository;
private final PickerRepository pickerRepository;
private final Map<Node, Rooms> node2roomsMap = new ConcurrentHashMap<>(); private final Map<Node, Rooms> node2roomsMap = new ConcurrentHashMap<>();
@Override @Override
@ -37,6 +38,7 @@ public class RoomRepositoryImpl implements RoomRepository {
throw new IllegalArgumentException("Room already exists"); throw new IllegalArgumentException("Room already exists");
} }
rooms.put(room.getId(), new RoomContainer(room, new AtomicInteger(0))); rooms.put(room.getId(), new RoomContainer(room, new AtomicInteger(0)));
pickerRepository.find(room.getNodeId()).add(room);
} }
} }
@ -53,6 +55,7 @@ public class RoomRepositoryImpl implements RoomRepository {
} }
node2roomsMap.get(node.get()).remove(room.getId()); node2roomsMap.get(node.get()).remove(room.getId());
pickerRepository.find(room.getNodeId()).remove(room);
} }
userRepository.onRemoveRoom(room); userRepository.onRemoveRoom(room);
@ -91,10 +94,14 @@ public class RoomRepositoryImpl implements RoomRepository {
throw new IllegalArgumentException("Node '" + node.id() + "' does not exist"); throw new IllegalArgumentException("Node '" + node.id() + "' does not exist");
} }
var requiredSlots = users.size(); Room room = null;
var container = node2roomsMap.get(node).values().stream() // TODO: pick room with used node balancing mode try {
.filter(r -> r.isAvailable(requiredSlots)) room = pickerRepository.pick(node.id(), users);
.findFirst(); } catch (RuntimeException ignore) {} // TODO: may be problem. Check it later
Optional<RoomContainer> container = room == null?
Optional.empty() :
Optional.of(node2roomsMap.get(node).get(room.getId()));
if (container.isPresent()) { if (container.isPresent()) {
var cont = container.get(); var cont = container.get();