From e8e053de8e623fc6cf08627d55ca4c6263408eb3 Mon Sep 17 00:00:00 2001 From: brido4125 Date: Thu, 15 Jun 2023 14:37:33 +0900 Subject: [PATCH] FIX: getOperationStatus method in asyncCollectionPipedInsert/Update. --- .../java/net/spy/memcached/ArcusClient.java | 60 ++++++++----------- 1 file changed, 24 insertions(+), 36 deletions(-) diff --git a/src/main/java/net/spy/memcached/ArcusClient.java b/src/main/java/net/spy/memcached/ArcusClient.java index 77fcb811b..299da9f56 100644 --- a/src/main/java/net/spy/memcached/ArcusClient.java +++ b/src/main/java/net/spy/memcached/ArcusClient.java @@ -952,9 +952,6 @@ CollectionFuture> asyncCollectionPip final CountDownLatch latch = new CountDownLatch(updateList.size()); - final List mergedOperationStatus = Collections - .synchronizedList(new ArrayList(updateList.size())); - final Map mergedResult = new ConcurrentHashMap(); @@ -966,15 +963,12 @@ CollectionFuture> asyncCollectionPip new CollectionPipedUpdateOperation.Callback() { // each result status public void receivedStatus(OperationStatus status) { - CollectionOperationStatus cstatus; - - if (status instanceof CollectionOperationStatus) { - cstatus = (CollectionOperationStatus) status; - } else { - getLogger().warn("Unhandled state: " + status); - cstatus = new CollectionOperationStatus(status); - } - mergedOperationStatus.add(cstatus); + /* + * Nothing to do here. + * Because the result status is handled in gotStatus method. + * gotStatus method put failed status into mergedResult. + * If mergedResult was not empty, the merged operation status is failed. + * */ } // complete @@ -1058,12 +1052,12 @@ public Map get(long duration, @Override public CollectionOperationStatus getOperationStatus() { - for (OperationStatus status : mergedOperationStatus) { - if (!status.isSuccess()) { - return new CollectionOperationStatus(status); - } - } - return new CollectionOperationStatus(true, "END", CollectionResponse.END); + return isDone() ? + (mergedResult.isEmpty() + ? new CollectionOperationStatus(true, "END", CollectionResponse.END) + : new CollectionOperationStatus(false, "END", CollectionResponse.END) + ) + : null; } @Override @@ -3907,9 +3901,6 @@ CollectionFuture> asyncCollectionPip final CountDownLatch latch = new CountDownLatch(insertList.size()); - final List mergedOperationStatus = Collections - .synchronizedList(new ArrayList(insertList.size())); - final Map mergedResult = new ConcurrentHashMap(); @@ -3921,15 +3912,12 @@ CollectionFuture> asyncCollectionPip new CollectionPipedInsertOperation.Callback() { // each result status public void receivedStatus(OperationStatus status) { - CollectionOperationStatus cstatus; - - if (status instanceof CollectionOperationStatus) { - cstatus = (CollectionOperationStatus) status; - } else { - getLogger().warn("Unhandled state: " + status); - cstatus = new CollectionOperationStatus(status); - } - mergedOperationStatus.add(cstatus); + /* + * Nothing to do here. + * Because the result status is handled in gotStatus method. + * gotStatus method put failed status into mergedResult. + * If mergedResult was not empty, the merged operation status is failed. + * */ } // complete @@ -4012,12 +4000,12 @@ public Map get(long duration, @Override public CollectionOperationStatus getOperationStatus() { - for (OperationStatus status : mergedOperationStatus) { - if (!status.isSuccess()) { - return new CollectionOperationStatus(status); - } - } - return new CollectionOperationStatus(true, "END", CollectionResponse.END); + return isDone() ? + (mergedResult.isEmpty() + ? new CollectionOperationStatus(true, "END", CollectionResponse.END) + : new CollectionOperationStatus(false, "END", CollectionResponse.END) + ) + : null; } @Override