Thanks Joakim for a detailed response. I don't think there is a problem in http-client as I can see that about 3.5-3.8 GB out 5 GB is written to disk and then it gets stuck. I will verify your other suggestions. But the problem is the issue does not come always. It is intermittent.
On Sat, Oct 13, 2018 at 5:49 PM Joakim Erdfelt <joa...@webtide.com> wrote: > The relevant stacktrace ... > > "dw-150 - POST /management/upgrade/uploadbundle" #150 prio=5 os_prio=0 > tid=0x00007ffff0f7e800 nid=0x3a46 in Object.wait() [0x00007ffee0728000] > java.lang.Thread.State: WAITING (on object monitor) > at java.lang.Object.wait(Native Method) > at java.lang.Object.wait(Object.java:502) > at org.eclipse.jetty.server.HttpInput.blockForContent(HttpInput.java:565) > at > org.eclipse.jetty.server.HttpInput$1.blockForContent(HttpInput.java:1084) > at org.eclipse.jetty.server.HttpInput.read(HttpInput.java:306) > - locked <0x0000000677a5d220> (a java.util.ArrayDeque) > at > org.apache.commons.fileupload.MultipartStream$ItemInputStream.makeAvailable(MultipartStream.java:999) > at > org.apache.commons.fileupload.MultipartStream$ItemInputStream.read(MultipartStream.java:903) > at java.io.InputStream.read(InputStream.java:101) > at org.apache.commons.io.IOUtils.copyLarge(IOUtils.java:1488) > at org.apache.commons.io.IOUtils.copyLarge(IOUtils.java:1465) > at > com.vnera.restapilayer.ManagementResource.flushFileToDisk(ManagementResource.java:2515) > at > com.vnera.restapilayer.ManagementResource.storeFileToDisk(ManagementResource.java:2441) > at > com.vnera.restapilayer.ManagementResource.uploadBundle(ManagementResource.java:2366) > at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) > at > sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) > at > sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) > at java.lang.reflect.Method.invoke(Method.java:498) > at > org.glassfish.jersey.server.model.internal.ResourceMethodInvocationHandlerFactory$1.invoke(ResourceMethodInvocationHandlerFactory.java:81) > at > org.glassfish.jersey.server.model.internal.AbstractJavaResourceMethodDispatcher$1.run(AbstractJavaResourceMethodDispatcher.java:144) > at > org.glassfish.jersey.server.model.internal.AbstractJavaResourceMethodDispatcher.invoke(AbstractJavaResourceMethodDispatcher.java:161) > at > org.glassfish.jersey.server.model.internal.JavaResourceMethodDispatcherProvider$TypeOutInvoker.doDispatch(JavaResourceMethodDispatcherProvider.java:205) > at > org.glassfish.jersey.server.model.internal.AbstractJavaResourceMethodDispatcher.dispatch(AbstractJavaResourceMethodDispatcher.java:99) > at > org.glassfish.jersey.server.model.ResourceMethodInvoker.invoke(ResourceMethodInvoker.java:389) > at > org.glassfish.jersey.server.model.ResourceMethodInvoker.apply(ResourceMethodInvoker.java:347) > at > org.glassfish.jersey.server.model.ResourceMethodInvoker.apply(ResourceMethodInvoker.java:102) > at org.glassfish.jersey.server.ServerRuntime$2.run(ServerRuntime.java:326) > at org.glassfish.jersey.internal.Errors$1.call(Errors.java:271) > at org.glassfish.jersey.internal.Errors$1.call(Errors.java:267) > at org.glassfish.jersey.internal.Errors.process(Errors.java:315) > at org.glassfish.jersey.internal.Errors.process(Errors.java:297) > at org.glassfish.jersey.internal.Errors.process(Errors.java:267) > at > org.glassfish.jersey.process.internal.RequestScope.runInScope(RequestScope.java:317) > at > org.glassfish.jersey.server.ServerRuntime.process(ServerRuntime.java:305) > at > org.glassfish.jersey.server.ApplicationHandler.handle(ApplicationHandler.java:1154) > at > org.glassfish.jersey.servlet.WebComponent.serviceImpl(WebComponent.java:473) > at org.glassfish.jersey.servlet.WebComponent.service(WebComponent.java:427) > at > org.glassfish.jersey.servlet.ServletContainer.service(ServletContainer.java:388) > at > org.glassfish.jersey.servlet.ServletContainer.service(ServletContainer.java:341) > at > org.glassfish.jersey.servlet.ServletContainer.service(ServletContainer.java:228) > at > io.dropwizard.jetty.NonblockingServletHolder.handle(NonblockingServletHolder.java:49) > at > org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1650) > at > io.dropwizard.servlets.ThreadNameFilter.doFilter(ThreadNameFilter.java:34) > at > org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1637) > at > io.dropwizard.jersey.filter.AllowedMethodsFilter.handle(AllowedMethodsFilter.java:45) > at > io.dropwizard.jersey.filter.AllowedMethodsFilter.doFilter(AllowedMethodsFilter.java:39) > at > org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1637) > at > org.eclipse.jetty.servlets.CrossOriginFilter.handle(CrossOriginFilter.java:308) > at > org.eclipse.jetty.servlets.CrossOriginFilter.doFilter(CrossOriginFilter.java:262) > at > org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1637) > at > org.apache.shiro.web.servlet.AbstractShiroFilter.executeChain(AbstractShiroFilter.java:449) > at > org.apache.shiro.web.servlet.AbstractShiroFilter$1.call(AbstractShiroFilter.java:365) > at > org.apache.shiro.subject.support.SubjectCallable.doCall(SubjectCallable.java:90) > at > org.apache.shiro.subject.support.SubjectCallable.call(SubjectCallable.java:83) > at > org.apache.shiro.subject.support.DelegatingSubject.execute(DelegatingSubject.java:383) > at > org.apache.shiro.web.servlet.AbstractShiroFilter.doFilterInternal(AbstractShiroFilter.java:362) > at > org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:125) > at > org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1637) > at > org.eclipse.jetty.servlet.ServletHandler.doHandle(ServletHandler.java:533) > at > org.eclipse.jetty.server.handler.ScopedHandler.nextHandle(ScopedHandler.java:188) > at > org.eclipse.jetty.server.session.SessionHandler.doHandle(SessionHandler.java:1595) > at > org.eclipse.jetty.server.handler.ScopedHandler.nextHandle(ScopedHandler.java:188) > at > org.eclipse.jetty.server.handler.ContextHandler.doHandle(ContextHandler.java:1253) > at > org.eclipse.jetty.server.handler.ScopedHandler.nextScope(ScopedHandler.java:168) > at > org.eclipse.jetty.servlet.ServletHandler.doScope(ServletHandler.java:473) > at > org.eclipse.jetty.server.session.SessionHandler.doScope(SessionHandler.java:1564) > at > org.eclipse.jetty.server.handler.ScopedHandler.nextScope(ScopedHandler.java:166) > at > org.eclipse.jetty.server.handler.ContextHandler.doScope(ContextHandler.java:1155) > at > org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:141) > at > org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:132) > at > com.codahale.metrics.jetty9.InstrumentedHandler.handle(InstrumentedHandler.java:241) > at io.dropwizard.jetty.RoutingHandler.handle(RoutingHandler.java:52) > at > org.eclipse.jetty.server.handler.gzip.GzipHandler.handle(GzipHandler.java:455) > at io.dropwizard.jetty.BiDiGzipHandler.handle(BiDiGzipHandler.java:69) > at > org.eclipse.jetty.server.handler.RequestLogHandler.handle(RequestLogHandler.java:56) > at > org.eclipse.jetty.server.handler.StatisticsHandler.handle(StatisticsHandler.java:169) > at > org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:132) > at org.eclipse.jetty.server.Server.handle(Server.java:530) > at org.eclipse.jetty.server.HttpChannel.handle(HttpChannel.java:347) > at > org.eclipse.jetty.server.HttpConnection.onFillable(HttpConnection.java:256) > at > org.eclipse.jetty.io.AbstractConnection$ReadCallback.succeeded(AbstractConnection.java:279) > at org.eclipse.jetty.io.FillInterest.fillable(FillInterest.java:102) > at org.eclipse.jetty.io.ChannelEndPoint$2.run(ChannelEndPoint.java:124) > at > org.eclipse.jetty.util.thread.strategy.EatWhatYouKill.doProduce(EatWhatYouKill.java:247) > at > org.eclipse.jetty.util.thread.strategy.EatWhatYouKill.produce(EatWhatYouKill.java:140) > at > org.eclipse.jetty.util.thread.strategy.EatWhatYouKill.run(EatWhatYouKill.java:131) > at > org.eclipse.jetty.util.thread.ReservedThreadExecutor$ReservedThread.run(ReservedThreadExecutor.java:382) > at > org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:708) > at > org.eclipse.jetty.util.thread.QueuedThreadPool$2.run(QueuedThreadPool.java:626) > at java.lang.Thread.run(Thread.java:748) > > Looks like you are using dropwizard + jersey + com.vnera.restapilayer + > commons-fileupload to handle your file upload. > > Your setup isn't using Jetty for multipart/form-data upload in the way you > think. > > First, don't use commons-fileupload, that's for Servlet 2.4 (and older) > environments. > Support for multipart/form-data parsing is built into the Servlet spec as > HttpServletRequest.getParts() and getPart(name) since Servlet 3.0 > See: > https://docs.oracle.com/javaee/7/api/javax/servlet/http/HttpServletRequest.html#getPart-java.lang.String- > > If your code, or ANY of its Filters or 3rd party libraries uses any one of > the HttpServletRequest.getParameter*() methods before your attempt at using > commons-fileupload then your code will not work and fail. > Why? That's because the Servlet spec says we have to read the Request URI > query and Request form data (Input Stream) to generate the the parameter > list and Parts list (if request is a multipart/form) > > Right now, based on your stacktrace, Jetty is only involved in giving you > a HttpServletRequest InputStream which is blocked waiting for more content > from the client. > This could be a bug in commons-fileupload (a common scenario) > A bug in your use of the servlet spec (based on the number of layers you > have going on, this is a high probability, try putting a breakpoint on > Jetty's org.eclipse.jetty.server.Request.getParameters() method to see if > the above example is going on) > Or a bug in your http client (a common scenario where the client says > `Content-Length: <big-number>` but never sends the complete <big-number> of > bytes, hence the blocking for content) > > You can test Jetty's behavior in isolation easily enough. > > $ mkdir jetty-downloads > $ cd jetty-downloads > $ curl -O > http://central.maven.org/maven2/org/eclipse/jetty/jetty-distribution/9.4.12.v20180830/jetty-distribution-9.4.12.v20180830.tar.gz > $ tar -zxf tar -zxvf jetty-distribution-9.4.12.v20180830.tar.gz > $ cd jetty-distribution-9.4.12.v20180830/demo-base/ > $ java -jar ../start.jar > > now open a web browser to http://localhost:8080/test/dump/info > scroll down to "Form to generate UPLOAD content" > use "File 1" or "File 2" on that form to select your 5gb data file. > then "submit" > > On chrome you'll see an "Uploading" percentage at the bottom of the window. > > when it's done uploading, you'll get a "Dump Servlet" response. > scroll down to "Parts:" (about 1/3rd down the page) > you'll see the results of HttpSerletRequest.getParts() here. > > example (for mine): > Parts: > Action: Part{n=Action,fn=null,ct=null,s=6,tmp=true,file=null} > file2: > Part{n=file2,fn=,ct=application/octet-stream,s=0,tmp=true,file=null} > TextField: Part{n=TextField,fn=null,ct=null,s=7,tmp=true,file=null} > file1: Part{n=file1,fn=bigger.iso,ct=application/octet-stream,s= > *6806166040* > ,tmp=true,file=/private/var/folders/gm/676mvm6j6131h37d0msqk1k40000gn/T/jetty-0.0.0.0-8080-test.war-_test-any-432009796042963862.dir/upload/MultiPart7642561650112679943} > > That tells me that 6806166040 bytes were sent as part of "file1". > > If I look at the original (pre-uploaded) file, I have ... > > $ ls -la bigger.iso > -rw-r--r-- 1 joakim staff 6806166040 Oct 13 07:09 bigger.iso > > I can see that the upload completed, the entire 6GB file was sent. > > Joakim Erdfelt / joa...@webtide.com > > > On Sat, Oct 13, 2018 at 6:17 AM Debraj Manna <subharaj.ma...@gmail.com> > wrote: > >> POST /management/upgrade/uploadbundle is the api in context >> >> On Sat, Oct 13, 2018 at 4:26 PM Debraj Manna <subharaj.ma...@gmail.com> >> wrote: >> >>> I am using a jetty-server behind nginx reverse proxy. On trying to >>> upload a big file about 5 GB via Multi-part I am seeing sometimes the >>> upload is getting stuck. Please find attached the full thread dump when the >>> jetty server was stuck. >>> >>> I have also placed the thread dump in the below gist >>> <https://gist.github.com/debraj-manna/20b62dd3cbc9e7badb05fdb01e513fcd> >>> >>> https://gist.github.com/debraj-manna/20b62dd3cbc9e7badb05fdb01e513fcd >>> >>> Can someone let me know if this is some known issue in Jetty? >>> >>> Environment >>> Ubuntu 14.04 >>> Java 8 >>> Jetty Server - 9.4.10, 9.4.8.v20171121 >>> >> _______________________________________________ >> jetty-users mailing list >> jetty-users@eclipse.org >> To change your delivery options, retrieve your password, or unsubscribe >> from this list, visit >> https://dev.eclipse.org/mailman/listinfo/jetty-users > > _______________________________________________ > jetty-users mailing list > jetty-users@eclipse.org > To change your delivery options, retrieve your password, or unsubscribe > from this list, visit > https://dev.eclipse.org/mailman/listinfo/jetty-users
_______________________________________________ jetty-users mailing list jetty-users@eclipse.org To change your delivery options, retrieve your password, or unsubscribe from this list, visit https://dev.eclipse.org/mailman/listinfo/jetty-users