2012-03-13 39 views
1

這幾個星期工作正常,今天中午工作正常,然後(沒有任何部署/更改)它突然開始失敗100%的時間。它在昨天工作的相同URL上生產失敗,並且在開發過程中仍能正常工作。Blobstore/FileService寫入突然失敗100%的時間

我認爲這是某種服務中斷,但App Engine狀態頁顯示全部爲綠色。

這裏的堆棧跟蹤:

java.io.IOException 
at com.google.appengine.api.files.FileServiceImpl.translateException(FileServiceImpl.java:588) 
at com.google.appengine.api.files.FileServiceImpl.makeSyncCall(FileServiceImpl.java:561) 
at com.google.appengine.api.files.FileServiceImpl.create(FileServiceImpl.java:479) 
at com.google.appengine.api.files.FileServiceImpl.createNewBlobFile(FileServiceImpl.java:99) 
at com.google.appengine.api.files.FileServiceImpl.createNewBlobFile(FileServiceImpl.java:81) 
at mikelike.common.Image.getImageFromUrl(Image.java:303) 
at mikelike.account.PinFactory.createPin(PinFactory.java:251) 
at org.apache.jsp.WEB_002dINF.ml.account.add_jsp._jspService(add_jsp.java:123) 
at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:97) 
at javax.servlet.http.HttpServlet.service(HttpServlet.java:717) 
at org.mortbay.jetty.servlet.ServletHolder.handle(ServletHolder.java:511) 
at org.mortbay.jetty.servlet.ServletHandler.handle(ServletHandler.java:390) 
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 org.mortbay.jetty.servlet.Dispatcher.forward(Dispatcher.java:327) 
at org.mortbay.jetty.servlet.Dispatcher.forward(Dispatcher.java:126) 
at mikelike.common.HideJspServlet.doGet(HideJspServlet.java:24) 
at mikelike.common.HideJspServlet.doPost(HideJspServlet.java:31) 
at javax.servlet.http.HttpServlet.service(HttpServlet.java:637) 
at javax.servlet.http.HttpServlet.service(HttpServlet.java:717) 
at org.mortbay.jetty.servlet.ServletHolder.handle(ServletHolder.java:511) 
at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1166) 
at mikelike.common.MikeLikeServletFilter.doFilter(MikeLikeServletFilter.java:190) 
at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157) 
at com.google.apphosting.utils.servlet.ParseBlobUploadFilter.doFilter(ParseBlobUploadFilter.java:102) 
at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157) 
at com.google.apphosting.runtime.jetty.SaveSessionFilter.doFilter(SaveSessionFilter.java:35) 
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 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.runtime.jetty.AppVersionHandlerMap.handle(AppVersionHandlerMap.java:249) 
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.headerComplete(HttpConnection.java:923) 
at com.google.apphosting.runtime.jetty.RpcRequestParser.parseAvailable(RpcRequestParser.java:76) 
at org.mortbay.jetty.HttpConnection.handle(HttpConnection.java:404) 
at com.google.apphosting.runtime.jetty.JettyServletEngineAdapter.serviceRequest(JettyServletEngineAdapter.java:135) 
at com.google.apphosting.runtime.JavaRuntime$RequestRunnable.run(JavaRuntime.java:422) 
at com.google.tracing.TraceContext$TraceContextRunnable.runInContext(TraceContext.java:449) 
at com.google.tracing.TraceContext$TraceContextRunnable$1.run(TraceContext.java:455) 
at com.google.tracing.TraceContext.runInContext(TraceContext.java:695) 
at com.google.tracing.TraceContext$AbstractTraceContextCallback.runInInheritedContextNoUnref(TraceContext.java:333) 
at com.google.tracing.TraceContext$AbstractTraceContextCallback.runInInheritedContext(TraceContext.java:325) 
at com.google.tracing.TraceContext$TraceContextRunnable.run(TraceContext.java:453) 
at com.google.apphosting.runtime.ThreadGroupPool$PoolEntry.run(ThreadGroupPool.java:251) 
at java.lang.Thread.run(Thread.java:679) 
Caused by: com.google.apphosting.api.ApiProxy$ApplicationException: ApplicationError: 1: 
at java.lang.Thread.getStackTrace(Thread.java:1495) 
at com.google.apphosting.runtime.ApiProxyImpl.doSyncCall(ApiProxyImpl.java:235) 
at com.google.apphosting.runtime.ApiProxyImpl.access$000(ApiProxyImpl.java:68) 
at com.google.apphosting.runtime.ApiProxyImpl$1.run(ApiProxyImpl.java:180) 
at com.google.apphosting.runtime.ApiProxyImpl$1.run(ApiProxyImpl.java:178) 
at java.security.AccessController.doPrivileged(Native Method) 
at com.google.apphosting.runtime.ApiProxyImpl.makeSyncCall(ApiProxyImpl.java:178) 
at com.google.apphosting.runtime.ApiProxyImpl.makeSyncCall(ApiProxyImpl.java:68) 
at com.google.apphosting.api.ApiProxy.makeSyncCall(ApiProxy.java:101) 
at com.google.apphosting.api.ApiProxy.makeSyncCall(ApiProxy.java:50) 
at com.google.appengine.api.files.FileServiceImpl.makeSyncCall(FileServiceImpl.java:557) 
... 52 more 
Caused by: com.google.apphosting.api.ApiProxy$ApplicationException: ApplicationError: 1: 
at com.google.apphosting.runtime.ApiProxyImpl$AsyncApiFuture.failure(ApiProxyImpl.java:544) 
at com.google.net.rpc3.client.RpcStub$RpcCallbackDispatcher$1.runInContext(RpcStub.java:748) 
at com.google.tracing.TraceContext$TraceContextRunnable$1.run(TraceContext.java:455) 
at com.google.tracing.TraceContext.runInContext(TraceContext.java:695) 
at com.google.tracing.TraceContext$AbstractTraceContextCallback.runInInheritedContextNoUnref(TraceContext.java:333) 
at com.google.tracing.TraceContext$AbstractTraceContextCallback.runInInheritedContext(TraceContext.java:325) 
at com.google.tracing.TraceContext$TraceContextRunnable.run(TraceContext.java:453) 
at com.google.net.rpc3.client.RpcStub$RpcCallbackDispatcher.rpcFinished(RpcStub.java:788) 
at com.google.net.rpc3.client.RpcStub$RpcCallbackDispatcher.failure(RpcStub.java:779) 
at com.google.net.rpc3.impl.client.RpcClientInternalContext.runCallbacks(RpcClientInternalContext.java:890) 
at com.google.net.rpc3.impl.client.RpcClientInternalContext.finishRpcAndNotifyApp(RpcClientInternalContext.java:793) 
at com.google.net.rpc3.impl.client.RpcNetChannel.afterFinishingActiveRpc(RpcNetChannel.java:1049) 
at com.google.net.rpc3.impl.client.RpcNetChannel.finishRpc(RpcNetChannel.java:895) 
at com.google.net.rpc3.impl.client.RpcNetChannel.handleResponse(RpcNetChannel.java:2248) 
at com.google.net.rpc3.impl.client.RpcNetChannel.messageReceived(RpcNetChannel.java:2060) 
at com.google.net.rpc3.impl.client.RpcNetChannel.access$2000(RpcNetChannel.java:147) 
at com.google.net.rpc3.impl.client.RpcNetChannel$TransportCallback.receivedMessage(RpcNetChannel.java:3097) 
at com.google.net.rpc3.impl.client.RpcChannelTransportData$TransportCallback.receivedMessage(RpcChannelTransportData.java:602) 
at com.google.net.rpc3.impl.wire.RpcBaseTransport.receivedMessage(RpcBaseTransport.java:420) 
at com.google.net.rpc3.impl.wire.RpcClientTcpTransport.parseOneMessage(RpcClientTcpTransport.java:773) 
at com.google.net.rpc3.impl.wire.RpcClientTcpTransport.parseMessages(RpcClientTcpTransport.java:651) 
at com.google.net.rpc3.impl.wire.RpcClientTcpTransport.access$100(RpcClientTcpTransport.java:38) 
at com.google.net.rpc3.impl.wire.RpcClientTcpTransport$1.dataReceived(RpcClientTcpTransport.java:293) 
at com.google.net.async3.SocketConnection.handleNetworkReadEvent(SocketConnection.java:843) 
at com.google.net.async3.SocketConnection.access$400(SocketConnection.java:40) 
at com.google.net.async3.SocketConnection$NetworkReadHandlerImpl.run(SocketConnection.java:872) 
at com.google.net.eventmanager.AbstractFutureTask$Sync.innerRun(AbstractFutureTask.java:260) 
at com.google.net.eventmanager.AbstractFutureTask.run(AbstractFutureTask.java:121) 
at com.google.net.eventmanager.EventManagerImpl.runTask(EventManagerImpl.java:576) 
at com.google.net.eventmanager.EventManagerImpl.internalRunWorkerLoop(EventManagerImpl.java:997) 
at com.google.net.eventmanager.EventManagerImpl.runWorkerLoop(EventManagerImpl.java:878) 
at com.google.net.eventmanager.WorkerThreadInfo.runWorkerLoop(WorkerThreadInfo.java:134) 
at com.google.net.eventmanager.EventManagerImpl$WorkerThread.run(EventManagerImpl.java:1833) 

沒有人有任何建議調試,或在其上獲取谷歌工程的眼睛嗎?有沒有人遇到過這種情況?

這是我的代碼,以防萬一它有助於把事情放在上下文中。

URL url = new URL(urlString); 
HttpURLConnection conn = (HttpURLConnection)url.openConnection(); 
conn.setConnectTimeout(10000); 
conn.setReadTimeout(15000); 

String contentType = conn.getContentType(); 

InputStream is = conn.getInputStream(); 

FileService fileService = FileServiceFactory.getFileService(); 
AppEngineFile file = fileService.createNewBlobFile(contentType); 
FileWriteChannel writeChannel = fileService.openWriteChannel(file, true); 

int nRead; 
byte[] data = new byte[8192]; 
while ((nRead = is.read(data, 0, data.length)) != -1) { 
    writeChannel.write(ByteBuffer.wrap(data,0,nRead)); 
} 

writeChannel.closeFinally(); 
BlobKey blobKey = fileService.getBlobKey(file); 

回答

0

我在appengine論壇上回復了你的帖子 - 實質上文件API目前是實驗性的。儘管正在努力提高其可靠性,以便能夠擺脫實驗狀態,但您應該謹慎使用它,並將其用於關鍵任務代碼路徑。

我觀察到很多時間它失敗與DeadlineExceeded錯誤 - 也許你可以編寫你的代碼重試操作發生這種情況。

+0

感謝您的回覆。我確信我知道它在一點上是實驗性的,但忘記了它。它95%的可靠性,然後100%的時間開始失敗。我的解決方法是現在將圖像存儲在數據存儲區而不是Blob存儲區。 – mrated 2012-03-13 16:32:30

+0

對你來說還有一件事 - 我注意到你的應用程序正在使用主/從數據存儲。文件API寫入您的數據存儲區,並且您會注意到,如果將應用程序切換到HRD數據存儲區,服務更可靠。 – 2012-03-13 23:10:40

0

您在mikelike.common.Image.getImageFromUrl(Image.java:303)

越來越IOException調用conn.getInputStream()你應該檢查HTTP連接通過conn.getResponseCode()成功之前。

確保URL返回您期望的數據 - 您不僅應該在瀏覽器中,而且還要在命令行中(通過wgetcurl)測試此數據。

+0

關於檢查響應代碼的好建議當然,但問題不在於響應的內容,而是無法將它們寫入Blobstore。 IO異常來自嘗試打開Blob文件,而不是通過讀取URL。 – mrated 2012-04-26 18:22:56