Re: [PATCH] localedata: Avoid concurrently written locales in gen-locale.sh

Sam James <[email protected]>
Newsgroups gmane.comp.lib.glibc.alpha
Organization Gentoo
Message-ID <[email protected]>
Florian Weimer <[email protected]> writes:

> There is no cross-directory exclusion of concurrent $(gen-locales)
> usage.  Parallel localedef calls can clobber locale data as it is
> being loaded by tests.
>
> With --no-hard-links, the separate touch invocation is no longer
> required.
>
> ---
>  localedata/gen-locale.sh | 22 +++++++++++++++-------
>  1 file changed, 15 insertions(+), 7 deletions(-)
>
> diff --git a/localedata/gen-locale.sh b/localedata/gen-locale.sh
> index 4762c04284..b0ce27fbae 100644
> --- a/localedata/gen-locale.sh
> +++ b/localedata/gen-locale.sh
> @@ -32,15 +32,23 @@ generate_locale ()
>    out=$3
>    flags=$4
>    ret=0
> +
> +  # Use a staging area to avoid writing to locales concurrently.
> +  # While this process is running, $$ is sufficiently unique.

Yes, this should be OK.

> +  # Use --no-hard-links to prevent localedef from accessing
> +  # other staging areas.
> +  stage="${common_objpfx}localedata/gen-locale.$$.tmp"
> +
>    ${localedef_before_env} ${run_program_env} I18NPATH=../localedata \
> -	${localedef_after_env} $flags -f $charmap -i $input \
> -	${common_objpfx}localedata/$out || ret=$?
> -  if [ $ret -eq 0 ]; then
> -    # The makefile checks the timestamp of the LC_CTYPE file,
> -    # but localedef won't have touched it if it was able to
> -    # hard-link it to an existing file.
> -    touch ${common_objpfx}localedata/$out/LC_CTYPE
> +	${localedef_after_env} $flags --no-hard-links -f $charmap -i $input \
> +	$stage || ret=$?

This could be improved to directly test the command but it can be done
later, no need to do it now.

> +  if [ $ret -eq 0 ] ; then
> +      # Ignore errors in case some other process has created the same
> locale.

OK. 

> +      # (Some versions of mv do not report an error here.)
> +      mv -Tn $stage ${common_objpfx}localedata/$out 2>/dev/null || true

I'm sorry to ask this, but is mv -T sufficiently portable? It's not
POSIX but I don't recall if we require any extensions for coreutils
elsewhere in glibc.

> +      rm -rf $stage
>    else
> +    rm -rf $stage
>      echo "Charmap: \"${charmap}\" Inputfile: \"${input}\"" \
>  	 "Outputdir: \"${out}\" failed"
>      exit 1

The patch otherwise looks good, but please wait a brief period for
Adhemerval to comment before committing.

sam
signature.asc (application/pgp-signature, 418 B)
-----BEGIN PGP SIGNATURE-----

iQEBBAEWCgCpFiEEJaa7iN2bdkxrVUHCc4QJ9SDfkZAFAmpOQDEbFIAAAAAABAAO
bWFudTIsMi41KzEuMTIsMiwyXxSAAAAAAC4AKGlzc3Vlci1mcHJAbm90YXRpb25z
Lm9wZW5wZ3AuZmlmdGhob3JzZW1hbi5uZXQyNUE2QkI4OEREOUI3NjRDNkI1NTQx
QzI3Mzg0MDlGNTIwREY5MTkwDxxzYW1AZ2VudG9vLm9yZwAKCRBzhAn1IN+RkLPw
AP9BJb6SExOuUFB0b9Wy5IVRg7jZxCpKnUyh3C4Dgsw4hQD/djHAnXPMD78FLYjV
lkeDjJWqsYRa5SU5jk4MBG7KTwM=
=IA4a
-----END PGP SIGNATURE-----
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.