ktor icon indicating copy to clipboard operation
ktor copied to clipboard

Large responses, ex: java exception stack, seems to not get handled

Open Syrou opened this issue 5 years ago • 7 comments

Ktor Version

1.2.0-alpha-2

Ktor Engine Used(client or server and name)

Client

JVM Version, Operating System and Relevant Context

ktor-client-logging

Feedback

On non HttpStatusCode 200 even while using sl4j or a logging system that supports large content buffers, it seems like large response bodies is not correctly handled but gets stuck with "BODY START" and then several minutes later shows "A resource failed to call response.body().close()."

In this particular case the error response is a json object

Syrou avatar Mar 26 '19 08:03 Syrou

Hi @Syrou, thanks for the report. The body logging freeze is fixed in develop branch, could you provide the example to create a test?

e5l avatar Mar 26 '19 11:03 e5l

@e5l This is the error coming back from the backend, and which seems to freeze up everything

com.domain.api.exception.NoSuchFeatureException: com.google.appengine.api.datastore.EntityNotFoundException: No entity was found matching the key: Feature(6446510218149888)
	at com.domain.appe.db.FeatureDBgae.getFeature(FeatureDBgae.java:663)
	at com.domain.appe.logic.FeatureLogic.getFeature(FeatureLogic.java:306)
	at com.domain.appe.logic.FeatureLogic.adjustBalance(FeatureLogic.java:1305)
	at com.domain.appe.logic.AnotherFeature.AnotherFeatureLogic.registerAnotherFeature(AnotherFeatureLogic.java:83)
	at com.domain.appe.servlets.rest.AnotherFeatureEndpoint.registerAnotherFeature(AnotherFeatureEndpoint.java:60)
	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 com.domain.microservices.gae.rest.RESTEndpoint.service(RESTEndpoint.java:488)
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:790)
	at org.eclipse.jetty.servlet.ServletHolder.handle(ServletHolder.java:848)
	at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1772)
	at com.domain.appe.servlets.GumblerFilter.doFilter(GumblerFilter.java:45)
	at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1759)
	at com.google.apphosting.utils.servlet.JdbcMySqlConnectionCleanupFilter.doFilter(JdbcMySqlConnectionCleanupFilter.java:60)
	at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1759)
	at org.eclipse.jetty.servlet.ServletHandler.doHandle(ServletHandler.java:582)
	at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:143)
	at org.eclipse.jetty.security.SecurityHandler.handle(SecurityHandler.java:524)
	at org.eclipse.jetty.server.session.SessionHandler.doHandle(SessionHandler.java:226)
	at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:143)
	at org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:134)
	at com.google.apphosting.runtime.jetty9.ParseBlobUploadHandler.handle(ParseBlobUploadHandler.java:119)
	at org.eclipse.jetty.server.handler.ContextHandler.doHandle(ContextHandler.java:1182)
	at com.google.apphosting.runtime.jetty9.AppEngineWebAppContext.doHandle(AppEngineWebAppContext.java:183)
	at org.eclipse.jetty.servlet.ServletHandler.doScope(ServletHandler.java:512)
	at org.eclipse.jetty.server.session.SessionHandler.doScope(SessionHandler.java:185)
	at org.eclipse.jetty.server.handler.ContextHandler.doScope(ContextHandler.java:1112)
	at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:141)
	at com.google.apphosting.runtime.jetty9.AppVersionHandlerMap.handle(AppVersionHandlerMap.java:293)
	at org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:134)
	at org.eclipse.jetty.server.Server.handle(Server.java:539)
	at org.eclipse.jetty.server.HttpChannel.handle(HttpChannel.java:333)
	at com.google.apphosting.runtime.jetty9.RpcConnection.handle(RpcConnection.java:212)
	at com.google.apphosting.runtime.jetty9.RpcConnector.serviceRequest(RpcConnector.java:81)
	at com.google.apphosting.runtime.jetty9.JettyServletEngineAdapter.serviceRequest(JettyServletEngineAdapter.java:123)
	at com.google.apphosting.runtime.JavaRuntime$RequestRunnable.dispatchServletRequest(JavaRuntime.java:692)
	at com.google.apphosting.runtime.JavaRuntime$RequestRunnable.dispatchRequest(JavaRuntime.java:655)
	at com.google.apphosting.runtime.JavaRuntime$RequestRunnable.run(JavaRuntime.java:625)
	at com.google.apphosting.runtime.JavaRuntime$NullSandboxRequestRunnable.run(JavaRuntime.java:817)
	at com.google.apphosting.runtime.ThreadGroupPool$PoolEntry.run(ThreadGroupPool.java:269)
	at java.lang.Thread.run(Thread.java:748)
Caused by: com.google.appengine.api.datastore.EntityNotFoundException: No entity was found matching the key: Feature(6446510218149888)
	at com.google.appengine.api.datastore.BaseAsyncDatastoreServiceImpl$2.wrap(BaseAsyncDatastoreServiceImpl.java:221)
	at com.google.appengine.api.datastore.BaseAsyncDatastoreServiceImpl$2.wrap(BaseAsyncDatastoreServiceImpl.java:216)
	at com.google.appengine.api.utils.FutureWrapper.wrapAndCache(FutureWrapper.java:60)
	at com.google.appengine.api.utils.FutureWrapper.get(FutureWrapper.java:101)
	at com.google.appengine.api.datastore.FutureHelper.getInternal(FutureHelper.java:69)
	at com.google.appengine.api.datastore.FutureHelper.quietGet(FutureHelper.java:56)
	at com.google.appengine.api.datastore.DatastoreServiceImpl.get(DatastoreServiceImpl.java:43)
	at com.domain.appe.db.FeatureDBgae.getFeature(FeatureDBgae.java:658)
	... 42 more

Status code is 500, if that for some reason matters.

Syrou avatar Mar 26 '19 12:03 Syrou

Another case would be where we get a response which is properly handled in the backend, but also freezes the response. This is currently our case where the response is of json with status code 500

{
    "errorTag": "not_found",
    "stacktrace": [
        "com.domain.api.exception.NoSuchFeatureException: com.google.appengine.api.datastore.EntityNotFoundException: No entity was found matching the key: Feature(6446510218149888) at com.domain.appe.db.FeatureDBgae.getFeature(FeatureDBgae.java:663) at com.domain.appe.logic.FeatureLogic.getFeature(FeatureLogic.java:306) at com.domain.appe.logic.FeatureLogic.adjustBalance(FeatureLogic.java:1305) at com.domain.appe.logic.AnotherFeature.AnotherFeatureLogic.registerAnotherFeature(AnotherFeatureLogic.java:83) at com.domain.appe.servlets.rest.AnotherFeatureEndpoint.registerAnotherFeature(AnotherFeatureEndpoint.java:60) 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 com.domain.microservices.gae.rest.RESTEndpoint.service(RESTEndpoint.java:488) at javax.servlet.http.HttpServlet.service(HttpServlet.java:790) at org.eclipse.jetty.servlet.ServletHolder.handle(ServletHolder.java:848) at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1772) at com.domain.appe.servlets.GumblerFilter.doFilter(GumblerFilter.java:45) at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1759) at com.google.apphosting.utils.servlet.JdbcMySqlConnectionCleanupFilter.doFilter(JdbcMySqlConnectionCleanupFilter.java:60) at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1759) at org.eclipse.jetty.servlet.ServletHandler.doHandle(ServletHandler.java:582) at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:143) at org.eclipse.jetty.security.SecurityHandler.handle(SecurityHandler.java:524) at org.eclipse.jetty.server.session.SessionHandler.doHandle(SessionHandler.java:226) at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:143) at org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:134) at com.google.apphosting.runtime.jetty9.ParseBlobUploadHandler.handle(ParseBlobUploadHandler.java:119) at org.eclipse.jetty.server.handler.ContextHandler.doHandle(ContextHandler.java:1182) at com.google.apphosting.runtime.jetty9.AppEngineWebAppContext.doHandle(AppEngineWebAppContext.java:183) at org.eclipse.jetty.servlet.ServletHandler.doScope(ServletHandler.java:512) at org.eclipse.jetty.server.session.SessionHandler.doScope(SessionHandler.java:185) at org.eclipse.jetty.server.handler.ContextHandler.doScope(ContextHandler.java:1112) at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:141) at com.google.apphosting.runtime.jetty9.AppVersionHandlerMap.handle(AppVersionHandlerMap.java:293) at org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:134) at org.eclipse.jetty.server.Server.handle(Server.java:539) at org.eclipse.jetty.server.HttpChannel.handle(HttpChannel.java:333) at com.google.apphosting.runtime.jetty9.RpcConnection.handle(RpcConnection.java:212) at com.google.apphosting.runtime.jetty9.RpcConnector.serviceRequest(RpcConnector.java:81) at com.google.apphosting.runtime.jetty9.JettyServletEngineAdapter.serviceRequest(JettyServletEngineAdapter.java:123) at com.google.apphosting.runtime.JavaRuntime$RequestRunnable.dispatchServletRequest(JavaRuntime.java:692) at com.google.apphosting.runtime.JavaRuntime$RequestRunnable.dispatchRequest(JavaRuntime.java:655) at com.google.apphosting.runtime.JavaRuntime$RequestRunnable.run(JavaRuntime.java:625) at com.google.apphosting.runtime.JavaRuntime$NullSandboxRequestRunnable.run(JavaRuntime.java:817) at com.google.apphosting.runtime.ThreadGroupPool$PoolEntry.run(ThreadGroupPool.java:269) at java.lang.Thread.run(Thread.java:748) Caused by: com.google.appengine.api.datastore.EntityNotFoundException: No entity was found matching the key: Feature(6446510218149888) at com.google.appengine.api.datastore.BaseAsyncDatastoreServiceImpl$2.wrap(BaseAsyncDatastoreServiceImpl.java:221) at com.google.appengine.api.datastore.BaseAsyncDatastoreServiceImpl$2.wrap(BaseAsyncDatastoreServiceImpl.java:216) at com.google.appengine.api.utils.FutureWrapper.wrapAndCache(FutureWrapper.java:60) at com.google.appengine.api.utils.FutureWrapper.get(FutureWrapper.java:101) at com.google.appengine.api.datastore.FutureHelper.getInternal(FutureHelper.java:69) at com.google.appengine.api.datastore.FutureHelper.quietGet(FutureHelper.java:56) at com.google.appengine.api.datastore.DatastoreServiceImpl.get(DatastoreServiceImpl.java:43) at com.domain.appe.db.FeatureDBgae.getFeature(FeatureDBgae.java:658) ... 42 more"
    ],
    "service": "default-service",
    "extra": {},
    "description": "An unknown error occurred, please try again or see over your input parameters.",
    "status": "error"
}

Syrou avatar Mar 26 '19 13:03 Syrou

What is com.domain.microservices.gae.rest.RESTEndpoint ? It doesn't look like a ktor handler. Does it contain ktor client invocations? The stacktrace complains about some missing key in GAE datastore while ktor itself does never interact with it. However an exception could somehow cause ktor client to hang.

cy6erGn0m avatar Apr 01 '19 12:04 cy6erGn0m

@cy6erGn0m That is just an example of the message trying to get printed with the feature logger, but it gets stuck when the backend ktor is communicating with sends the above message back

Syrou avatar Apr 01 '19 13:04 Syrou

Please check the following ticket on YouTrack for follow-ups to this issue. GitHub issues will be closed in the coming weeks.

oleg-larshin avatar Aug 10 '20 15:08 oleg-larshin

@Syrou could you please share the exact steps to reproduce your problem?

Stexxe avatar Jul 21 '21 09:07 Stexxe