You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@geode.apache.org by do...@apache.org on 2022/02/01 21:02:02 UTC

[geode] branch support/1.15 updated: GEODE-9993: Make SMOVE transactional (#7321)

This is an automated email from the ASF dual-hosted git repository.

donalevans pushed a commit to branch support/1.15
in repository https://gitbox.apache.org/repos/asf/geode.git


The following commit(s) were added to refs/heads/support/1.15 by this push:
     new f790596  GEODE-9993: Make SMOVE transactional (#7321)
f790596 is described below

commit f7905968b7b89db08c3edf180b91b3fdadfe45b7
Author: Donal Evans <do...@vmware.com>
AuthorDate: Tue Feb 1 12:47:03 2022 -0800

    GEODE-9993: Make SMOVE transactional (#7321)
    
     - Use lockedExecuteInTransaction method in SMoveExecutor
     - Refactor RedisSet.sadd and RedisSet.srem to not modify the list of members passed to them
     - Do not use Delta in AbstractRedisData.storeChanges() if operation is using a transaction
    
    Authored-by: Donal Evans <do...@vmware.com>
    (cherry picked from commit c0eb58e055a16fd5bc5bb22ad97d88739d55ae02)
---
 .../commands/executor/set/SMoveExecutor.java       |  2 +-
 .../redis/internal/data/AbstractRedisData.java     | 18 ++++-
 .../apache/geode/redis/internal/data/RedisSet.java | 48 +++++++------
 .../redis/internal/data/delta/AddByteArrays.java   |  9 +++
 .../geode/redis/internal/data/RedisHashTest.java   | 19 ++---
 .../geode/redis/internal/data/RedisSetTest.java    | 80 +++++++++++++++++++---
 .../redis/internal/data/RedisSortedSetTest.java    | 37 +++++-----
 .../internal/data/RedisStringQuickCheckTest.java   |  3 +-
 .../geode/redis/internal/data/RedisStringTest.java | 53 +++++++-------
 9 files changed, 185 insertions(+), 84 deletions(-)

diff --git a/geode-for-redis/src/main/java/org/apache/geode/redis/internal/commands/executor/set/SMoveExecutor.java b/geode-for-redis/src/main/java/org/apache/geode/redis/internal/commands/executor/set/SMoveExecutor.java
index 42647ba..487ab6b 100755
--- a/geode-for-redis/src/main/java/org/apache/geode/redis/internal/commands/executor/set/SMoveExecutor.java
+++ b/geode-for-redis/src/main/java/org/apache/geode/redis/internal/commands/executor/set/SMoveExecutor.java
@@ -36,7 +36,7 @@ public class SMoveExecutor implements CommandExecutor {
     byte[] member = commandElems.get(3);
     RegionProvider regionProvider = context.getRegionProvider();
 
-    int removed = context.lockedExecute(sourceKey, Arrays.asList(sourceKey, destKey),
+    int removed = context.lockedExecuteInTransaction(sourceKey, Arrays.asList(sourceKey, destKey),
         () -> smove(sourceKey, destKey, member, regionProvider));
 
     return RedisResponse.integer(removed);
diff --git a/geode-for-redis/src/main/java/org/apache/geode/redis/internal/data/AbstractRedisData.java b/geode-for-redis/src/main/java/org/apache/geode/redis/internal/data/AbstractRedisData.java
index 349bcd7..4f7586c 100644
--- a/geode-for-redis/src/main/java/org/apache/geode/redis/internal/data/AbstractRedisData.java
+++ b/geode-for-redis/src/main/java/org/apache/geode/redis/internal/data/AbstractRedisData.java
@@ -17,6 +17,7 @@
 package org.apache.geode.redis.internal.data;
 
 import static org.apache.geode.DataSerializer.readEnum;
+import static org.apache.geode.internal.cache.TXManagerImpl.NOTX;
 import static org.apache.geode.redis.internal.RedisConstants.ERROR_KEY_EXISTS;
 import static org.apache.geode.redis.internal.data.delta.DeltaType.ADD_BYTE_ARRAYS;
 import static org.apache.geode.redis.internal.data.delta.DeltaType.ADD_BYTE_ARRAY_DOUBLE_PAIRS;
@@ -44,6 +45,9 @@ import org.apache.geode.cache.EntryExistsException;
 import org.apache.geode.cache.EntryNotFoundException;
 import org.apache.geode.cache.Region;
 import org.apache.geode.internal.cache.BucketRegion;
+import org.apache.geode.internal.cache.LocalDataSet;
+import org.apache.geode.internal.cache.PartitionedRegion;
+import org.apache.geode.internal.cache.TXId;
 import org.apache.geode.internal.serialization.DeserializationContext;
 import org.apache.geode.internal.serialization.KnownVersion;
 import org.apache.geode.internal.serialization.SerializationContext;
@@ -335,7 +339,9 @@ public abstract class AbstractRedisData implements RedisData {
       if (removeFromRegion()) {
         region.remove(key);
       } else {
-        setDelta(deltaInfo);
+        if (!txActive(region)) {
+          setDelta(deltaInfo);
+        }
         try {
           region.put(key, this);
         } finally {
@@ -345,6 +351,16 @@ public abstract class AbstractRedisData implements RedisData {
     }
   }
 
+  private boolean txActive(Region<RedisKey, RedisData> region) {
+    TXId txId;
+    if (region instanceof LocalDataSet) {
+      txId = ((LocalDataSet) region).getProxy().getTXId();
+    } else {
+      txId = ((PartitionedRegion) region).getTXId();
+    }
+    return txId != null && txId.getUniqId() != NOTX;
+  }
+
   protected abstract boolean removeFromRegion();
 
   @Override
diff --git a/geode-for-redis/src/main/java/org/apache/geode/redis/internal/data/RedisSet.java b/geode-for-redis/src/main/java/org/apache/geode/redis/internal/data/RedisSet.java
index 3fd6352..23dfd0d 100644
--- a/geode-for-redis/src/main/java/org/apache/geode/redis/internal/data/RedisSet.java
+++ b/geode-for-redis/src/main/java/org/apache/geode/redis/internal/data/RedisSet.java
@@ -76,18 +76,14 @@ public class RedisSet extends AbstractRedisData {
 
   public static int smove(RedisKey sourceKey, RedisKey destKey, byte[] member,
       RegionProvider regionProvider) {
-    Region<RedisKey, RedisData> region = regionProvider.getDataRegion();
-
     RedisSet source = regionProvider.getTypedRedisData(REDIS_SET, sourceKey, false);
     RedisSet destination = regionProvider.getTypedRedisData(REDIS_SET, destKey, false);
-    if (source.members.isEmpty() || !source.members.contains(member)) {
+    List<byte[]> memberList = new ArrayList<>();
+    memberList.add(member);
+    if (source.srem(memberList, regionProvider.getDataRegion(), sourceKey) == 0) {
       return 0;
     }
-
-    List<byte[]> movedMember = new ArrayList<>();
-    movedMember.add(member);
-    source.srem(movedMember, region, sourceKey);
-    destination.sadd(movedMember, region, destKey);
+    destination.sadd(memberList, regionProvider.getDataRegion(), destKey);
     return 1;
   }
 
@@ -383,34 +379,46 @@ public class RedisSet extends AbstractRedisData {
   }
 
   /**
-   * @param membersToAdd members to add to this set; NOTE this list may by
-   *        modified by this call
+   * @param membersToAdd members to add to this set
    * @param region the region this instance is stored in
    * @param key the name of the set to add to
    * @return the number of members actually added
    */
   public long sadd(List<byte[]> membersToAdd, Region<RedisKey, RedisData> region, RedisKey key) {
-    membersToAdd.removeIf(memberToAdd -> !membersAdd(memberToAdd));
-    int membersAdded = membersToAdd.size();
-    if (membersAdded != 0) {
-      storeChanges(region, key, new AddByteArrays(membersToAdd));
+    AddByteArrays delta = new AddByteArrays();
+    int membersAdded = 0;
+    for (byte[] member : membersToAdd) {
+      if (membersAdd(member)) {
+        delta.add(member);
+        membersAdded++;
+      }
+    }
+    if (membersAdded == 0) {
+      return 0;
     }
+    storeChanges(region, key, delta);
     return membersAdded;
   }
 
   /**
-   * @param membersToRemove members to remove from this set; NOTE this list may by
-   *        modified by this call
+   * @param membersToRemove members to remove from this set
    * @param region the region this instance is stored in
    * @param key the name of the set to remove from
    * @return the number of members actually removed
    */
   public long srem(List<byte[]> membersToRemove, Region<RedisKey, RedisData> region, RedisKey key) {
-    membersToRemove.removeIf(memberToRemove -> !membersRemove(memberToRemove));
-    int membersRemoved = membersToRemove.size();
-    if (membersRemoved != 0) {
-      storeChanges(region, key, new RemoveByteArrays(membersToRemove));
+    RemoveByteArrays delta = new RemoveByteArrays();
+    int membersRemoved = 0;
+    for (byte[] member : membersToRemove) {
+      if (membersRemove(member)) {
+        delta.add(member);
+        membersRemoved++;
+      }
+    }
+    if (membersRemoved == 0) {
+      return 0;
     }
+    storeChanges(region, key, delta);
     return membersRemoved;
   }
 
diff --git a/geode-for-redis/src/main/java/org/apache/geode/redis/internal/data/delta/AddByteArrays.java b/geode-for-redis/src/main/java/org/apache/geode/redis/internal/data/delta/AddByteArrays.java
index 91a9ae6..9f34797 100644
--- a/geode-for-redis/src/main/java/org/apache/geode/redis/internal/data/delta/AddByteArrays.java
+++ b/geode-for-redis/src/main/java/org/apache/geode/redis/internal/data/delta/AddByteArrays.java
@@ -23,6 +23,7 @@ import static org.apache.geode.redis.internal.data.delta.DeltaType.ADD_BYTE_ARRA
 import java.io.DataInput;
 import java.io.DataOutput;
 import java.io.IOException;
+import java.util.ArrayList;
 import java.util.List;
 
 import org.apache.geode.DataSerializer;
@@ -32,10 +33,18 @@ import org.apache.geode.redis.internal.data.AbstractRedisData;
 public class AddByteArrays implements DeltaInfo {
   private final List<byte[]> byteArrays;
 
+  public AddByteArrays() {
+    byteArrays = new ArrayList<>();
+  }
+
   public AddByteArrays(List<byte[]> deltas) {
     this.byteArrays = deltas;
   }
 
+  public void add(byte[] delta) {
+    byteArrays.add(delta);
+  }
+
   public void serializeTo(DataOutput out) throws IOException {
     DataSerializer.writeEnum(ADD_BYTE_ARRAYS, out);
     InternalDataSerializer.writeArrayLength(byteArrays.size(), out);
diff --git a/geode-for-redis/src/test/java/org/apache/geode/redis/internal/data/RedisHashTest.java b/geode-for-redis/src/test/java/org/apache/geode/redis/internal/data/RedisHashTest.java
index 3c17d10..0d46161 100644
--- a/geode-for-redis/src/test/java/org/apache/geode/redis/internal/data/RedisHashTest.java
+++ b/geode-for-redis/src/test/java/org/apache/geode/redis/internal/data/RedisHashTest.java
@@ -45,6 +45,7 @@ import org.mockito.invocation.InvocationOnMock;
 import org.apache.geode.DataSerializer;
 import org.apache.geode.cache.Region;
 import org.apache.geode.internal.HeapDataOutputStream;
+import org.apache.geode.internal.cache.PartitionedRegion;
 import org.apache.geode.internal.serialization.ByteArrayDataInput;
 import org.apache.geode.internal.serialization.SerializationContext;
 import org.apache.geode.internal.size.ReflectionObjectSizer;
@@ -114,7 +115,7 @@ public class RedisHashTest {
   @SuppressWarnings("unchecked")
   @Test
   public void hset_stores_delta_that_is_stable() {
-    Region<RedisKey, RedisData> region = Mockito.mock(Region.class);
+    Region<RedisKey, RedisData> region = Mockito.mock(PartitionedRegion.class);
     when(region.put(any(), any())).thenAnswer(this::validateDeltaSerialization);
 
     RedisHash o1 = createRedisHash("k1", "v1", "k2", "v2");
@@ -146,7 +147,7 @@ public class RedisHashTest {
   @SuppressWarnings("unchecked")
   @Test
   public void hdel_stores_delta_that_is_stable() {
-    Region<RedisKey, RedisData> region = mock(Region.class);
+    Region<RedisKey, RedisData> region = mock(PartitionedRegion.class);
     when(region.put(any(), any())).thenAnswer(this::validateDeltaSerialization);
 
     RedisHash o1 = createRedisHash("k1", "v1", "k2", "v2");
@@ -164,7 +165,7 @@ public class RedisHashTest {
   @SuppressWarnings("unchecked")
   @Test
   public void setExpirationTimestamp_stores_delta_that_is_stable() {
-    Region<RedisKey, RedisData> region = mock(Region.class);
+    Region<RedisKey, RedisData> region = mock(PartitionedRegion.class);
     when(region.put(any(), any())).thenAnswer(this::validateDeltaSerialization);
 
     RedisHash o1 = createRedisHash("k1", "v1", "k2", "v2");
@@ -279,7 +280,7 @@ public class RedisHashTest {
     final String baseField = "field";
     final String baseValue = "value";
 
-    final Region<RedisKey, RedisData> region = uncheckedCast(mock(Region.class));
+    final Region<RedisKey, RedisData> region = uncheckedCast(mock(PartitionedRegion.class));
     final RedisData returnData = mock(RedisData.class);
     when(region.put(any(), any())).thenReturn(returnData);
 
@@ -328,7 +329,7 @@ public class RedisHashTest {
 
   public void testThatSizeIsUpdatedWhenUpdatingValue(final RedisKey key, final String field,
       final String initialValue, final String finalValue) {
-    final Region<RedisKey, RedisData> region = uncheckedCast(mock(Region.class));
+    final Region<RedisKey, RedisData> region = uncheckedCast(mock(PartitionedRegion.class));
     final RedisData returnData = mock(RedisData.class);
     when(region.put(any(RedisKey.class), any(RedisData.class))).thenReturn(returnData);
 
@@ -363,7 +364,7 @@ public class RedisHashTest {
     final String baseField = "field";
     final String baseValue = "value";
 
-    final Region<RedisKey, RedisData> region = uncheckedCast(mock(Region.class));
+    final Region<RedisKey, RedisData> region = uncheckedCast(mock(PartitionedRegion.class));
     final RedisData returnData = mock(RedisData.class);
     when(region.put(any(RedisKey.class), any(RedisData.class))).thenReturn(returnData);
 
@@ -386,7 +387,7 @@ public class RedisHashTest {
     final String baseField = "field";
     final String baseValue = "value";
 
-    final Region<RedisKey, RedisData> region = uncheckedCast(mock(Region.class));
+    final Region<RedisKey, RedisData> region = uncheckedCast(mock(PartitionedRegion.class));
     final RedisData returnData = mock(RedisData.class);
     when(region.put(any(RedisKey.class), any(RedisData.class))).thenReturn(returnData);
 
@@ -413,7 +414,7 @@ public class RedisHashTest {
     final String initialBaseValue = "value";
     final String finalBaseValue = "longerValue";
 
-    final Region<RedisKey, RedisData> region = uncheckedCast(mock(Region.class));
+    final Region<RedisKey, RedisData> region = uncheckedCast(mock(PartitionedRegion.class));
     final RedisData returnData = mock(RedisData.class);
     when(region.put(any(RedisKey.class), any(RedisData.class))).thenReturn(returnData);
 
@@ -445,7 +446,7 @@ public class RedisHashTest {
     final RedisKey key = new RedisKey(stringToBytes("key"));
     final String baseField = "field";
     final String baseValue = "value";
-    final Region<RedisKey, RedisData> region = uncheckedCast(mock(Region.class));
+    final Region<RedisKey, RedisData> region = uncheckedCast(mock(PartitionedRegion.class));
     final RedisData returnData = mock(RedisData.class);
     when(region.put(any(RedisKey.class), any(RedisData.class))).thenReturn(returnData);
 
diff --git a/geode-for-redis/src/test/java/org/apache/geode/redis/internal/data/RedisSetTest.java b/geode-for-redis/src/test/java/org/apache/geode/redis/internal/data/RedisSetTest.java
index 5978c9b..b7f365d 100644
--- a/geode-for-redis/src/test/java/org/apache/geode/redis/internal/data/RedisSetTest.java
+++ b/geode-for-redis/src/test/java/org/apache/geode/redis/internal/data/RedisSetTest.java
@@ -16,6 +16,7 @@
 
 package org.apache.geode.redis.internal.data;
 
+import static org.apache.geode.internal.cache.TXManagerImpl.NOTX;
 import static org.apache.geode.redis.internal.data.AbstractRedisData.NO_EXPIRATION;
 import static org.apache.geode.redis.internal.data.NullRedisDataStructures.NULL_REDIS_SET;
 import static org.apache.geode.redis.internal.data.RedisDataType.REDIS_SET;
@@ -50,6 +51,8 @@ import org.mockito.invocation.InvocationOnMock;
 import org.apache.geode.DataSerializer;
 import org.apache.geode.cache.Region;
 import org.apache.geode.internal.HeapDataOutputStream;
+import org.apache.geode.internal.cache.PartitionedRegion;
+import org.apache.geode.internal.cache.TXId;
 import org.apache.geode.internal.serialization.ByteArrayDataInput;
 import org.apache.geode.internal.serialization.SerializationContext;
 import org.apache.geode.internal.size.ReflectionObjectSizer;
@@ -131,8 +134,69 @@ public class RedisSetTest {
   }
 
   @Test
+  public void storeChangesDoesNotStoreDeltaIfTransactionIsInProgress() {
+    Region<RedisKey, RedisData> region = uncheckedCast(mock(PartitionedRegion.class));
+    when(region.put(any(), any())).thenAnswer(invocation -> {
+      assertThat(invocation.getArgument(1, RedisSet.class).hasDelta()).isFalse();
+      return null;
+    });
+
+    TXId txId = mock(TXId.class);
+    when(txId.getUniqId()).thenReturn(5);
+    when(((PartitionedRegion) region).getTXId()).thenReturn(txId);
+
+    RedisSet set = createRedisSet(1, 2);
+    List<byte[]> membersToAdd = Collections.singletonList(new byte[] {3});
+
+    set.sadd(membersToAdd, region, null);
+
+    verify(region).put(any(), any());
+    assertThat(set.hasDelta()).isFalse();
+  }
+
+  @Test
+  public void storeChangesStoresDeltaIfTransactionIsNOTX() {
+    Region<RedisKey, RedisData> region = uncheckedCast(mock(PartitionedRegion.class));
+    when(region.put(any(), any())).thenAnswer(invocation -> {
+      assertThat(invocation.getArgument(1, RedisSet.class).hasDelta()).isTrue();
+      return null;
+    });
+
+    TXId txId = mock(TXId.class);
+    when(txId.getUniqId()).thenReturn(NOTX);
+    when(((PartitionedRegion) region).getTXId()).thenReturn(txId);
+
+    RedisSet set = createRedisSet(1, 2);
+    List<byte[]> membersToAdd = Collections.singletonList(new byte[] {3});
+
+    set.sadd(membersToAdd, region, null);
+
+    verify(region).put(any(), any());
+    assertThat(set.hasDelta()).isFalse();
+  }
+
+  @Test
+  public void storeChangesStoresDeltaIfTransactionIsNull() {
+    Region<RedisKey, RedisData> region = uncheckedCast(mock(PartitionedRegion.class));
+    when(region.put(any(), any())).thenAnswer(invocation -> {
+      assertThat(invocation.getArgument(1, RedisSet.class).hasDelta()).isTrue();
+      return null;
+    });
+
+    when(((PartitionedRegion) region).getTXId()).thenReturn(null);
+
+    RedisSet set = createRedisSet(1, 2);
+    List<byte[]> membersToAdd = Collections.singletonList(new byte[] {3});
+
+    set.sadd(membersToAdd, region, null);
+
+    verify(region).put(any(), any());
+    assertThat(set.hasDelta()).isFalse();
+  }
+
+  @Test
   public void sadd_stores_delta_that_is_stable() {
-    Region<RedisKey, RedisData> region = uncheckedCast(mock(Region.class));
+    Region<RedisKey, RedisData> region = uncheckedCast(mock(PartitionedRegion.class));
     when(region.put(any(), any())).thenAnswer(this::validateDeltaSerialization);
 
     RedisSet set1 = createRedisSet(1, 2);
@@ -148,7 +212,7 @@ public class RedisSetTest {
 
   @Test
   public void srem_stores_delta_that_is_stable() {
-    Region<RedisKey, RedisData> region = uncheckedCast(mock(Region.class));
+    Region<RedisKey, RedisData> region = uncheckedCast(mock(PartitionedRegion.class));
     when(region.put(any(), any())).thenAnswer(this::validateDeltaSerialization);
 
     RedisSet set1 = createRedisSet(1, 2);
@@ -165,7 +229,7 @@ public class RedisSetTest {
   @Test
   public void sdiffstore_stores_delta_that_is_stable() {
     RegionProvider regionProvider = uncheckedCast(mock(RegionProvider.class));
-    Region<RedisKey, RedisData> dataRegion = uncheckedCast(mock(Region.class));
+    Region<RedisKey, RedisData> dataRegion = uncheckedCast(mock(PartitionedRegion.class));
 
     RedisSet setDest = createRedisSet(1, 2);
 
@@ -184,7 +248,7 @@ public class RedisSetTest {
   @Test
   public void sdiffstore_sets_expiration_time_to_zero() {
     RegionProvider regionProvider = uncheckedCast(mock(RegionProvider.class));
-    Region<RedisKey, RedisData> dataRegion = uncheckedCast(mock(Region.class));
+    Region<RedisKey, RedisData> dataRegion = uncheckedCast(mock(PartitionedRegion.class));
 
     RedisSet setDest = createRedisSet(1, 2);
     setDest.setExpirationTimestamp(dataRegion, null, 100);
@@ -203,7 +267,7 @@ public class RedisSetTest {
 
   @Test
   public void setExpirationTimestamp_stores_delta_that_is_stable() {
-    Region<RedisKey, RedisData> region = uncheckedCast(mock(Region.class));
+    Region<RedisKey, RedisData> region = uncheckedCast(mock(PartitionedRegion.class));
     when(region.put(any(), any())).thenAnswer(this::validateDeltaSerialization);
 
     RedisSet set1 = createRedisSet(1, 2);
@@ -270,7 +334,7 @@ public class RedisSetTest {
   @Test
   public void bytesInUse_sadd_withOneMember() {
     RedisSet set = new RedisSet(new ArrayList<>());
-    Region<RedisKey, RedisData> region = uncheckedCast(mock(Region.class));
+    Region<RedisKey, RedisData> region = uncheckedCast(mock(PartitionedRegion.class));
     final RedisData returnData = mock(RedisData.class);
     when(region.put(any(RedisKey.class), any(RedisData.class))).thenReturn(returnData);
     final RedisKey key = new RedisKey(stringToBytes("key"));
@@ -288,7 +352,7 @@ public class RedisSetTest {
   @Test
   public void bytesInUse_sadd_withMultipleMembers() {
     RedisSet set = new RedisSet(new ArrayList<>());
-    Region<RedisKey, RedisData> region = uncheckedCast(mock(Region.class));
+    Region<RedisKey, RedisData> region = uncheckedCast(mock(PartitionedRegion.class));
     final RedisData returnData = mock(RedisData.class);
     when(region.put(any(RedisKey.class), any(RedisData.class))).thenReturn(returnData);
     final RedisKey key = new RedisKey(stringToBytes("key"));
@@ -311,7 +375,7 @@ public class RedisSetTest {
   /******* remove *******/
   @Test
   public void size_shouldDecrease_WhenValueIsRemoved() {
-    Region<RedisKey, RedisData> region = uncheckedCast(mock(Region.class));
+    Region<RedisKey, RedisData> region = uncheckedCast(mock(PartitionedRegion.class));
     final RedisData returnData = mock(RedisData.class);
     when(region.put(any(RedisKey.class), any(RedisData.class))).thenReturn(returnData);
     final RedisKey key = new RedisKey(stringToBytes("key"));
diff --git a/geode-for-redis/src/test/java/org/apache/geode/redis/internal/data/RedisSortedSetTest.java b/geode-for-redis/src/test/java/org/apache/geode/redis/internal/data/RedisSortedSetTest.java
index 0d20d15..03a68f8 100644
--- a/geode-for-redis/src/test/java/org/apache/geode/redis/internal/data/RedisSortedSetTest.java
+++ b/geode-for-redis/src/test/java/org/apache/geode/redis/internal/data/RedisSortedSetTest.java
@@ -59,6 +59,7 @@ import org.mockito.invocation.InvocationOnMock;
 import org.apache.geode.DataSerializer;
 import org.apache.geode.cache.Region;
 import org.apache.geode.internal.HeapDataOutputStream;
+import org.apache.geode.internal.cache.PartitionedRegion;
 import org.apache.geode.internal.serialization.ByteArrayDataInput;
 import org.apache.geode.internal.serialization.SerializationContext;
 import org.apache.geode.internal.size.ReflectionObjectSizer;
@@ -144,7 +145,7 @@ public class RedisSortedSetTest {
 
   @Test
   public void zadd_stores_delta_that_is_stable() {
-    Region<RedisKey, RedisData> region = uncheckedCast(mock(Region.class));
+    Region<RedisKey, RedisData> region = uncheckedCast(mock(PartitionedRegion.class));
     when(region.put(any(), any())).thenAnswer(this::validateDeltaSerialization);
     RedisSortedSet sortedSet1 = createRedisSortedSet("3.14159", "v1", "2.71828", "v2");
     List<byte[]> members = singletonList(stringToBytes("v3"));
@@ -160,7 +161,7 @@ public class RedisSortedSetTest {
   @Test
   public void sortedSetOpStoreResult_stores_delta_that_is_stable() {
     RegionProvider regionProvider = uncheckedCast(mock(RegionProvider.class));
-    Region<RedisKey, RedisData> dataRegion = uncheckedCast(mock(Region.class));
+    Region<RedisKey, RedisData> dataRegion = uncheckedCast(mock(PartitionedRegion.class));
 
     RedisSortedSet sortedSet1 = createRedisSortedSet("3.14159", "v1", "2.71828", "v2");
     when(regionProvider.getTypedRedisDataElseRemove(REDIS_SORTED_SET, null, false))
@@ -185,7 +186,7 @@ public class RedisSortedSetTest {
   @Test
   public void sortedSetOpStoreResult_sets_expiration_time_to_zero() {
     RegionProvider regionProvider = uncheckedCast(mock(RegionProvider.class));
-    Region<RedisKey, RedisData> dataRegion = uncheckedCast(mock(Region.class));
+    Region<RedisKey, RedisData> dataRegion = uncheckedCast(mock(PartitionedRegion.class));
 
     RedisSortedSet setDest = createRedisSortedSet("3.14159", "v1", "2.71828", "v2");
     setDest.setExpirationTimestamp(dataRegion, null, 100);
@@ -224,7 +225,7 @@ public class RedisSortedSetTest {
 
   @Test
   public void setExpirationTimestamp_stores_delta_that_is_stable() {
-    Region<RedisKey, RedisData> region = uncheckedCast(mock(Region.class));
+    Region<RedisKey, RedisData> region = uncheckedCast(mock(PartitionedRegion.class));
     when(region.put(any(), any())).thenAnswer(this::validateDeltaSerialization);
     RedisSortedSet sortedSet1 = createRedisSortedSet("3.14159", "v1", "2.71828", "v2");
 
@@ -240,7 +241,7 @@ public class RedisSortedSetTest {
     String score3 = "998955255.66361191";
     RedisSortedSet sortedSet =
         spy(createRedisSortedSet(score1, member1, score2, member2, score3, member3));
-    Region<RedisKey, RedisData> region = uncheckedCast(mock(Region.class));
+    Region<RedisKey, RedisData> region = uncheckedCast(mock(PartitionedRegion.class));
     RedisKey key = new RedisKey();
     ArrayList<byte[]> membersToRemove = new ArrayList<>();
     membersToRemove.add(stringToBytes("nonExisting"));
@@ -632,7 +633,7 @@ public class RedisSortedSetTest {
   public void zpopminRemovesMemberWithLowestScore() {
     int originalSize = rangeSortedSet.getSortedSetSize();
     RedisSortedSet sortedSet = spy(rangeSortedSet);
-    Region<RedisKey, RedisData> region = uncheckedCast(mock(Region.class));
+    Region<RedisKey, RedisData> region = uncheckedCast(mock(PartitionedRegion.class));
     RedisKey key = new RedisKey();
     int count = 1;
 
@@ -650,7 +651,7 @@ public class RedisSortedSetTest {
   public void zpopminRemovesMembersWithLowestScores_whenCountIsGreaterThanOne() {
     int originalSize = rangeSortedSet.getSortedSetSize();
     RedisSortedSet sortedSet = spy(rangeSortedSet);
-    Region<RedisKey, RedisData> region = uncheckedCast(mock(Region.class));
+    Region<RedisKey, RedisData> region = uncheckedCast(mock(PartitionedRegion.class));
     RedisKey key = new RedisKey();
     int count = 3;
 
@@ -669,7 +670,7 @@ public class RedisSortedSetTest {
   @Test
   public void zpopminRemovesRegionEntryWhenSetBecomesEmpty() {
     RedisSortedSet sortedSet = spy(createRedisSortedSet(score1, member1));
-    Region<RedisKey, RedisData> region = uncheckedCast(mock(Region.class));
+    Region<RedisKey, RedisData> region = uncheckedCast(mock(PartitionedRegion.class));
     RedisKey key = new RedisKey();
 
     List<byte[]> result = sortedSet.zpopmin(region, key, 1);
@@ -687,7 +688,7 @@ public class RedisSortedSetTest {
         "1.1", "member3",
         "1.1", "member2",
         "1.1", "member1"));
-    Region<RedisKey, RedisData> region = uncheckedCast(mock(Region.class));
+    Region<RedisKey, RedisData> region = uncheckedCast(mock(PartitionedRegion.class));
     RedisKey key = new RedisKey();
 
     List<byte[]> result = sortedSet.zpopmin(region, key, 1);
@@ -698,7 +699,7 @@ public class RedisSortedSetTest {
   public void zpopmaxRemovesMemberWithHighestScore() {
     int originalSize = rangeSortedSet.getSortedSetSize();
     RedisSortedSet sortedSet = spy(rangeSortedSet);
-    Region<RedisKey, RedisData> region = uncheckedCast(mock(Region.class));
+    Region<RedisKey, RedisData> region = uncheckedCast(mock(PartitionedRegion.class));
     RedisKey key = new RedisKey();
     int count = 1;
 
@@ -716,7 +717,7 @@ public class RedisSortedSetTest {
   public void zpopmaxRemovesMembersWithHighestScores_whenCountIsGreaterThanOne() {
     int originalSize = rangeSortedSet.getSortedSetSize();
     RedisSortedSet sortedSet = spy(rangeSortedSet);
-    Region<RedisKey, RedisData> region = uncheckedCast(mock(Region.class));
+    Region<RedisKey, RedisData> region = uncheckedCast(mock(PartitionedRegion.class));
     RedisKey key = new RedisKey();
     int count = 3;
 
@@ -735,7 +736,7 @@ public class RedisSortedSetTest {
   @Test
   public void zpopmaxRemovesRegionEntryWhenSetBecomesEmpty() {
     RedisSortedSet sortedSet = spy(createRedisSortedSet(score1, member1));
-    Region<RedisKey, RedisData> region = uncheckedCast(mock(Region.class));
+    Region<RedisKey, RedisData> region = uncheckedCast(mock(PartitionedRegion.class));
     RedisKey key = new RedisKey();
 
     List<byte[]> result = sortedSet.zpopmax(region, key, 1);
@@ -753,7 +754,7 @@ public class RedisSortedSetTest {
         "1.1", "member3",
         "1.1", "member2",
         "1.1", "member1"));
-    Region<RedisKey, RedisData> region = uncheckedCast(mock(Region.class));
+    Region<RedisKey, RedisData> region = uncheckedCast(mock(PartitionedRegion.class));
     RedisKey key = new RedisKey();
 
     List<byte[]> result = sortedSet.zpopmax(region, key, 1);
@@ -792,7 +793,7 @@ public class RedisSortedSetTest {
 
   @Test
   public void redisSortedSetGetSizeInBytes_isAccurateForAdds() {
-    Region<RedisKey, RedisData> mockRegion = uncheckedCast(mock(Region.class));
+    Region<RedisKey, RedisData> mockRegion = uncheckedCast(mock(PartitionedRegion.class));
     RedisKey mockKey = mock(RedisKey.class);
     ZAddOptions options = new ZAddOptions(ZAddOptions.Exists.NONE, false, false);
     RedisSortedSet sortedSet = new RedisSortedSet(Collections.emptyList(), new double[0]);
@@ -815,7 +816,7 @@ public class RedisSortedSetTest {
 
   @Test
   public void redisSortedSetGetSizeInBytes_isAccurateForUpdates() {
-    Region<RedisKey, RedisData> mockRegion = uncheckedCast(mock(Region.class));
+    Region<RedisKey, RedisData> mockRegion = uncheckedCast(mock(PartitionedRegion.class));
     RedisKey mockKey = mock(RedisKey.class);
     ZAddOptions options = new ZAddOptions(ZAddOptions.Exists.NONE, false, false);
     RedisSortedSet sortedSet = new RedisSortedSet(Collections.emptyList(), new double[0]);
@@ -840,7 +841,7 @@ public class RedisSortedSetTest {
 
   @Test
   public void redisSortedSetGetSizeInBytes_isAccurateForRemoves() {
-    Region<RedisKey, RedisData> mockRegion = uncheckedCast(mock(Region.class));
+    Region<RedisKey, RedisData> mockRegion = uncheckedCast(mock(PartitionedRegion.class));
     RedisKey mockKey = mock(RedisKey.class);
     ZAddOptions options = new ZAddOptions(ZAddOptions.Exists.NONE, false, false);
     RedisSortedSet sortedSet = new RedisSortedSet(Collections.emptyList(), new double[0]);
@@ -864,7 +865,7 @@ public class RedisSortedSetTest {
 
   @Test
   public void redisSortedSetGetSizeInBytes_isAccurateForZpopmax() {
-    Region<RedisKey, RedisData> mockRegion = uncheckedCast(mock(Region.class));
+    Region<RedisKey, RedisData> mockRegion = uncheckedCast(mock(PartitionedRegion.class));
     RedisKey mockKey = mock(RedisKey.class);
     ZAddOptions options = new ZAddOptions(ZAddOptions.Exists.NONE, false, false);
     RedisSortedSet sortedSet = new RedisSortedSet(Collections.emptyList(), new double[0]);
@@ -887,7 +888,7 @@ public class RedisSortedSetTest {
 
   @Test
   public void redisSortedSetGetSizeInBytes_isAccurateForZpopmin() {
-    Region<RedisKey, RedisData> mockRegion = uncheckedCast(mock(Region.class));
+    Region<RedisKey, RedisData> mockRegion = uncheckedCast(mock(PartitionedRegion.class));
     RedisKey mockKey = mock(RedisKey.class);
     ZAddOptions options = new ZAddOptions(ZAddOptions.Exists.NONE, false, false);
     RedisSortedSet sortedSet = new RedisSortedSet(Collections.emptyList(), new double[0]);
diff --git a/geode-for-redis/src/test/java/org/apache/geode/redis/internal/data/RedisStringQuickCheckTest.java b/geode-for-redis/src/test/java/org/apache/geode/redis/internal/data/RedisStringQuickCheckTest.java
index f9c0ffd..903d438 100644
--- a/geode-for-redis/src/test/java/org/apache/geode/redis/internal/data/RedisStringQuickCheckTest.java
+++ b/geode-for-redis/src/test/java/org/apache/geode/redis/internal/data/RedisStringQuickCheckTest.java
@@ -30,6 +30,7 @@ import com.pholser.junit.quickcheck.runner.JUnitQuickcheck;
 import org.junit.runner.RunWith;
 
 import org.apache.geode.cache.Region;
+import org.apache.geode.internal.cache.PartitionedRegion;
 
 /**
  * Property testing of RedisString.
@@ -41,7 +42,7 @@ public class RedisStringQuickCheckTest {
   public void setrangePrefixSuffix(@Size(min = 10, max = 50) ArrayList<Byte> existingByteArray,
       @Size(min = 0, max = 10) ArrayList<Byte> valueToAddArray,
       @InRange(minInt = 0, maxInt = 60) int offset) {
-    Region<RedisKey, RedisData> region = uncheckedCast(mock(Region.class));
+    Region<RedisKey, RedisData> region = uncheckedCast(mock(PartitionedRegion.class));
     byte[] existingBytes = Bytes.toArray(existingByteArray);
     byte[] valueToAdd = Bytes.toArray(valueToAddArray);
 
diff --git a/geode-for-redis/src/test/java/org/apache/geode/redis/internal/data/RedisStringTest.java b/geode-for-redis/src/test/java/org/apache/geode/redis/internal/data/RedisStringTest.java
index 95261a1..7c13a74 100644
--- a/geode-for-redis/src/test/java/org/apache/geode/redis/internal/data/RedisStringTest.java
+++ b/geode-for-redis/src/test/java/org/apache/geode/redis/internal/data/RedisStringTest.java
@@ -38,6 +38,7 @@ import org.mockito.invocation.InvocationOnMock;
 import org.apache.geode.DataSerializer;
 import org.apache.geode.cache.Region;
 import org.apache.geode.internal.HeapDataOutputStream;
+import org.apache.geode.internal.cache.PartitionedRegion;
 import org.apache.geode.internal.serialization.ByteArrayDataInput;
 import org.apache.geode.internal.serialization.SerializationContext;
 import org.apache.geode.internal.size.ReflectionObjectSizer;
@@ -75,7 +76,7 @@ public class RedisStringTest {
 
   @Test
   public void getsetSetsValueAndReturnsOldValue() {
-    Region<RedisKey, RedisData> region = uncheckedCast(mock(Region.class));
+    Region<RedisKey, RedisData> region = uncheckedCast(mock(PartitionedRegion.class));
     byte[] oldBytes = {0, 1};
     byte[] newBytes = {0, 1, 2};
     RedisString string = new RedisString(oldBytes);
@@ -88,7 +89,7 @@ public class RedisStringTest {
 
   @Test
   public void appendResizesByteArray() {
-    Region<RedisKey, RedisData> region = uncheckedCast(mock(Region.class));
+    Region<RedisKey, RedisData> region = uncheckedCast(mock(PartitionedRegion.class));
     RedisString redisString = new RedisString(new byte[] {0, 1});
     int redisStringSize = redisString.strlen();
     byte[] bytesToAppend = {2, 3, 4, 5};
@@ -99,7 +100,7 @@ public class RedisStringTest {
 
   @Test
   public void appendStoresStableDelta() {
-    Region<RedisKey, RedisData> region = uncheckedCast(mock(Region.class));
+    Region<RedisKey, RedisData> region = uncheckedCast(mock(PartitionedRegion.class));
     final byte[] baseBytes = {'0', '1'};
     final byte[] bytesToAppend = {'2', '3'};
 
@@ -115,7 +116,7 @@ public class RedisStringTest {
 
   @Test
   public void setStoresStableDelta() {
-    Region<RedisKey, RedisData> region = uncheckedCast(mock(Region.class));
+    Region<RedisKey, RedisData> region = uncheckedCast(mock(PartitionedRegion.class));
     final byte[] baseBytes = {'0', '1'};
     final byte[] bytesToSet = {'2', '3'};
 
@@ -131,7 +132,7 @@ public class RedisStringTest {
 
   @Test
   public void incrStoresStableDelta() {
-    Region<RedisKey, RedisData> region = uncheckedCast(mock(Region.class));
+    Region<RedisKey, RedisData> region = uncheckedCast(mock(PartitionedRegion.class));
     final byte[] baseBytes = {'1'};
 
     when(region.put(any(), any()))
@@ -146,7 +147,7 @@ public class RedisStringTest {
 
   @Test
   public void incrbyStoresStableDelta() {
-    Region<RedisKey, RedisData> region = uncheckedCast(mock(Region.class));
+    Region<RedisKey, RedisData> region = uncheckedCast(mock(PartitionedRegion.class));
     final byte[] baseBytes = {'1'};
 
     when(region.put(any(), any()))
@@ -161,7 +162,7 @@ public class RedisStringTest {
 
   @Test
   public void incrbyfloatStoresStableDelta() {
-    Region<RedisKey, RedisData> region = uncheckedCast(mock(Region.class));
+    Region<RedisKey, RedisData> region = uncheckedCast(mock(PartitionedRegion.class));
     final byte[] baseBytes = {'1'};
 
     when(region.put(any(), any()))
@@ -176,7 +177,7 @@ public class RedisStringTest {
 
   @Test
   public void setbitStoresStableDelta() {
-    Region<RedisKey, RedisData> region = uncheckedCast(mock(Region.class));
+    Region<RedisKey, RedisData> region = uncheckedCast(mock(PartitionedRegion.class));
     final byte[] baseBytes = {'0', '1'};
 
     when(region.put(any(), any()))
@@ -206,7 +207,7 @@ public class RedisStringTest {
 
   @Test
   public void decrStoresStableDelta() {
-    Region<RedisKey, RedisData> region = uncheckedCast(mock(Region.class));
+    Region<RedisKey, RedisData> region = uncheckedCast(mock(PartitionedRegion.class));
     final byte[] baseBytes = {'1'};
 
     when(region.put(any(), any()))
@@ -221,7 +222,7 @@ public class RedisStringTest {
 
   @Test
   public void decrbyStoresStableDelta() {
-    Region<RedisKey, RedisData> region = uncheckedCast(mock(Region.class));
+    Region<RedisKey, RedisData> region = uncheckedCast(mock(PartitionedRegion.class));
     final byte[] baseBytes = {'1'};
 
     when(region.put(any(), any()))
@@ -236,7 +237,7 @@ public class RedisStringTest {
 
   @Test
   public void decrbyfloatStoresStableDelta() {
-    Region<RedisKey, RedisData> region = uncheckedCast(mock(Region.class));
+    Region<RedisKey, RedisData> region = uncheckedCast(mock(PartitionedRegion.class));
     final byte[] baseBytes = {'1'};
 
     when(region.put(any(), any()))
@@ -259,7 +260,7 @@ public class RedisStringTest {
 
   @Test
   public void incrThrowsArithmeticErrorWhenNotALong() {
-    Region<RedisKey, RedisData> region = uncheckedCast(mock(Region.class));
+    Region<RedisKey, RedisData> region = uncheckedCast(mock(PartitionedRegion.class));
     byte[] bytes = stringToBytes("10 1");
     RedisString string = new RedisString(bytes);
     assertThatThrownBy(() -> string.incr(region, null)).isInstanceOf(NumberFormatException.class);
@@ -267,7 +268,7 @@ public class RedisStringTest {
 
   @Test
   public void incrErrorsWhenValueOverflows() {
-    Region<RedisKey, RedisData> region = uncheckedCast(mock(Region.class));
+    Region<RedisKey, RedisData> region = uncheckedCast(mock(PartitionedRegion.class));
     byte[] bytes = longToBytes(Long.MAX_VALUE);
     RedisString string = new RedisString(bytes);
     assertThatThrownBy(() -> string.incr(region, null)).isInstanceOf(ArithmeticException.class);
@@ -275,7 +276,7 @@ public class RedisStringTest {
 
   @Test
   public void incrIncrementsValueAtGivenKey() {
-    Region<RedisKey, RedisData> region = uncheckedCast(mock(Region.class));
+    Region<RedisKey, RedisData> region = uncheckedCast(mock(PartitionedRegion.class));
     byte[] bytes = stringToBytes("10");
     RedisString string = new RedisString(bytes);
     string.incr(region, null);
@@ -284,7 +285,7 @@ public class RedisStringTest {
 
   @Test
   public void incrbyThrowsNumberFormatExceptionWhenNotALong() {
-    Region<RedisKey, RedisData> region = uncheckedCast(mock(Region.class));
+    Region<RedisKey, RedisData> region = uncheckedCast(mock(PartitionedRegion.class));
     byte[] bytes = stringToBytes("10 1");
     RedisString string = new RedisString(bytes);
     assertThatThrownBy(() -> string.incrby(region, null, 2L))
@@ -293,7 +294,7 @@ public class RedisStringTest {
 
   @Test
   public void incrbyErrorsWhenValueOverflows() {
-    Region<RedisKey, RedisData> region = uncheckedCast(mock(Region.class));
+    Region<RedisKey, RedisData> region = uncheckedCast(mock(PartitionedRegion.class));
     byte[] bytes = longToBytes(Long.MAX_VALUE);
     RedisString string = new RedisString(bytes);
     assertThatThrownBy(() -> string.incrby(region, null, 2L))
@@ -302,7 +303,7 @@ public class RedisStringTest {
 
   @Test
   public void incrbyIncrementsValueByGivenLong() {
-    Region<RedisKey, RedisData> region = uncheckedCast(mock(Region.class));
+    Region<RedisKey, RedisData> region = uncheckedCast(mock(PartitionedRegion.class));
     byte[] bytes = stringToBytes("10");
     RedisString string = new RedisString(bytes);
     string.incrby(region, null, 2L);
@@ -311,7 +312,7 @@ public class RedisStringTest {
 
   @Test
   public void incrbyfloatThrowsArithmeticErrorWhenNotADouble() {
-    Region<RedisKey, RedisData> region = uncheckedCast(mock(Region.class));
+    Region<RedisKey, RedisData> region = uncheckedCast(mock(PartitionedRegion.class));
     byte[] bytes = stringToBytes("10 1");
     RedisString string = new RedisString(bytes);
     assertThatThrownBy(() -> string.incrbyfloat(region, null, new BigDecimal("1.1")))
@@ -320,7 +321,7 @@ public class RedisStringTest {
 
   @Test
   public void incrbyfloatIncrementsValueByGivenFloat() {
-    Region<RedisKey, RedisData> region = uncheckedCast(mock(Region.class));
+    Region<RedisKey, RedisData> region = uncheckedCast(mock(PartitionedRegion.class));
     byte[] bytes = stringToBytes("10");
     RedisString string = new RedisString(bytes);
     string.incrbyfloat(region, null, new BigDecimal("2.20"));
@@ -329,7 +330,7 @@ public class RedisStringTest {
 
   @Test
   public void decrThrowsNumberFormatExceptionWhenNotALong() {
-    Region<RedisKey, RedisData> region = uncheckedCast(mock(Region.class));
+    Region<RedisKey, RedisData> region = uncheckedCast(mock(PartitionedRegion.class));
     byte[] bytes = {0};
     RedisString string = new RedisString(bytes);
     assertThatThrownBy(() -> string.decr(region, null)).isInstanceOf(NumberFormatException.class);
@@ -337,7 +338,7 @@ public class RedisStringTest {
 
   @Test
   public void decrThrowsArithmeticExceptionWhenDecrementingMin() {
-    Region<RedisKey, RedisData> region = uncheckedCast(mock(Region.class));
+    Region<RedisKey, RedisData> region = uncheckedCast(mock(PartitionedRegion.class));
     byte[] bytes = longToBytes(Long.MIN_VALUE);
     RedisString string = new RedisString(bytes);
     assertThatThrownBy(() -> string.decr(region, null)).isInstanceOf(ArithmeticException.class);
@@ -345,7 +346,7 @@ public class RedisStringTest {
 
   @Test
   public void decrDecrementsValue() {
-    Region<RedisKey, RedisData> region = uncheckedCast(mock(Region.class));
+    Region<RedisKey, RedisData> region = uncheckedCast(mock(PartitionedRegion.class));
     byte[] bytes = stringToBytes("10");
     RedisString string = new RedisString(bytes);
     string.decr(region, null);
@@ -354,7 +355,7 @@ public class RedisStringTest {
 
   @Test
   public void decrbyThrowsNumberFormatExceptionWhenNotALong() {
-    Region<RedisKey, RedisData> region = uncheckedCast(mock(Region.class));
+    Region<RedisKey, RedisData> region = uncheckedCast(mock(PartitionedRegion.class));
     byte[] bytes = {1};
     RedisString string = new RedisString(bytes);
     assertThatThrownBy(() -> string.decrby(region, null, 2))
@@ -363,7 +364,7 @@ public class RedisStringTest {
 
   @Test
   public void decrbyThrowsArithmeticExceptionWhenDecrementingMin() {
-    Region<RedisKey, RedisData> region = uncheckedCast(mock(Region.class));
+    Region<RedisKey, RedisData> region = uncheckedCast(mock(PartitionedRegion.class));
     byte[] bytes = longToBytes(Long.MIN_VALUE);
     RedisString string = new RedisString(bytes);
     assertThatThrownBy(() -> string.decrby(region, null, 2))
@@ -372,7 +373,7 @@ public class RedisStringTest {
 
   @Test
   public void decrbyDecrementsValue() {
-    Region<RedisKey, RedisData> region = uncheckedCast(mock(Region.class));
+    Region<RedisKey, RedisData> region = uncheckedCast(mock(PartitionedRegion.class));
     byte[] bytes = stringToBytes("10");
     RedisString string = new RedisString(bytes);
     string.decrby(region, null, 2);
@@ -425,7 +426,7 @@ public class RedisStringTest {
 
   @Test
   public void setExpirationTimestamp_stores_delta_that_is_stable() {
-    Region<RedisKey, RedisData> region = uncheckedCast(mock(Region.class));
+    Region<RedisKey, RedisData> region = uncheckedCast(mock(PartitionedRegion.class));
     final byte[] bytes = {0, 1};
     when(region.put(any(), any()))
         .thenAnswer(invocation -> validateDeltaSerialization(bytes, invocation));