On May 20, 2008, at 4:19 AM, Jess Holle wrote:

Curt Arnold wrote:

On May 19, 2008, at 11:22 AM, Jess Holle wrote:
If it is sufficiently compelling it appears it would be possible to rework AppenderSkeleton without breaking most extensions thereof but allowing Layout.format() to be hoisted out of the synchronization block in cases where the Layout is an instance of some special interface. [I was hacking away at this approach when I ran into the issue with PatternLayout.] The point here would be to reduce the bottleneck imposed by today's Appenders and Layouts while only reworking some Layout classes.

--
Jess Holle
Did you check out the "concurrent" contribution in the sandbox, http://svn.apache.org/repos/asf/logging/sandbox/log4j/concurrent? See also http://marc.info/?l=log4j-dev&m=110623974420412&w=2.
I think I knew about this a long time ago, but I'd forgotten about it.

It looks like a good start on producing a parallel Appender hierarchy. It would seem that one could use the concurrent PatternLayout from here with existing Appenders if one adds a tag interface to the concurrent PatternLayout and some extra code to AppenderSkeleton -- if this proved compelling. Also, one nit: the concurrent PatternLayout.format() should use StringBuilder, not StringBuffer.

That said, none of this would seem to buy you anything if you don't remove the synchronization bottleneck in Category.callAppenders(), e.g. as per my patch. This patch would enable a high-concurrency branch. Without this patch, everything is still bottlenecked in Category as best I can tell.
As we are very far along in the log4j 1.2.x lifetime, removing synchronization points in the main-line of the code is very high risk activity. The concurrent proposal basically created a parallel package of classes that had different synchronization guarantees and so would not require proving that a particular modification would be safe for all potential uses.
I'm fine wit the concurrent proposal except that Category still needs to be changed. I also wonder whether an ability to opt-in to improved concurrency by using a concurrent Layout and an existing "non-concurrent" Appender would be helpful.

One question: I notice ConcurrentAppender uses 'guard' to explicitly prevent re-entrancy. I don't notice anything to this effect in the existing "main-line" Appenders. Am I missing something? Or is there an intent in existing Appenders to allow re-entrancy? Or do they just not guard against this and run into issues upon re-entrancy?


I never went deep into the concurrent contribution. The project accepted it in the sandbox from Elias Ross and granted him commit rights for continued development, but it did not develop a community and Elias drifted away.

Having anything in an appender or layout that in turn calls log4j is unsafe and may likely cause infinite recursion. log4j 1.2.x won't stop you from that. Looks like the concurrent contribution attempted to block it.

I think incrementally improving log4j 1.2, particularly in the area of concurrency is a morass. Since individual components of log4j 1.2 were not designed to be thread-safe and the contract with extensions allowed them to not be thread-safe, removing any existing synchronization block is extremely difficult to be proved generally safe. Removing the category synchronization lock may work for you or allow the unit tests to run (which are far from a thorough test of log4j), but it screams like the type of thing you don't do in the 16th dot release.

The log4j 2.0 approach was to design the fundamental building blocks designed for concurrency and JDK 1.5 and then when that foundation was sufficiently established, start migrating appenders and writing log4j 1.2 emulation on top of it. Right now it is a few experiments in the sandbox and not as accessible as I would like. If I were going to spend my time on concurrency related issues, the best use of my time would be to make it more accessible and complete. If you are interested in contributing to that, I'd be willing to change my priorities and update that.

If you really want to work on an incremental approach, I'd be willing to create and apply your patches to a branch of log4j 1.2 in the sandbox.

---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to