Problema incomum de armazenamento em cache do Apache-Tomcat

2

Neste momento, tenho uma configuração do Apache na frente do Tomcat para lidar com o cache. Esta configuração foi dada a um serviço externo para gerenciar e, desde a transição, notei um comportamento estranho. Especificamente, quando eu solicito um arquivo swf do servidor web, eu acerto o cache do Apache (bom), mas ocasionalmente recebo um arquivo truncado. Depois que eu receber esse arquivo truncado, o cache NÃO será atualizado até que eu exclua manualmente o cache e deixe o swf ser removido do tomcat novamente.

O serviço externo afirma que a configuração está correta, mas não vejo como isso possa estar acontecendo além da configuração incorreta. Agora, há dois servidores apache e dois tomcat em um balanceador de carga e, ocasionalmente, um cache de apache será interrompido enquanto outro não (levando a 50% de todas as solicitações obtendo dados truncados incorretos).

Onde devo começar a procurar depurar esse problema? O que poderia estar causando este comportamento estranho?

Editar: Inspecionando os logs, tomcat lança isso:

java.io.IOException: Bad file number
        at java.io.FileInputStream.readBytes(Native Method)
        at java.io.FileInputStream.read(FileInputStream.java:199)
        at java.io.BufferedInputStream.read1(BufferedInputStream.java:256)
        at java.io.BufferedInputStream.read(BufferedInputStream.java:317)
        at java.io.FilterInputStream.read(FilterInputStream.java:90)
        at org.apache.catalina.servlets.DefaultServlet.copyRange(DefaultServlet.java:1968)
        at org.apache.catalina.servlets.DefaultServlet.copy(DefaultServlet.java:1714)
        at org.apache.catalina.servlets.DefaultServlet.serveResource(DefaultServlet.java:809)
        at org.apache.catalina.servlets.DefaultServlet.doGet(DefaultServlet.java:325)
        at javax.servlet.http.HttpServlet.service(HttpServlet.java:690)
        at javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
        at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)
        at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:175)
        at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:128)
        at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
        at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:568)
        at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
        at org.apache.catalina.ha.session.JvmRouteBinderValve.invoke(JvmRouteBinderValve.java:209)
        at org.apache.catalina.ha.tcp.ReplicationValve.invoke(ReplicationValve.java:347)
        at org.terracotta.modules.tomcat.tomcat_5_5.SessionValve55.invoke(SessionValve55.java:57)
        at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:286)
        at org.apache.jk.server.JkCoyoteHandler.invoke(JkCoyoteHandler.java:190)
        at org.apache.jk.common.HandlerRequest.invoke(HandlerRequest.java:283)
        at org.apache.jk.common.ChannelSocket.invoke(ChannelSocket.java:767)
        at org.apache.jk.common.ChannelSocket.processConnection(ChannelSocket.java:697)
        at org.apache.jk.common.ChannelSocket$SocketConnection.runIt(ChannelSocket.java:889)
        at org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:690)
        at java.lang.Thread.run(Thread.java:619)

followed by 

access_log.2009-12-14.txt:1.2.3.4 - - [14/Dec/2009:00:27:32 -0500] "GET /myApp/mySwf.swf HTTP/1.1" 304 -
access_log.2009-12-14.txt:1.2.3.4 - - [14/Dec/2009:01:27:33 -0500] "GET /myApp/mySwf.swf HTTP/1.1" 304 -
access_log.2009-12-14.txt:1.2.3.4 - - [14/Dec/2009:01:39:53 -0500] "GET /myApp/mySwf.swf HTTP/1.1" 304 -
access_log.2009-12-14.txt:1.2.3.4 - - [14/Dec/2009:02:27:38 -0500] "GET /myApp/mySwf.swf HTTP/1.1" 304 -

Assim, o apache está armazenando em cache o tamanho incorreto do arquivo. O que poderia estar causando isso, e possivelmente separado, como garantir que essa exceção não seja gravada no cache?

    
por Stefan Kendall 18.12.2009 / 23:43

2 respostas

0

wget, curl ou file save como esse arquivo?

Outros arquivos grandes funcionam?

Se houver um contrato de suporte, considerarei solicitar que o fornecedor depure isso de maneira colaborativa.

    
por 08.01.2010 / 21:14
0

A incapacidade do Tomcat de atender arquivos grandes foi corrigida no trunk, 5.5.x, e a correção que fixa o bug está comprometida com o 6.0.27.

    
por 25.04.2010 / 23:53