Added file exists check for onetime post url

also, fixed an issue where in the upload was going to error state in
case of parallel call to the same post url


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

Branch: refs/heads/master
Commit: a7e511c1a30c974038ebd5683f112631e5abb6da
Parents: 4f35d36
Author: Rajani Karuturi <rajanikarut...@gmail.com>
Authored: Fri Apr 17 18:03:13 2015 +0530
Committer: Rajani Karuturi <rajanikarut...@gmail.com>
Committed: Fri Apr 17 18:08:23 2015 +0530

----------------------------------------------------------------------
 .../storage/resource/HttpUploadServerHandler.java     | 13 +++++++++----
 .../storage/resource/NfsSecondaryStorageResource.java | 14 ++++++++++++--
 2 files changed, 21 insertions(+), 6 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cloudstack/blob/a7e511c1/services/secondary-storage/server/src/org/apache/cloudstack/storage/resource/HttpUploadServerHandler.java
----------------------------------------------------------------------
diff --git 
a/services/secondary-storage/server/src/org/apache/cloudstack/storage/resource/HttpUploadServerHandler.java
 
b/services/secondary-storage/server/src/org/apache/cloudstack/storage/resource/HttpUploadServerHandler.java
index 4a3fa86..05e5fe4 100644
--- 
a/services/secondary-storage/server/src/org/apache/cloudstack/storage/resource/HttpUploadServerHandler.java
+++ 
b/services/secondary-storage/server/src/org/apache/cloudstack/storage/resource/HttpUploadServerHandler.java
@@ -77,7 +77,7 @@ public class HttpUploadServerHandler extends 
SimpleChannelInboundHandler<HttpObj
 
     private String uuid;
 
-    private boolean fileReceived = false;
+    private boolean requestProcessed = false;
 
     private static final String HEADER_SIGNATURE = "X-signature";
 
@@ -96,12 +96,12 @@ public class HttpUploadServerHandler extends 
SimpleChannelInboundHandler<HttpObj
         if (decoder != null) {
             decoder.cleanFiles();
         }
-        fileReceived = false;
+        requestProcessed = false;
     }
 
     @Override
     public void channelInactive(ChannelHandlerContext ctx) throws Exception {
-        if (!fileReceived) {
+        if (!requestProcessed) {
             String message = "file receive failed or connection closed 
prematurely.";
             logger.error(message);
             storageResource.updateStateMapWithError(uuid, message);
@@ -163,12 +163,14 @@ public class HttpUploadServerHandler extends 
SimpleChannelInboundHandler<HttpObj
                     logger.error("post request validation failed", ex);
                     responseContent.append(ex.getMessage());
                     writeResponse(ctx.channel(), 
HttpResponseStatus.BAD_REQUEST);
+                    requestProcessed = true;
                     return;
                 }
                 if (uploadEntity == null) {
                     logger.error("Unable to create upload entity. An exception 
occurred.");
                     responseContent.append("Internal Server Error");
                     writeResponse(ctx.channel(), 
HttpResponseStatus.INTERNAL_SERVER_ERROR);
+                    requestProcessed = true;
                     return;
                 }
                 //set the base directory to download the file
@@ -181,12 +183,14 @@ public class HttpUploadServerHandler extends 
SimpleChannelInboundHandler<HttpObj
                     logger.error("exception while initialising the decoder", 
e);
                     responseContent.append(e.getMessage());
                     writeResponse(ctx.channel(), 
HttpResponseStatus.INTERNAL_SERVER_ERROR);
+                    requestProcessed = true;
                     return;
                 }
             } else {
                 logger.warn("received a get request");
                 responseContent.append("only post requests are allowed");
                 writeResponse(ctx.channel(), HttpResponseStatus.BAD_REQUEST);
+                requestProcessed = true;
                 return;
             }
 
@@ -202,6 +206,7 @@ public class HttpUploadServerHandler extends 
SimpleChannelInboundHandler<HttpObj
                     logger.error("data decoding exception", e);
                     responseContent.append(e.getMessage());
                     writeResponse(ctx.channel(), 
HttpResponseStatus.INTERNAL_SERVER_ERROR);
+                    requestProcessed = true;
                     return;
                 }
                 if (chunk instanceof LastHttpContent) {
@@ -229,7 +234,7 @@ public class HttpUploadServerHandler extends 
SimpleChannelInboundHandler<HttpObj
                     if (data.getHttpDataType() == HttpDataType.FileUpload) {
                         FileUpload fileUpload = (FileUpload) data;
                         if (fileUpload.isCompleted()) {
-                            fileReceived = true;
+                            requestProcessed = true;
                             String format = 
ImageStoreUtil.checkTemplateFormat(fileUpload.getFile().getAbsolutePath(), 
fileUpload.getFilename());
                             if(StringUtils.isNotBlank(format)) {
                                 String errorString = "File type mismatch 
between the sent file and the actual content. Received: " + format;

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/a7e511c1/services/secondary-storage/server/src/org/apache/cloudstack/storage/resource/NfsSecondaryStorageResource.java
----------------------------------------------------------------------
diff --git 
a/services/secondary-storage/server/src/org/apache/cloudstack/storage/resource/NfsSecondaryStorageResource.java
 
b/services/secondary-storage/server/src/org/apache/cloudstack/storage/resource/NfsSecondaryStorageResource.java
index 4644785..7cfaa9c 100755
--- 
a/services/secondary-storage/server/src/org/apache/cloudstack/storage/resource/NfsSecondaryStorageResource.java
+++ 
b/services/secondary-storage/server/src/org/apache/cloudstack/storage/resource/NfsSecondaryStorageResource.java
@@ -2617,9 +2617,13 @@ public class NfsSecondaryStorageResource extends 
ServerResourceBase implements S
             throw new InvalidParameterValueException("unable to decode and 
deserialize metadata");
         } else {
             uuid = cmd.getEntityUUID();
-            if (uploadEntityStateMap.containsKey(uuid)) {
+            if (isOneTimePostUrlUsed(cmd)) {
                 uploadEntity = uploadEntityStateMap.get(uuid);
-                throw new InvalidParameterValueException("The one time post 
url is already used and the upload is in " + uploadEntity.getUploadState() + " 
state.");
+                StringBuilder errorMessage = new StringBuilder("The one time 
post url is already used");
+                if (uploadEntity != null) {
+                    errorMessage.append(" and the upload is in 
").append(uploadEntity.getUploadState()).append(" state.");
+                }
+                throw new 
InvalidParameterValueException(errorMessage.toString());
             }
             int maxSizeInGB = Integer.valueOf(cmd.getMaxUploadSize());
             int contentLengthInGB = getSizeInGB(contentLength);
@@ -2657,6 +2661,12 @@ public class NfsSecondaryStorageResource extends 
ServerResourceBase implements S
         return uploadEntity;
     }
 
+    private boolean isOneTimePostUrlUsed(TemplateOrVolumePostUploadCommand 
cmd) {
+        String uuid = cmd.getEntityUUID();
+        String uploadPath = this.getRootDir(cmd.getDataTo()) + File.separator 
+ cmd.getAbsolutePath();
+        return uploadEntityStateMap.containsKey(uuid) || new 
File(uploadPath).exists();
+    }
+
     private int getSizeInGB(long sizeInBytes) {
         return (int)Math.ceil(sizeInBytes * 1.0d / (1024 * 1024 * 1024));
     }

Reply via email to