Commit 612a17af3bc95ccc84e9f738d4121390031436b1
Committed by
Andrew Shvayka
1 parent
27c9ad95
Clean up cache in case entity was renamed
Showing
6 changed files
with
96 additions
and
23 deletions
@@ -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 | } |