On 16 January 2013 22:31, Roberto De Ioris <[email protected]> wrote:
>
>> On 16 January 2013 19:39, Roberto De Ioris <[email protected]> wrote:
>>>
>>>> I actually found that flock has, for some reason, no effect whatsoever
>>>> when daemonize is used. (Is that fd inadvertently closed?)
>>>>
>>>> This is on an ext4 filesystem. The related test configs: (the asdf
>>>> lockfile was pre-created)
>>>>
>>>>     $ cat x.ini
>>>>     [uwsgi]
>>>>     flock=asdf
>>>>     socket=/tmp/test.sock
>>>>     daemonize=foo.log
>>>>
>>>>     $ cat x-nodaemon.ini
>>>>     [uwsgi]
>>>>     flock=asdf
>>>>     socket=/tmp/test.sock
>>>>
>>>> First session, showing two daemonized uWSGIs and one non-daemonized
>>>> uWSGI
>>>> starting concurrently with the same flock file:
>>>>
>>>>     $ uwsgi-1.4.3 x.ini
>>>>     [uWSGI] getting INI configuration from x.ini
>>>>
>>>>     $ uwsgi-1.4.3 x.ini
>>>>     [uWSGI] getting INI configuration from x.ini
>>>>
>>>>     $ ps aux | grep x.ini
>>>>     21943  ... uwsgi-1.4.3 x.ini
>>>>     21947  ... uwsgi-1.4.3 x.ini
>>>>
>>>>     $ uwsgi-1.4.3 x-nodaemon.ini
>>>>     [uWSGI] getting INI configuration from x-nodaemon.ini
>>>>     *** Starting uWSGI 1.4.3 (64bit) on [Tue Jan 15 09:50:39 2013] ***
>>>>
>>>> And a second session, with two non-daemonized uWSGIs with the same
>>>> lockfile:
>>>>
>>>>     (shell 1) $ uwsgi-1.4.3 x-nodaemon.ini
>>>>     [uWSGI] getting INI configuration from x-nodaemon.ini
>>>>     *** Starting uWSGI 1.4.3 (64bit) on [Tue Jan 15 09:51:23 2013] ***
>>>>
>>>>     (shell 2) $ uwsgi-1.4.3 x-nodaemon.ini
>>>>     [uWSGI] getting INI configuration from x-nodaemon.ini
>>>>     uWSGI ERROR: asdf is locked by another instance
>>>>     (shell 2) $
>>>>
>>>> Strange...
>>>>
>>>> -
>>>
>>> it is the expected behaviour.
>>>
>>> If you fork() after a flock(), the lock is lost.
>>
>> This is confusing. The flock(2) manpage says the opposite:
>>
>> <quote>
>> Locks created by flock() are associated with an open file table entry.
>>  This means that duplicate file descriptors (created by,  for
>> example, fork(2) or dup(2)) refer to the same lock, and this lock may
>> be modified or released using any of these descriptors.  Furthermore,
>> the lock is released either by an explicit LOCK_UN operation on any of
>> these duplicate descriptors, or when  all  such  descriptors  have
>> been closed.
>> </quote>
>>
>> I regularly flock and fork and do not lose the lock in child
>> processes. Generally in Perl, but whatever, it uses fork(), and
>> flock() internally.
>>
>> What am I missing? Are you describing uWSGI specific behavior?
>>
>
>
> it is a "daemonization" behaviour, but it is not clear if it is linux
> specific.
>
> basically:
>
> flock() on proc 1
> fork() on proc 1
> proc 2 starts
> exit() on proc 1
> the lock is released in proc2
>
> If you do not exit the main process the lock is ok

Hrm. Ill try to investigate further. I am pretty sure this should work
fine as long the file descriptors are left open in the child.

Yves





-- 
perl -Mre=debug -e "/just|another|perl|hacker/"
_______________________________________________
uWSGI mailing list
[email protected]
http://lists.unbit.it/cgi-bin/mailman/listinfo/uwsgi

Reply via email to