diff --git a/hazelcast-spring-tests/src/test/java/com/hazelcast/spring/TestFullApplicationContext.java b/hazelcast-spring-tests/src/test/java/com/hazelcast/spring/TestFullApplicationContext.java
index 359872ed532b..137a8caf9993 100644
--- a/hazelcast-spring-tests/src/test/java/com/hazelcast/spring/TestFullApplicationContext.java
+++ b/hazelcast-spring-tests/src/test/java/com/hazelcast/spring/TestFullApplicationContext.java
@@ -328,7 +328,7 @@ public void testCacheConfig() {
WanReplicationRef wanRef = cacheConfig.getWanReplicationRef();
assertEquals("testWan", wanRef.getName());
- assertEquals("PUT_IF_ABSENT", wanRef.getMergePolicyClassName());
+ assertEquals("PutIfAbsentMergePolicy", wanRef.getMergePolicyClassName());
assertEquals(1, wanRef.getFilters().size());
assertEquals("com.example.SampleFilter", wanRef.getFilters().get(0));
}
@@ -415,7 +415,7 @@ public void testMapConfig() {
// test testMapConfig2's WanReplicationConfig
WanReplicationRef wanReplicationRef = testMapConfig2.getWanReplicationRef();
assertEquals("testWan", wanReplicationRef.getName());
- assertEquals("PUT_IF_ABSENT", wanReplicationRef.getMergePolicyClassName());
+ assertEquals("PutIfAbsentMergePolicy", wanReplicationRef.getMergePolicyClassName());
assertTrue(wanReplicationRef.isRepublishingEnabled());
assertEquals(1000, testMapConfig2.getEvictionConfig().getSize());
@@ -482,7 +482,7 @@ public void testMapNoWanMergePolicy() {
// test testMapConfig2's WanReplicationConfig
WanReplicationRef wanReplicationRef = testMapConfig2.getWanReplicationRef();
assertEquals("testWan", wanReplicationRef.getName());
- assertEquals("PUT_IF_ABSENT", wanReplicationRef.getMergePolicyClassName());
+ assertEquals("PutIfAbsentMergePolicy", wanReplicationRef.getMergePolicyClassName());
}
@Test
diff --git a/hazelcast-spring-tests/src/test/resources/com/hazelcast/spring/fullConfig-applicationContext-hazelcast.xml b/hazelcast-spring-tests/src/test/resources/com/hazelcast/spring/fullConfig-applicationContext-hazelcast.xml
index cd49df9ad643..bf777c4d7aa4 100644
--- a/hazelcast-spring-tests/src/test/resources/com/hazelcast/spring/fullConfig-applicationContext-hazelcast.xml
+++ b/hazelcast-spring-tests/src/test/resources/com/hazelcast/spring/fullConfig-applicationContext-hazelcast.xml
@@ -374,7 +374,7 @@
implementation="dummyMapStore"
write-delay-seconds="0"
initial-mode="LAZY"/>
-
+
@@ -508,7 +508,7 @@
-
com.example.SampleFilter
diff --git a/hazelcast/src/main/java/com/hazelcast/map/impl/MapContainer.java b/hazelcast/src/main/java/com/hazelcast/map/impl/MapContainer.java
index e393f81151f1..e8450cfb62db 100644
--- a/hazelcast/src/main/java/com/hazelcast/map/impl/MapContainer.java
+++ b/hazelcast/src/main/java/com/hazelcast/map/impl/MapContainer.java
@@ -64,6 +64,7 @@
import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.atomic.AtomicInteger;
+import java.util.concurrent.atomic.AtomicLong;
import java.util.function.Function;
import java.util.function.Predicate;
import java.util.function.Supplier;
@@ -106,6 +107,7 @@ public class MapContainer {
* Holds number of registered {@link InvalidationListener} from clients.
*/
protected final AtomicInteger invalidationListenerCount = new AtomicInteger();
+ protected final AtomicLong lastInvalidMergePolicyCheckTime = new AtomicLong();
protected SplitBrainMergePolicy wanMergePolicy;
protected DelegatingWanScheme wanReplicationDelegate;
@@ -169,6 +171,10 @@ public Indexes createIndexes(boolean global) {
.build();
}
+ public AtomicLong getLastInvalidMergePolicyCheckTime() {
+ return lastInvalidMergePolicyCheckTime;
+ }
+
private class IndexResultFilterFactory implements Supplier> {
@Override
diff --git a/hazelcast/src/main/java/com/hazelcast/map/impl/operation/MergeOperation.java b/hazelcast/src/main/java/com/hazelcast/map/impl/operation/MergeOperation.java
index 2df90e4d2459..cc613c9a050f 100644
--- a/hazelcast/src/main/java/com/hazelcast/map/impl/operation/MergeOperation.java
+++ b/hazelcast/src/main/java/com/hazelcast/map/impl/operation/MergeOperation.java
@@ -16,7 +16,9 @@
package com.hazelcast.map.impl.operation;
+import com.hazelcast.config.InvalidConfigurationException;
import com.hazelcast.internal.serialization.Data;
+import com.hazelcast.internal.util.Clock;
import com.hazelcast.map.impl.MapDataSerializerHook;
import com.hazelcast.map.impl.record.Record;
import com.hazelcast.nio.ObjectDataInput;
@@ -31,8 +33,12 @@
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
+import java.util.concurrent.TimeUnit;
+import java.util.concurrent.atomic.AtomicLong;
+import java.util.logging.Level;
import static com.hazelcast.core.EntryEventType.MERGED;
+import static com.hazelcast.internal.config.MergePolicyValidator.checkMapMergePolicy;
/**
* Contains multiple merge entries for split-brain
@@ -43,6 +49,8 @@
public class MergeOperation extends MapOperation
implements PartitionAwareOperation, BackupAwareOperation {
+ private static final long MERGE_POLICY_CHECK_PERIOD = TimeUnit.MINUTES.toMillis(1);
+
private boolean disableWanReplicationEvent;
private List> mergingEntries;
private SplitBrainMergePolicy