Add --no-hard-links option to localedef (bug 23923)
Downstream distributions need consistent sets of hardlinks in order for rpm to operate effectively. This means that even if locales are built with a high level of parallelism that the resulting files need to have consistent hardlink counts. The only way to achieve this is with a post-install hardlink pass using a program like 'hardlink' (shipped in Fedora). If the downstream distro wants to post-process the hardlinks then the time spent in localedef looking up sibling directories and processing hardlinks is wasted effort. To optimize the build and install pass we add a --no-hard-links option to localedef to avoid doing the hardlink optimziation for size. Tested on x86_64 with 'make localedata/install-locale-files' before and after. Without the patch we have files with 100+ hardlink counts. After the patch and running with --no-hard-links all link counts are 1. This patch also alters the convenience target 'make localedata/install-locale-files' to use the new option. Signed-off-by: Carlos O'Donell <carlos@redhat.com>
This commit is contained in:
parent
c22e4c2a14
commit
8cebd4ffe6
10
ChangeLog
10
ChangeLog
|
@ -1,3 +1,13 @@
|
||||||
|
2018-12-03 Carlos O'Donell <carlos@redhat.com>
|
||||||
|
|
||||||
|
[BZ #23923]
|
||||||
|
* locale/programs/localedef.c: Declare boolean hard_links default true.
|
||||||
|
(options): Add --no-hard-links option.
|
||||||
|
(parse_opt): Add OPT_NO_HARD_LINKS case and set hard_links to false.
|
||||||
|
* locale/programs/localedef.h: Declare prototype for hard_links.
|
||||||
|
* locale/programs/locfile.c (write_locale_data): Don't use hard
|
||||||
|
links if hard_links is false.
|
||||||
|
|
||||||
2018-12-03 H.J. Lu <hongjiu.lu@intel.com>
|
2018-12-03 H.J. Lu <hongjiu.lu@intel.com>
|
||||||
|
|
||||||
* sysdeps/x86/cacheinfo.c (intel_check_word): Updated for
|
* sysdeps/x86/cacheinfo.c (intel_check_word): Updated for
|
||||||
|
|
|
@ -85,6 +85,9 @@ static bool replace_archive;
|
||||||
/* If true list archive content. */
|
/* If true list archive content. */
|
||||||
static bool list_archive;
|
static bool list_archive;
|
||||||
|
|
||||||
|
/* If true create hard links to other locales (default). */
|
||||||
|
bool hard_links = true;
|
||||||
|
|
||||||
/* Maximum number of retries when opening the locale archive. */
|
/* Maximum number of retries when opening the locale archive. */
|
||||||
int max_locarchive_open_retry = 10;
|
int max_locarchive_open_retry = 10;
|
||||||
|
|
||||||
|
@ -105,6 +108,7 @@ void (*argp_program_version_hook) (FILE *, struct argp_state *) = print_version;
|
||||||
#define OPT_BIG_ENDIAN 401
|
#define OPT_BIG_ENDIAN 401
|
||||||
#define OPT_NO_WARN 402
|
#define OPT_NO_WARN 402
|
||||||
#define OPT_WARN 403
|
#define OPT_WARN 403
|
||||||
|
#define OPT_NO_HARD_LINKS 404
|
||||||
|
|
||||||
/* Definitions of arguments for argp functions. */
|
/* Definitions of arguments for argp functions. */
|
||||||
static const struct argp_option options[] =
|
static const struct argp_option options[] =
|
||||||
|
@ -120,6 +124,8 @@ static const struct argp_option options[] =
|
||||||
{ NULL, 0, NULL, 0, N_("Output control:") },
|
{ NULL, 0, NULL, 0, N_("Output control:") },
|
||||||
{ "force", 'c', NULL, 0,
|
{ "force", 'c', NULL, 0,
|
||||||
N_("Create output even if warning messages were issued") },
|
N_("Create output even if warning messages were issued") },
|
||||||
|
{ "no-hard-links", OPT_NO_HARD_LINKS, NULL, 0,
|
||||||
|
N_("Do not create hard links between installed locales") },
|
||||||
{ "prefix", OPT_PREFIX, N_("PATH"), 0, N_("Optional output file prefix") },
|
{ "prefix", OPT_PREFIX, N_("PATH"), 0, N_("Optional output file prefix") },
|
||||||
{ "posix", OPT_POSIX, NULL, 0, N_("Strictly conform to POSIX") },
|
{ "posix", OPT_POSIX, NULL, 0, N_("Strictly conform to POSIX") },
|
||||||
{ "quiet", OPT_QUIET, NULL, 0,
|
{ "quiet", OPT_QUIET, NULL, 0,
|
||||||
|
@ -389,6 +395,10 @@ parse_opt (int key, char *arg, struct argp_state *state)
|
||||||
/* Enable the warnings. */
|
/* Enable the warnings. */
|
||||||
set_warnings (arg, true);
|
set_warnings (arg, true);
|
||||||
break;
|
break;
|
||||||
|
case OPT_NO_HARD_LINKS:
|
||||||
|
/* Do not hard link to other locales. */
|
||||||
|
hard_links = false;
|
||||||
|
break;
|
||||||
case 'c':
|
case 'c':
|
||||||
force_output = 1;
|
force_output = 1;
|
||||||
break;
|
break;
|
||||||
|
|
|
@ -118,6 +118,7 @@ extern const char *repertoire_global;
|
||||||
extern int max_locarchive_open_retry;
|
extern int max_locarchive_open_retry;
|
||||||
extern bool no_archive;
|
extern bool no_archive;
|
||||||
extern const char *alias_file;
|
extern const char *alias_file;
|
||||||
|
extern bool hard_links;
|
||||||
|
|
||||||
|
|
||||||
/* Prototypes for a few program-wide used functions. */
|
/* Prototypes for a few program-wide used functions. */
|
||||||
|
|
|
@ -702,7 +702,7 @@ write_locale_data (const char *output_path, int catidx, const char *category,
|
||||||
size_t cnt, step, maxiov;
|
size_t cnt, step, maxiov;
|
||||||
int fd;
|
int fd;
|
||||||
char *fname;
|
char *fname;
|
||||||
const char **other_paths;
|
const char **other_paths = NULL;
|
||||||
uint32_t header[2];
|
uint32_t header[2];
|
||||||
size_t n_elem;
|
size_t n_elem;
|
||||||
struct iovec vec[3];
|
struct iovec vec[3];
|
||||||
|
@ -827,9 +827,22 @@ failure while writing data for category `%s'"), category);
|
||||||
|
|
||||||
close (fd);
|
close (fd);
|
||||||
|
|
||||||
/* Compare the file with the locale data files for the same category in
|
/* Compare the file with the locale data files for the same category
|
||||||
other locales, and see if we can reuse it, to save disk space. */
|
in other locales, and see if we can reuse it, to save disk space.
|
||||||
|
If the user specified --no-hard-links to localedef then hard_links
|
||||||
|
is false, other_paths remains NULL and we skip the optimization
|
||||||
|
below. The use of --no-hard-links is distribution specific since
|
||||||
|
some distros have post-processing hard-link steps and so doing this
|
||||||
|
here is a waste of time. Worse than a waste of time in rpm-based
|
||||||
|
distributions it can result in build determinism issues from
|
||||||
|
build-to-build since some files may get a hard link in one pass but
|
||||||
|
not in another (if the files happened to be created in parallel). */
|
||||||
|
if (hard_links)
|
||||||
other_paths = siblings (output_path);
|
other_paths = siblings (output_path);
|
||||||
|
|
||||||
|
/* If there are other paths, then walk the sibling paths looking for
|
||||||
|
files with the same content so we can hard link and reduce disk
|
||||||
|
space usage. */
|
||||||
if (other_paths != NULL)
|
if (other_paths != NULL)
|
||||||
{
|
{
|
||||||
struct stat64 fname_stat;
|
struct stat64 fname_stat;
|
||||||
|
|
|
@ -423,7 +423,7 @@ $(INSTALL-SUPPORTED-LOCALE-ARCHIVE): install-locales-dir
|
||||||
$(build-one-locale)
|
$(build-one-locale)
|
||||||
|
|
||||||
$(INSTALL-SUPPORTED-LOCALE-FILES): install-locales-dir
|
$(INSTALL-SUPPORTED-LOCALE-FILES): install-locales-dir
|
||||||
@flags="-c --no-archive"; \
|
@flags="-c --no-archive --no-hard-links"; \
|
||||||
$(build-one-locale)
|
$(build-one-locale)
|
||||||
|
|
||||||
tst-setlocale-ENV = LC_ALL=ja_JP.EUC-JP
|
tst-setlocale-ENV = LC_ALL=ja_JP.EUC-JP
|
||||||
|
|
Loading…
Reference in New Issue