NvmfFuture: fix concurrency bug

Fix bug when completed counter was incremented in parallel
and never reached 2.

Signed-off-by: Jonas Pfefferle <peppe...@apache.org>


Project: http://git-wip-us.apache.org/repos/asf/incubator-crail/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-crail/commit/feb765c3
Tree: http://git-wip-us.apache.org/repos/asf/incubator-crail/tree/feb765c3
Diff: http://git-wip-us.apache.org/repos/asf/incubator-crail/diff/feb765c3

Branch: refs/heads/master
Commit: feb765c3143d35f3526909b1b69aa33790b21a9d
Parents: ac9e299
Author: Jonas Pfefferle <peppe...@apache.org>
Authored: Mon Apr 9 15:18:40 2018 +0200
Committer: Jonas Pfefferle <peppe...@apache.org>
Committed: Tue Apr 10 13:19:02 2018 +0200

----------------------------------------------------------------------
 .../org/apache/crail/storage/nvmf/client/NvmfFuture.java | 11 ++++++-----
 1 file changed, 6 insertions(+), 5 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-crail/blob/feb765c3/storage-nvmf/src/main/java/org/apache/crail/storage/nvmf/client/NvmfFuture.java
----------------------------------------------------------------------
diff --git 
a/storage-nvmf/src/main/java/org/apache/crail/storage/nvmf/client/NvmfFuture.java
 
b/storage-nvmf/src/main/java/org/apache/crail/storage/nvmf/client/NvmfFuture.java
index 639f568..885121d 100644
--- 
a/storage-nvmf/src/main/java/org/apache/crail/storage/nvmf/client/NvmfFuture.java
+++ 
b/storage-nvmf/src/main/java/org/apache/crail/storage/nvmf/client/NvmfFuture.java
@@ -28,16 +28,17 @@ import java.util.Queue;
 import java.util.concurrent.ExecutionException;
 import java.util.concurrent.TimeUnit;
 import java.util.concurrent.TimeoutException;
+import java.util.concurrent.atomic.AtomicInteger;
 
 public class NvmfFuture<Command extends NvmIoCommand<? extends 
NvmIoCommandCapsule>> implements StorageFuture, OperationCallback {
        private final NvmfStorageEndpoint endpoint;
        private final Command command;
        private final Queue<Command> operations;
-       private boolean done;
+       private volatile boolean done;
        private RdmaException exception;
        private final StorageResult storageResult;
        private final Response<NvmResponseCapsule> response;
-       private int completed;
+       private final AtomicInteger completed;
 
        NvmfFuture(NvmfStorageEndpoint endpoint, Command command, 
Response<NvmResponseCapsule> response,
                           Queue<Command> operations, int length) {
@@ -47,7 +48,7 @@ public class NvmfFuture<Command extends NvmIoCommand<? 
extends NvmIoCommandCapsu
                this.done = false;
                this.storageResult = () -> length;
                this.response = response;
-               this.completed = 0;
+               this.completed = new AtomicInteger(0);
        }
 
        @Override
@@ -129,8 +130,8 @@ public class NvmfFuture<Command extends NvmIoCommand<? 
extends NvmIoCommandCapsu
        @Override
        public void onComplete() {
                assert !done;
-               assert completed < 2;
-               if (++completed == 2) {
+               assert completed.get() < 2;
+               if (completed.incrementAndGet() == 2) {
                        /* we need to complete command and response */
                        operations.add(command);
                        this.done = true;

Reply via email to