Ensure lpush atomic
diff --git a/geode-for-redis/src/integrationTest/java/org/apache/geode/redis/internal/commands/executor/list/AbstractLPopIntegrationTest.java b/geode-for-redis/src/integrationTest/java/org/apache/geode/redis/internal/commands/executor/list/AbstractLPopIntegrationTest.java
index fd7979d..3457635 100755
--- a/geode-for-redis/src/integrationTest/java/org/apache/geode/redis/internal/commands/executor/list/AbstractLPopIntegrationTest.java
+++ b/geode-for-redis/src/integrationTest/java/org/apache/geode/redis/internal/commands/executor/list/AbstractLPopIntegrationTest.java
@@ -96,8 +96,8 @@
@Test
public void lpop_withConcurrentLPush_returnsCorrectValue() {
- String[] valuesInitial = new String[] {"one", "two", "three"};
- String[] valuesToAdd = new String[] {"pear", "apple", "plum", "orange", "peach"};
+ String[] valuesInitial = new String[] {"un", "deux", "troix"};
+ String[] valuesToAdd = new String[] {"plum", "peach", "orange"};
jedis.lpush(KEY, valuesInitial);
final AtomicReference<String> lpopReference = new AtomicReference<>();
@@ -106,9 +106,9 @@
i -> lpopReference.set(jedis.lpop(KEY)))
.runWithAction(() -> {
assertThat(lpopReference).satisfiesAnyOf(
- lpopResult -> assertThat(lpopReference.get()).isEqualTo("peach"),
- lpopResult -> assertThat(lpopReference.get()).isEqualTo("three"),
- lpopResult -> assertThat(lpopResult.get()).isNull());
+ lpopResult -> assertThat(lpopReference.get()).isEqualTo("orange"),
+ lpopResult -> assertThat(lpopReference.get()).isEqualTo("troix"),
+ lpopResult -> assertThat(lpopReference.get()).isNull());
jedis.del(KEY);
jedis.lpush(KEY, valuesInitial);
});
diff --git a/geode-for-redis/src/integrationTest/java/org/apache/geode/redis/internal/commands/executor/list/AbstractLPushIntegrationTest.java b/geode-for-redis/src/integrationTest/java/org/apache/geode/redis/internal/commands/executor/list/AbstractLPushIntegrationTest.java
index f3ecf43..25959fd 100755
--- a/geode-for-redis/src/integrationTest/java/org/apache/geode/redis/internal/commands/executor/list/AbstractLPushIntegrationTest.java
+++ b/geode-for-redis/src/integrationTest/java/org/apache/geode/redis/internal/commands/executor/list/AbstractLPushIntegrationTest.java
@@ -95,8 +95,18 @@
@Test
public void lpush_addsElementsInCorrectOrder_givenMultipleElements() {
jedis.lpush(KEY, "e1", "e2", "e3");
+ jedis.lpush(KEY, "e4", "e5", "e6");
String result = jedis.lpop(KEY);
+ assertThat(result).isEqualTo("e6");
+
+ result = jedis.lpop(KEY);
+ assertThat(result).isEqualTo("e5");
+
+ result = jedis.lpop(KEY);
+ assertThat(result).isEqualTo("e4");
+
+ result = jedis.lpop(KEY);
assertThat(result).isEqualTo("e3");
result = jedis.lpop(KEY);
diff --git a/geode-for-redis/src/main/java/org/apache/geode/redis/internal/commands/RedisCommandType.java b/geode-for-redis/src/main/java/org/apache/geode/redis/internal/commands/RedisCommandType.java
index e5ea743..d67a7a1 100755
--- a/geode-for-redis/src/main/java/org/apache/geode/redis/internal/commands/RedisCommandType.java
+++ b/geode-for-redis/src/main/java/org/apache/geode/redis/internal/commands/RedisCommandType.java
@@ -382,7 +382,8 @@
LLEN(new LLenExecutor(), Category.LIST, SUPPORTED, new Parameter().exact(2).flags(READONLY, FAST)),
LPOP(new LPopExecutor(), Category.LIST, SUPPORTED, new Parameter().exact(2).flags(WRITE, FAST)),
- LPUSH(new LPushExecutor(), Category.LIST, SUPPORTED, new Parameter().min(3).flags(WRITE, DENYOOM, FAST)),
+ LPUSH(new LPushExecutor(), Category.LIST, SUPPORTED,
+ new Parameter().min(3).flags(WRITE, DENYOOM, FAST)),
/********** Publish Subscribe **********/
diff --git a/geode-for-redis/src/main/java/org/apache/geode/redis/internal/data/RedisList.java b/geode-for-redis/src/main/java/org/apache/geode/redis/internal/data/RedisList.java
index 61f9b79..02928d0 100644
--- a/geode-for-redis/src/main/java/org/apache/geode/redis/internal/data/RedisList.java
+++ b/geode-for-redis/src/main/java/org/apache/geode/redis/internal/data/RedisList.java
@@ -49,9 +49,6 @@
* @return the number of elements actually added
*/
public long lpush(List<byte[]> elementsToAdd, Region<RedisKey, RedisData> region, RedisKey key) {
- // for (byte[] element : elementsToAdd) {
- // elementPush(element);
- // }
elementsPush(elementsToAdd);
storeChanges(region, key, new AddByteArrays(elementsToAdd));
return elementList.size();
@@ -133,7 +130,9 @@
}
public synchronized void elementsPush(List<byte[]> elementsToAdd) {
- elementList.addAll(0, elementsToAdd);
+ for (byte[] element : elementsToAdd) {
+ elementPush(element);
+ }
}
@Override