A quick note that this was fixed for 2.3. Gary
On Tue, Apr 7, 2015 at 6:36 AM, Remko Popma <remko.po...@gmail.com> wrote: > I created https://issues.apache.org/jira/browse/LOG4J2-993 for the > deadlock issue. > > I agree that reconfigure() does not need to be synchronized. Similarly, > afaiks onChange() also does not need to be synchronized. > > As for setConfiguration, locking on a private lock rather than the > LoggerContext instance may be better. > > I noted that the start() methods both use configLock.tryLock(). So if the > configLock is already locked, the logic inside these blocks will not > execute. For example, if start() is called while a stop() is in progress, > the start() method will essentially skip instead of executing after the > stop() completes. I am not sure why tryLock() is used and not lock() in the > start() methods. > > I also noted that there is currently a call to setConfiguration from > start(Configuration), and this call is outside the configLock block. I am > not sure why this is. Is it just to prevent deadlocks (avoid grabbing two > locks simultaneously), or should the setConfiguration method execute > regardless of whether a stop() is currently in progress? > > If we use the configLock in setConfiguration, we should probably call > configLock.lock() here rather than configLock.tryLock(), would you agree? > > > On Tue, Apr 7, 2015 at 6:15 PM, Remko Popma <remko.po...@gmail.com> wrote: > >> For testing, just a thought: what about creating a (test) plugin that >> during its initialization triggers a reconfiguration in another thread? >> >> The other thread should not be able to complete reconfiguration until the >> first configuration completes. Not sure if this can be turned into a useful >> test... >> >> >> On Tuesday, April 7, 2015, Ralph Goers <ralph.go...@dslextreme.com> >> wrote: >> >>> I agree with all of this. However, I believe the reconfigure method does >>> not need to be synchronized. I think it is OK to construct a new >>> Configuration while not synchronized. What needs to be locked is the >>> setConfigurationMethod, which can I believe can be locked using the >>> configLock, rather than synchronizing the method. >>> >>> The problem with this is I am not sure I know of a good way to verify >>> all of this. The error that is occurring happens because the FlumeAppender >>> is trying to shutdown its writer threads during a reconfigure and one of >>> those threads is trying to flush data which apparently is causing a new >>> Logger to be obtained in the process of doing that. >>> >>> I can try to create a test case that emulates this but it may be a bit >>> tricky. >>> >>> Ralph >>> >>> > On Apr 6, 2015, at 6:55 PM, Remko Popma <remko.po...@gmail.com> wrote: >>> > >>> > Looking at the patch I submitted for LOG4J2-207, this is where the >>> synchronized methods getConfigLocation and setConfigLocation were added. >>> The patch also made the configLocation field mutable (it was final before). >>> > >>> > I think my reasoning for making them synchronized was that setting the >>> configLocation field and the subsequent call to reconfigure() should be >>> atomic. >>> > >>> > I agree that there may be better ways of doing this. One idea: >>> > 1. Make configLocation volatile as Ralph suggested >>> > 2. Remove synchronized keyword from getConfigLocation and >>> setConfigLocation >>> > 3. Add a new private method reconfigure(URI configLocation). This does >>> all the work of the current reconfigure() method, but uses the specified >>> configLocation method parameter instead of the field. >>> > 4. Modify the public synchronized method reconfigure() to delegate to >>> the private method with the configLocation field value. (So this method >>> becomes a one-liner.) >>> > >>> > This is a cleaner way to preserve the atomicity of the >>> setConfiguration method without any additional locks. >>> > >>> > Thoughts? >>> > >>> > Sent from my iPhone >>> > >>> >> On 2015/04/07, at 1:02, Ralph Goers <ralph.go...@dslextreme.com> >>> wrote: >>> >> >>> >> I’ve been looking at the deadlock that is documented in LOG4J-982. >>> It seems to me that the problem is that get/setConfigLocation and >>> reconfigure are locking the whole LoggerContext. First, the history shows >>> that I added get & setConfigLocation as part of LOG4J2-207. I think Remko >>> actually wrote the code. I am not sure why these methods need to be >>> synchronized. Wouldn’t it be enough for configLocation to be volatile? >>> >> >>> >> Second, I don’t think locking the LoggerContext for the entirety a >>> reconfigure is a good idea. reconfigure calls setConfiguration, which is >>> also synchronized. It seems to me that while setConfiguration does need to >>> be locked, it should be using a lock that specifically only prevents >>> setConfiguration from being executed simultaneously from more than one >>> thread. >>> >> >>> >> Thoughts? >>> >> >>> >> Ralph >>> >> --------------------------------------------------------------------- >>> >> To unsubscribe, e-mail: log4j-dev-unsubscr...@logging.apache.org >>> >> For additional commands, e-mail: log4j-dev-h...@logging.apache.org >>> >> >>> > >>> > --------------------------------------------------------------------- >>> > To unsubscribe, e-mail: log4j-dev-unsubscr...@logging.apache.org >>> > For additional commands, e-mail: log4j-dev-h...@logging.apache.org >>> > >>> >>> >>> --------------------------------------------------------------------- >>> To unsubscribe, e-mail: log4j-dev-unsubscr...@logging.apache.org >>> For additional commands, e-mail: log4j-dev-h...@logging.apache.org >>> >>> > -- E-Mail: garydgreg...@gmail.com | ggreg...@apache.org Java Persistence with Hibernate, Second Edition <http://www.manning.com/bauer3/> JUnit in Action, Second Edition <http://www.manning.com/tahchiev/> Spring Batch in Action <http://www.manning.com/templier/> Blog: http://garygregory.wordpress.com Home: http://garygregory.com/ Tweet! http://twitter.com/GaryGregory