2010-07-05 12 views
14

Estoy haciendo un formulario de carga muy simple para mi aplicación de Google App Engine. En el código de GWT cliente tengo algo como:Subiendo a Blobstore da un montón de Java OutOfMemoryError

final FormPanel uploadForm = new FormPanel(); 
uploadForm.setEncoding(FormPanel.ENCODING_MULTIPART); 
uploadForm.setMethod(FormPanel.METHOD_POST); 

uploadBtn.addClickHandler(new ClickHandler() { 
     @Override 
     public void onClick(ClickEvent event) { 
      blobstoreUploadURLService.getBlobstoreUploadURL("/banzai/process-pdf", new AsyncCallback<String>() { 

       @Override 
       public void onFailure(Throwable caught) { 
        // TODO Auto-generated method stub 
        System.err.println("FAILURE DURING UPLOAD SERVICE"); 
       } 

       @Override 
       public void onSuccess(String result) { 
        uploadForm.setAction(result); 
        uploadForm.submit(); 
       } 

      }); 
     } 
    }); 

y utiliza un new FileUpload() para seleccionar el archivo. Cuando la prueba, ya sea a nivel local o en una instancia desplegada, me sale el siguiente error en los registros:

WARNING: Error for /_ah/upload/agdrYnNrYWFychsLEhVfX0Jsb2JVcGxvYWRTZXNzaW9uX18YAww java.lang.OutOfMemoryError: Java heap space 
    at java.util.Arrays.copyOf(Arrays.java:2786) 
    at java.io.ByteArrayOutputStream.write(ByteArrayOutputStream.java:71) 
    at javax.mail.internet.MimeMultipart.readTillFirstBoundary(MimeMultipart.java:316) 
    at javax.mail.internet.MimeMultipart.parse(MimeMultipart.java:186) 
    at javax.mail.internet.MimeMultipart.getCount(MimeMultipart.java:109) 
    at com.google.appengine.api.blobstore.dev.UploadBlobServlet.handleUpload(UploadBlobServlet.java:135) 
    at com.google.appengine.api.blobstore.dev.UploadBlobServlet.access$000(UploadBlobServlet.java:72) 
    at com.google.appengine.api.blobstore.dev.UploadBlobServlet$1.run(UploadBlobServlet.java:100) 
    at java.security.AccessController.doPrivileged(Native Method) 
    at com.google.appengine.api.blobstore.dev.UploadBlobServlet.doPost(UploadBlobServlet.java:98) 
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:713) 
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:806) 
    at org.mortbay.jetty.servlet.ServletHolder.handle(ServletHolder.java:511) 
    at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1166) 
    at com.google.appengine.api.blobstore.dev.ServeBlobFilter.doFilter(ServeBlobFilter.java:51) 
    at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157) 
    at com.google.apphosting.utils.servlet.TransactionCleanupFilter.doFilter(TransactionCleanupFilter.java:43) 
    at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157) 
    at com.google.appengine.tools.development.StaticFileFilter.doFilter(StaticFileFilter.java:122) 
    at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157) 
    at org.mortbay.jetty.servlet.ServletHandler.handle(ServletHandler.java:388) 
    at org.mortbay.jetty.security.SecurityHandler.handle(SecurityHandler.java:216) 
    at org.mortbay.jetty.servlet.SessionHandler.handle(SessionHandler.java:182) 
    at org.mortbay.jetty.handler.ContextHandler.handle(ContextHandler.java:765) 
    at org.mortbay.jetty.webapp.WebAppContext.handle(WebAppContext.java:418) 
    at com.google.apphosting.utils.jetty.DevAppEngineWebAppContext.handle(DevAppEngineWebAppContext.java:70) 
    at org.mortbay.jetty.handler.HandlerWrapper.handle(HandlerWrapper.java:152) 
    at com.google.appengine.tools.development.JettyContainerService$ApiProxyHandler.handle(JettyContainerService.java:349) 
    at org.mortbay.jetty.handler.HandlerWrapper.handle(HandlerWrapper.java:152) 
    at org.mortbay.jetty.Server.handle(Server.java:326) 
    at org.mortbay.jetty.HttpConnection.handleRequest(HttpConnection.java:542) 
    at org.mortbay.jetty.HttpConnection$RequestHandler.content(HttpConnection.java:938) 

Curiosamente, varias personas parecen haber funcionado en este problema antes (basta con mirar this issue here, y usted puede encontrar algunos más en Google) pero nadie parece tener idea de por qué está sucediendo, y algunas personas incluso sugieren que es culpa de App Engine. Antes de saltar a tan precipitadas conclusiones, pensé en preguntar aquí primero :)

Y en caso de que sea interesante, aquí están los encabezados HTTP de la carga intentada (un archivo muy pequeño), capturados con HTTP Live Headers.

 
    POST /_ah/upload/AMmfu6ZyyhSgz9uOR5VX4QBZeYADTB-aSejVvfGaogl3E_E8yPOLgtX9-0mob17IYfsaRZg-YP7aZrp1D4pDAwuKKm9CoNjeVx1eN2PwBro9x0PqXPeBLpQ/ALBNUaYAAAAATDFOaLPIvuEEhSS6F4HxMmf9xOb8lp0y/ HTTP/1.1 
    Host: kbskaar.appspot.com 
    User-Agent: Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10.6; en-US; rv:1.9.2.6) Gecko/20100625 Firefox/3.6.6 
    Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 
    Accept-Language: en-us,en;q=0.5 
    Accept-Encoding: gzip,deflate 
    Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7 
    Keep-Alive: 115 
    Connection: keep-alive 
    Referer: http://kbskaar.appspot.com/ 

    Cookie: Lastname=Wong; Firstname=Ka%20Man%20Sophia; Username=kmswong%40uwaterloo.ca 
    Content-Type: multipart/form-data; boundary=---------------------------168072824752491622650073 
    Content-Length: 57 
     -----------------------------168072824752491622650073-- 



    HTTP/1.1 500 Internal Server Error 
    Server: Upload Server Built on Jul 1 2010 15:26:59 (1278023219) 
    Content-Type: text/html; charset=UTF-8 
    X-AppEngine-Estimated-CPM-US-Dollars: $0.375815 
    X-AppEngine-Resource-Usage: ms=7103 cpu_ms=16217 api_cpu_ms=0 
    Date: Mon, 05 Jul 2010 03:06:00 GMT 
    Pragma: no-cache 
    Expires: Fri, 01 Jan 1990 00:00:00 GMT 
    Cache-Control: no-cache, no-store, must-revalidate 
    Content-Length: 3211 
     ---------------------------------------------------------- 

Háganme saber si tiene alguna idea. ¡Gracias!

+0

¿Qué tan grande es el archivo que está cargando? – markovuksanovic

+1

@markovuksanovic Sucede para archivos de cualquier tamaño, incluso archivos de menos de 10 KB. Definitivamente no es el caso que simplemente estoy cargando demasiado, eso fue lo primero que pensé, por supuesto :) –

+0

Además, puede ver todo el contenido del archivo en el listado de código anterior. Este es de 57 bytes. –

Respuesta

15

Bien, entonces el problema increíblemente tonto resultó ser que había omitido un atributo de "nombre" en el elemento FileInput del formulario. Evidentemente, esto hace que la secuencia resultante sea inutilizable, lo que hace que el analizador MimeMultipart se quede sin memoria.

Aunque el problema terminó siendo el mío, y fue fácilmente reparable, todavía considero esto un error en App Engine debido a que no hay manera de que un error tan simple cause un OutOfMemoryError y se cuelgue; esto también podría ser una fuente de vulnerabilidades de DOS simplemente elaborando solicitudes HTTP maliciosas. Archivaré un informe de error con Google.

+1

Tuve el mismo problema, pero tampoco tuve una "/" inicial en la cadena que pasó a createUploadUrl(). Esto provoca una excepción de puntero nulo: consulte http://code.google.com/p/googleappengine/issues/detail?id=2771 –

+3

Si desactiva el componente FileUpload antes de cargarlo (para evitar que los usuarios cambien el valor), esto también causa la excepción de falta de memoria – pauli

4

y asegúrese de añadir esto en su forma

enctype="multipart/form-data" 
+0

si esto lo hizo por mí –

+0

esto lo hizo por mí también – csturtz

Cuestiones relacionadas