Commit 3ae5acbcc8eaa47a9459256b994a60d3626a48c2

Authored by Volodymyr Babak
1 parent 5c8618c3

Added lock on edge event save/read. Removed save async method

@@ -94,11 +94,9 @@ import java.util.Arrays; @@ -94,11 +94,9 @@ import java.util.Arrays;
94 import java.util.Collections; 94 import java.util.Collections;
95 import java.util.HashMap; 95 import java.util.HashMap;
96 import java.util.HashSet; 96 import java.util.HashSet;
97 -import java.util.LinkedHashMap;  
98 import java.util.List; 97 import java.util.List;
99 import java.util.Map; 98 import java.util.Map;
100 import java.util.Objects; 99 import java.util.Objects;
101 -import java.util.Optional;  
102 import java.util.Set; 100 import java.util.Set;
103 import java.util.UUID; 101 import java.util.UUID;
104 import java.util.function.Consumer; 102 import java.util.function.Consumer;
@@ -703,18 +701,8 @@ class DeviceActorMessageProcessor extends AbstractContextAwareMsgProcessor { @@ -703,18 +701,8 @@ class DeviceActorMessageProcessor extends AbstractContextAwareMsgProcessor {
703 edgeEvent.setBody(body); 701 edgeEvent.setBody(body);
704 702
705 edgeEvent.setEdgeId(edgeId); 703 edgeEvent.setEdgeId(edgeId);
706 - ListenableFuture<EdgeEvent> future = systemContext.getEdgeEventService().saveAsync(edgeEvent);  
707 - Futures.addCallback(future, new FutureCallback<EdgeEvent>() {  
708 - @Override  
709 - public void onSuccess(EdgeEvent result) {  
710 - systemContext.getClusterService().onEdgeEventUpdate(tenantId, edgeId);  
711 - }  
712 -  
713 - @Override  
714 - public void onFailure(Throwable t) {  
715 - log.warn("[{}] Can't save edge event [{}] for edge [{}]", tenantId.getId(), edgeEvent, edgeId.getId(), t);  
716 - }  
717 - }, systemContext.getDbCallbackExecutor()); 704 + systemContext.getEdgeEventService().save(edgeEvent);
  705 + systemContext.getClusterService().onEdgeEventUpdate(tenantId, edgeId);
718 } 706 }
719 707
720 private List<TsKvProto> toTsKvProtos(@Nullable List<AttributeKvEntry> result) { 708 private List<TsKvProto> toTsKvProtos(@Nullable List<AttributeKvEntry> result) {
@@ -16,11 +16,7 @@ @@ -16,11 +16,7 @@
16 package org.thingsboard.server.service.edge; 16 package org.thingsboard.server.service.edge;
17 17
18 import com.fasterxml.jackson.databind.JsonNode; 18 import com.fasterxml.jackson.databind.JsonNode;
19 -import com.google.common.util.concurrent.FutureCallback;  
20 -import com.google.common.util.concurrent.Futures;  
21 -import com.google.common.util.concurrent.ListenableFuture;  
22 import lombok.extern.slf4j.Slf4j; 19 import lombok.extern.slf4j.Slf4j;
23 -import org.checkerframework.checker.nullness.qual.Nullable;  
24 import org.springframework.beans.factory.annotation.Autowired; 20 import org.springframework.beans.factory.annotation.Autowired;
25 import org.springframework.stereotype.Service; 21 import org.springframework.stereotype.Service;
26 import org.thingsboard.server.common.data.edge.Edge; 22 import org.thingsboard.server.common.data.edge.Edge;
@@ -123,19 +119,8 @@ public class DefaultEdgeNotificationService implements EdgeNotificationService { @@ -123,19 +119,8 @@ public class DefaultEdgeNotificationService implements EdgeNotificationService {
123 edgeEvent.setEntityId(entityId.getId()); 119 edgeEvent.setEntityId(entityId.getId());
124 } 120 }
125 edgeEvent.setBody(body); 121 edgeEvent.setBody(body);
126 - ListenableFuture<EdgeEvent> future = edgeEventService.saveAsync(edgeEvent);  
127 - Futures.addCallback(future, new FutureCallback<EdgeEvent>() {  
128 - @Override  
129 - public void onSuccess(@Nullable EdgeEvent result) {  
130 - clusterService.onEdgeEventUpdate(tenantId, edgeId);  
131 - }  
132 -  
133 - @Override  
134 - public void onFailure(Throwable t) {  
135 - log.warn("[{}] Can't save edge event [{}] for edge [{}]", tenantId.getId(), edgeEvent, edgeId.getId(), t);  
136 - }  
137 - }, dbCallbackExecutorService);  
138 - 122 + edgeEventService.save(edgeEvent);
  123 + clusterService.onEdgeEventUpdate(tenantId, edgeId);
139 } 124 }
140 125
141 @Override 126 @Override
@@ -259,7 +259,7 @@ public final class EdgeGrpcSession implements Closeable { @@ -259,7 +259,7 @@ public final class EdgeGrpcSession implements Closeable {
259 log.error("[{}] Msg processing failed! Error msg: {}", edge.getRoutingKey(), msg.getErrorMsg()); 259 log.error("[{}] Msg processing failed! Error msg: {}", edge.getRoutingKey(), msg.getErrorMsg());
260 } 260 }
261 if (sessionState.getPendingMsgsMap().isEmpty()) { 261 if (sessionState.getPendingMsgsMap().isEmpty()) {
262 - log.debug("[{}] Pending msgs map is empty. Stopping current iteration {}", edge.getRoutingKey(), msg); 262 + log.debug("[{}] Pending msgs map is empty. Stopping current iteration", edge.getRoutingKey());
263 if (sessionState.getScheduledSendDownlinkTask() != null) { 263 if (sessionState.getScheduledSendDownlinkTask() != null) {
264 sessionState.getScheduledSendDownlinkTask().cancel(false); 264 sessionState.getScheduledSendDownlinkTask().cancel(false);
265 } 265 }
@@ -17,11 +17,7 @@ package org.thingsboard.server.service.edge.rpc.processor; @@ -17,11 +17,7 @@ package org.thingsboard.server.service.edge.rpc.processor;
17 17
18 import com.fasterxml.jackson.databind.JsonNode; 18 import com.fasterxml.jackson.databind.JsonNode;
19 import com.fasterxml.jackson.databind.ObjectMapper; 19 import com.fasterxml.jackson.databind.ObjectMapper;
20 -import com.google.common.util.concurrent.FutureCallback;  
21 -import com.google.common.util.concurrent.Futures;  
22 -import com.google.common.util.concurrent.ListenableFuture;  
23 import lombok.extern.slf4j.Slf4j; 20 import lombok.extern.slf4j.Slf4j;
24 -import org.checkerframework.checker.nullness.qual.Nullable;  
25 import org.springframework.beans.factory.annotation.Autowired; 21 import org.springframework.beans.factory.annotation.Autowired;
26 import org.thingsboard.server.common.data.HasCustomerId; 22 import org.thingsboard.server.common.data.HasCustomerId;
27 import org.thingsboard.server.common.data.edge.Edge; 23 import org.thingsboard.server.common.data.edge.Edge;
@@ -178,7 +174,7 @@ public abstract class BaseEdgeProcessor { @@ -178,7 +174,7 @@ public abstract class BaseEdgeProcessor {
178 @Autowired 174 @Autowired
179 protected DbCallbackExecutorService dbCallbackExecutorService; 175 protected DbCallbackExecutorService dbCallbackExecutorService;
180 176
181 - protected ListenableFuture<EdgeEvent> saveEdgeEvent(TenantId tenantId, 177 + protected void saveEdgeEvent(TenantId tenantId,
182 EdgeId edgeId, 178 EdgeId edgeId,
183 EdgeEventType type, 179 EdgeEventType type,
184 EdgeEventActionType action, 180 EdgeEventActionType action,
@@ -197,19 +193,8 @@ public abstract class BaseEdgeProcessor { @@ -197,19 +193,8 @@ public abstract class BaseEdgeProcessor {
197 edgeEvent.setEntityId(entityId.getId()); 193 edgeEvent.setEntityId(entityId.getId());
198 } 194 }
199 edgeEvent.setBody(body); 195 edgeEvent.setBody(body);
200 - ListenableFuture<EdgeEvent> future = edgeEventService.saveAsync(edgeEvent);  
201 - Futures.addCallback(future, new FutureCallback<EdgeEvent>() {  
202 - @Override  
203 - public void onSuccess(@Nullable EdgeEvent result) {  
204 - tbClusterService.onEdgeEventUpdate(tenantId, edgeId);  
205 - }  
206 -  
207 - @Override  
208 - public void onFailure(Throwable t) {  
209 - log.warn("[{}] Can't save edge event [{}] for edge [{}]", tenantId.getId(), edgeEvent, edgeId.getId(), t);  
210 - }  
211 - }, dbCallbackExecutorService);  
212 - return future; 196 + edgeEventService.save(edgeEvent);
  197 + tbClusterService.onEdgeEventUpdate(tenantId, edgeId);
213 } 198 }
214 199
215 protected CustomerId getCustomerIdIfEdgeAssignedToCustomer(HasCustomerId hasCustomerIdEntity, Edge edge) { 200 protected CustomerId getCustomerIdIfEdgeAssignedToCustomer(HasCustomerId hasCustomerIdEntity, Edge edge) {
@@ -105,19 +105,8 @@ public class DeviceEdgeProcessor extends BaseEdgeProcessor { @@ -105,19 +105,8 @@ public class DeviceEdgeProcessor extends BaseEdgeProcessor {
105 Device newDevice = createDevice(tenantId, edge, deviceUpdateMsg, newDeviceName); 105 Device newDevice = createDevice(tenantId, edge, deviceUpdateMsg, newDeviceName);
106 ObjectNode body = mapper.createObjectNode(); 106 ObjectNode body = mapper.createObjectNode();
107 body.put("conflictName", deviceName); 107 body.put("conflictName", deviceName);
108 - ListenableFuture<EdgeEvent> future =  
109 - saveEdgeEvent(tenantId, edge.getId(), EdgeEventType.DEVICE, EdgeEventActionType.ENTITY_MERGE_REQUEST, newDevice.getId(), body);  
110 - Futures.addCallback(future, new FutureCallback<>() {  
111 - @Override  
112 - public void onSuccess(EdgeEvent edgeEvent) {  
113 - saveEdgeEvent(tenantId, edge.getId(), EdgeEventType.DEVICE, EdgeEventActionType.CREDENTIALS_REQUEST, newDevice.getId(), null);  
114 - }  
115 -  
116 - @Override  
117 - public void onFailure(Throwable t) {  
118 - log.error("[{}] Failed to save ENTITY_MERGE_REQUEST edge event [{}][{}]", tenantId, deviceUpdateMsg, edge.getId(), t);  
119 - }  
120 - }, dbCallbackExecutorService); 108 + saveEdgeEvent(tenantId, edge.getId(), EdgeEventType.DEVICE, EdgeEventActionType.ENTITY_MERGE_REQUEST, newDevice.getId(), body);
  109 + saveEdgeEvent(tenantId, edge.getId(), EdgeEventType.DEVICE, EdgeEventActionType.CREDENTIALS_REQUEST, newDevice.getId(), null);
121 } 110 }
122 } while (pageData != null && pageData.hasNext()); 111 } while (pageData != null && pageData.hasNext());
123 } else { 112 } else {
@@ -122,26 +122,13 @@ public class DefaultEdgeRequestsService implements EdgeRequestsService { @@ -122,26 +122,13 @@ public class DefaultEdgeRequestsService implements EdgeRequestsService {
122 @Override 122 @Override
123 public ListenableFuture<Void> processRuleChainMetadataRequestMsg(TenantId tenantId, Edge edge, RuleChainMetadataRequestMsg ruleChainMetadataRequestMsg) { 123 public ListenableFuture<Void> processRuleChainMetadataRequestMsg(TenantId tenantId, Edge edge, RuleChainMetadataRequestMsg ruleChainMetadataRequestMsg) {
124 log.trace("[{}] processRuleChainMetadataRequestMsg [{}][{}]", tenantId, edge.getName(), ruleChainMetadataRequestMsg); 124 log.trace("[{}] processRuleChainMetadataRequestMsg [{}][{}]", tenantId, edge.getName(), ruleChainMetadataRequestMsg);
125 - SettableFuture<Void> futureToSet = SettableFuture.create();  
126 if (ruleChainMetadataRequestMsg.getRuleChainIdMSB() != 0 && ruleChainMetadataRequestMsg.getRuleChainIdLSB() != 0) { 125 if (ruleChainMetadataRequestMsg.getRuleChainIdMSB() != 0 && ruleChainMetadataRequestMsg.getRuleChainIdLSB() != 0) {
127 RuleChainId ruleChainId = 126 RuleChainId ruleChainId =
128 new RuleChainId(new UUID(ruleChainMetadataRequestMsg.getRuleChainIdMSB(), ruleChainMetadataRequestMsg.getRuleChainIdLSB())); 127 new RuleChainId(new UUID(ruleChainMetadataRequestMsg.getRuleChainIdMSB(), ruleChainMetadataRequestMsg.getRuleChainIdLSB()));
129 - ListenableFuture<EdgeEvent> future = saveEdgeEvent(tenantId, edge.getId(), 128 + saveEdgeEvent(tenantId, edge.getId(),
130 EdgeEventType.RULE_CHAIN_METADATA, EdgeEventActionType.ADDED, ruleChainId, null); 129 EdgeEventType.RULE_CHAIN_METADATA, EdgeEventActionType.ADDED, ruleChainId, null);
131 - Futures.addCallback(future, new FutureCallback<EdgeEvent>() {  
132 - @Override  
133 - public void onSuccess(@Nullable EdgeEvent result) {  
134 - futureToSet.set(null);  
135 - }  
136 -  
137 - @Override  
138 - public void onFailure(Throwable t) {  
139 - log.error("Can't save edge event [{}]", ruleChainMetadataRequestMsg, t);  
140 - futureToSet.setException(t);  
141 - }  
142 - }, dbCallbackExecutorService);  
143 } 130 }
144 - return futureToSet; 131 + return Futures.immediateFuture(null);
145 } 132 }
146 133
147 @Override 134 @Override
@@ -273,82 +260,39 @@ public class DefaultEdgeRequestsService implements EdgeRequestsService { @@ -273,82 +260,39 @@ public class DefaultEdgeRequestsService implements EdgeRequestsService {
273 @Override 260 @Override
274 public ListenableFuture<Void> processDeviceCredentialsRequestMsg(TenantId tenantId, Edge edge, DeviceCredentialsRequestMsg deviceCredentialsRequestMsg) { 261 public ListenableFuture<Void> processDeviceCredentialsRequestMsg(TenantId tenantId, Edge edge, DeviceCredentialsRequestMsg deviceCredentialsRequestMsg) {
275 log.trace("[{}] processDeviceCredentialsRequestMsg [{}][{}]", tenantId, edge.getName(), deviceCredentialsRequestMsg); 262 log.trace("[{}] processDeviceCredentialsRequestMsg [{}][{}]", tenantId, edge.getName(), deviceCredentialsRequestMsg);
276 - SettableFuture<Void> futureToSet = SettableFuture.create();  
277 if (deviceCredentialsRequestMsg.getDeviceIdMSB() != 0 && deviceCredentialsRequestMsg.getDeviceIdLSB() != 0) { 263 if (deviceCredentialsRequestMsg.getDeviceIdMSB() != 0 && deviceCredentialsRequestMsg.getDeviceIdLSB() != 0) {
278 DeviceId deviceId = new DeviceId(new UUID(deviceCredentialsRequestMsg.getDeviceIdMSB(), deviceCredentialsRequestMsg.getDeviceIdLSB())); 264 DeviceId deviceId = new DeviceId(new UUID(deviceCredentialsRequestMsg.getDeviceIdMSB(), deviceCredentialsRequestMsg.getDeviceIdLSB()));
279 - ListenableFuture<EdgeEvent> future = saveEdgeEvent(tenantId, edge.getId(), EdgeEventType.DEVICE, 265 + saveEdgeEvent(tenantId, edge.getId(), EdgeEventType.DEVICE,
280 EdgeEventActionType.CREDENTIALS_UPDATED, deviceId, null); 266 EdgeEventActionType.CREDENTIALS_UPDATED, deviceId, null);
281 - Futures.addCallback(future, new FutureCallback<EdgeEvent>() {  
282 - @Override  
283 - public void onSuccess(@Nullable EdgeEvent result) {  
284 - futureToSet.set(null);  
285 - }  
286 -  
287 - @Override  
288 - public void onFailure(Throwable t) {  
289 - log.error("Can't save edge event [{}]", deviceCredentialsRequestMsg, t);  
290 - futureToSet.setException(t);  
291 - }  
292 - }, dbCallbackExecutorService);  
293 } 267 }
294 - return futureToSet; 268 + return Futures.immediateFuture(null);
295 } 269 }
296 270
297 @Override 271 @Override
298 public ListenableFuture<Void> processUserCredentialsRequestMsg(TenantId tenantId, Edge edge, UserCredentialsRequestMsg userCredentialsRequestMsg) { 272 public ListenableFuture<Void> processUserCredentialsRequestMsg(TenantId tenantId, Edge edge, UserCredentialsRequestMsg userCredentialsRequestMsg) {
299 log.trace("[{}] processUserCredentialsRequestMsg [{}][{}]", tenantId, edge.getName(), userCredentialsRequestMsg); 273 log.trace("[{}] processUserCredentialsRequestMsg [{}][{}]", tenantId, edge.getName(), userCredentialsRequestMsg);
300 - SettableFuture<Void> futureToSet = SettableFuture.create();  
301 if (userCredentialsRequestMsg.getUserIdMSB() != 0 && userCredentialsRequestMsg.getUserIdLSB() != 0) { 274 if (userCredentialsRequestMsg.getUserIdMSB() != 0 && userCredentialsRequestMsg.getUserIdLSB() != 0) {
302 UserId userId = new UserId(new UUID(userCredentialsRequestMsg.getUserIdMSB(), userCredentialsRequestMsg.getUserIdLSB())); 275 UserId userId = new UserId(new UUID(userCredentialsRequestMsg.getUserIdMSB(), userCredentialsRequestMsg.getUserIdLSB()));
303 - ListenableFuture<EdgeEvent> future = saveEdgeEvent(tenantId, edge.getId(), EdgeEventType.USER, 276 + saveEdgeEvent(tenantId, edge.getId(), EdgeEventType.USER,
304 EdgeEventActionType.CREDENTIALS_UPDATED, userId, null); 277 EdgeEventActionType.CREDENTIALS_UPDATED, userId, null);
305 - Futures.addCallback(future, new FutureCallback<>() {  
306 - @Override  
307 - public void onSuccess(@Nullable EdgeEvent result) {  
308 - futureToSet.set(null);  
309 - }  
310 -  
311 - @Override  
312 - public void onFailure(Throwable t) {  
313 - log.error("Can't save edge event [{}]", userCredentialsRequestMsg, t);  
314 - futureToSet.setException(t);  
315 - }  
316 - }, dbCallbackExecutorService);  
317 } 278 }
318 - return futureToSet; 279 + return Futures.immediateFuture(null);
319 } 280 }
320 281
321 @Override 282 @Override
322 public ListenableFuture<Void> processDeviceProfileDevicesRequestMsg(TenantId tenantId, Edge edge, DeviceProfileDevicesRequestMsg deviceProfileDevicesRequestMsg) { 283 public ListenableFuture<Void> processDeviceProfileDevicesRequestMsg(TenantId tenantId, Edge edge, DeviceProfileDevicesRequestMsg deviceProfileDevicesRequestMsg) {
323 log.trace("[{}] processDeviceProfileDevicesRequestMsg [{}][{}]", tenantId, edge.getName(), deviceProfileDevicesRequestMsg); 284 log.trace("[{}] processDeviceProfileDevicesRequestMsg [{}][{}]", tenantId, edge.getName(), deviceProfileDevicesRequestMsg);
324 - SettableFuture<Void> futureToSet = SettableFuture.create();  
325 if (deviceProfileDevicesRequestMsg.getDeviceProfileIdMSB() != 0 && deviceProfileDevicesRequestMsg.getDeviceProfileIdLSB() != 0) { 285 if (deviceProfileDevicesRequestMsg.getDeviceProfileIdMSB() != 0 && deviceProfileDevicesRequestMsg.getDeviceProfileIdLSB() != 0) {
326 DeviceProfileId deviceProfileId = new DeviceProfileId(new UUID(deviceProfileDevicesRequestMsg.getDeviceProfileIdMSB(), deviceProfileDevicesRequestMsg.getDeviceProfileIdLSB())); 286 DeviceProfileId deviceProfileId = new DeviceProfileId(new UUID(deviceProfileDevicesRequestMsg.getDeviceProfileIdMSB(), deviceProfileDevicesRequestMsg.getDeviceProfileIdLSB()));
327 DeviceProfile deviceProfileById = deviceProfileService.findDeviceProfileById(tenantId, deviceProfileId); 287 DeviceProfile deviceProfileById = deviceProfileService.findDeviceProfileById(tenantId, deviceProfileId);
328 - List<ListenableFuture<EdgeEvent>> futures;  
329 if (deviceProfileById != null) { 288 if (deviceProfileById != null) {
330 - futures = syncDevices(tenantId, edge, deviceProfileById.getName());  
331 - } else {  
332 - futures = new ArrayList<>(); 289 + syncDevices(tenantId, edge, deviceProfileById.getName());
333 } 290 }
334 - Futures.addCallback(Futures.allAsList(futures), new FutureCallback<>() {  
335 - @Override  
336 - public void onSuccess(@Nullable List<EdgeEvent> result) {  
337 - futureToSet.set(null);  
338 - }  
339 -  
340 - @Override  
341 - public void onFailure(Throwable t) {  
342 - log.error("Can't sync devices by device profile [{}]", deviceProfileDevicesRequestMsg, t);  
343 - futureToSet.setException(t);  
344 - }  
345 - }, dbCallbackExecutorService);  
346 } 291 }
347 - return futureToSet; 292 + return Futures.immediateFuture(null);
348 } 293 }
349 294
350 - private List<ListenableFuture<EdgeEvent>> syncDevices(TenantId tenantId, Edge edge, String deviceType) {  
351 - List<ListenableFuture<EdgeEvent>> futures = new ArrayList<>(); 295 + private void syncDevices(TenantId tenantId, Edge edge, String deviceType) {
352 log.trace("[{}] syncDevices [{}][{}]", tenantId, edge.getName(), deviceType); 296 log.trace("[{}] syncDevices [{}][{}]", tenantId, edge.getName(), deviceType);
353 try { 297 try {
354 PageLink pageLink = new PageLink(DEFAULT_PAGE_SIZE); 298 PageLink pageLink = new PageLink(DEFAULT_PAGE_SIZE);
@@ -358,7 +302,7 @@ public class DefaultEdgeRequestsService implements EdgeRequestsService { @@ -358,7 +302,7 @@ public class DefaultEdgeRequestsService implements EdgeRequestsService {
358 if (pageData != null && pageData.getData() != null && !pageData.getData().isEmpty()) { 302 if (pageData != null && pageData.getData() != null && !pageData.getData().isEmpty()) {
359 log.trace("[{}] [{}] device(s) are going to be pushed to edge.", edge.getId(), pageData.getData().size()); 303 log.trace("[{}] [{}] device(s) are going to be pushed to edge.", edge.getId(), pageData.getData().size());
360 for (Device device : pageData.getData()) { 304 for (Device device : pageData.getData()) {
361 - futures.add(saveEdgeEvent(tenantId, edge.getId(), EdgeEventType.DEVICE, EdgeEventActionType.ADDED, device.getId(), null)); 305 + saveEdgeEvent(tenantId, edge.getId(), EdgeEventType.DEVICE, EdgeEventActionType.ADDED, device.getId(), null);
362 } 306 }
363 if (pageData.hasNext()) { 307 if (pageData.hasNext()) {
364 pageLink = pageLink.nextPageLink(); 308 pageLink = pageLink.nextPageLink();
@@ -368,40 +312,25 @@ public class DefaultEdgeRequestsService implements EdgeRequestsService { @@ -368,40 +312,25 @@ public class DefaultEdgeRequestsService implements EdgeRequestsService {
368 } catch (Exception e) { 312 } catch (Exception e) {
369 log.error("Exception during loading edge device(s) on sync!", e); 313 log.error("Exception during loading edge device(s) on sync!", e);
370 } 314 }
371 - return futures;  
372 } 315 }
373 316
374 @Override 317 @Override
375 public ListenableFuture<Void> processWidgetBundleTypesRequestMsg(TenantId tenantId, Edge edge, 318 public ListenableFuture<Void> processWidgetBundleTypesRequestMsg(TenantId tenantId, Edge edge,
376 WidgetBundleTypesRequestMsg widgetBundleTypesRequestMsg) { 319 WidgetBundleTypesRequestMsg widgetBundleTypesRequestMsg) {
377 log.trace("[{}] processWidgetBundleTypesRequestMsg [{}][{}]", tenantId, edge.getName(), widgetBundleTypesRequestMsg); 320 log.trace("[{}] processWidgetBundleTypesRequestMsg [{}][{}]", tenantId, edge.getName(), widgetBundleTypesRequestMsg);
378 - SettableFuture<Void> futureToSet = SettableFuture.create();  
379 if (widgetBundleTypesRequestMsg.getWidgetBundleIdMSB() != 0 && widgetBundleTypesRequestMsg.getWidgetBundleIdLSB() != 0) { 321 if (widgetBundleTypesRequestMsg.getWidgetBundleIdMSB() != 0 && widgetBundleTypesRequestMsg.getWidgetBundleIdLSB() != 0) {
380 WidgetsBundleId widgetsBundleId = new WidgetsBundleId(new UUID(widgetBundleTypesRequestMsg.getWidgetBundleIdMSB(), widgetBundleTypesRequestMsg.getWidgetBundleIdLSB())); 322 WidgetsBundleId widgetsBundleId = new WidgetsBundleId(new UUID(widgetBundleTypesRequestMsg.getWidgetBundleIdMSB(), widgetBundleTypesRequestMsg.getWidgetBundleIdLSB()));
381 WidgetsBundle widgetsBundleById = widgetsBundleService.findWidgetsBundleById(tenantId, widgetsBundleId); 323 WidgetsBundle widgetsBundleById = widgetsBundleService.findWidgetsBundleById(tenantId, widgetsBundleId);
382 - List<ListenableFuture<EdgeEvent>> futures = new ArrayList<>();  
383 if (widgetsBundleById != null) { 324 if (widgetsBundleById != null) {
384 List<WidgetType> widgetTypesToPush = 325 List<WidgetType> widgetTypesToPush =
385 widgetTypeService.findWidgetTypesByTenantIdAndBundleAlias(widgetsBundleById.getTenantId(), widgetsBundleById.getAlias()); 326 widgetTypeService.findWidgetTypesByTenantIdAndBundleAlias(widgetsBundleById.getTenantId(), widgetsBundleById.getAlias());
386 327
387 for (WidgetType widgetType : widgetTypesToPush) { 328 for (WidgetType widgetType : widgetTypesToPush) {
388 - futures.add(saveEdgeEvent(tenantId, edge.getId(), EdgeEventType.WIDGET_TYPE, EdgeEventActionType.ADDED, widgetType.getId(), null)); 329 + saveEdgeEvent(tenantId, edge.getId(), EdgeEventType.WIDGET_TYPE, EdgeEventActionType.ADDED, widgetType.getId(), null);
389 } 330 }
390 } 331 }
391 - Futures.addCallback(Futures.allAsList(futures), new FutureCallback<>() {  
392 - @Override  
393 - public void onSuccess(@Nullable List<EdgeEvent> result) {  
394 - futureToSet.set(null);  
395 - }  
396 -  
397 - @Override  
398 - public void onFailure(Throwable t) {  
399 - log.error("Can't sync widget types by widget bundle [{}]", widgetBundleTypesRequestMsg, t);  
400 - futureToSet.setException(t);  
401 - }  
402 - }, dbCallbackExecutorService);  
403 } 332 }
404 - return futureToSet; 333 + return Futures.immediateFuture(null);
405 } 334 }
406 335
407 @Override 336 @Override
@@ -425,6 +354,7 @@ public class DefaultEdgeRequestsService implements EdgeRequestsService { @@ -425,6 +354,7 @@ public class DefaultEdgeRequestsService implements EdgeRequestsService {
425 saveEdgeEvent(tenantId, edge.getId(), EdgeEventType.ENTITY_VIEW, 354 saveEdgeEvent(tenantId, edge.getId(), EdgeEventType.ENTITY_VIEW,
426 EdgeEventActionType.ADDED, entityView.getId(), null); 355 EdgeEventActionType.ADDED, entityView.getId(), null);
427 } 356 }
  357 + futureToSet.set(null);
428 } 358 }
429 359
430 @Override 360 @Override
@@ -434,8 +364,9 @@ public class DefaultEdgeRequestsService implements EdgeRequestsService { @@ -434,8 +364,9 @@ public class DefaultEdgeRequestsService implements EdgeRequestsService {
434 } 364 }
435 }, dbCallbackExecutorService); 365 }, dbCallbackExecutorService);
436 } 366 }
  367 + } else {
  368 + futureToSet.set(null);
437 } 369 }
438 - futureToSet.set(null);  
439 } catch (Exception e) { 370 } catch (Exception e) {
440 log.error("Exception during loading relation(s) to edge on sync!", e); 371 log.error("Exception during loading relation(s) to edge on sync!", e);
441 futureToSet.setException(e); 372 futureToSet.setException(e);
@@ -451,7 +382,7 @@ public class DefaultEdgeRequestsService implements EdgeRequestsService { @@ -451,7 +382,7 @@ public class DefaultEdgeRequestsService implements EdgeRequestsService {
451 return futureToSet; 382 return futureToSet;
452 } 383 }
453 384
454 - private ListenableFuture<EdgeEvent> saveEdgeEvent(TenantId tenantId, 385 + private void saveEdgeEvent(TenantId tenantId,
455 EdgeId edgeId, 386 EdgeId edgeId,
456 EdgeEventType type, 387 EdgeEventType type,
457 EdgeEventActionType action, 388 EdgeEventActionType action,
@@ -462,19 +393,8 @@ public class DefaultEdgeRequestsService implements EdgeRequestsService { @@ -462,19 +393,8 @@ public class DefaultEdgeRequestsService implements EdgeRequestsService {
462 393
463 EdgeEvent edgeEvent = EdgeEventUtils.constructEdgeEvent(tenantId, edgeId, type, action, entityId, body); 394 EdgeEvent edgeEvent = EdgeEventUtils.constructEdgeEvent(tenantId, edgeId, type, action, entityId, body);
464 395
465 - ListenableFuture<EdgeEvent> future = edgeEventService.saveAsync(edgeEvent);  
466 - Futures.addCallback(future, new FutureCallback<>() {  
467 - @Override  
468 - public void onSuccess(@Nullable EdgeEvent result) {  
469 - tbClusterService.onEdgeEventUpdate(tenantId, edgeId);  
470 - }  
471 -  
472 - @Override  
473 - public void onFailure(Throwable t) {  
474 - log.warn("[{}] Can't save edge event [{}] for edge [{}]", tenantId.getId(), edgeEvent, edgeId.getId(), t);  
475 - }  
476 - }, dbCallbackExecutorService);  
477 - return future; 396 + edgeEventService.save(edgeEvent);
  397 + tbClusterService.onEdgeEventUpdate(tenantId, edgeId);
478 } 398 }
479 399
480 } 400 }
@@ -939,7 +939,7 @@ abstract public class BaseEdgeTest extends AbstractControllerTest { @@ -939,7 +939,7 @@ abstract public class BaseEdgeTest extends AbstractControllerTest {
939 String timeseriesData = "{\"data\":{\"temperature\":25},\"ts\":" + System.currentTimeMillis() + "}"; 939 String timeseriesData = "{\"data\":{\"temperature\":25},\"ts\":" + System.currentTimeMillis() + "}";
940 JsonNode timeseriesEntityData = mapper.readTree(timeseriesData); 940 JsonNode timeseriesEntityData = mapper.readTree(timeseriesData);
941 EdgeEvent edgeEvent = constructEdgeEvent(tenantId, edge.getId(), EdgeEventActionType.TIMESERIES_UPDATED, device.getId().getId(), EdgeEventType.DEVICE, timeseriesEntityData); 941 EdgeEvent edgeEvent = constructEdgeEvent(tenantId, edge.getId(), EdgeEventActionType.TIMESERIES_UPDATED, device.getId().getId(), EdgeEventType.DEVICE, timeseriesEntityData);
942 - edgeEventService.saveAsync(edgeEvent); 942 + edgeEventService.save(edgeEvent);
943 clusterService.onEdgeEventUpdate(tenantId, edge.getId()); 943 clusterService.onEdgeEventUpdate(tenantId, edge.getId());
944 Assert.assertTrue(edgeImitator.waitForMessages()); 944 Assert.assertTrue(edgeImitator.waitForMessages());
945 945
@@ -978,7 +978,7 @@ abstract public class BaseEdgeTest extends AbstractControllerTest { @@ -978,7 +978,7 @@ abstract public class BaseEdgeTest extends AbstractControllerTest {
978 JsonNode attributesEntityData = mapper.readTree(attributesData); 978 JsonNode attributesEntityData = mapper.readTree(attributesData);
979 EdgeEvent edgeEvent1 = constructEdgeEvent(tenantId, edge.getId(), EdgeEventActionType.ATTRIBUTES_UPDATED, device.getId().getId(), EdgeEventType.DEVICE, attributesEntityData); 979 EdgeEvent edgeEvent1 = constructEdgeEvent(tenantId, edge.getId(), EdgeEventActionType.ATTRIBUTES_UPDATED, device.getId().getId(), EdgeEventType.DEVICE, attributesEntityData);
980 edgeImitator.expectMessageAmount(1); 980 edgeImitator.expectMessageAmount(1);
981 - edgeEventService.saveAsync(edgeEvent1); 981 + edgeEventService.save(edgeEvent1);
982 clusterService.onEdgeEventUpdate(tenantId, edge.getId()); 982 clusterService.onEdgeEventUpdate(tenantId, edge.getId());
983 Assert.assertTrue(edgeImitator.waitForMessages()); 983 Assert.assertTrue(edgeImitator.waitForMessages());
984 984
@@ -1003,7 +1003,7 @@ abstract public class BaseEdgeTest extends AbstractControllerTest { @@ -1003,7 +1003,7 @@ abstract public class BaseEdgeTest extends AbstractControllerTest {
1003 JsonNode postAttributesEntityData = mapper.readTree(postAttributesData); 1003 JsonNode postAttributesEntityData = mapper.readTree(postAttributesData);
1004 EdgeEvent edgeEvent = constructEdgeEvent(tenantId, edge.getId(), EdgeEventActionType.POST_ATTRIBUTES, device.getId().getId(), EdgeEventType.DEVICE, postAttributesEntityData); 1004 EdgeEvent edgeEvent = constructEdgeEvent(tenantId, edge.getId(), EdgeEventActionType.POST_ATTRIBUTES, device.getId().getId(), EdgeEventType.DEVICE, postAttributesEntityData);
1005 edgeImitator.expectMessageAmount(1); 1005 edgeImitator.expectMessageAmount(1);
1006 - edgeEventService.saveAsync(edgeEvent); 1006 + edgeEventService.save(edgeEvent);
1007 clusterService.onEdgeEventUpdate(tenantId, edge.getId()); 1007 clusterService.onEdgeEventUpdate(tenantId, edge.getId());
1008 Assert.assertTrue(edgeImitator.waitForMessages()); 1008 Assert.assertTrue(edgeImitator.waitForMessages());
1009 1009
@@ -1028,7 +1028,7 @@ abstract public class BaseEdgeTest extends AbstractControllerTest { @@ -1028,7 +1028,7 @@ abstract public class BaseEdgeTest extends AbstractControllerTest {
1028 JsonNode deleteAttributesEntityData = mapper.readTree(deleteAttributesData); 1028 JsonNode deleteAttributesEntityData = mapper.readTree(deleteAttributesData);
1029 EdgeEvent edgeEvent = constructEdgeEvent(tenantId, edge.getId(), EdgeEventActionType.ATTRIBUTES_DELETED, device.getId().getId(), EdgeEventType.DEVICE, deleteAttributesEntityData); 1029 EdgeEvent edgeEvent = constructEdgeEvent(tenantId, edge.getId(), EdgeEventActionType.ATTRIBUTES_DELETED, device.getId().getId(), EdgeEventType.DEVICE, deleteAttributesEntityData);
1030 edgeImitator.expectMessageAmount(1); 1030 edgeImitator.expectMessageAmount(1);
1031 - edgeEventService.saveAsync(edgeEvent); 1031 + edgeEventService.save(edgeEvent);
1032 clusterService.onEdgeEventUpdate(tenantId, edge.getId()); 1032 clusterService.onEdgeEventUpdate(tenantId, edge.getId());
1033 Assert.assertTrue(edgeImitator.waitForMessages()); 1033 Assert.assertTrue(edgeImitator.waitForMessages());
1034 1034
@@ -1062,7 +1062,7 @@ abstract public class BaseEdgeTest extends AbstractControllerTest { @@ -1062,7 +1062,7 @@ abstract public class BaseEdgeTest extends AbstractControllerTest {
1062 1062
1063 EdgeEvent edgeEvent = constructEdgeEvent(tenantId, edge.getId(), EdgeEventActionType.RPC_CALL, device.getId().getId(), EdgeEventType.DEVICE, body); 1063 EdgeEvent edgeEvent = constructEdgeEvent(tenantId, edge.getId(), EdgeEventActionType.RPC_CALL, device.getId().getId(), EdgeEventType.DEVICE, body);
1064 edgeImitator.expectMessageAmount(1); 1064 edgeImitator.expectMessageAmount(1);
1065 - edgeEventService.saveAsync(edgeEvent); 1065 + edgeEventService.save(edgeEvent);
1066 clusterService.onEdgeEventUpdate(tenantId, edge.getId()); 1066 clusterService.onEdgeEventUpdate(tenantId, edge.getId());
1067 Assert.assertTrue(edgeImitator.waitForMessages()); 1067 Assert.assertTrue(edgeImitator.waitForMessages());
1068 1068
@@ -1088,7 +1088,7 @@ abstract public class BaseEdgeTest extends AbstractControllerTest { @@ -1088,7 +1088,7 @@ abstract public class BaseEdgeTest extends AbstractControllerTest {
1088 JsonNode timeseriesEntityData = mapper.readTree(timeseriesData); 1088 JsonNode timeseriesEntityData = mapper.readTree(timeseriesData);
1089 EdgeEvent edgeEvent = constructEdgeEvent(tenantId, edge.getId(), EdgeEventActionType.TIMESERIES_UPDATED, 1089 EdgeEvent edgeEvent = constructEdgeEvent(tenantId, edge.getId(), EdgeEventActionType.TIMESERIES_UPDATED,
1090 device.getId().getId(), EdgeEventType.DEVICE, timeseriesEntityData); 1090 device.getId().getId(), EdgeEventType.DEVICE, timeseriesEntityData);
1091 - edgeEventService.saveAsync(edgeEvent); 1091 + edgeEventService.save(edgeEvent);
1092 clusterService.onEdgeEventUpdate(tenantId, edge.getId()); 1092 clusterService.onEdgeEventUpdate(tenantId, edge.getId());
1093 } 1093 }
1094 1094
@@ -15,7 +15,6 @@ @@ -15,7 +15,6 @@
15 */ 15 */
16 package org.thingsboard.server.dao.edge; 16 package org.thingsboard.server.dao.edge;
17 17
18 -import com.google.common.util.concurrent.ListenableFuture;  
19 import org.thingsboard.server.common.data.edge.EdgeEvent; 18 import org.thingsboard.server.common.data.edge.EdgeEvent;
20 import org.thingsboard.server.common.data.id.EdgeId; 19 import org.thingsboard.server.common.data.id.EdgeId;
21 import org.thingsboard.server.common.data.id.TenantId; 20 import org.thingsboard.server.common.data.id.TenantId;
@@ -24,7 +23,7 @@ import org.thingsboard.server.common.data.page.TimePageLink; @@ -24,7 +23,7 @@ import org.thingsboard.server.common.data.page.TimePageLink;
24 23
25 public interface EdgeEventService { 24 public interface EdgeEventService {
26 25
27 - ListenableFuture<EdgeEvent> saveAsync(EdgeEvent edgeEvent); 26 + EdgeEvent save(EdgeEvent edgeEvent);
28 27
29 PageData<EdgeEvent> findEdgeEvents(TenantId tenantId, EdgeId edgeId, TimePageLink pageLink, boolean withTsUpdate); 28 PageData<EdgeEvent> findEdgeEvents(TenantId tenantId, EdgeId edgeId, TimePageLink pageLink, boolean withTsUpdate);
30 29
@@ -15,9 +15,7 @@ @@ -15,9 +15,7 @@
15 */ 15 */
16 package org.thingsboard.server.dao.edge; 16 package org.thingsboard.server.dao.edge;
17 17
18 -import com.google.common.util.concurrent.ListenableFuture;  
19 import lombok.extern.slf4j.Slf4j; 18 import lombok.extern.slf4j.Slf4j;
20 -import org.apache.commons.lang3.StringUtils;  
21 import org.springframework.beans.factory.annotation.Autowired; 19 import org.springframework.beans.factory.annotation.Autowired;
22 import org.springframework.stereotype.Service; 20 import org.springframework.stereotype.Service;
23 import org.thingsboard.server.common.data.edge.EdgeEvent; 21 import org.thingsboard.server.common.data.edge.EdgeEvent;
@@ -36,9 +34,9 @@ public class BaseEdgeEventService implements EdgeEventService { @@ -36,9 +34,9 @@ public class BaseEdgeEventService implements EdgeEventService {
36 private EdgeEventDao edgeEventDao; 34 private EdgeEventDao edgeEventDao;
37 35
38 @Override 36 @Override
39 - public ListenableFuture<EdgeEvent> saveAsync(EdgeEvent edgeEvent) { 37 + public EdgeEvent save(EdgeEvent edgeEvent) {
40 edgeEventValidator.validate(edgeEvent, EdgeEvent::getTenantId); 38 edgeEventValidator.validate(edgeEvent, EdgeEvent::getTenantId);
41 - return edgeEventDao.saveAsync(edgeEvent); 39 + return edgeEventDao.save(edgeEvent);
42 } 40 }
43 41
44 @Override 42 @Override
@@ -30,12 +30,12 @@ import java.util.UUID; @@ -30,12 +30,12 @@ import java.util.UUID;
30 public interface EdgeEventDao extends Dao<EdgeEvent> { 30 public interface EdgeEventDao extends Dao<EdgeEvent> {
31 31
32 /** 32 /**
33 - * Save or update edge event object async 33 + * Save or update edge event object
34 * 34 *
35 * @param edgeEvent the event object 35 * @param edgeEvent the event object
36 * @return saved edge event object future 36 * @return saved edge event object future
37 */ 37 */
38 - ListenableFuture<EdgeEvent> saveAsync(EdgeEvent edgeEvent); 38 + EdgeEvent save(EdgeEvent edgeEvent);
39 39
40 40
41 /** 41 /**
@@ -41,6 +41,10 @@ import java.sql.ResultSet; @@ -41,6 +41,10 @@ import java.sql.ResultSet;
41 import java.sql.SQLException; 41 import java.sql.SQLException;
42 import java.util.Optional; 42 import java.util.Optional;
43 import java.util.UUID; 43 import java.util.UUID;
  44 +import java.util.concurrent.ConcurrentHashMap;
  45 +import java.util.concurrent.ConcurrentMap;
  46 +import java.util.concurrent.locks.Lock;
  47 +import java.util.concurrent.locks.ReentrantLock;
44 48
45 import static org.thingsboard.server.dao.model.ModelConstants.NULL_UUID; 49 import static org.thingsboard.server.dao.model.ModelConstants.NULL_UUID;
46 50
@@ -50,6 +54,8 @@ public class JpaBaseEdgeEventDao extends JpaAbstractSearchTextDao<EdgeEventEntit @@ -50,6 +54,8 @@ public class JpaBaseEdgeEventDao extends JpaAbstractSearchTextDao<EdgeEventEntit
50 54
51 private final UUID systemTenantId = NULL_UUID; 55 private final UUID systemTenantId = NULL_UUID;
52 56
  57 + private final ConcurrentMap<EdgeId, Lock> readWriteLocks = new ConcurrentHashMap<>();
  58 +
53 @Autowired 59 @Autowired
54 private EdgeEventRepository edgeEventRepository; 60 private EdgeEventRepository edgeEventRepository;
55 61
@@ -64,47 +70,59 @@ public class JpaBaseEdgeEventDao extends JpaAbstractSearchTextDao<EdgeEventEntit @@ -64,47 +70,59 @@ public class JpaBaseEdgeEventDao extends JpaAbstractSearchTextDao<EdgeEventEntit
64 } 70 }
65 71
66 @Override 72 @Override
67 - public ListenableFuture<EdgeEvent> saveAsync(EdgeEvent edgeEvent) {  
68 - log.debug("Save edge event [{}] ", edgeEvent);  
69 - if (edgeEvent.getId() == null) {  
70 - UUID timeBased = Uuids.timeBased();  
71 - edgeEvent.setId(new EdgeEventId(timeBased));  
72 - edgeEvent.setCreatedTime(Uuids.unixTimestamp(timeBased));  
73 - } else if (edgeEvent.getCreatedTime() == 0L) {  
74 - UUID eventId = edgeEvent.getId().getId();  
75 - if (eventId.version() == 1) {  
76 - edgeEvent.setCreatedTime(Uuids.unixTimestamp(eventId));  
77 - } else {  
78 - edgeEvent.setCreatedTime(System.currentTimeMillis()); 73 + public EdgeEvent save(EdgeEvent edgeEvent) {
  74 + final Lock readWriteLock = readWriteLocks.computeIfAbsent(edgeEvent.getEdgeId(), id -> new ReentrantLock());
  75 + readWriteLock.lock();
  76 + try {
  77 + log.debug("Save edge event [{}] ", edgeEvent);
  78 + if (edgeEvent.getId() == null) {
  79 + UUID timeBased = Uuids.timeBased();
  80 + edgeEvent.setId(new EdgeEventId(timeBased));
  81 + edgeEvent.setCreatedTime(Uuids.unixTimestamp(timeBased));
  82 + } else if (edgeEvent.getCreatedTime() == 0L) {
  83 + UUID eventId = edgeEvent.getId().getId();
  84 + if (eventId.version() == 1) {
  85 + edgeEvent.setCreatedTime(Uuids.unixTimestamp(eventId));
  86 + } else {
  87 + edgeEvent.setCreatedTime(System.currentTimeMillis());
  88 + }
79 } 89 }
  90 + if (StringUtils.isEmpty(edgeEvent.getUid())) {
  91 + edgeEvent.setUid(edgeEvent.getId().toString());
  92 + }
  93 + return save(new EdgeEventEntity(edgeEvent)).orElse(null);
  94 + } finally {
  95 + readWriteLock.unlock();
80 } 96 }
81 - if (StringUtils.isEmpty(edgeEvent.getUid())) {  
82 - edgeEvent.setUid(edgeEvent.getId().toString());  
83 - }  
84 - return service.submit(() -> save(new EdgeEventEntity(edgeEvent)).orElse(null));  
85 } 97 }
86 98
87 @Override 99 @Override
88 public PageData<EdgeEvent> findEdgeEvents(UUID tenantId, EdgeId edgeId, TimePageLink pageLink, boolean withTsUpdate) { 100 public PageData<EdgeEvent> findEdgeEvents(UUID tenantId, EdgeId edgeId, TimePageLink pageLink, boolean withTsUpdate) {
89 - if (withTsUpdate) {  
90 - return DaoUtil.toPageData(  
91 - edgeEventRepository  
92 - .findEdgeEventsByTenantIdAndEdgeId(  
93 - tenantId,  
94 - edgeId.getId(),  
95 - pageLink.getStartTime(),  
96 - pageLink.getEndTime(),  
97 - DaoUtil.toPageable(pageLink)));  
98 - } else {  
99 - return DaoUtil.toPageData(  
100 - edgeEventRepository  
101 - .findEdgeEventsByTenantIdAndEdgeIdWithoutTimeseriesUpdated(  
102 - tenantId,  
103 - edgeId.getId(),  
104 - pageLink.getStartTime(),  
105 - pageLink.getEndTime(),  
106 - DaoUtil.toPageable(pageLink))); 101 + final Lock readWriteLock = readWriteLocks.computeIfAbsent(edgeId, id -> new ReentrantLock());
  102 + readWriteLock.lock();
  103 + try {
  104 + if (withTsUpdate) {
  105 + return DaoUtil.toPageData(
  106 + edgeEventRepository
  107 + .findEdgeEventsByTenantIdAndEdgeId(
  108 + tenantId,
  109 + edgeId.getId(),
  110 + pageLink.getStartTime(),
  111 + pageLink.getEndTime(),
  112 + DaoUtil.toPageable(pageLink)));
  113 + } else {
  114 + return DaoUtil.toPageData(
  115 + edgeEventRepository
  116 + .findEdgeEventsByTenantIdAndEdgeIdWithoutTimeseriesUpdated(
  117 + tenantId,
  118 + edgeId.getId(),
  119 + pageLink.getStartTime(),
  120 + pageLink.getEndTime(),
  121 + DaoUtil.toPageable(pageLink)));
107 122
  123 + }
  124 + } finally {
  125 + readWriteLock.unlock();
108 } 126 }
109 } 127 }
110 128
@@ -42,7 +42,7 @@ public abstract class BaseEdgeEventServiceTest extends AbstractServiceTest { @@ -42,7 +42,7 @@ public abstract class BaseEdgeEventServiceTest extends AbstractServiceTest {
42 EdgeId edgeId = new EdgeId(Uuids.timeBased()); 42 EdgeId edgeId = new EdgeId(Uuids.timeBased());
43 DeviceId deviceId = new DeviceId(Uuids.timeBased()); 43 DeviceId deviceId = new DeviceId(Uuids.timeBased());
44 EdgeEvent edgeEvent = generateEdgeEvent(null, edgeId, deviceId, EdgeEventActionType.ADDED); 44 EdgeEvent edgeEvent = generateEdgeEvent(null, edgeId, deviceId, EdgeEventActionType.ADDED);
45 - EdgeEvent saved = edgeEventService.saveAsync(edgeEvent).get(); 45 + EdgeEvent saved = edgeEventService.save(edgeEvent);
46 Assert.assertEquals(saved.getTenantId(), edgeEvent.getTenantId()); 46 Assert.assertEquals(saved.getTenantId(), edgeEvent.getTenantId());
47 Assert.assertEquals(saved.getEdgeId(), edgeEvent.getEdgeId()); 47 Assert.assertEquals(saved.getEdgeId(), edgeEvent.getEdgeId());
48 Assert.assertEquals(saved.getEntityId(), edgeEvent.getEntityId()); 48 Assert.assertEquals(saved.getEntityId(), edgeEvent.getEntityId());
@@ -109,7 +109,7 @@ public abstract class BaseEdgeEventServiceTest extends AbstractServiceTest { @@ -109,7 +109,7 @@ public abstract class BaseEdgeEventServiceTest extends AbstractServiceTest {
109 TimePageLink pageLink = new TimePageLink(1); 109 TimePageLink pageLink = new TimePageLink(1);
110 110
111 EdgeEvent edgeEventWithTsUpdate = generateEdgeEvent(tenantId, edgeId, deviceId, EdgeEventActionType.TIMESERIES_UPDATED); 111 EdgeEvent edgeEventWithTsUpdate = generateEdgeEvent(tenantId, edgeId, deviceId, EdgeEventActionType.TIMESERIES_UPDATED);
112 - edgeEventService.saveAsync(edgeEventWithTsUpdate).get(); 112 + edgeEventService.save(edgeEventWithTsUpdate);
113 113
114 PageData<EdgeEvent> allEdgeEvents = edgeEventService.findEdgeEvents(tenantId, edgeId, pageLink, true); 114 PageData<EdgeEvent> allEdgeEvents = edgeEventService.findEdgeEvents(tenantId, edgeId, pageLink, true);
115 PageData<EdgeEvent> edgeEventsWithoutTsUpdate = edgeEventService.findEdgeEvents(tenantId, edgeId, pageLink, false); 115 PageData<EdgeEvent> edgeEventsWithoutTsUpdate = edgeEventService.findEdgeEvents(tenantId, edgeId, pageLink, false);
@@ -124,6 +124,6 @@ public abstract class BaseEdgeEventServiceTest extends AbstractServiceTest { @@ -124,6 +124,6 @@ public abstract class BaseEdgeEventServiceTest extends AbstractServiceTest {
124 private EdgeEvent saveEdgeEventWithProvidedTime(long time, EdgeId edgeId, EntityId entityId, TenantId tenantId) throws Exception { 124 private EdgeEvent saveEdgeEventWithProvidedTime(long time, EdgeId edgeId, EntityId entityId, TenantId tenantId) throws Exception {
125 EdgeEvent edgeEvent = generateEdgeEvent(tenantId, edgeId, entityId, EdgeEventActionType.ADDED); 125 EdgeEvent edgeEvent = generateEdgeEvent(tenantId, edgeId, entityId, EdgeEventActionType.ADDED);
126 edgeEvent.setId(new EdgeEventId(Uuids.startOf(time))); 126 edgeEvent.setId(new EdgeEventId(Uuids.startOf(time)));
127 - return edgeEventService.saveAsync(edgeEvent).get(); 127 + return edgeEventService.save(edgeEvent);
128 } 128 }
129 } 129 }
@@ -149,20 +149,9 @@ public class TbMsgPushToEdgeNode implements TbNode { @@ -149,20 +149,9 @@ public class TbMsgPushToEdgeNode implements TbNode {
149 149
150 private void notifyEdge(TbContext ctx, TbMsg msg, EdgeEvent edgeEvent, EdgeId edgeId) { 150 private void notifyEdge(TbContext ctx, TbMsg msg, EdgeEvent edgeEvent, EdgeId edgeId) {
151 edgeEvent.setEdgeId(edgeId); 151 edgeEvent.setEdgeId(edgeId);
152 - ListenableFuture<EdgeEvent> saveFuture = ctx.getEdgeEventService().saveAsync(edgeEvent);  
153 - Futures.addCallback(saveFuture, new FutureCallback<EdgeEvent>() {  
154 - @Override  
155 - public void onSuccess(@Nullable EdgeEvent event) {  
156 - ctx.tellNext(msg, SUCCESS);  
157 - ctx.onEdgeEventUpdate(ctx.getTenantId(), edgeId);  
158 - }  
159 -  
160 - @Override  
161 - public void onFailure(Throwable th) {  
162 - log.warn("[{}] Can't save edge event [{}] for edge [{}]", ctx.getTenantId().getId(), edgeEvent, edgeId.getId(), th);  
163 - ctx.tellFailure(msg, th);  
164 - }  
165 - }, ctx.getDbCallbackExecutor()); 152 + ctx.getEdgeEventService().save(edgeEvent);
  153 + ctx.tellNext(msg, SUCCESS);
  154 + ctx.onEdgeEventUpdate(ctx.getTenantId(), edgeId);
166 } 155 }
167 156
168 private EdgeEvent buildEdgeEvent(TbMsg msg, TbContext ctx) { 157 private EdgeEvent buildEdgeEvent(TbMsg msg, TbContext ctx) {