You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@usergrid.apache.org by sn...@apache.org on 2015/05/19 16:33:12 UTC

[1/3] incubator-usergrid git commit: Only synchronize initialization code, not whole method.

Repository: incubator-usergrid
Updated Branches:
  refs/heads/USERGRID-579-jcloud171 e0d9fe675 -> 49ae4ac5b


Only synchronize initialization code, not whole method.


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

Branch: refs/heads/USERGRID-579-jcloud171
Commit: 5079d4737cfdb960665692e4b16bf59ea61d5dd5
Parents: c6289d5
Author: Dave Johnson <dm...@apigee.com>
Authored: Mon May 18 13:45:28 2015 -0400
Committer: Dave Johnson <dm...@apigee.com>
Committed: Mon May 18 13:45:28 2015 -0400

----------------------------------------------------------------------
 .../rest/management/ManagementResource.java     | 60 +++++++++++---------
 1 file changed, 32 insertions(+), 28 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/5079d473/stack/rest/src/main/java/org/apache/usergrid/rest/management/ManagementResource.java
----------------------------------------------------------------------
diff --git a/stack/rest/src/main/java/org/apache/usergrid/rest/management/ManagementResource.java b/stack/rest/src/main/java/org/apache/usergrid/rest/management/ManagementResource.java
index ad604d5..46d6d6b 100644
--- a/stack/rest/src/main/java/org/apache/usergrid/rest/management/ManagementResource.java
+++ b/stack/rest/src/main/java/org/apache/usergrid/rest/management/ManagementResource.java
@@ -710,44 +710,48 @@ public class ManagementResource extends AbstractContextResource {
     }
 
 
-    synchronized Client getJerseyClient() {
+    private Client getJerseyClient() {
 
         if ( jerseyClient == null ) {
 
-            // create HTTPClient and with configured connection pool
+            synchronized ( this ) {
 
-            int poolSize = 100; // connections
-            final String poolSizeStr = properties.getProperty( CENTRAL_CONNECTION_POOL_SIZE );
-            if ( poolSizeStr != null ) {
-                poolSize = Integer.parseInt( poolSizeStr );
-            }
+                // create HTTPClient and with configured connection pool
 
-            MultiThreadedHttpConnectionManager cm = new MultiThreadedHttpConnectionManager();
-            HttpConnectionManagerParams cmParams = cm.getParams();
-            cmParams.setMaxTotalConnections( poolSize );
-            HttpClient httpClient = new HttpClient( cm );
+                int poolSize = 100; // connections
+                final String poolSizeStr = properties.getProperty( CENTRAL_CONNECTION_POOL_SIZE );
+                if ( poolSizeStr != null ) {
+                    poolSize = Integer.parseInt( poolSizeStr );
+                }
 
-            // create Jersey Client using that HTTPClient and with configured timeouts
+                MultiThreadedHttpConnectionManager cm = new MultiThreadedHttpConnectionManager();
+                HttpConnectionManagerParams cmParams = cm.getParams();
+                cmParams.setMaxTotalConnections( poolSize );
+                HttpClient httpClient = new HttpClient( cm );
 
-            int timeout = 20000; // ms
-            final String timeoutStr = properties.getProperty( CENTRAL_CONNECTION_TIMEOUT );
-            if ( timeoutStr != null ) {
-                timeout = Integer.parseInt( timeoutStr );
-            }
+                // create Jersey Client using that HTTPClient and with configured timeouts
 
-            int readTimeout = 20000; // ms
-            final String readTimeoutStr = properties.getProperty( CENTRAL_READ_TIMEOUT );
-            if ( readTimeoutStr != null ) {
-                readTimeout = Integer.parseInt( readTimeoutStr );
-            }
+                int timeout = 20000; // ms
+                final String timeoutStr = properties.getProperty( CENTRAL_CONNECTION_TIMEOUT );
+                if ( timeoutStr != null ) {
+                    timeout = Integer.parseInt( timeoutStr );
+                }
 
-            ClientConfig clientConfig = new DefaultClientConfig();
-            clientConfig.getFeatures().put( JSONConfiguration.FEATURE_POJO_MAPPING, Boolean.TRUE );
-            clientConfig.getProperties().put( ClientConfig.PROPERTY_CONNECT_TIMEOUT, timeout ); // ms
-            clientConfig.getProperties().put( ClientConfig.PROPERTY_READ_TIMEOUT, readTimeout ); // ms
+                int readTimeout = 20000; // ms
+                final String readTimeoutStr = properties.getProperty( CENTRAL_READ_TIMEOUT );
+                if ( readTimeoutStr != null ) {
+                    readTimeout = Integer.parseInt( readTimeoutStr );
+                }
+
+                ClientConfig clientConfig = new DefaultClientConfig();
+                clientConfig.getFeatures().put( JSONConfiguration.FEATURE_POJO_MAPPING, Boolean.TRUE );
+                clientConfig.getProperties().put( ClientConfig.PROPERTY_CONNECT_TIMEOUT, timeout ); // ms
+                clientConfig.getProperties().put( ClientConfig.PROPERTY_READ_TIMEOUT, readTimeout ); // ms
 
-            ApacheHttpClientHandler handler = new ApacheHttpClientHandler( httpClient, clientConfig );
-            jerseyClient = new ApacheHttpClient( handler );
+                ApacheHttpClientHandler handler = new ApacheHttpClientHandler( httpClient, clientConfig );
+                jerseyClient = new ApacheHttpClient( handler );
+
+            }
         }
 
         return jerseyClient;


[3/3] incubator-usergrid git commit: Use ExecutorService to limit number of threads used for Uploads (default is 40) and add property to set max uploaded file size (default is 50mb).

Posted by sn...@apache.org.
Use ExecutorService to limit number of threads used for Uploads (default is 40) and add property to set max uploaded file size (default is 50mb).


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

Branch: refs/heads/USERGRID-579-jcloud171
Commit: 49ae4ac5b8d5d77e90e6e6c6e9d8b299a5423863
Parents: 6f90eba
Author: Dave Johnson <dm...@apigee.com>
Authored: Tue May 19 10:32:42 2015 -0400
Committer: Dave Johnson <dm...@apigee.com>
Committed: Tue May 19 10:32:42 2015 -0400

----------------------------------------------------------------------
 .../main/resources/usergrid-default.properties  |   2 +
 .../applications/assets/AssetResourceIT.java    |  68 +++++-
 .../src/test/resources/cat-larger-than-6mb.jpg  | Bin 0 -> 9799257 bytes
 .../services/assets/data/S3BinaryStore.java     | 215 +++++++++++++------
 4 files changed, 216 insertions(+), 69 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/49ae4ac5/stack/config/src/main/resources/usergrid-default.properties
----------------------------------------------------------------------
diff --git a/stack/config/src/main/resources/usergrid-default.properties b/stack/config/src/main/resources/usergrid-default.properties
index d653b7e..0a4f218 100644
--- a/stack/config/src/main/resources/usergrid-default.properties
+++ b/stack/config/src/main/resources/usergrid-default.properties
@@ -160,6 +160,8 @@ swagger.basepath=http://localhost:8080
 AWS_ACCESS_KEY_ID=
 AWS_SECRET_KEY=
 usergrid.binary.bucketname=usergrid-test
+usergrid.binary.max-size-mb=50
+usergrid.binary.upload-workers=40
 
 usergrid.test.sample_data_url=
 

http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/49ae4ac5/stack/rest/src/test/java/org/apache/usergrid/rest/applications/assets/AssetResourceIT.java
----------------------------------------------------------------------
diff --git a/stack/rest/src/test/java/org/apache/usergrid/rest/applications/assets/AssetResourceIT.java b/stack/rest/src/test/java/org/apache/usergrid/rest/applications/assets/AssetResourceIT.java
index 666f95e..c3cab63 100644
--- a/stack/rest/src/test/java/org/apache/usergrid/rest/applications/assets/AssetResourceIT.java
+++ b/stack/rest/src/test/java/org/apache/usergrid/rest/applications/assets/AssetResourceIT.java
@@ -19,6 +19,7 @@ package org.apache.usergrid.rest.applications.assets;
 
 import java.io.IOException;
 import java.io.InputStream;
+import java.util.HashMap;
 import java.util.Map;
 import java.util.UUID;
 import java.util.concurrent.TimeoutException;
@@ -40,10 +41,9 @@ import org.apache.commons.io.IOUtils;
 
 import com.sun.jersey.multipart.FormDataMultiPart;
 
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertNotNull;
+import static org.apache.usergrid.management.AccountCreationProps.PROPERTIES_ADMIN_USERS_REQUIRE_CONFIRMATION;
 import static org.apache.usergrid.utils.MapUtils.hashMap;
+import static org.junit.Assert.*;
 
 
 @Concurrent()
@@ -249,12 +249,11 @@ public class AssetResourceIT extends AbstractRestIT {
         node = resource().path( "/test-organization/test-app/foos/" + uuid ).queryParam( "access_token", access_token )
                 .accept( MediaType.APPLICATION_JSON ).type( MediaType.MULTIPART_FORM_DATA ).put( JsonNode.class, form );
         logNode( node );
-        Assert.assertTrue( lastModified != node.findValue( AssetUtils.LAST_MODIFIED ).getLongValue() );
+        assertTrue( lastModified != node.findValue( AssetUtils.LAST_MODIFIED ).getLongValue() );
     }
 
 
     @Test
-    @Ignore("Just enable and run when testing S3 large file upload specifically")
     public void largeFileInS3() throws Exception {
         UserRepo.INSTANCE.load( resource(), access_token );
 
@@ -302,6 +301,63 @@ public class AssetResourceIT extends AbstractRestIT {
                 .accept( MediaType.APPLICATION_JSON_TYPE ).delete( JsonNode.class );
     }
 
+    @Test
+    public void fileTooLargeShouldResultInError() throws Exception {
+
+        Map<String, String> props = new HashMap<String, String>();
+        props.put( "usergrid.binary.max-size-mb", "6" );
+        resource().path( "/testproperties" )
+                .queryParam( "access_token", access_token )
+                .accept( MediaType.APPLICATION_JSON )
+                .type( MediaType.APPLICATION_JSON_TYPE ).post( props );
+
+        try {
+
+            UserRepo.INSTANCE.load( resource(), access_token );
+
+            byte[] data = IOUtils.toByteArray( this.getClass().getResourceAsStream( "/cat-larger-than-6mb.jpg" ) );
+            FormDataMultiPart form = new FormDataMultiPart().field( "file", data, MediaType.MULTIPART_FORM_DATA_TYPE );
+
+            // send data
+            JsonNode node = resource().path( "/test-organization/test-app/bars" ).queryParam( "access_token", access_token )
+                    .accept( MediaType.APPLICATION_JSON ).type( MediaType.MULTIPART_FORM_DATA )
+                    .post( JsonNode.class, form );
+            //logNode( node );
+            JsonNode idNode = node.get( "entities" ).get( 0 ).get( "uuid" );
+            String uuid = idNode.getTextValue();
+
+            // get entity
+            String errorMessage = null;
+            long timeout = System.currentTimeMillis() + 60000;
+            while (true) {
+                LOG.info( "Waiting for upload to finish..." );
+                Thread.sleep( 2000 );
+                node = resource().path( "/test-organization/test-app/bars/" + uuid )
+                        .queryParam( "access_token", access_token ).accept( MediaType.APPLICATION_JSON_TYPE )
+                        .get( JsonNode.class );
+                //logNode( node );
+
+                // poll for the error to happen
+                if (node.findValue( "error" ) != null) {
+                    errorMessage = node.findValue("error").asText();
+                    break;
+                }
+                if (System.currentTimeMillis() > timeout) {
+                    throw new TimeoutException();
+                }
+            }
+
+            assertTrue( errorMessage.startsWith("Asset size "));
+
+        } finally {
+            props = new HashMap<String, String>();
+            props.put( "usergrid.binary.max-size-mb", "25" );
+            resource().path( "/testproperties" )
+                    .queryParam( "access_token", access_token )
+                    .accept( MediaType.APPLICATION_JSON )
+                    .type( MediaType.APPLICATION_JSON_TYPE ).post( props );
+        }
+    }
 
     /**
      * Deleting a connection to an asset should not delete the asset or the asset's data
@@ -317,7 +373,7 @@ public class AssetResourceIT extends AbstractRestIT {
 
         Map<String, String> payload = hashMap("name", "cassandra_eye.jpg");
 
-        JsonNode node = resource().path("/test-organization/test-app/foos")
+        JsonNode node = resource().path("/test-organization/test-app/bars")
                 .queryParam("access_token", access_token)
                 .accept(MediaType.APPLICATION_JSON)
                 .type(MediaType.APPLICATION_JSON_TYPE)

http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/49ae4ac5/stack/rest/src/test/resources/cat-larger-than-6mb.jpg
----------------------------------------------------------------------
diff --git a/stack/rest/src/test/resources/cat-larger-than-6mb.jpg b/stack/rest/src/test/resources/cat-larger-than-6mb.jpg
new file mode 100644
index 0000000..d45435a
Binary files /dev/null and b/stack/rest/src/test/resources/cat-larger-than-6mb.jpg differ

http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/49ae4ac5/stack/services/src/main/java/org/apache/usergrid/services/assets/data/S3BinaryStore.java
----------------------------------------------------------------------
diff --git a/stack/services/src/main/java/org/apache/usergrid/services/assets/data/S3BinaryStore.java b/stack/services/src/main/java/org/apache/usergrid/services/assets/data/S3BinaryStore.java
index 29b5e47..f59e79c 100644
--- a/stack/services/src/main/java/org/apache/usergrid/services/assets/data/S3BinaryStore.java
+++ b/stack/services/src/main/java/org/apache/usergrid/services/assets/data/S3BinaryStore.java
@@ -25,10 +25,12 @@ import java.io.IOException;
 import java.io.InputStream;
 import java.io.OutputStream;
 import java.util.Map;
+import java.util.Properties;
+import java.util.Stack;
 import java.util.UUID;
-import java.util.concurrent.ExecutorService;
-import java.util.concurrent.Executors;
+import java.util.concurrent.*;
 
+import org.apache.usergrid.utils.StringUtils;
 import org.jclouds.ContextBuilder;
 import org.jclouds.blobstore.AsyncBlobStore;
 import org.jclouds.blobstore.BlobStore;
@@ -63,12 +65,16 @@ public class S3BinaryStore implements BinaryStore {
 
     private static final Logger LOG = LoggerFactory.getLogger( S3BinaryStore.class );
     private static final long FIVE_MB = ( FileUtils.ONE_MB * 5 );
+    private static String WORKERS_PROP_NAME = "usergrid.binary.upload-workers";
 
     private BlobStoreContext context;
     private String accessId;
     private String secretKey;
     private String bucketName;
-    private ExecutorService executor = Executors.newFixedThreadPool( 10 );
+    private ExecutorService executorService;
+
+    @Autowired
+    private Properties properties;
 
     @Autowired
     private EntityManagerFactory emf;
@@ -104,17 +110,19 @@ public class S3BinaryStore implements BinaryStore {
     @Override
     public void write( final UUID appId, final Entity entity, InputStream inputStream ) throws IOException {
 
-        final String uploadFileName = AssetUtils.buildAssetKey( appId, entity );
+        // write up to 5mb of data to an byte array
+
         ByteArrayOutputStream baos = new ByteArrayOutputStream();
         long written = IOUtils.copyLarge( inputStream, baos, 0, FIVE_MB );
         byte[] data = baos.toByteArray();
 
-        final Map<String, Object> fileMetadata = AssetUtils.getFileMetadata( entity );
-        fileMetadata.put( AssetUtils.LAST_MODIFIED, System.currentTimeMillis() );
+        if ( written < FIVE_MB ) { // total smaller than 5mb
 
-        final String mimeType = AssetMimeHandler.get().getMimeType( entity, data );
+            final String uploadFileName = AssetUtils.buildAssetKey( appId, entity );
+            final String mimeType = AssetMimeHandler.get().getMimeType( entity, data );
 
-        if ( written < FIVE_MB ) { // total smaller than 5mb
+            final Map<String, Object> fileMetadata = AssetUtils.getFileMetadata( entity );
+            fileMetadata.put( AssetUtils.LAST_MODIFIED, System.currentTimeMillis() );
 
             BlobStore blobStore = getContext().getBlobStore();
             BlobBuilder.PayloadBlobBuilder bb = blobStore.blobBuilder( uploadFileName )
@@ -134,69 +142,31 @@ public class S3BinaryStore implements BinaryStore {
         }
         else { // bigger than 5mb... dump 5 mb tmp files and upload from them
 
-            // create temp file and copy entire file to that temp file
-
-            LOG.debug( "Writing temp file for S3 upload" );
-
-            final File tempFile = File.createTempFile( entity.getUuid().toString(), "tmp" );
-            tempFile.deleteOnExit();
-            OutputStream os = null;
-            try {
-                os = new BufferedOutputStream( new FileOutputStream( tempFile.getAbsolutePath() ) );
-                os.write( data );
-                written += IOUtils.copyLarge( inputStream, os, 0, ( FileUtils.ONE_GB * 5 ) );
-            }
-            finally {
-                IOUtils.closeQuietly( os );
-            }
-
-            fileMetadata.put( AssetUtils.CONTENT_LENGTH, written );
-
-            // JClouds no longer supports async blob store, so we have to do this fun stuff
-
-            LOG.debug( "Starting upload thread" );
-
-            Thread uploadThread = new Thread( new Runnable() {
-                @Override
-                public void run() {
-                    try {
-                        LOG.debug( "S3 upload thread started" );
+            ExecutorService executors = getExecutorService();
 
-                        BlobStore blobStore = getContext().getBlobStore();
-
-                        BlobBuilder.PayloadBlobBuilder bb =  blobStore.blobBuilder( uploadFileName )
-                                .payload( tempFile ).calculateMD5().contentType( mimeType );
-
-                        if ( fileMetadata.get( AssetUtils.CONTENT_DISPOSITION ) != null ) {
-                            bb.contentDisposition( fileMetadata.get( AssetUtils.CONTENT_DISPOSITION ).toString() );
-                        }
-                        final Blob blob = bb.build();
+            executors.submit( new UploadWorker( appId, entity, inputStream, data, written ) );
+        }
+    }
 
-                        String md5sum = Hex.encodeHexString( blob.getMetadata().getContentMetadata().getContentMD5() );
-                        fileMetadata.put( AssetUtils.CHECKSUM, md5sum );
 
-                        LOG.debug( "S3 upload starting" );
+    private ExecutorService getExecutorService() {
 
-                        String eTag = blobStore.putBlob( bucketName, blob );
-                        fileMetadata.put( AssetUtils.E_TAG, eTag );
+        if ( executorService == null ) {
+            synchronized (this) {
 
-                        LOG.debug( "S3 upload complete eTag=" + eTag);
+                int workers = 40;
+                String workersString = properties.getProperty( WORKERS_PROP_NAME, "40");
 
-                        EntityManager em = emf.getEntityManager( appId );
-                        em.update( entity );
-                        tempFile.delete();
-                    }
-                    catch ( Exception e ) {
-                        LOG.error( "error uploading", e );
-                    }
-                    if ( tempFile != null && tempFile.exists() ) {
-                        tempFile.delete();
-                    }
+                if ( StringUtils.isNumeric( workersString ) ) {
+                    workers = Integer.parseInt( workersString );
+                } else if ( !StringUtils.isEmpty( workersString )) {
+                    LOG.error("Ignoring invalid setting for {}", WORKERS_PROP_NAME);
                 }
-            });
-
-            uploadThread.start();
+                executorService = Executors.newFixedThreadPool( workers );
+            }
         }
+
+        return executorService;
     }
 
 
@@ -229,5 +199,124 @@ public class S3BinaryStore implements BinaryStore {
         BlobStore blobStore = getContext().getBlobStore();
         blobStore.removeBlob( bucketName, AssetUtils.buildAssetKey( appId, entity ) );
     }
+
+    class UploadWorker implements Callable<Void> {
+
+        private UUID appId;
+        private Entity entity;
+        private InputStream inputStream;
+        private byte[] data;
+        private long written;
+
+
+        public UploadWorker( UUID appId, Entity entity, InputStream is, byte[] data, long written ) {
+            this.appId = appId;
+            this.entity = entity;
+            this.inputStream = is;
+            this.data = data;
+            this.written = written;
+        }
+
+        @Override
+        public Void call() {
+
+            LOG.debug( "Writing temp file for S3 upload" );
+
+            // determine max size file allowed, default to 50mb
+            long maxSizeBytes = 50 * FileUtils.ONE_MB;
+            String maxSizeMbString = properties.getProperty( "usergrid.binary.max-size-mb", "50" );
+            if (StringUtils.isNumeric( maxSizeMbString )) {
+                maxSizeBytes = Long.parseLong( maxSizeMbString ) * FileUtils.ONE_MB;
+            }
+
+            // always allow files up to 5mb
+            if (maxSizeBytes < 5 * FileUtils.ONE_MB ) {
+                maxSizeBytes = 5 * FileUtils.ONE_MB;
+            }
+
+            // write temporary file, slightly larger than our size limit
+            OutputStream os = null;
+            File tempFile;
+            try {
+                tempFile = File.createTempFile( entity.getUuid().toString(), "tmp" );
+                tempFile.deleteOnExit();
+                os = new BufferedOutputStream( new FileOutputStream( tempFile.getAbsolutePath() ) );
+                os.write( data );
+                written += IOUtils.copyLarge( inputStream, os, 0, maxSizeBytes + 1 );
+
+            } catch ( IOException e ) {
+                throw new RuntimeException( "Error creating temp file", e );
+
+            } finally {
+                if ( os != null ) {
+                    IOUtils.closeQuietly( os );
+                }
+            }
+
+            // if tempFile is too large, delete it, add error to entity file metadata and abort
+
+            Map<String, Object> fileMetadata = AssetUtils.getFileMetadata( entity );
+
+            if ( tempFile.length() > maxSizeBytes ) {
+                LOG.debug("File too large. Temp file size (bytes) = {}, " +
+                        "Max file size (bytes) = {} ", tempFile.length(), maxSizeBytes);
+                try {
+                    EntityManager em = emf.getEntityManager( appId );
+                    fileMetadata.put( "error", "Asset size " + tempFile.length()
+                                    + " is larger than max size of " + maxSizeBytes );
+                    em.update( entity );
+                    tempFile.delete();
+
+                } catch ( Exception e ) {
+                    LOG.error( "Error updating entity with error message", e);
+                }
+                return null;
+            }
+
+            String uploadFileName = AssetUtils.buildAssetKey( appId, entity );
+            String mimeType = AssetMimeHandler.get().getMimeType( entity, data );
+
+            try {  // start the upload
+
+                LOG.debug( "S3 upload thread started" );
+
+                BlobStore blobStore = getContext().getBlobStore();
+
+                BlobBuilder.PayloadBlobBuilder bb =  blobStore.blobBuilder( uploadFileName )
+                        .payload( tempFile ).calculateMD5().contentType( mimeType );
+
+                if ( fileMetadata.get( AssetUtils.CONTENT_DISPOSITION ) != null ) {
+                    bb.contentDisposition( fileMetadata.get( AssetUtils.CONTENT_DISPOSITION ).toString() );
+                }
+                final Blob blob = bb.build();
+
+                String md5sum = Hex.encodeHexString( blob.getMetadata().getContentMetadata().getContentMD5() );
+                fileMetadata.put( AssetUtils.CHECKSUM, md5sum );
+
+                LOG.debug( "S3 upload starting" );
+
+                String eTag = blobStore.putBlob( bucketName, blob );
+
+                LOG.debug( "S3 upload complete eTag=" + eTag);
+
+                // update entity with information about uploaded asset
+
+                EntityManager em = emf.getEntityManager( appId );
+                fileMetadata.put( AssetUtils.E_TAG, eTag );
+                fileMetadata.put( AssetUtils.LAST_MODIFIED, System.currentTimeMillis() );
+                fileMetadata.put( AssetUtils.CONTENT_LENGTH, written );
+                em.update( entity );
+            }
+            catch ( Exception e ) {
+                LOG.error( "error uploading", e );
+            }
+
+            if ( tempFile != null && tempFile.exists() ) {
+                tempFile.delete();
+            }
+
+            return null;
+        }
+    }
 }
 


[2/3] incubator-usergrid git commit: Merge branch 'sso-conn-pool' into USERGRID-579-jcloud171

Posted by sn...@apache.org.
Merge branch 'sso-conn-pool' into USERGRID-579-jcloud171


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

Branch: refs/heads/USERGRID-579-jcloud171
Commit: 6f90ebaf52c3918fe8ac1623fbcad53e127b16b2
Parents: e0d9fe6 5079d47
Author: Dave Johnson <dm...@apigee.com>
Authored: Mon May 18 13:49:56 2015 -0400
Committer: Dave Johnson <dm...@apigee.com>
Committed: Mon May 18 13:49:56 2015 -0400

----------------------------------------------------------------------
 .../rest/management/ManagementResource.java     | 60 +++++++++++---------
 1 file changed, 32 insertions(+), 28 deletions(-)
----------------------------------------------------------------------