thingsboard-aplcache

Improve Relations API.

10/6/2017 6:05:43 AM

Details

diff --git a/application/src/main/java/org/thingsboard/server/controller/EntityRelationController.java b/application/src/main/java/org/thingsboard/server/controller/EntityRelationController.java
index 551e73f..ec7be12 100644
--- a/application/src/main/java/org/thingsboard/server/controller/EntityRelationController.java
+++ b/application/src/main/java/org/thingsboard/server/controller/EntityRelationController.java
@@ -51,7 +51,7 @@ public class EntityRelationController extends BaseController {
             if (relation.getTypeGroup() == null) {
                 relation.setTypeGroup(RelationTypeGroup.COMMON);
             }
-            relationService.saveRelation(relation).get();
+            relationService.saveRelation(relation);
         } catch (Exception e) {
             throw handleException(e);
         }
@@ -76,7 +76,7 @@ public class EntityRelationController extends BaseController {
         checkEntityId(toId);
         RelationTypeGroup relationTypeGroup = parseRelationTypeGroup(strRelationTypeGroup, RelationTypeGroup.COMMON);
         try {
-            Boolean found = relationService.deleteRelation(fromId, toId, strRelationType, relationTypeGroup).get();
+            Boolean found = relationService.deleteRelation(fromId, toId, strRelationType, relationTypeGroup);
             if (!found) {
                 throw new ThingsboardException("Requested item wasn't found!", ThingsboardErrorCode.ITEM_NOT_FOUND);
             }
@@ -95,7 +95,7 @@ public class EntityRelationController extends BaseController {
         EntityId entityId = EntityIdFactory.getByTypeAndId(strType, strId);
         checkEntityId(entityId);
         try {
-            relationService.deleteEntityRelations(entityId).get();
+            relationService.deleteEntityRelations(entityId);
         } catch (Exception e) {
             throw handleException(e);
         }
diff --git a/dao/src/main/java/org/thingsboard/server/dao/alarm/BaseAlarmService.java b/dao/src/main/java/org/thingsboard/server/dao/alarm/BaseAlarmService.java
index cd64f32..be7e44f 100644
--- a/dao/src/main/java/org/thingsboard/server/dao/alarm/BaseAlarmService.java
+++ b/dao/src/main/java/org/thingsboard/server/dao/alarm/BaseAlarmService.java
@@ -307,12 +307,12 @@ public class BaseAlarmService extends AbstractEntityService implements AlarmServ
 
     private void deleteRelation(EntityRelation alarmRelation) throws ExecutionException, InterruptedException {
         log.debug("Deleting Alarm relation: {}", alarmRelation);
-        relationService.deleteRelation(alarmRelation).get();
+        relationService.deleteRelationAsync(alarmRelation).get();
     }
 
     private void createRelation(EntityRelation alarmRelation) throws ExecutionException, InterruptedException {
         log.debug("Creating Alarm relation: {}", alarmRelation);
-        relationService.saveRelation(alarmRelation).get();
+        relationService.saveRelationAsync(alarmRelation).get();
     }
 
     private Alarm merge(Alarm existing, Alarm alarm) {
diff --git a/dao/src/main/java/org/thingsboard/server/dao/entity/AbstractEntityService.java b/dao/src/main/java/org/thingsboard/server/dao/entity/AbstractEntityService.java
index b75196d..a7f1530 100644
--- a/dao/src/main/java/org/thingsboard/server/dao/entity/AbstractEntityService.java
+++ b/dao/src/main/java/org/thingsboard/server/dao/entity/AbstractEntityService.java
@@ -31,12 +31,7 @@ public abstract class AbstractEntityService {
 
     protected void deleteEntityRelations(EntityId entityId) {
         log.trace("Executing deleteEntityRelations [{}]", entityId);
-        try {
-            relationService.deleteEntityRelations(entityId).get();
-        } catch (InterruptedException | ExecutionException e) {
-            throw new RuntimeException(e);
-        }
+        relationService.deleteEntityRelations(entityId);
     }
 
-
 }
diff --git a/dao/src/main/java/org/thingsboard/server/dao/relation/BaseRelationDao.java b/dao/src/main/java/org/thingsboard/server/dao/relation/BaseRelationDao.java
index 9627db3..c313f0b 100644
--- a/dao/src/main/java/org/thingsboard/server/dao/relation/BaseRelationDao.java
+++ b/dao/src/main/java/org/thingsboard/server/dao/relation/BaseRelationDao.java
@@ -140,9 +140,21 @@ public class BaseRelationDao extends CassandraAbstractAsyncDao implements Relati
         return getFuture(executeAsyncRead(stmt), rs -> rs != null ? getEntityRelation(rs.one()) : null);
     }
 
+    @Override
+    public boolean saveRelation(EntityRelation relation) {
+        BoundStatement stmt = getSaveRelationStatement(relation);
+        ResultSet rs = executeWrite(stmt);
+        return rs.wasApplied();
+    }
 
     @Override
-    public ListenableFuture<Boolean> saveRelation(EntityRelation relation) {
+    public ListenableFuture<Boolean> saveRelationAsync(EntityRelation relation) {
+        BoundStatement stmt = getSaveRelationStatement(relation);
+        ResultSetFuture future = executeAsyncWrite(stmt);
+        return getBooleanListenableFuture(future);
+    }
+
+    private BoundStatement getSaveRelationStatement(EntityRelation relation) {
         BoundStatement stmt = getSaveStmt().bind()
                 .setUUID(0, relation.getFrom().getId())
                 .setString(1, relation.getFrom().getEntityType().name())
@@ -151,17 +163,34 @@ public class BaseRelationDao extends CassandraAbstractAsyncDao implements Relati
                 .set(4, relation.getTypeGroup(), relationTypeGroupCodec)
                 .setString(5, relation.getType())
                 .set(6, relation.getAdditionalInfo(), JsonNode.class);
-        ResultSetFuture future = executeAsyncWrite(stmt);
-        return getBooleanListenableFuture(future);
+        return stmt;
     }
 
     @Override
-    public ListenableFuture<Boolean> deleteRelation(EntityRelation relation) {
+    public boolean deleteRelation(EntityRelation relation) {
         return deleteRelation(relation.getFrom(), relation.getTo(), relation.getType(), relation.getTypeGroup());
     }
 
     @Override
-    public ListenableFuture<Boolean> deleteRelation(EntityId from, EntityId to, String relationType, RelationTypeGroup typeGroup) {
+    public ListenableFuture<Boolean> deleteRelationAsync(EntityRelation relation) {
+        return deleteRelationAsync(relation.getFrom(), relation.getTo(), relation.getType(), relation.getTypeGroup());
+    }
+
+    @Override
+    public boolean deleteRelation(EntityId from, EntityId to, String relationType, RelationTypeGroup typeGroup) {
+        BoundStatement stmt = getDeleteRelationStatement(from, to, relationType, typeGroup);
+        ResultSet rs = executeWrite(stmt);
+        return rs.wasApplied();
+    }
+
+    @Override
+    public ListenableFuture<Boolean> deleteRelationAsync(EntityId from, EntityId to, String relationType, RelationTypeGroup typeGroup) {
+        BoundStatement stmt = getDeleteRelationStatement(from, to, relationType, typeGroup);
+        ResultSetFuture future = executeAsyncWrite(stmt);
+        return getBooleanListenableFuture(future);
+    }
+
+    private BoundStatement getDeleteRelationStatement(EntityId from, EntityId to, String relationType, RelationTypeGroup typeGroup) {
         BoundStatement stmt = getDeleteStmt().bind()
                 .setUUID(0, from.getId())
                 .setString(1, from.getEntityType().name())
@@ -169,12 +198,21 @@ public class BaseRelationDao extends CassandraAbstractAsyncDao implements Relati
                 .setString(3, to.getEntityType().name())
                 .set(4, typeGroup, relationTypeGroupCodec)
                 .setString(5, relationType);
-        ResultSetFuture future = executeAsyncWrite(stmt);
-        return getBooleanListenableFuture(future);
+        return stmt;
     }
 
     @Override
-    public ListenableFuture<Boolean> deleteOutboundRelations(EntityId entity) {
+    public boolean deleteOutboundRelations(EntityId entity) {
+        BoundStatement stmt = getDeleteAllByEntityStmt().bind()
+                .setUUID(0, entity.getId())
+                .setString(1, entity.getEntityType().name());
+        ResultSet rs = executeWrite(stmt);
+        return rs.wasApplied();
+    }
+
+
+    @Override
+    public ListenableFuture<Boolean> deleteOutboundRelationsAsync(EntityId entity) {
         BoundStatement stmt = getDeleteAllByEntityStmt().bind()
                 .setUUID(0, entity.getId())
                 .setString(1, entity.getEntityType().name());
diff --git a/dao/src/main/java/org/thingsboard/server/dao/relation/BaseRelationService.java b/dao/src/main/java/org/thingsboard/server/dao/relation/BaseRelationService.java
index 5c29a37..3574e83 100644
--- a/dao/src/main/java/org/thingsboard/server/dao/relation/BaseRelationService.java
+++ b/dao/src/main/java/org/thingsboard/server/dao/relation/BaseRelationService.java
@@ -31,6 +31,7 @@ import org.thingsboard.server.dao.exception.DataValidationException;
 import javax.annotation.Nullable;
 import java.util.*;
 import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.ExecutionException;
 import java.util.function.BiConsumer;
 
 /**
@@ -61,28 +62,49 @@ public class BaseRelationService implements RelationService {
     }
 
     @Override
-    public ListenableFuture<Boolean> saveRelation(EntityRelation relation) {
+    public boolean saveRelation(EntityRelation relation) {
         log.trace("Executing saveRelation [{}]", relation);
         validate(relation);
         return relationDao.saveRelation(relation);
     }
 
     @Override
-    public ListenableFuture<Boolean> deleteRelation(EntityRelation relation) {
+    public ListenableFuture<Boolean> saveRelationAsync(EntityRelation relation) {
+        log.trace("Executing saveRelationAsync [{}]", relation);
+        validate(relation);
+        return relationDao.saveRelationAsync(relation);
+    }
+
+    @Override
+    public boolean deleteRelation(EntityRelation relation) {
         log.trace("Executing deleteRelation [{}]", relation);
         validate(relation);
         return relationDao.deleteRelation(relation);
     }
 
     @Override
-    public ListenableFuture<Boolean> deleteRelation(EntityId from, EntityId to, String relationType, RelationTypeGroup typeGroup) {
+    public ListenableFuture<Boolean> deleteRelationAsync(EntityRelation relation) {
+        log.trace("Executing deleteRelationAsync [{}]", relation);
+        validate(relation);
+        return relationDao.deleteRelationAsync(relation);
+    }
+
+    @Override
+    public boolean deleteRelation(EntityId from, EntityId to, String relationType, RelationTypeGroup typeGroup) {
         log.trace("Executing deleteRelation [{}][{}][{}][{}]", from, to, relationType, typeGroup);
         validate(from, to, relationType, typeGroup);
         return relationDao.deleteRelation(from, to, relationType, typeGroup);
     }
 
     @Override
-    public ListenableFuture<Boolean> deleteEntityRelations(EntityId entity) {
+    public ListenableFuture<Boolean> deleteRelationAsync(EntityId from, EntityId to, String relationType, RelationTypeGroup typeGroup) {
+        log.trace("Executing deleteRelationAsync [{}][{}][{}][{}]", from, to, relationType, typeGroup);
+        validate(from, to, relationType, typeGroup);
+        return relationDao.deleteRelationAsync(from, to, relationType, typeGroup);
+    }
+
+    @Override
+    public boolean deleteEntityRelations(EntityId entity) {
         log.trace("Executing deleteEntityRelations [{}]", entity);
         validate(entity);
         List<ListenableFuture<List<EntityRelation>>> inboundRelationsList = new ArrayList<>();
@@ -90,12 +112,42 @@ public class BaseRelationService implements RelationService {
             inboundRelationsList.add(relationDao.findAllByTo(entity, typeGroup));
         }
         ListenableFuture<List<List<EntityRelation>>> inboundRelations = Futures.allAsList(inboundRelationsList);
+        ListenableFuture<List<Boolean>> inboundDeletions = Futures.transform(inboundRelations, new Function<List<List<EntityRelation>>, List<Boolean>>() {
+            @Override
+            public List<Boolean> apply(List<List<EntityRelation>> relations) {
+                List<Boolean> results = new ArrayList<>();
+                for (List<EntityRelation> relationList : relations) {
+                    relationList.stream().forEach(relation -> results.add(relationDao.deleteRelation(relation)));
+                }
+                return results;
+            }
+        });
+        ListenableFuture<Boolean> inboundFuture = Futures.transform(inboundDeletions, getListToBooleanFunction());
+        boolean inboundDeleteResult = false;
+        try {
+            inboundDeleteResult = inboundFuture.get();
+        } catch (InterruptedException | ExecutionException e) {
+            log.error("Error deleting entity inbound relations", e);
+        }
+        boolean outboundDeleteResult = relationDao.deleteOutboundRelations(entity);
+        return inboundDeleteResult && outboundDeleteResult;
+    }
+
+    @Override
+    public ListenableFuture<Boolean> deleteEntityRelationsAsync(EntityId entity) {
+        log.trace("Executing deleteEntityRelationsAsync [{}]", entity);
+        validate(entity);
+        List<ListenableFuture<List<EntityRelation>>> inboundRelationsList = new ArrayList<>();
+        for (RelationTypeGroup typeGroup : RelationTypeGroup.values()) {
+            inboundRelationsList.add(relationDao.findAllByTo(entity, typeGroup));
+        }
+        ListenableFuture<List<List<EntityRelation>>> inboundRelations = Futures.allAsList(inboundRelationsList);
         ListenableFuture<List<Boolean>> inboundDeletions = Futures.transform(inboundRelations, new AsyncFunction<List<List<EntityRelation>>, List<Boolean>>() {
             @Override
             public ListenableFuture<List<Boolean>> apply(List<List<EntityRelation>> relations) throws Exception {
                 List<ListenableFuture<Boolean>> results = new ArrayList<>();
                 for (List<EntityRelation> relationList : relations) {
-                    relationList.stream().forEach(relation -> results.add(relationDao.deleteRelation(relation)));
+                    relationList.stream().forEach(relation -> results.add(relationDao.deleteRelationAsync(relation)));
                 }
                 return Futures.allAsList(results);
             }
@@ -103,7 +155,7 @@ public class BaseRelationService implements RelationService {
 
         ListenableFuture<Boolean> inboundFuture = Futures.transform(inboundDeletions, getListToBooleanFunction());
 
-        ListenableFuture<Boolean> outboundFuture = relationDao.deleteOutboundRelations(entity);
+        ListenableFuture<Boolean> outboundFuture = relationDao.deleteOutboundRelationsAsync(entity);
 
         return Futures.transform(Futures.allAsList(Arrays.asList(inboundFuture, outboundFuture)), getListToBooleanFunction());
     }
diff --git a/dao/src/main/java/org/thingsboard/server/dao/relation/RelationDao.java b/dao/src/main/java/org/thingsboard/server/dao/relation/RelationDao.java
index ec946d0..edd6d87 100644
--- a/dao/src/main/java/org/thingsboard/server/dao/relation/RelationDao.java
+++ b/dao/src/main/java/org/thingsboard/server/dao/relation/RelationDao.java
@@ -41,13 +41,21 @@ public interface RelationDao {
 
     ListenableFuture<EntityRelation> getRelation(EntityId from, EntityId to, String relationType, RelationTypeGroup typeGroup);
 
-    ListenableFuture<Boolean> saveRelation(EntityRelation relation);
+    boolean saveRelation(EntityRelation relation);
 
-    ListenableFuture<Boolean> deleteRelation(EntityRelation relation);
+    ListenableFuture<Boolean> saveRelationAsync(EntityRelation relation);
 
-    ListenableFuture<Boolean> deleteRelation(EntityId from, EntityId to, String relationType, RelationTypeGroup typeGroup);
+    boolean deleteRelation(EntityRelation relation);
 
-    ListenableFuture<Boolean> deleteOutboundRelations(EntityId entity);
+    ListenableFuture<Boolean> deleteRelationAsync(EntityRelation relation);
+
+    boolean deleteRelation(EntityId from, EntityId to, String relationType, RelationTypeGroup typeGroup);
+
+    ListenableFuture<Boolean> deleteRelationAsync(EntityId from, EntityId to, String relationType, RelationTypeGroup typeGroup);
+
+    boolean deleteOutboundRelations(EntityId entity);
+
+    ListenableFuture<Boolean> deleteOutboundRelationsAsync(EntityId entity);
 
     ListenableFuture<List<EntityRelation>> findRelations(EntityId from, String relationType, RelationTypeGroup typeGroup, EntityType toType, TimePageLink pageLink);
 
diff --git a/dao/src/main/java/org/thingsboard/server/dao/relation/RelationService.java b/dao/src/main/java/org/thingsboard/server/dao/relation/RelationService.java
index 89aae8e..cef9393 100644
--- a/dao/src/main/java/org/thingsboard/server/dao/relation/RelationService.java
+++ b/dao/src/main/java/org/thingsboard/server/dao/relation/RelationService.java
@@ -33,13 +33,21 @@ public interface RelationService {
 
     ListenableFuture<EntityRelation> getRelation(EntityId from, EntityId to, String relationType, RelationTypeGroup typeGroup);
 
-    ListenableFuture<Boolean> saveRelation(EntityRelation relation);
+    boolean saveRelation(EntityRelation relation);
 
-    ListenableFuture<Boolean> deleteRelation(EntityRelation relation);
+    ListenableFuture<Boolean> saveRelationAsync(EntityRelation relation);
 
-    ListenableFuture<Boolean> deleteRelation(EntityId from, EntityId to, String relationType, RelationTypeGroup typeGroup);
+    boolean deleteRelation(EntityRelation relation);
 
-    ListenableFuture<Boolean> deleteEntityRelations(EntityId entity);
+    ListenableFuture<Boolean> deleteRelationAsync(EntityRelation relation);
+
+    boolean deleteRelation(EntityId from, EntityId to, String relationType, RelationTypeGroup typeGroup);
+
+    ListenableFuture<Boolean> deleteRelationAsync(EntityId from, EntityId to, String relationType, RelationTypeGroup typeGroup);
+
+    boolean deleteEntityRelations(EntityId entity);
+
+    ListenableFuture<Boolean> deleteEntityRelationsAsync(EntityId entity);
 
     ListenableFuture<List<EntityRelation>> findByFrom(EntityId from, RelationTypeGroup typeGroup);
 
diff --git a/dao/src/main/java/org/thingsboard/server/dao/sql/relation/JpaRelationDao.java b/dao/src/main/java/org/thingsboard/server/dao/sql/relation/JpaRelationDao.java
index 16aabac..b996aea 100644
--- a/dao/src/main/java/org/thingsboard/server/dao/sql/relation/JpaRelationDao.java
+++ b/dao/src/main/java/org/thingsboard/server/dao/sql/relation/JpaRelationDao.java
@@ -120,12 +120,25 @@ public class JpaRelationDao extends JpaAbstractDaoListeningExecutorService imple
     }
 
     @Override
-    public ListenableFuture<Boolean> saveRelation(EntityRelation relation) {
+    public boolean saveRelation(EntityRelation relation) {
+        return relationRepository.save(new RelationEntity(relation)) != null;
+    }
+
+    @Override
+    public ListenableFuture<Boolean> saveRelationAsync(EntityRelation relation) {
         return service.submit(() -> relationRepository.save(new RelationEntity(relation)) != null);
     }
 
     @Override
-    public ListenableFuture<Boolean> deleteRelation(EntityRelation relation) {
+    public boolean deleteRelation(EntityRelation relation) {
+        RelationCompositeKey key = new RelationCompositeKey(relation);
+        boolean relationExistsBeforeDelete = relationRepository.exists(key);
+        relationRepository.delete(key);
+        return relationExistsBeforeDelete;
+    }
+
+    @Override
+    public ListenableFuture<Boolean> deleteRelationAsync(EntityRelation relation) {
         RelationCompositeKey key = new RelationCompositeKey(relation);
         return service.submit(
                 () -> {
@@ -136,7 +149,15 @@ public class JpaRelationDao extends JpaAbstractDaoListeningExecutorService imple
     }
 
     @Override
-    public ListenableFuture<Boolean> deleteRelation(EntityId from, EntityId to, String relationType, RelationTypeGroup typeGroup) {
+    public boolean deleteRelation(EntityId from, EntityId to, String relationType, RelationTypeGroup typeGroup) {
+        RelationCompositeKey key = getRelationCompositeKey(from, to, relationType, typeGroup);
+        boolean relationExistsBeforeDelete = relationRepository.exists(key);
+        relationRepository.delete(key);
+        return relationExistsBeforeDelete;
+    }
+
+    @Override
+    public ListenableFuture<Boolean> deleteRelationAsync(EntityId from, EntityId to, String relationType, RelationTypeGroup typeGroup) {
         RelationCompositeKey key = getRelationCompositeKey(from, to, relationType, typeGroup);
         return service.submit(
                 () -> {
@@ -147,7 +168,16 @@ public class JpaRelationDao extends JpaAbstractDaoListeningExecutorService imple
     }
 
     @Override
-    public ListenableFuture<Boolean> deleteOutboundRelations(EntityId entity) {
+    public boolean deleteOutboundRelations(EntityId entity) {
+        boolean relationExistsBeforeDelete = relationRepository
+                .findAllByFromIdAndFromType(UUIDConverter.fromTimeUUID(entity.getId()), entity.getEntityType().name())
+                .size() > 0;
+        relationRepository.deleteByFromIdAndFromType(UUIDConverter.fromTimeUUID(entity.getId()), entity.getEntityType().name());
+        return relationExistsBeforeDelete;
+    }
+
+    @Override
+    public ListenableFuture<Boolean> deleteOutboundRelationsAsync(EntityId entity) {
         return service.submit(
                 () -> {
                     boolean relationExistsBeforeDelete = relationRepository
diff --git a/dao/src/test/java/org/thingsboard/server/dao/service/BaseAlarmServiceTest.java b/dao/src/test/java/org/thingsboard/server/dao/service/BaseAlarmServiceTest.java
index b208e75..23fc3cc 100644
--- a/dao/src/test/java/org/thingsboard/server/dao/service/BaseAlarmServiceTest.java
+++ b/dao/src/test/java/org/thingsboard/server/dao/service/BaseAlarmServiceTest.java
@@ -57,7 +57,7 @@ public abstract class BaseAlarmServiceTest extends AbstractServiceTest {
 
         EntityRelation relation = new EntityRelation(parentId, childId, EntityRelation.CONTAINS_TYPE);
 
-        Assert.assertTrue(relationService.saveRelation(relation).get());
+        Assert.assertTrue(relationService.saveRelationAsync(relation).get());
 
         long ts = System.currentTimeMillis();
         Alarm alarm = Alarm.builder().tenantId(tenantId).originator(childId)
@@ -94,7 +94,7 @@ public abstract class BaseAlarmServiceTest extends AbstractServiceTest {
 
         EntityRelation relation = new EntityRelation(parentId, childId, EntityRelation.CONTAINS_TYPE);
 
-        Assert.assertTrue(relationService.saveRelation(relation).get());
+        Assert.assertTrue(relationService.saveRelationAsync(relation).get());
 
         long ts = System.currentTimeMillis();
         Alarm alarm = Alarm.builder().tenantId(tenantId).originator(childId)
diff --git a/dao/src/test/java/org/thingsboard/server/dao/service/BaseRelationServiceTest.java b/dao/src/test/java/org/thingsboard/server/dao/service/BaseRelationServiceTest.java
index d76265d..6b58af8 100644
--- a/dao/src/test/java/org/thingsboard/server/dao/service/BaseRelationServiceTest.java
+++ b/dao/src/test/java/org/thingsboard/server/dao/service/BaseRelationServiceTest.java
@@ -75,13 +75,13 @@ public abstract class BaseRelationServiceTest extends AbstractServiceTest {
         saveRelation(relationA);
         saveRelation(relationB);
 
-        Assert.assertTrue(relationService.deleteRelation(relationA).get());
+        Assert.assertTrue(relationService.deleteRelationAsync(relationA).get());
 
         Assert.assertFalse(relationService.checkRelation(parentId, childId, EntityRelation.CONTAINS_TYPE, RelationTypeGroup.COMMON).get());
 
         Assert.assertTrue(relationService.checkRelation(childId, subChildId, EntityRelation.CONTAINS_TYPE, RelationTypeGroup.COMMON).get());
 
-        Assert.assertTrue(relationService.deleteRelation(childId, subChildId, EntityRelation.CONTAINS_TYPE, RelationTypeGroup.COMMON).get());
+        Assert.assertTrue(relationService.deleteRelationAsync(childId, subChildId, EntityRelation.CONTAINS_TYPE, RelationTypeGroup.COMMON).get());
     }
 
     @Test
@@ -96,7 +96,7 @@ public abstract class BaseRelationServiceTest extends AbstractServiceTest {
         saveRelation(relationA);
         saveRelation(relationB);
 
-        Assert.assertTrue(relationService.deleteEntityRelations(childId).get());
+        Assert.assertTrue(relationService.deleteEntityRelationsAsync(childId).get());
 
         Assert.assertFalse(relationService.checkRelation(parentId, childId, EntityRelation.CONTAINS_TYPE, RelationTypeGroup.COMMON).get());
 
@@ -152,7 +152,7 @@ public abstract class BaseRelationServiceTest extends AbstractServiceTest {
     }
 
     private Boolean saveRelation(EntityRelation relationA1) throws ExecutionException, InterruptedException {
-        return relationService.saveRelation(relationA1).get();
+        return relationService.saveRelationAsync(relationA1).get();
     }
 
     @Test
diff --git a/transport/mqtt/src/main/java/org/thingsboard/server/transport/mqtt/session/GatewaySessionCtx.java b/transport/mqtt/src/main/java/org/thingsboard/server/transport/mqtt/session/GatewaySessionCtx.java
index 27c4f88..00d1f0c 100644
--- a/transport/mqtt/src/main/java/org/thingsboard/server/transport/mqtt/session/GatewaySessionCtx.java
+++ b/transport/mqtt/src/main/java/org/thingsboard/server/transport/mqtt/session/GatewaySessionCtx.java
@@ -94,7 +94,7 @@ public class GatewaySessionCtx {
                 newDevice.setName(deviceName);
                 newDevice.setType(deviceType);
                 newDevice = deviceService.saveDevice(newDevice);
-                relationService.saveRelation(new EntityRelation(gateway.getId(), newDevice.getId(), "Created"));
+                relationService.saveRelationAsync(new EntityRelation(gateway.getId(), newDevice.getId(), "Created"));
                 return newDevice;
             });
             GatewayDeviceSessionCtx ctx = new GatewayDeviceSessionCtx(this, device);