From 52e2894225b83fc0b82b627f5caac5f32e2b9488 Mon Sep 17 00:00:00 2001 From: Mark Reynolds Date: Apr 03 2020 15:23:44 +0000 Subject: Issue 49731 - Fix additional issues with setting db home directory by default Description: The db home dir does need to be set in the template-dse.ldif file, but this required additional changes to perl modules that setup-ds.pl uses. There are also issues with containers where /dev/shm could be undersized for the database, so for container installs we will not set the db-home-dir to tmpfs. relates: https://pagure.io/389-ds-base/issue/49731 Reviewed by: ? --- diff --git a/ldap/admin/src/scripts/DSCreate.pm.in b/ldap/admin/src/scripts/DSCreate.pm.in index b586cef..9f949e7 100644 --- a/ldap/admin/src/scripts/DSCreate.pm.in +++ b/ldap/admin/src/scripts/DSCreate.pm.in @@ -225,9 +225,9 @@ sub makeDSDirs { my $mode = getMode($inf, 7); my @errs; - my @dsdirs = qw(config_dir schema_dir log_dir lock_dir run_dir tmp_dir cert_dir db_dir ldif_dir bak_dir); + my @dsdirs = qw(config_dir schema_dir log_dir lock_dir run_dir tmp_dir cert_dir db_home_dir db_dir ldif_dir bak_dir); if ($inf->{slapd}->{InstScriptsEnabled} eq "true") { - @dsdirs = qw(inst_dir config_dir schema_dir log_dir lock_dir run_dir tmp_dir cert_dir db_dir ldif_dir bak_dir); + @dsdirs = qw(inst_dir config_dir schema_dir log_dir lock_dir run_dir tmp_dir cert_dir db_home_dir db_dir ldif_dir bak_dir); } # These paths are owned by the SuiteSpotGroup @@ -313,7 +313,8 @@ sub createInstanceScripts { "RUN-DIR" => $inf->{slapd}->{run_dir}, "PRODUCT-NAME" => "slapd", "SERVERBIN-DIR" => $inf->{slapd}->{sbindir}, - "DB-DIR" => $inf->{slapd}->{db_dir} + "DB-DIR" => $inf->{slapd}->{db_dir}, + "DB-HOME-DIR" => $inf->{slapd}->{db_home_dir} ); @@ -952,6 +953,10 @@ sub setDefaults { } } + if (!defined($inf->{slapd}->{db_home_dir})) { + $inf->{slapd}->{db_home_dir} = "/dev/shm/@PACKAGE_NAME@/slapd-$servid"; + } + if (!defined($inf->{slapd}->{bak_dir})) { if ("@with_fhs_opt@") { $inf->{slapd}->{bak_dir} = "$localstatedir/@PACKAGE_NAME@/slapd-$servid/bak"; @@ -1008,9 +1013,9 @@ sub updateSelinuxPolicy { system("restorecon -R $localstatedir/lib/@PACKAGE_NAME@"); } - my @inst_dirs = qw(config_dir schema_dir log_dir lock_dir run_dir tmp_dir cert_dir db_dir ldif_dir bak_dir); + my @inst_dirs = qw(config_dir schema_dir log_dir lock_dir run_dir tmp_dir cert_dir db_home_dir db_dir ldif_dir bak_dir); if ($inf->{slapd}->{InstScriptsEnabled} eq "true") { - @inst_dirs = qw(inst_dir config_dir schema_dir log_dir lock_dir run_dir tmp_dir cert_dir db_dir ldif_dir bak_dir); + @inst_dirs = qw(inst_dir config_dir schema_dir log_dir lock_dir run_dir tmp_dir cert_dir db_home_dir db_dir ldif_dir bak_dir); } # run restorecon on all instance directories we created for my $kw (@inst_dirs) { diff --git a/ldap/admin/src/scripts/DSUpdate.pm.in b/ldap/admin/src/scripts/DSUpdate.pm.in index 25fecbe..d2e0e8a 100644 --- a/ldap/admin/src/scripts/DSUpdate.pm.in +++ b/ldap/admin/src/scripts/DSUpdate.pm.in @@ -493,6 +493,10 @@ sub initInfFromInst { $inf->{slapd}->{db_dir} = $entry->getValue('nsslapd-directory'); } + if (!$inf->{slapd}->{db_home_dir}) { + $inf->{slapd}->{db_home_dir} = $entry->getValue('nsslapd-db-home-directory'); + } + $conn->close(); # don't need this anymore # set defaults for things we don't know how to find, after setting the values diff --git a/ldap/admin/src/scripts/dscreate.map.in b/ldap/admin/src/scripts/dscreate.map.in index 92cefd0..4c47b08 100644 --- a/ldap/admin/src/scripts/dscreate.map.in +++ b/ldap/admin/src/scripts/dscreate.map.in @@ -36,5 +36,6 @@ inst_dir = inst_dir log_dir = log_dir config_dir = config_dir db_dir = db_dir +db_home_dir = db_home_dir run_dir = run_dir instance_name = ServerIdentifier diff --git a/ldap/admin/src/scripts/dsupdate.map.in b/ldap/admin/src/scripts/dsupdate.map.in index 843fd34..f6912b6 100644 --- a/ldap/admin/src/scripts/dsupdate.map.in +++ b/ldap/admin/src/scripts/dsupdate.map.in @@ -33,4 +33,5 @@ inst_dir = inst_dir log_dir = log_dir config_dir = config_dir db_dir = db_dir +db_home_dir = db_home_dir run_dir = run_dir diff --git a/ldap/ldif/template-dse.ldif.in b/ldap/ldif/template-dse.ldif.in index 9efff58..19abcf8 100644 --- a/ldap/ldif/template-dse.ldif.in +++ b/ldap/ldif/template-dse.ldif.in @@ -905,6 +905,7 @@ objectclass: extensibleObject cn: config nsslapd-mode: 600 nsslapd-directory: %db_dir% +nsslapd-db-home-directory: %db_home_dir% nsslapd-subtree-rename-switch: on dn: cn=default indexes, cn=config,cn=ldbm database,cn=plugins,cn=config diff --git a/ldap/servers/slapd/back-ldbm/db-bdb/bdb_version.c b/ldap/servers/slapd/back-ldbm/db-bdb/bdb_version.c index ff0d7b3..c800ca2 100644 --- a/ldap/servers/slapd/back-ldbm/db-bdb/bdb_version.c +++ b/ldap/servers/slapd/back-ldbm/db-bdb/bdb_version.c @@ -53,8 +53,8 @@ bdb_version_write(struct ldbminfo *li, const char *directory, const char *datave /* Open the file */ if ((prfd = PR_Open(filename, PR_RDWR | PR_CREATE_FILE | PR_TRUNCATE, SLAPD_DEFAULT_FILE_MODE)) == NULL) { - slapi_log_err(SLAPI_LOG_ERR, "bdb_version_write - " - "Could not open file \"%s\" for writing " SLAPI_COMPONENT_NAME_NSPR " %d (%s)\n", + slapi_log_err(SLAPI_LOG_ERR, "bdb_version_write", + "Could not open file \"%s\" for writing " SLAPI_COMPONENT_NAME_NSPR " %d (%s)\n", filename, PR_GetError(), slapd_pr_strerror(PR_GetError())); rc = -1; } else { diff --git a/src/lib389/lib389/instance/setup.py b/src/lib389/lib389/instance/setup.py index 0cb8f4f..60eb6c7 100644 --- a/src/lib389/lib389/instance/setup.py +++ b/src/lib389/lib389/instance/setup.py @@ -720,7 +720,11 @@ class SetupDs(object): dse += line.replace('%', '{', 1).replace('%', '}', 1) with open(os.path.join(slapd['config_dir'], 'dse.ldif'), 'w') as file_dse: - file_dse.write(dse.format( + db_home_dir = slapd['db_home_dir'] + if self.containerised: + # don't set db_home_dir to tmpfs in containers + db_home_dir = slapd['db_dir'] + dse_fmt = dse.format( schema_dir=slapd['schema_dir'], lock_dir=slapd['lock_dir'], tmp_dir=slapd['tmp_dir'], @@ -741,8 +745,9 @@ class SetupDs(object): ds_suffix=ds_suffix, config_dir=slapd['config_dir'], db_dir=slapd['db_dir'], - db_home_dir=slapd['db_home_dir'] - )) + db_home_dir=db_home_dir + ) + file_dse.write(dse_fmt) # Create all the needed paths # we should only need to make bak_dir, cert_dir, config_dir, db_dir, ldif_dir, lock_dir, log_dir, run_dir?