diff --git a/src/main/java/io/ebeaninternal/server/deploy/BeanDescriptor.java b/src/main/java/io/ebeaninternal/server/deploy/BeanDescriptor.java index 60b5ed482..12ffbcb19 100644 --- a/src/main/java/io/ebeaninternal/server/deploy/BeanDescriptor.java +++ b/src/main/java/io/ebeaninternal/server/deploy/BeanDescriptor.java @@ -1476,6 +1476,13 @@ public class BeanDescriptor implements BeanType, STreeType { cacheHelp.beanCacheRemove(id); } + /** + * Remove a collection of beans from the cache given the ids. + */ + public void cacheHandleInvalidate(Collection ids) { + cacheHelp.beanCacheInvalidate(ids); + } + /** * Returns true if it managed to populate/load the bean from the cache. */ diff --git a/src/main/java/io/ebeaninternal/server/deploy/BeanDescriptorCacheHelp.java b/src/main/java/io/ebeaninternal/server/deploy/BeanDescriptorCacheHelp.java index 07f326e6c..d10bd85a6 100644 --- a/src/main/java/io/ebeaninternal/server/deploy/BeanDescriptorCacheHelp.java +++ b/src/main/java/io/ebeaninternal/server/deploy/BeanDescriptorCacheHelp.java @@ -680,6 +680,21 @@ final class BeanDescriptorCacheHelp { return bean; } + /** + * Remove a bean from the cache given its Id. + */ + void beanCacheInvalidate(Collection ids) { + if (beanCache != null) { + if (beanLog.isDebugEnabled()) { + beanLog.debug(" REMOVE {}({})", cacheName, ids); + } + beanCache.removeAll(new HashSet<>(ids)); + } + for (BeanPropertyAssocOne imported : propertiesOneImported) { + imported.cacheClear(); + } + } + /** * Remove a bean from the cache given its Id. */ diff --git a/src/main/java/io/ebeaninternal/server/transaction/BeanPersistIdMap.java b/src/main/java/io/ebeaninternal/server/transaction/BeanPersistIdMap.java index a292edf01..0bcbcb381 100644 --- a/src/main/java/io/ebeaninternal/server/transaction/BeanPersistIdMap.java +++ b/src/main/java/io/ebeaninternal/server/transaction/BeanPersistIdMap.java @@ -34,14 +34,12 @@ public final class BeanPersistIdMap { public void add(BeanDescriptor desc, PersistRequest.Type type, Object id) { BeanPersistIds r = getPersistIds(desc); - r.addId(type, (Serializable) id); + r.addId(type, id); } private BeanPersistIds getPersistIds(BeanDescriptor desc) { String beanType = desc.getFullName(); - BeanPersistIds r = beanMap.computeIfAbsent(beanType, k -> new BeanPersistIds(desc)); - return r; + return beanMap.computeIfAbsent(beanType, k -> new BeanPersistIds(desc)); } - } diff --git a/src/main/java/io/ebeaninternal/server/transaction/BeanPersistIds.java b/src/main/java/io/ebeaninternal/server/transaction/BeanPersistIds.java index 25ebea220..13810e4fe 100644 --- a/src/main/java/io/ebeaninternal/server/transaction/BeanPersistIds.java +++ b/src/main/java/io/ebeaninternal/server/transaction/BeanPersistIds.java @@ -34,9 +34,10 @@ public class BeanPersistIds implements BinaryWritable { private final String descriptorId; - private List insertIds; - private List updateIds; - private List deleteIds; + /** + * The ids to invalidate from the cache (updates and deletes). + */ + private List ids; /** * Create the payload. @@ -56,47 +57,24 @@ public class BeanPersistIds implements BinaryWritable { private void read(BinaryReadContext dataInput) throws IOException { - IdBinder idBinder = beanDescriptor.getIdBinder(); - - int iudType = dataInput.readInt(); - List idList = readIdList(dataInput.in(), idBinder); - switch (iudType) { - case 0: - insertIds = idList; - break; - case 1: - updateIds = idList; - break; - case 2: - deleteIds = idList; - break; - - default: - throw new RuntimeException("Invalid iudType " + iudType); - } + dataInput.readInt(); // legacy read type + ids = readIdList(dataInput.in(), beanDescriptor.getIdBinder()); } @Override public void writeBinary(BinaryWriteContext out) throws IOException { - writeBinaryList(out, 0, insertIds); - writeBinaryList(out, 1, updateIds); - writeBinaryList(out, 2, deleteIds); - } - private void writeBinaryList(BinaryWriteContext out, int type, List ids) throws IOException { - - if (ids != null) { + DataOutputStream os = out.start(TYPE_BEANIUD); + os.writeUTF(descriptorId); + os.writeInt(1); // legacy marker for update + if (ids == null) { + os.writeInt(0); + } else { + os.writeInt(ids.size()); IdBinder idBinder = beanDescriptor.getIdBinder(); - int count = ids.size(); - - DataOutputStream os = out.start(TYPE_BEANIUD); - os.writeUTF(descriptorId); - os.writeInt(type); - os.writeInt(count); - for (Object insertId : ids) { - idBinder.writeData(os, insertId); + for (Object idValue : ids) { + idBinder.writeData(os, idValue); } - os.flush(); } } @@ -121,90 +99,37 @@ public class BeanPersistIds implements BinaryWritable { } else { sb.append("descId:").append(descriptorId); } - if (insertIds != null) { - sb.append(" insertIds:").append(insertIds); - } - if (updateIds != null) { - sb.append(" updateIds:").append(updateIds); - } - if (deleteIds != null) { - sb.append(" deleteIds:").append(deleteIds); + if (ids != null) { + sb.append(" ids:").append(ids); } return sb.toString(); } - public void addId(PersistRequest.Type type, Serializable id) { - switch (type) { - case INSERT: - addInsertId(id); - break; - case UPDATE: - addUpdateId(id); - break; - case DELETE: - case DELETE_SOFT: - addDeleteId(id); - break; - - default: - break; + public void addId(PersistRequest.Type type, Object id) { + if (type != PersistRequest.Type.INSERT) { + if (ids == null) { + ids = new ArrayList<>(); + } + ids.add(id); } } - private void addInsertId(Serializable id) { - if (insertIds == null) { - insertIds = new ArrayList<>(); - } - insertIds.add(id); - } - - private void addUpdateId(Serializable id) { - if (updateIds == null) { - updateIds = new ArrayList<>(); - } - updateIds.add(id); - } - - private void addDeleteId(Serializable id) { - if (deleteIds == null) { - deleteIds = new ArrayList<>(); - } - deleteIds.add(id); - } - public BeanDescriptor getBeanDescriptor() { return beanDescriptor; } - public List getDeleteIds() { - return deleteIds; - } - - public List getInsertIds() { - return insertIds; - } - - public List getUpdateIds() { - return updateIds; + public List getIds() { + return ids; } /** * Notify the cache of this event that came from another server in the cluster. */ void notifyCacheAndListener() { - // any change invalidates the query cache beanDescriptor.clearQueryCache(); - - if (updateIds != null) { - for (Object id : updateIds) { - beanDescriptor.cacheHandleDeleteById(id); - } - } - if (deleteIds != null) { - for (Object id : deleteIds) { - beanDescriptor.cacheHandleDeleteById(id); - } + if (ids != null) { + beanDescriptor.cacheHandleInvalidate(ids); } } } diff --git a/src/main/java/io/ebeaninternal/server/transaction/DeleteByIdMap.java b/src/main/java/io/ebeaninternal/server/transaction/DeleteByIdMap.java index f92691cde..1bf84c0c2 100644 --- a/src/main/java/io/ebeaninternal/server/transaction/DeleteByIdMap.java +++ b/src/main/java/io/ebeaninternal/server/transaction/DeleteByIdMap.java @@ -28,12 +28,10 @@ public final class DeleteByIdMap { public void notifyCache(CacheChangeSet changeSet) { for (BeanPersistIds deleteIds : beanMap.values()) { BeanDescriptor d = deleteIds.getBeanDescriptor(); - List idValues = deleteIds.getDeleteIds(); + List idValues = deleteIds.getIds(); if (idValues != null) { d.queryCacheClear(changeSet); - for (Object idValue : idValues) { - d.cacheHandleDeleteById(idValue, changeSet); - } + d.cacheHandleInvalidate(idValues); } } } @@ -52,7 +50,7 @@ public final class DeleteByIdMap { public void add(BeanDescriptor desc, Object id) { BeanPersistIds r = getPersistIds(desc); - r.addId(PersistRequest.Type.DELETE, (Serializable) id); + r.addId(PersistRequest.Type.DELETE, id); } /** @@ -61,15 +59,14 @@ public final class DeleteByIdMap { public void addList(BeanDescriptor desc, List idList) { BeanPersistIds r = getPersistIds(desc); - for (Object anIdList : idList) { - r.addId(PersistRequest.Type.DELETE, (Serializable) anIdList); + for (Object idValue : idList) { + r.addId(PersistRequest.Type.DELETE, idValue); } } private BeanPersistIds getPersistIds(BeanDescriptor desc) { String beanType = desc.getFullName(); - BeanPersistIds r = beanMap.computeIfAbsent(beanType, k -> new BeanPersistIds(desc)); - return r; + return beanMap.computeIfAbsent(beanType, k -> new BeanPersistIds(desc)); } /** @@ -83,7 +80,7 @@ public final class DeleteByIdMap { // Add to queue or bulk update entries boolean queue = (DocStoreMode.QUEUE == mode); String queueId = desc.getDocStoreQueueId(); - List idValues = deleteIds.getDeleteIds(); + List idValues = deleteIds.getIds(); if (idValues != null) { for (Object idValue : idValues) { if (queue) { diff --git a/src/main/java/io/ebeaninternal/server/transaction/RemoteTransactionEvent.java b/src/main/java/io/ebeaninternal/server/transaction/RemoteTransactionEvent.java index 17004bf34..c89a255d1 100644 --- a/src/main/java/io/ebeaninternal/server/transaction/RemoteTransactionEvent.java +++ b/src/main/java/io/ebeaninternal/server/transaction/RemoteTransactionEvent.java @@ -120,9 +120,7 @@ public class RemoteTransactionEvent implements Runnable, BinaryWritable { public void writeBinary(BinaryWriteContext out) throws IOException { DataOutputStream os = out.os(); - //os.writeInt(TRANSACTION_EVENT); os.writeUTF(serverName); - if (remoteTableMod != null) { remoteTableMod.writeBinary(out); } diff --git a/src/test/java/io/ebeaninternal/server/cluster/binarymessage/BinaryTransactionEventReadWriteTest.java b/src/test/java/io/ebeaninternal/server/cluster/binarymessage/BinaryTransactionEventReadWriteTest.java index d696aa096..afeff01d3 100644 --- a/src/test/java/io/ebeaninternal/server/cluster/binarymessage/BinaryTransactionEventReadWriteTest.java +++ b/src/test/java/io/ebeaninternal/server/cluster/binarymessage/BinaryTransactionEventReadWriteTest.java @@ -57,6 +57,7 @@ public class BinaryTransactionEventReadWriteTest extends BaseTestCase { beanPersistIds.addId(PersistRequest.Type.INSERT, 43); beanPersistIds.addId(PersistRequest.Type.UPDATE, 55); beanPersistIds.addId(PersistRequest.Type.DELETE, 66); + beanPersistIds.addId(PersistRequest.Type.UPDATE, 92); event.addBeanPersistIds(beanPersistIds); @@ -74,10 +75,8 @@ public class BinaryTransactionEventReadWriteTest extends BaseTestCase { // Bean persist ids List beanPersistList = read.getBeanPersistList(); - assertThat(beanPersistList).hasSize(3); - assertThat(beanPersistList.get(0).getInsertIds()).containsOnly(42, 43); - assertThat(beanPersistList.get(1).getUpdateIds()).containsOnly(55); - assertThat(beanPersistList.get(2).getDeleteIds()).containsOnly(66); + assertThat(beanPersistList).hasSize(1); + assertThat(beanPersistList.get(0).getIds()).containsOnly(55, 66, 92); } @Test