Sorry to keep replying to myself but this fix does appear to work... It kept
my open file handles down to 5 or 6 for the duration of the load suite.

public UrlResourceStream(final URL url)
        {
                // Save URL
                this.url = url;
                URLConnection connection = null;
                try
                {
                        connection = url.openConnection();
                        contentLength = connection.getContentLength();
                        contentType = connection.getContentType();
                        >>if (connection instanceof JarURLConnection)
                        >>{
                        >>      JarURLConnection jarUrlConnection = 
(JarURLConnection)connection;
                        >>      URL jarFileUrl = 
jarUrlConnection.getJarFileURL();
                        >>      URLConnection jarFileConnection = 
jarFileUrl.openConnection();
                        >>      try
                        >>      {
                        >>              lastModified = 
jarFileConnection.getLastModified();
                        >>      }
                        >>      finally
                        >>      {
                        >>              
jarFileConnection.getInputStream().close();
                        >>      }
                        >>}
                        >>else
                        >>{
                        >>      lastModified = connection.getLastModified();
                        >>}
                        try
                        {
                                file = new File(new URI(url.toExternalForm()));
                        }
                        catch (Exception ex)
                        {
                                log.debug("cannot convert url: " + url + " to 
file (" + ex.getMessage()
+
                                        "), falling back to the inputstream for 
polling");
                        }
                        if (file != null && !file.exists())
                        {
                                file = null;
                        }
                }
                catch (IOException ex)
                {
                        // It should be impossible to get here or the original 
URL
                        // couldn't have been constructed. But we re-throw with 
details
                        // anyway.
                        final IllegalArgumentException illegalArgumentException 
= new
IllegalArgumentException(
                                "Invalid URL parameter " + url);
                        illegalArgumentException.initCause(ex);
                        throw illegalArgumentException;
                }
                finally
                {
                        // if applicable, disconnect
                        if (connection != null)
                        {
                                if (connection instanceof HttpURLConnection)
                                {
                                        
((HttpURLConnection)connection).disconnect();
                                }
                                else
                                {
                                        try
                                        {
                                                
connection.getInputStream().close();
                                        }
                                        catch (Exception ex)
                                        {
                                                // ignore
                                        }
                                }
                        }
                }
        }






adambender wrote:
> 
> Is it possible to use this 
> http://www.mail-archive.com/wicket-u...@lists.sourceforge.net/msg20951.html
> workaround  in the URLResourceStream constructor - similar to how it is
> done in URLResourceStream#lastModifiedTime()? 
> 
> 
> 
> adambender wrote:
>> 
>> For what it is worth I saw a file being created in the URLResourceStream
>> constructor at line 88 but it doesn't look like this is the source of any
>> problems, its just a way to figure out how to check the lastModified time
>> later on. 
>> 
>> While I can't claim any kind of expertise on the inner workings of Wicket
>> it seems that this problem would be solved if it wasn't required to check
>> the last modification time on those resources which are embedded in the
>> Wicket jar. Of course I have no idea what else this would affect so it
>> may not be so simple. It may also be possible to just cache the stream or
>> the actual .js string for use by later requests so that it is not
>> necessary to try and reload files like this from the jar every time they
>> are requested.
>> 
>> For our use what we are likely going to do is pull the .js files out and
>> place them where httpd can serve them and then use some url rewriting
>> magic to prevent Wicket from serving them.
>> 
>> 
>> Adam
>> 
>> 
>> igor.vaynberg wrote:
>>> 
>>> i just dont see what we can do about this... we are calling
>>> connection.getLastModified(), we are not creating a file, etc...
>>> 
>>> -igor
>>> 
>>> On Wed, Oct 21, 2009 at 10:18 AM, adambender <adamben...@gmail.com>
>>> wrote:
>>>>
>>>> This issue looks like it is directly related to
>>>> http://issues.apache.org/jira/browse/WICKET-438 and the access of the
>>>> lastModified header. Every time a URLResourceStream is constructed the
>>>> lastModified time is requested at line 85 and the number of file
>>>> handles
>>>> goes up by one. The solution to the jira issue indicated that upgrading
>>>> the
>>>> version of linux fixed the problem but it doesnt seem to be the case
>>>> with OS
>>>> X or Red Hat Enterprise Linux...
>>>>
>>>>
>>>> adambender wrote:
>>>>>
>>>>> I was able to distill the problem down to what I think is the core
>>>>> issue
>>>>> here.
>>>>>
>>>>> When an AJAX Wicket page is rendered it contains a reference to two
>>>>> .js
>>>>> files as Igor had mentioned, the Web URLs of these files look like
>>>>> this:
>>>>>
>>>>> <App Context
>>>>> Root>/resources/org.apache.wicket.markup.html.WicketEventReference/wicket-event.js
>>>>> <App Context
>>>>> Root>/resources/org.apache.wicket.markup.html.WicketEventReference/wicket-ajax.js
>>>>>
>>>>> These requests are of course fielded by the Wicket filter which ends
>>>>> up
>>>>> trying to load the resources using the UrlResourceStream. In order to
>>>>> actually load these files Wicket gets the JAR URL for each file,
>>>>> converts
>>>>> them to a URIs and then passes them to the File constructor. The
>>>>> problem
>>>>> is that the URI that is created is opaque -
>>>>> http://www.docjar.com/docs/api/java/net/URI.html  see here for a good
>>>>> explanation  in the case of wicket-event.js the URI string is like the
>>>>> following :
>>>>>
>>>>> jar:file:/<absolute-path-tojar>/wicket-1.4.1.jar!/org/apache/wicket/markup/html/wicket-event.js
>>>>>
>>>>> It is similar for the case of wicket-ajax.js
>>>>>
>>>>> A quick glance at the File constructor shows that an opaque URL cannot
>>>>> be
>>>>> used to create a File as it is considered non-hierarchical. This of
>>>>> course
>>>>> leaves you with lots of requests to load this file, none of which can
>>>>> be
>>>>> completed and results in a lot of open URL connections which can never
>>>>> be
>>>>> closed.
>>>>>
>>>>> I guess my question is, should this loading mechanism be working
>>>>> because
>>>>> it doesnt seem like it could the way it is currently written? Is it
>>>>> possible to configure how Wicket finds these files embedded in the
>>>>> jar?
>>>>> Have I missed something?
>>>>>
>>>>>
>>>>> Adam Bender-2 wrote:
>>>>>>
>>>>>> Thanks for the explanation I think that helps shed some light... The
>>>>>> tests are actually JMeter tests driving load by emulating a web
>>>>>> browser - the application the are testing is running in Deployment
>>>>>> mode set up as though it were a production server. After a little
>>>>>> more
>>>>>> digging I have been able to determine that is only a problem on pages
>>>>>> which use Ajax - and it looks like there is a related debug message
>>>>>> coming from an exception handler regarding the wicket-event.js file
>>>>>> not being accessible (URI is not hierarchical). This would actually
>>>>>> explain  why the problem only manifests when the JMeter tests are set
>>>>>> to request embedded assets as wicket ajax pages embed requests for
>>>>>> additional pieces of javascript - which in the case of
>>>>>> wicket-event.js
>>>>>> are causing exceptions to be thrown and the JVM bug you mentioned is
>>>>>> probably preventing these resources from being cleaned up properly.
>>>>>>
>>>>>> Does that sound right?
>>>>>>
>>>>>> Adam
>>>>>>
>>>>>>
>>>>>> On Oct 20, 2009, at 8:41 PM, Igor Vaynberg wrote:
>>>>>>
>>>>>>> when you are requesting an embedded resource wicket needs to stream
>>>>>>> the file out of a jar, the way the jvm handles that is by creating a
>>>>>>> jar url connection object that streams the file. unfortunately,
>>>>>>> there
>>>>>>> is a bug in the jdk where the url connection does not have a close
>>>>>>> method and so wicket or any other java app cannot release the
>>>>>>> connection. this is addressed, afair, in jdk 7.
>>>>>>>
>>>>>>> i have many apps deployed in production and have not managed yet to
>>>>>>> run out of the handles with the limit set about 4K. not sure why
>>>>>>> this
>>>>>>> is different in your case. you mentioned "tests", are those unit
>>>>>>> tests
>>>>>>> and is wicket there running in deployment mode?
>>>>>>>
>>>>>>> the resource watcher, which should be disabled, will cause the
>>>>>>> handles
>>>>>>> to run out because it continuously monitors markup files for changes
>>>>>>> (hot reloading in dev mode) and everytime it checks a markup file in
>>>>>>> a
>>>>>>> jar it creates the url connection and leaks it. by default it is
>>>>>>> disabled in deployment mode but if you manually set the poll
>>>>>>> frequency
>>>>>>> in your settings it will be reenabled.
>>>>>>>
>>>>>>> -igor
>>>>>>>
>>>>>>>
>>>>>>> On Tue, Oct 20, 2009 at 4:07 PM, Adam Bender <a...@magpieti.com>
>>>>>>> wrote:
>>>>>>>> We have run with a limit as high as 10,000 files and our tests can
>>>>>>>> bring it
>>>>>>>> to the limit in 20 minutes, but that still doesn't explain why so
>>>>>>>> many
>>>>>>>> copies of the jar are needed - and only when we are also requesting
>>>>>>>> embedded
>>>>>>>> assets...
>>>>>>>>
>>>>>>>> On Oct 20, 2009, at 5:04 PM, Major Péter wrote:
>>>>>>>>
>>>>>>>>> resolution -> solution...
>>>>>>>>> Just set the ulimit in the initscript and run it with start-stop-
>>>>>>>>> daemon,
>>>>>>>>> it will make the problem disappear (but still there would be many
>>>>>>>>> open
>>>>>>>>> files...)
>>>>>>>>>
>>>>>>>>> Peter
>>>>>>>>>
>>>>>>>>> 2009-10-21 00:38 keltezéssel, Major Péter írta:
>>>>>>>>>>
>>>>>>>>>> Hi,
>>>>>>>>>>
>>>>>>>>>> we also had this issue, because (I think) we are running two
>>>>>>>>>> different
>>>>>>>>>> wicket application in only one glassfish domain. Our resolution
>>>>>>>>>> was,
>>>>>>>>>> that we are running now the glassfish domains with custom init
>>>>>>>>>> scripts
>>>>>>>>>> with ulimit settings. Maybe this will help for you.
>>>>>>>>>>
>>>>>>>>>> Best Regards,
>>>>>>>>>> Peter
>>>>>>>>>>
>>>>>>>>>> 2009-10-21 00:14 keltezéssel, Martin Grigorov írta:
>>>>>>>>>>>
>>>>>>>>>>> Hi Adam,
>>>>>>>>>>>
>>>>>>>>>>> You may try to debug what is the problem with
>>>>>>>>>>> https://wiki.sdn.sap.com/wiki/display/Java/JPicus
>>>>>>>>>>>
>>>>>>>>>>> El mar, 20-10-2009 a las 15:39 -0600, Adam Bender escribió:
>>>>>>>>>>>>
>>>>>>>>>>>> Greetings all,
>>>>>>>>>>>>
>>>>>>>>>>>> Recently I have been performance testing a Wicket application
>>>>>>>>>>>> (1.4.1)
>>>>>>>>>>>> and I
>>>>>>>>>>>> am running into the dreaded Too Many Files Open issue. I have
>>>>>>>>>>>> searched
>>>>>>>>>>>> the
>>>>>>>>>>>> mailing lists and most of the trouble around this issue seems
>>>>>>>>>>>> to come
>>>>>>>>>>>> from
>>>>>>>>>>>> being in DEVELOPMENT mode so I made sure we were in DEPLOYMENT
>>>>>>>>>>>> mode.
>>>>>>>>>>>> When I
>>>>>>>>>>>> run 'lsof -p xxxx | grep wicket-1.4.1.jar' I see over 1000
>>>>>>>>>>>> entries and
>>>>>>>>>>>> it's
>>>>>>>>>>>> growing monotonically. This seems really unusual - why would
>>>>>>>>>>>> wicket
>>>>>>>>>>>> need
>>>>>>>>>>>> 1000 copies of this jar open? An additional bit of weirdness
>>>>>>>>>>>> came up
>>>>>>>>>>>> when
>>>>>>>>>>>> our load tests stopped loading the embedded assets (css, js and
>>>>>>>>>>>> images)
>>>>>>>>>>>> in
>>>>>>>>>>>> each page - this seemed to cap the number of lsof entries at
>>>>>>>>>>>> 5... This
>>>>>>>>>>>> is
>>>>>>>>>>>> even weirder because our app serves these static items from
>>>>>>>>>>>> httpd
>>>>>>>>>>>> without
>>>>>>>>>>>> tomcat ever knowing about them. How could our loading of
>>>>>>>>>>>> embedded items
>>>>>>>>>>>> really affect the number of file handles wicket needs?
>>>>>>>>>>>>
>>>>>>>>>>>> For completeness we are running this app on Red Hat Enterprise
>>>>>>>>>>>> Linx 5
>>>>>>>>>>>> with
>>>>>>>>>>>> Tomcat 6.0.20 and Java 1.6
>>>>>>>>>>>>
>>>>>>>>>>>> Adam
>>>>>>>>>
>>>>>>>>> ---------------------------------------------------------------------
>>>>>>>>> To unsubscribe, e-mail: users-unsubscr...@wicket.apache.org
>>>>>>>>> For additional commands, e-mail: users-h...@wicket.apache.org
>>>>>>>>>
>>>>>>>>
>>>>>>>>
>>>>>>>> ---------------------------------------------------------------------
>>>>>>>> To unsubscribe, e-mail: users-unsubscr...@wicket.apache.org
>>>>>>>> For additional commands, e-mail: users-h...@wicket.apache.org
>>>>>>>>
>>>>>>>>
>>>>>>>
>>>>>>> ---------------------------------------------------------------------
>>>>>>> To unsubscribe, e-mail: users-unsubscr...@wicket.apache.org
>>>>>>> For additional commands, e-mail: users-h...@wicket.apache.org
>>>>>>>
>>>>>>
>>>>>>
>>>>>> ---------------------------------------------------------------------
>>>>>> To unsubscribe, e-mail: users-unsubscr...@wicket.apache.org
>>>>>> For additional commands, e-mail: users-h...@wicket.apache.org
>>>>>>
>>>>>>
>>>>>>
>>>>>
>>>>>
>>>>
>>>> --
>>>> View this message in context:
>>>> http://www.nabble.com/Too-Many-Files-Wicket-1.4.1-tp25983047p25996646.html
>>>> Sent from the Wicket - User mailing list archive at Nabble.com.
>>>>
>>>>
>>>> ---------------------------------------------------------------------
>>>> To unsubscribe, e-mail: users-unsubscr...@wicket.apache.org
>>>> For additional commands, e-mail: users-h...@wicket.apache.org
>>>>
>>>>
>>> 
>>> ---------------------------------------------------------------------
>>> To unsubscribe, e-mail: users-unsubscr...@wicket.apache.org
>>> For additional commands, e-mail: users-h...@wicket.apache.org
>>> 
>>> 
>>> 
>> 
>> 
> 
> 

-- 
View this message in context: 
http://www.nabble.com/Too-Many-Files-Wicket-1.4.1-tp25983047p26001456.html
Sent from the Wicket - User mailing list archive at Nabble.com.


---------------------------------------------------------------------
To unsubscribe, e-mail: users-unsubscr...@wicket.apache.org
For additional commands, e-mail: users-h...@wicket.apache.org

Reply via email to