You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cloudstack.apache.org by ra...@apache.org on 2015/04/17 14:39:34 UTC

git commit: updated refs/heads/volume-upload to a7e511c

Repository: cloudstack
Updated Branches:
  refs/heads/volume-upload 4f35d3611 -> a7e511c1a


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/volume-upload
Commit: a7e511c1a30c974038ebd5683f112631e5abb6da
Parents: 4f35d36
Author: Rajani Karuturi <ra...@gmail.com>
Authored: Fri Apr 17 18:03:13 2015 +0530
Committer: Rajani Karuturi <ra...@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));
     }