Commit 612a17af3bc95ccc84e9f738d4121390031436b1

Authored by Volodymyr Babak
Committed by Andrew Shvayka
1 parent 27c9ad95

Clean up cache in case entity was renamed

@@ -16,7 +16,6 @@ @@ -16,7 +16,6 @@
16 package org.thingsboard.server.dao.asset; 16 package org.thingsboard.server.dao.asset;
17 17
18 18
19 -import com.google.common.base.Function;  
20 import com.google.common.util.concurrent.Futures; 19 import com.google.common.util.concurrent.Futures;
21 import com.google.common.util.concurrent.ListenableFuture; 20 import com.google.common.util.concurrent.ListenableFuture;
22 import com.google.common.util.concurrent.MoreExecutors; 21 import com.google.common.util.concurrent.MoreExecutors;
@@ -46,11 +45,10 @@ import org.thingsboard.server.common.data.id.EntityId; @@ -46,11 +45,10 @@ import org.thingsboard.server.common.data.id.EntityId;
46 import org.thingsboard.server.common.data.id.TenantId; 45 import org.thingsboard.server.common.data.id.TenantId;
47 import org.thingsboard.server.common.data.page.PageData; 46 import org.thingsboard.server.common.data.page.PageData;
48 import org.thingsboard.server.common.data.page.PageLink; 47 import org.thingsboard.server.common.data.page.PageLink;
49 -import org.thingsboard.server.common.data.page.TimePageLink;  
50 import org.thingsboard.server.common.data.relation.EntityRelation; 48 import org.thingsboard.server.common.data.relation.EntityRelation;
51 import org.thingsboard.server.common.data.relation.EntitySearchDirection; 49 import org.thingsboard.server.common.data.relation.EntitySearchDirection;
52 -import org.thingsboard.server.common.data.tenant.profile.DefaultTenantProfileConfiguration;  
53 import org.thingsboard.server.common.data.relation.RelationTypeGroup; 50 import org.thingsboard.server.common.data.relation.RelationTypeGroup;
  51 +import org.thingsboard.server.common.data.tenant.profile.DefaultTenantProfileConfiguration;
54 import org.thingsboard.server.dao.customer.CustomerDao; 52 import org.thingsboard.server.dao.customer.CustomerDao;
55 import org.thingsboard.server.dao.entity.AbstractEntityService; 53 import org.thingsboard.server.dao.entity.AbstractEntityService;
56 import org.thingsboard.server.dao.exception.DataValidationException; 54 import org.thingsboard.server.dao.exception.DataValidationException;
@@ -59,8 +57,8 @@ import org.thingsboard.server.dao.service.PaginatedRemover; @@ -59,8 +57,8 @@ import org.thingsboard.server.dao.service.PaginatedRemover;
59 import org.thingsboard.server.dao.tenant.TbTenantProfileCache; 57 import org.thingsboard.server.dao.tenant.TbTenantProfileCache;
60 import org.thingsboard.server.dao.tenant.TenantDao; 58 import org.thingsboard.server.dao.tenant.TenantDao;
61 59
62 -import javax.annotation.Nullable;  
63 import java.util.ArrayList; 60 import java.util.ArrayList;
  61 +import java.util.Arrays;
64 import java.util.Collections; 62 import java.util.Collections;
65 import java.util.Comparator; 63 import java.util.Comparator;
66 import java.util.List; 64 import java.util.List;
@@ -180,15 +178,16 @@ public class BaseAssetService extends AbstractEntityService implements AssetServ @@ -180,15 +178,16 @@ public class BaseAssetService extends AbstractEntityService implements AssetServ
180 throw new RuntimeException("Exception while finding entity views for assetId [" + assetId + "]", e); 178 throw new RuntimeException("Exception while finding entity views for assetId [" + assetId + "]", e);
181 } 179 }
182 180
183 - List<Object> list = new ArrayList<>();  
184 - list.add(asset.getTenantId());  
185 - list.add(asset.getName());  
186 - Cache cache = cacheManager.getCache(ASSET_CACHE);  
187 - cache.evict(list); 181 + removeAssetFromCacheByName(asset.getTenantId(), asset.getName());
188 182
189 assetDao.removeById(tenantId, assetId.getId()); 183 assetDao.removeById(tenantId, assetId.getId());
190 } 184 }
191 185
  186 + private void removeAssetFromCacheByName(TenantId tenantId, String name) {
  187 + Cache cache = cacheManager.getCache(ASSET_CACHE);
  188 + cache.evict(Arrays.asList(tenantId, name));
  189 + }
  190 +
192 @Override 191 @Override
193 public PageData<Asset> findAssetsByTenantId(TenantId tenantId, PageLink pageLink) { 192 public PageData<Asset> findAssetsByTenantId(TenantId tenantId, PageLink pageLink) {
194 log.trace("Executing findAssetsByTenantId, tenantId [{}], pageLink [{}]", tenantId, pageLink); 193 log.trace("Executing findAssetsByTenantId, tenantId [{}], pageLink [{}]", tenantId, pageLink);
@@ -397,6 +396,13 @@ public class BaseAssetService extends AbstractEntityService implements AssetServ @@ -397,6 +396,13 @@ public class BaseAssetService extends AbstractEntityService implements AssetServ
397 396
398 @Override 397 @Override
399 protected void validateUpdate(TenantId tenantId, Asset asset) { 398 protected void validateUpdate(TenantId tenantId, Asset asset) {
  399 + Asset old = assetDao.findById(asset.getTenantId(), asset.getId().getId());
  400 + if (old == null) {
  401 + throw new DataValidationException("Can't update non existing asset!");
  402 + }
  403 + if (!old.getName().equals(asset.getName())) {
  404 + removeAssetFromCacheByName(tenantId, old.getName());
  405 + }
400 } 406 }
401 407
402 @Override 408 @Override
@@ -84,6 +84,7 @@ import org.thingsboard.common.util.JacksonUtil; @@ -84,6 +84,7 @@ import org.thingsboard.common.util.JacksonUtil;
84 84
85 import javax.annotation.Nullable; 85 import javax.annotation.Nullable;
86 import java.util.ArrayList; 86 import java.util.ArrayList;
  87 +import java.util.Arrays;
87 import java.util.Collections; 88 import java.util.Collections;
88 import java.util.Comparator; 89 import java.util.Comparator;
89 import java.util.List; 90 import java.util.List;
@@ -245,7 +246,7 @@ public class DeviceServiceImpl extends AbstractEntityService implements DeviceSe @@ -245,7 +246,7 @@ public class DeviceServiceImpl extends AbstractEntityService implements DeviceSe
245 ConstraintViolationException e = extractConstraintViolationException(t).orElse(null); 246 ConstraintViolationException e = extractConstraintViolationException(t).orElse(null);
246 if (e != null && e.getConstraintName() != null && e.getConstraintName().equalsIgnoreCase("device_name_unq_key")) { 247 if (e != null && e.getConstraintName() != null && e.getConstraintName().equalsIgnoreCase("device_name_unq_key")) {
247 // remove device from cache in case null value cached in the distributed redis. 248 // remove device from cache in case null value cached in the distributed redis.
248 - removeDeviceFromCache(device.getTenantId(), device.getName()); 249 + removeDeviceFromCacheByName(device.getTenantId(), device.getName());
249 throw new DataValidationException("Device with such name already exists!"); 250 throw new DataValidationException("Device with such name already exists!");
250 } else { 251 } else {
251 throw t; 252 throw t;
@@ -322,17 +323,14 @@ public class DeviceServiceImpl extends AbstractEntityService implements DeviceSe @@ -322,17 +323,14 @@ public class DeviceServiceImpl extends AbstractEntityService implements DeviceSe
322 } 323 }
323 deleteEntityRelations(tenantId, deviceId); 324 deleteEntityRelations(tenantId, deviceId);
324 325
325 - removeDeviceFromCache(tenantId, device.getName()); 326 + removeDeviceFromCacheByName(tenantId, device.getName());
326 327
327 deviceDao.removeById(tenantId, deviceId.getId()); 328 deviceDao.removeById(tenantId, deviceId.getId());
328 } 329 }
329 330
330 - private void removeDeviceFromCache(TenantId tenantId, String name) {  
331 - List<Object> list = new ArrayList<>();  
332 - list.add(tenantId);  
333 - list.add(name); 331 + private void removeDeviceFromCacheByName(TenantId tenantId, String name) {
334 Cache cache = cacheManager.getCache(DEVICE_CACHE); 332 Cache cache = cacheManager.getCache(DEVICE_CACHE);
335 - cache.evict(list); 333 + cache.evict(Arrays.asList(tenantId, name));
336 } 334 }
337 335
338 @Override 336 @Override
@@ -671,6 +669,9 @@ public class DeviceServiceImpl extends AbstractEntityService implements DeviceSe @@ -671,6 +669,9 @@ public class DeviceServiceImpl extends AbstractEntityService implements DeviceSe
671 if (old == null) { 669 if (old == null) {
672 throw new DataValidationException("Can't update non existing device!"); 670 throw new DataValidationException("Can't update non existing device!");
673 } 671 }
  672 + if (!old.getName().equals(device.getName())) {
  673 + removeDeviceFromCacheByName(tenantId, old.getName());
  674 + }
674 } 675 }
675 676
676 @Override 677 @Override
@@ -58,7 +58,6 @@ import org.thingsboard.server.common.data.id.TenantId; @@ -58,7 +58,6 @@ import org.thingsboard.server.common.data.id.TenantId;
58 import org.thingsboard.server.common.data.id.UserId; 58 import org.thingsboard.server.common.data.id.UserId;
59 import org.thingsboard.server.common.data.page.PageData; 59 import org.thingsboard.server.common.data.page.PageData;
60 import org.thingsboard.server.common.data.page.PageLink; 60 import org.thingsboard.server.common.data.page.PageLink;
61 -import org.thingsboard.server.common.data.page.TimePageLink;  
62 import org.thingsboard.server.common.data.relation.EntityRelation; 61 import org.thingsboard.server.common.data.relation.EntityRelation;
63 import org.thingsboard.server.common.data.relation.EntitySearchDirection; 62 import org.thingsboard.server.common.data.relation.EntitySearchDirection;
64 import org.thingsboard.server.common.data.relation.RelationTypeGroup; 63 import org.thingsboard.server.common.data.relation.RelationTypeGroup;
@@ -80,6 +79,7 @@ import javax.annotation.PostConstruct; @@ -80,6 +79,7 @@ import javax.annotation.PostConstruct;
80 import java.net.InetSocketAddress; 79 import java.net.InetSocketAddress;
81 import java.net.Proxy; 80 import java.net.Proxy;
82 import java.util.ArrayList; 81 import java.util.ArrayList;
  82 +import java.util.Arrays;
83 import java.util.Collections; 83 import java.util.Collections;
84 import java.util.Comparator; 84 import java.util.Comparator;
85 import java.util.HashMap; 85 import java.util.HashMap;
@@ -222,17 +222,18 @@ public class EdgeServiceImpl extends AbstractEntityService implements EdgeServic @@ -222,17 +222,18 @@ public class EdgeServiceImpl extends AbstractEntityService implements EdgeServic
222 222
223 Edge edge = edgeDao.findById(tenantId, edgeId.getId()); 223 Edge edge = edgeDao.findById(tenantId, edgeId.getId());
224 224
225 - List<Object> list = new ArrayList<>();  
226 - list.add(edge.getTenantId());  
227 - list.add(edge.getName());  
228 - Cache cache = cacheManager.getCache(EDGE_CACHE);  
229 - cache.evict(list);  
230 -  
231 deleteEntityRelations(tenantId, edgeId); 225 deleteEntityRelations(tenantId, edgeId);
232 226
  227 + removeEdgeFromCacheByName(edge.getTenantId(), edge.getName());
  228 +
233 edgeDao.removeById(tenantId, edgeId.getId()); 229 edgeDao.removeById(tenantId, edgeId.getId());
234 } 230 }
235 231
  232 + private void removeEdgeFromCacheByName(TenantId tenantId, String name) {
  233 + Cache cache = cacheManager.getCache(EDGE_CACHE);
  234 + cache.evict(Arrays.asList(tenantId, name));
  235 + }
  236 +
236 @Override 237 @Override
237 public PageData<Edge> findEdgesByTenantId(TenantId tenantId, PageLink pageLink) { 238 public PageData<Edge> findEdgesByTenantId(TenantId tenantId, PageLink pageLink) {
238 log.trace("Executing findEdgesByTenantId, tenantId [{}], pageLink [{}]", tenantId, pageLink); 239 log.trace("Executing findEdgesByTenantId, tenantId [{}], pageLink [{}]", tenantId, pageLink);
@@ -423,6 +424,10 @@ public class EdgeServiceImpl extends AbstractEntityService implements EdgeServic @@ -423,6 +424,10 @@ public class EdgeServiceImpl extends AbstractEntityService implements EdgeServic
423 424
424 @Override 425 @Override
425 protected void validateUpdate(TenantId tenantId, Edge edge) { 426 protected void validateUpdate(TenantId tenantId, Edge edge) {
  427 + Edge old = edgeDao.findById(edge.getTenantId(), edge.getId().getId());
  428 + if (!old.getName().equals(edge.getName())) {
  429 + removeEdgeFromCacheByName(tenantId, old.getName());
  430 + }
426 } 431 }
427 432
428 @Override 433 @Override
@@ -632,4 +632,25 @@ public abstract class BaseAssetServiceTest extends AbstractServiceTest { @@ -632,4 +632,25 @@ public abstract class BaseAssetServiceTest extends AbstractServiceTest {
632 customerService.deleteCustomer(tenantId, customerId); 632 customerService.deleteCustomer(tenantId, customerId);
633 } 633 }
634 634
  635 + @Test
  636 + public void testCleanCacheIfAssetRenamed() {
  637 + String assetNameBeforeRename = RandomStringUtils.randomAlphanumeric(15);
  638 + String assetNameAfterRename = RandomStringUtils.randomAlphanumeric(15);
  639 +
  640 + Asset asset = new Asset();
  641 + asset.setTenantId(tenantId);
  642 + asset.setName(assetNameBeforeRename);
  643 + asset.setType("default");
  644 + assetService.saveAsset(asset);
  645 +
  646 + Asset savedAsset = assetService.findAssetByTenantIdAndName(tenantId, assetNameBeforeRename);
  647 +
  648 + savedAsset.setName(assetNameAfterRename);
  649 + assetService.saveAsset(savedAsset);
  650 +
  651 + Asset renamedAsset = assetService.findAssetByTenantIdAndName(tenantId, assetNameBeforeRename);
  652 +
  653 + Assert.assertNull("Can't find asset by name in cache if it was renamed", renamedAsset);
  654 + assetService.deleteAsset(tenantId, savedAsset.getId());
  655 + }
635 } 656 }
@@ -793,4 +793,25 @@ public abstract class BaseDeviceServiceTest extends AbstractServiceTest { @@ -793,4 +793,25 @@ public abstract class BaseDeviceServiceTest extends AbstractServiceTest {
793 customerService.deleteCustomer(tenantId, customerId); 793 customerService.deleteCustomer(tenantId, customerId);
794 } 794 }
795 795
  796 + @Test
  797 + public void testCleanCacheIfDeviceRenamed() {
  798 + String deviceNameBeforeRename = RandomStringUtils.randomAlphanumeric(15);
  799 + String deviceNameAfterRename = RandomStringUtils.randomAlphanumeric(15);
  800 +
  801 + Device device = new Device();
  802 + device.setTenantId(tenantId);
  803 + device.setName(deviceNameBeforeRename);
  804 + device.setType("default");
  805 + deviceService.saveDevice(device);
  806 +
  807 + Device savedDevice = deviceService.findDeviceByTenantIdAndName(tenantId, deviceNameBeforeRename);
  808 +
  809 + savedDevice.setName(deviceNameAfterRename);
  810 + deviceService.saveDevice(savedDevice);
  811 +
  812 + Device renamedDevice = deviceService.findDeviceByTenantIdAndName(tenantId, deviceNameBeforeRename);
  813 +
  814 + Assert.assertNull("Can't find device by name in cache if it was renamed", renamedDevice);
  815 + deviceService.deleteDevice(tenantId, savedDevice.getId());
  816 + }
796 } 817 }
@@ -595,4 +595,23 @@ public abstract class BaseEdgeServiceTest extends AbstractServiceTest { @@ -595,4 +595,23 @@ public abstract class BaseEdgeServiceTest extends AbstractServiceTest {
595 return edge; 595 return edge;
596 } 596 }
597 597
  598 + @Test
  599 + public void testCleanCacheIfEdgeRenamed() {
  600 + String edgeNameBeforeRename = RandomStringUtils.randomAlphanumeric(15);
  601 + String edgeNameAfterRename = RandomStringUtils.randomAlphanumeric(15);
  602 +
  603 + Edge edge = constructEdge(tenantId, edgeNameBeforeRename, "default");
  604 + edgeService.saveEdge(edge);
  605 +
  606 + Edge savedEdge = edgeService.findEdgeByTenantIdAndName(tenantId, edgeNameBeforeRename);
  607 +
  608 + savedEdge.setName(edgeNameAfterRename);
  609 + edgeService.saveEdge(savedEdge);
  610 +
  611 + Edge renamedEdge = edgeService.findEdgeByTenantIdAndName(tenantId, edgeNameBeforeRename);
  612 +
  613 + Assert.assertNull("Can't find edge by name in cache if it was renamed", renamedEdge);
  614 + edgeService.deleteEdge(tenantId, savedEdge.getId());
  615 + }
  616 +
598 } 617 }