lilypond-devel
[Top][All Lists]
Advanced

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

Re: race condition in writing lilypond-book filenames


From: Matthias Kilian
Subject: Re: race condition in writing lilypond-book filenames
Date: Sun, 13 Dec 2009 17:49:13 +0100
User-agent: Mutt/1.4.2.3i

Hi,

On Sun, Dec 13, 2009 at 03:55:00PM +0000, Graham Percival wrote:
> diff --git a/scripts/lilypond-book.py b/scripts/lilypond-book.py
> index 392ddd0..b9731f1 100644
> --- a/scripts/lilypond-book.py
> +++ b/scripts/lilypond-book.py
> @@ -1273,7 +1273,11 @@ left-margin-default right-margin-default)"
>          directory = os.path.split(path)[0]
>          if not os.path.isdir (directory):
>              os.makedirs (directory)
> -        out = file (path + '.ly', 'w')
> +        filename = path + '.ly'
> +        if os.path.exists(filename):
> +            print "PANIC!  ", filename, "already exists!"
> +            sys.exit(1)
> +        out = file (filename, 'w')
>          out.write (self.full_ly ())
>          file (path + '.txt', 'w').write ('image of music')

It's still possible that a file gets overwritten, for example if
one process creates the output file *after* another process checked
wether it exists, but *before* that other process actually creates
the file.

Anyway, I had an idea after seeing that diff...

> In any case, we definitely have the same filename being used multiple
> times when building lilypond.  Is this a problem?  I can't say for
> certainty, but I *do* know that unpredictable race conditions occur in
> the docs when building with more than one process.

If the a file with the same name always has the same content,
regardless from which document it has been generated, would something
like the following help (no real code, i'm not good at all if it
comes to python)?


- write the output to a temporary file (with a unique filename, but
  within the same directory)

- after writing the temporary file, test wether a file with the final
  name (path + '.ly') already exists

- if not, just rename the tempory file to the final name

- if it already existed, remove the temporary file (here one could
  additionally compare the two files and error out if they differ)

There's still a race here (again, between the check wether the final
file exists and the actual renaming). However, if equally named
files are expected to have the same content, this race doesn't
matter, because renaming a file is an atomic operation, and because
the final file will always be complete.

Ciao,
        Kili




reply via email to

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