Re: request-route

John Macdonald (jmm@ELEGANT.COM)
Tue, 29 Jul 1997 17:19:26 -0400

Eric Bennett wrote :
|| On Tue, 29 Jul 1997, Zoltan Hidvegi wrote:
||
|| > As far as I know, there is no portable way to safely create
|| > lock files in a world-writable directory from a bourne-shell script.
||
|| I have done this by creating directories instead of files: only one mkdir
|| will complete. You can also create a pid-specific file and then ln it to the
|| common lockfile - only one ln will complete (without the -f flag).
||
|| I'm not sure if ln is save over NFS, but I beleive that mkdir is.

Nope, you;ve got it backwards. To begin, the same basic problem
applies to both. If an operation succeeds, but the
acknowledgement gets lost on the network, then the time-out
cause a retry which will fail because the target item exists.

So, even the user that created the lock doesn't know that
*their* operation succeeded.

With "mkdir", that is fatal - there is no way to look at a
directory and tell which program created it (well maybe you
could manage to have every process use a different group).

With "ln", it is not. As long as each process uses their own
private file with distinguishable contents (like its process
id), then if the link succeeds the created lock file will
contain the creator's process id - *even* if NFS gets confused
and says that the operation failed. So, as long as you ignore
the status of the "ln" attempt, but instead read the lock file
and compare with the process id you tried to register, you can
safely determine whether you created a lock file.

Stateless protocols have a definite downside.

--
Perl's grammar can not be reduced to BNF. The work of | John Macdonald
parsing perl is distributed between yacc, the lexer,  |   jmm@elegant.com
smoke and mirrors.   - Chaim Frenkel                  |