diff --git a/application/src/main/java/org/thingsboard/server/service/cluster/routing/ClusterRoutingService.java b/application/src/main/java/org/thingsboard/server/service/cluster/routing/ClusterRoutingService.java index 425b578f7b..dabca5f3d7 100644 --- a/application/src/main/java/org/thingsboard/server/service/cluster/routing/ClusterRoutingService.java +++ b/application/src/main/java/org/thingsboard/server/service/cluster/routing/ClusterRoutingService.java @@ -30,13 +30,6 @@ public interface ClusterRoutingService extends DiscoveryServiceListener { ServerAddress getCurrentServer(); - Optional resolveByUuid(UUID uuid); - Optional resolveById(EntityId entityId); - Optional resolveByUuid(ServerType server, UUID uuid); - - Optional resolveById(ServerType server, EntityId entityId); - - } diff --git a/application/src/main/java/org/thingsboard/server/service/cluster/routing/ConsistentClusterRoutingService.java b/application/src/main/java/org/thingsboard/server/service/cluster/routing/ConsistentClusterRoutingService.java index 87948eddba..99051389c8 100644 --- a/application/src/main/java/org/thingsboard/server/service/cluster/routing/ConsistentClusterRoutingService.java +++ b/application/src/main/java/org/thingsboard/server/service/cluster/routing/ConsistentClusterRoutingService.java @@ -88,21 +88,6 @@ public class ConsistentClusterRoutingService implements ClusterRoutingService { return resolveByUuid(rootCircle, entityId.getId()); } - @Override - public Optional resolveByUuid(UUID uuid) { - return resolveByUuid(rootCircle, uuid); - } - - @Override - public Optional resolveByUuid(ServerType server, UUID uuid) { - return resolveByUuid(circles[server.ordinal()], uuid); - } - - @Override - public Optional resolveById(ServerType server, EntityId entityId) { - return resolveByUuid(circles[server.ordinal()], entityId.getId()); - } - private Optional resolveByUuid(ConsistentHashCircle circle, UUID uuid) { Assert.notNull(uuid); if (circle.isEmpty()) { diff --git a/application/src/main/java/org/thingsboard/server/service/state/DefaultDeviceStateService.java b/application/src/main/java/org/thingsboard/server/service/state/DefaultDeviceStateService.java index b42b4c6732..e8336f2093 100644 --- a/application/src/main/java/org/thingsboard/server/service/state/DefaultDeviceStateService.java +++ b/application/src/main/java/org/thingsboard/server/service/state/DefaultDeviceStateService.java @@ -296,15 +296,21 @@ public class DefaultDeviceStateService implements DeviceStateService { private void updateState() { long ts = System.currentTimeMillis(); Set deviceIds = new HashSet<>(deviceStates.keySet()); + log.info("Calculating state updates for {} devices", deviceStates.size()); for (DeviceId deviceId : deviceIds) { - DeviceStateData stateData = deviceStates.get(deviceId); - DeviceState state = stateData.getState(); - state.setActive(ts < state.getLastActivityTime() + state.getInactivityTimeout()); - if (!state.isActive() && (state.getLastInactivityAlarmTime() == 0L || state.getLastInactivityAlarmTime() < state.getLastActivityTime())) { - state.setLastInactivityAlarmTime(ts); - pushRuleEngineMessage(stateData, INACTIVITY_EVENT); - save(deviceId, INACTIVITY_ALARM_TIME, ts); - save(deviceId, ACTIVITY_STATE, state.isActive()); + DeviceStateData stateData = getOrFetchDeviceStateData(deviceId); + if (stateData != null) { + DeviceState state = stateData.getState(); + state.setActive(ts < state.getLastActivityTime() + state.getInactivityTimeout()); + if (!state.isActive() && (state.getLastInactivityAlarmTime() == 0L || state.getLastInactivityAlarmTime() < state.getLastActivityTime())) { + state.setLastInactivityAlarmTime(ts); + pushRuleEngineMessage(stateData, INACTIVITY_EVENT); + save(deviceId, INACTIVITY_ALARM_TIME, ts); + save(deviceId, ACTIVITY_STATE, state.isActive()); + } + } else { + log.debug("[{}] Device that belongs to other server is detected and removed.", deviceId); + deviceStates.remove(deviceId); } } } @@ -353,6 +359,7 @@ public class DefaultDeviceStateService implements DeviceStateService { if (device != null) { try { deviceStateData = fetchDeviceState(device).get(); + deviceStates.putIfAbsent(deviceId, deviceStateData); } catch (InterruptedException | ExecutionException e) { log.debug("[{}] Failed to fetch device state!", deviceId, e); }