discuss-gnustep
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: Program occasionally crashes on startup due to GNUstepDefaults.lck e


From: Lobron, David
Subject: Re: Program occasionally crashes on startup due to GNUstepDefaults.lck error
Date: Mon, 19 Jun 2017 13:14:53 +0000

Many thanks for this fix, Wolfgang and Richard!

--David

> On Jun 17, 2017, at 2:04 AM, Richard Frith-Macdonald 
> <richard.frith-macdonald@theengagehub.com> wrote:
> 
>> 
>> On 16 Jun 2017, at 10:48, Wolfgang Lux <wolfgang.lux@gmail.com> wrote:
>> 
>> 
>>> Am 14.06.2017 um 22:29 schrieb Lobron, David <dlobron@akamai.com>:
>>> 
>>> Hello GNUstep people,
>>> 
>>> I'm debugging an occasional crash that we've observed on machines that run 
>>> 20 instances of a GNUstep-based program.  The crash does not occur often, 
>>> and I can't reproduce it on demand, but when it does occur, we see a 
>>> message like this: 
>>> 
>>> mapmaker_7.exe: Uncaught exception NSGenericException, reason: Unable to 
>>> get attributes of lock file we made at 
>>> /root/GNUstep/Defaults/.lck/.GNUstepDefaults.lck
>>> 
>>> Since the lock file path is absolute, I suspect the problem here is 
>>> contention among the various processes for the same file if two or more of 
>>> them are starting up at exactly the same time.  However, I would expect a 
>>> lock file to be impervious to multiple readers.  Maybe there is a 
>>> non-atomic operation happening here.  I searched the code for 
>>> "GNUstepDefaults.lck", but I did find it there.  The 
>>> /root/GNUstep/Defaults/.lck is normally empty, so it seems like this is a 
>>> transient file.
>>> 
>>> Does anyone know if there's a recommended way to handle this?  Is it a 
>>> known issue?
>> 
>> Sort of. I've seen many issues revolving around GNUstepDefaults.lck in the 
>> past here.
>> However, looking at the code I'm afraid the reason is simply that the 
>> NSDistributedLock implementation is broken (and apparently is so for quite 
>> some time). :-(
>> The problem is that the code of NSDistributedLock was changed to use 
>> -[NSFileManager 
>> createDirectoryAtPath:withIntermediateDirectories:attributes:error:] with 
>> the second argument set to YES so that it would create intermediate 
>> directories. However, that means that this method returns YES regardless of 
>> whether the new directory already exists or not. I think changing the 
>> parameter to NO should fix your (and everyone else's) issue.
> 
> Thanks a lot for that Wolfgang, I've spent days trying to figure out why the 
> user defaults locks were occasionally failing, looking in completely the 
> wrong area (threading mostly)' and never considering it might be something as 
> basic as that.  It's great that you spotted the cause of the problem.
> I have changed the NSDistributedLock code (github) to use O/S level functions 
> to create the lock directory, to be sure that if a directory already exists 
> we see the creation attempt as failing rather than succeeding.




reply via email to

[Prev in Thread] Current Thread [Next in Thread]