From b7ea05ba7b10b642100d54051a90f85436d30cf2 Mon Sep 17 00:00:00 2001 From: Tomasz Gromadzki Date: Wed, 16 Oct 2024 02:48:45 +0200 Subject: [PATCH] DAOS-14408 common: ensure NDCTL not used for storage class `ram` (#15203) * DAOS-14408 common: enable NDCTL for DCPM This PR prepares DAOS to be used with NDCTL enabled in PMDK, which means: - NDCTL must not be used when non-DCPM (simulate PMem) - `storage class: "ram"` is used: `PMEMOBJ_CONF=sds.at_create=0` env variable disables NDCTL features in the PMDK This change affects all tests run on simulated PMem (e.g. inside VMs). Some DOAS utility applications may also require `PMEMOBJ_CONF=sds.at_create=0` to be set. - The default ULT stack size must be at least 20KiB to avoid stack overuse by PMDK with NDCTL enabled and be aligned with Linux page size. `ABT_THREAD_STACKSIZE=20480` env variable is used to increase the default ULT stack size. This env variable is set by control/server module just before engine is started. Much bigger stack is used for pmempool open/create-related tasks e.g. `tgt_vos_create_one` to avoid stack overusage. This modification shall not affect md-on-ssd mode as long as `storage class: "ram"` is used for the first tier in the `storage` configuration. This change does not require any configuration changes to existing systems. The new PMDK package with NDCTL enabled (https://github.com/daos-stack/pmdk/pull/38) will land as soon as this PR is merged. Change-Id: If4c3f7d88a97e4e4f5526da71f4b374a2844057b Signed-off-by: Jan Michalski --- .github/workflows/landing-builds.yml | 1 + debian/changelog | 16 ++ debian/control | 6 +- site_scons/components/__init__.py | 1 - src/control/server/engine/config.go | 86 ++++++++++ src/control/server/engine/config_test.go | 207 +++++++++++++++++++++++ src/control/server/server.go | 6 + src/mgmt/srv_target.c | 2 +- utils/build.config | 3 +- utils/rpms/daos.rpmlintrc | 10 +- utils/rpms/daos.spec | 29 +++- utils/run_utest.py | 1 + utils/scripts/install-el8.sh | 2 + utils/scripts/install-el9.sh | 2 + utils/scripts/install-leap15.sh | 1 + utils/scripts/install-ubuntu.sh | 2 + 16 files changed, 361 insertions(+), 14 deletions(-) diff --git a/.github/workflows/landing-builds.yml b/.github/workflows/landing-builds.yml index 103f150915a..814c4f0e71f 100644 --- a/.github/workflows/landing-builds.yml +++ b/.github/workflows/landing-builds.yml @@ -16,6 +16,7 @@ on: - ci/** - requirements-build.txt - requirements-utest.txt + - utils/build.config permissions: {} diff --git a/debian/changelog b/debian/changelog index 6891cea4737..9790dcbee3e 100644 --- a/debian/changelog +++ b/debian/changelog @@ -1,3 +1,19 @@ +daos (2.6.1-4) unstable; urgency=medium + [ Tomasz Gromadzki ] + * Add support of the PMDK package 2.1.0 with NDCTL enabled. + * Increase the default ULT stack size to 20KiB if the engine uses + the DCPM storage class. + * Prevent using the RAM storage class (simulated PMem) when + the shutdown state (SDS) is active. + * Automatically disable SDS for the RAM storage class on engine startup. + * Force explicitly setting the PMEMOBJ_CONF='sds.at_create=0' + environment variable to deactivate SDS for the DAOS tools + (ddb, daos_perf, vos_perf, etc.) when used WITHOUT DCPM. + Otherwise, a user is supposed to be stopped by an error + like: "Unsafe shutdown count is not supported for this source". + + -- Tomasz Gromadzki Wed, 02 Oct 2024 12:00:00 +0200 + daos (2.6.1-3) unstable; urgency=medium [ Phillip Henderson ] * Third release candidate for 2.6.1 diff --git a/debian/control b/debian/control index 53f84d7f9c1..328bda36426 100644 --- a/debian/control +++ b/debian/control @@ -18,7 +18,7 @@ Build-Depends: debhelper (>= 10), python3-distro, libabt-dev, libucx-dev, - libpmemobj-dev (>= 2.0.0), + libpmemobj-dev (>= 2.1.0), libfuse3-dev, libprotobuf-c-dev, libjson-c-dev, @@ -118,7 +118,9 @@ Depends: python (>=3.8), python3, python-yaml, python3-yaml, daos-client (= ${binary:Version}), daos-admin (= ${binary:Version}), golang-go (>= 2:1.21), - libcapstone-dev + libcapstone-dev, + libndctl-dev, + libdaxctl-dev Description: The Distributed Asynchronous Object Storage (DAOS) is an open-source software-defined object store designed from the ground up for massively distributed Non Volatile Memory (NVM). DAOS takes advantage diff --git a/site_scons/components/__init__.py b/site_scons/components/__init__.py index e6a20f7b413..2525b448671 100644 --- a/site_scons/components/__init__.py +++ b/site_scons/components/__init__.py @@ -268,7 +268,6 @@ def define_components(reqs): retriever=GitRepoRetriever(), commands=[['make', 'all', - 'NDCTL_ENABLE=n', 'BUILD_EXAMPLES=n', 'BUILD_BENCHMARKS=n', 'DOC=n', diff --git a/src/control/server/engine/config.go b/src/control/server/engine/config.go index 3e6ab0b64d7..38595fd8091 100644 --- a/src/control/server/engine/config.go +++ b/src/control/server/engine/config.go @@ -9,6 +9,7 @@ package engine import ( "fmt" "os" + "strconv" "strings" "github.com/pkg/errors" @@ -28,6 +29,8 @@ const ( envLogMasks = "D_LOG_MASK" envLogDbgStreams = "DD_MASK" envLogSubsystems = "DD_SUBSYS" + + minABTThreadStackSizeDCPM = 20480 ) // FabricConfig encapsulates networking fabric configuration. @@ -342,7 +345,80 @@ func (c *Config) Validate() error { if err := ValidateLogSubsystems(subsystems); err != nil { return errors.Wrap(err, "validate engine log subsystems") } + return nil +} + +// Ensure at least 20KiB ABT stack size for an engine with DCPM storage class. +func (c *Config) UpdatePMDKEnvarsStackSizeDCPM() error { + stackSizeStr, err := c.GetEnvVar("ABT_THREAD_STACKSIZE") + if err != nil { + c.EnvVars = append(c.EnvVars, fmt.Sprintf("ABT_THREAD_STACKSIZE=%d", + minABTThreadStackSizeDCPM)) + return nil + } + // Ensure at least 20KiB ABT stack size for an engine with DCPM storage class. + stackSizeValue, err := strconv.Atoi(stackSizeStr) + if err != nil { + return errors.Errorf("env_var ABT_THREAD_STACKSIZE has invalid value: %s", + stackSizeStr) + } + if stackSizeValue < minABTThreadStackSizeDCPM { + return errors.Errorf("env_var ABT_THREAD_STACKSIZE should be >= %d "+ + "for DCPM storage class, found %d", minABTThreadStackSizeDCPM, + stackSizeValue) + } + return nil +} + +// Ensure proper configuration of shutdown (SDS) state +func (c *Config) UpdatePMDKEnvarsPMemobjConf(isDCPM bool) error { + pmemobjConfStr, pmemobjConfErr := c.GetEnvVar("PMEMOBJ_CONF") + //also work for empty string + hasSdsAtCreate := strings.Contains(pmemobjConfStr, "sds.at_create") + if isDCPM { + if !hasSdsAtCreate { + return nil + } + // Confirm default handling of shutdown state (SDS) for DCPM storage class. + return errors.New("env_var PMEMOBJ_CONF should NOT contain 'sds.at_create=?' " + + "for DCPM storage class, found '" + pmemobjConfStr + "'") + } + + // Disable shutdown state (SDS) (part of RAS) for RAM-based simulated SCM. + if pmemobjConfErr != nil { + c.EnvVars = append(c.EnvVars, "PMEMOBJ_CONF=sds.at_create=0") + return nil + } + if !hasSdsAtCreate { + envVars, _ := common.DeleteKeyValue(c.EnvVars, "PMEMOBJ_CONF") + c.EnvVars = append(envVars, "PMEMOBJ_CONF="+pmemobjConfStr+ + ";sds.at_create=0") + return nil + } + if strings.Contains(pmemobjConfStr, "sds.at_create=1") { + return errors.New("env_var PMEMOBJ_CONF should contain 'sds.at_create=0' " + + "for non-DCPM storage class, found '" + pmemobjConfStr + "'") + } + return nil +} + +// Ensure proper environment variables for PMDK w/ NDCTL enabled based on +// the actual configuration of the storage class. +func (c *Config) UpdatePMDKEnvars() error { + + if len(c.Storage.Tiers) == 0 { + return errors.New("Invalid config - no tier 0 defined") + } + + isDCPM := c.Storage.Tiers[0].Class == storage.ClassDcpm + if err := c.UpdatePMDKEnvarsPMemobjConf(isDCPM); err != nil { + return err + } + + if isDCPM { + return c.UpdatePMDKEnvarsStackSizeDCPM() + } return nil } @@ -690,3 +766,13 @@ func (c *Config) WithStorageIndex(i uint32) *Config { c.Storage.EngineIdx = uint(i) return c } + +// WithEnvVarAbtThreadStackSize sets environment variable ABT_THREAD_STACKSIZE. +func (c *Config) WithEnvVarAbtThreadStackSize(stack_size uint16) *Config { + return c.WithEnvVars(fmt.Sprintf("ABT_THREAD_STACKSIZE=%d", stack_size)) +} + +// WithEnvVarPMemObjSdsAtCreate sets PMEMOBJ_CONF env. var. to sds.at_create=0/1 value +func (c *Config) WithEnvVarPMemObjSdsAtCreate(value uint8) *Config { + return c.WithEnvVars(fmt.Sprintf("PMEMOBJ_CONF=sds.at_create=%d", value)) +} diff --git a/src/control/server/engine/config_test.go b/src/control/server/engine/config_test.go index 463e86567dc..d9ca2bfebbd 100644 --- a/src/control/server/engine/config_test.go +++ b/src/control/server/engine/config_test.go @@ -1104,3 +1104,210 @@ func TestFabricConfig_Update(t *testing.T) { }) } } + +func TestConfig_UpdatePMDKEnvarsStackSizeDCPM(t *testing.T) { + validConfig := func() *Config { + return MockConfig().WithStorage( + storage.NewTierConfig(). + WithStorageClass("dcpm")) + } + + for name, tc := range map[string]struct { + cfg *Config + expErr error + expABTthreadStackSize int + }{ + "empty config should not fail": { + cfg: MockConfig(), + expABTthreadStackSize: minABTThreadStackSizeDCPM, + }, + "valid config for DCPM should not fail": { + cfg: validConfig().WithEnvVarAbtThreadStackSize(minABTThreadStackSizeDCPM), + expABTthreadStackSize: minABTThreadStackSizeDCPM, + }, + "config for DCPM without thread size should not fail": { + cfg: validConfig(), + expABTthreadStackSize: minABTThreadStackSizeDCPM, + }, + "config for DCPM with stack size big enough should not fail": { + cfg: validConfig(). + WithEnvVarAbtThreadStackSize(minABTThreadStackSizeDCPM + 1), + expABTthreadStackSize: minABTThreadStackSizeDCPM + 1, + }, + "config for DCPM with stack size too small should fail": { + cfg: validConfig(). + WithEnvVarAbtThreadStackSize(minABTThreadStackSizeDCPM - 1), + expErr: errors.New(fmt.Sprintf("env_var ABT_THREAD_STACKSIZE "+ + "should be >= %d for DCPM storage class, found %d", + minABTThreadStackSizeDCPM, minABTThreadStackSizeDCPM-1)), + }, + "config for DCPM with invalid ABT_THREAD_STACKSIZE value should fail": { + cfg: validConfig().WithEnvVars("ABT_THREAD_STACKSIZE=foo_bar"), + expErr: errors.New("env_var ABT_THREAD_STACKSIZE has invalid value: foo_bar"), + }, + } { + t.Run(name, func(t *testing.T) { + err := tc.cfg.UpdatePMDKEnvarsStackSizeDCPM() + test.CmpErr(t, tc.expErr, err) + if err == nil { + stackSizeStr, err := tc.cfg.GetEnvVar("ABT_THREAD_STACKSIZE") + test.AssertTrue(t, err == nil, "Missing env var ABT_THREAD_STACKSIZE") + stackSizeVal, err := strconv.Atoi(stackSizeStr) + test.AssertTrue(t, err == nil, "Invalid env var ABT_THREAD_STACKSIZE") + test.AssertEqual(t, tc.expABTthreadStackSize, stackSizeVal, + "Invalid ABT_THREAD_STACKSIZE value") + } + }) + } +} + +func TestConfig_UpdatePMDKEnvarsPMemobjConfDCPM(t *testing.T) { + validConfig := func() *Config { + return MockConfig().WithStorage( + storage.NewTierConfig().WithStorageClass("dcpm")) + } + + for name, tc := range map[string]struct { + cfg *Config + expErr error + }{ + "empty config should not fail": { + cfg: MockConfig(), + }, + "valid config for DCPM should not fail": { + cfg: validConfig(), + }, + "config for DCPM with forced sds.at_create (1) should fail": { + cfg: validConfig().WithEnvVarPMemObjSdsAtCreate(1), + expErr: errors.New("env_var PMEMOBJ_CONF should NOT contain " + + "'sds.at_create=?' for DCPM storage class, found 'sds.at_create=1'"), + }, + "config for DCPM with forced sds.at_create (0) should fail": { + cfg: validConfig().WithEnvVarPMemObjSdsAtCreate(0), + expErr: errors.New("env_var PMEMOBJ_CONF should NOT contain " + + "'sds.at_create=?' for DCPM storage class, found 'sds.at_create=0'"), + }, + } { + t.Run(name, func(t *testing.T) { + test.CmpErr(t, tc.expErr, tc.cfg.UpdatePMDKEnvarsPMemobjConf(true)) + }) + } +} + +func TestConfig_UpdatePMDKEnvarsPMemobjConfNRam(t *testing.T) { + validConfig := func() *Config { + return MockConfig().WithStorage( + storage.NewTierConfig(). + WithStorageClass("dcpm")) + } + + for name, tc := range map[string]struct { + cfg *Config + expErr error + expPMEMOBJ_CONF string + }{ + "empty config should not fail": { + cfg: validConfig(), + expPMEMOBJ_CONF: "sds.at_create=0", + }, + "config for ram without PMEMOBJ_CONF should not fail": { + cfg: MockConfig(), + expPMEMOBJ_CONF: "sds.at_create=0", + }, + "valid config for should not fail": { + cfg: validConfig().WithEnvVarPMemObjSdsAtCreate(0), + expPMEMOBJ_CONF: "sds.at_create=0", + }, + "config for ram w/ PMEMOBJ_CONF w/o sds.at_create should should be updated": { + cfg: validConfig().WithEnvVars("PMEMOBJ_CONF=foo_bar"), + expPMEMOBJ_CONF: "foo_bar;sds.at_create=0", + }, + "config for ram with sds.at_create set to 1 should fail": { + cfg: validConfig().WithEnvVarPMemObjSdsAtCreate(1), + expErr: errors.New("env_var PMEMOBJ_CONF should contain " + + "'sds.at_create=0' for non-DCPM storage class" + + ", found 'sds.at_create=1'"), + }, + "config for ram w/ PMEMOBJ_CONF w/ sds.at_create=1 should fail": { + cfg: validConfig(). + WithEnvVars("PMEMOBJ_CONF=sds.at_create=1;foo-bar"), + expErr: errors.New("env_var PMEMOBJ_CONF should contain " + + "'sds.at_create=0' for non-DCPM storage class" + + ", found 'sds.at_create=1;foo-bar'"), + }, + } { + t.Run(name, func(t *testing.T) { + test.CmpErr(t, tc.expErr, tc.cfg.UpdatePMDKEnvarsPMemobjConf(false)) + if len(tc.expPMEMOBJ_CONF) > 0 { + sds_at_create, err := tc.cfg.GetEnvVar("PMEMOBJ_CONF") + test.AssertTrue(t, err == nil, "Missing env var PMEMOBJ_CONF") + test.AssertEqual(t, tc.expPMEMOBJ_CONF, sds_at_create, + "Invalid PMEMOBJ_CONF") + } + + }) + } +} + +func TestConfig_UpdatePMDKEnvars(t *testing.T) { + validConfig := func(storageclas string) *Config { + return MockConfig().WithStorage( + storage.NewTierConfig(). + WithStorageClass(storageclas)) + } + for name, tc := range map[string]struct { + cfg *Config + expErr error + expPMEMOBJ_CONF string + expABTthreadStackSize int + }{ + "empty config should fail": { + cfg: MockConfig(), + expErr: errors.New("Invalid config - no tier 0 defined"), + expABTthreadStackSize: -1, + }, + "valid config for RAM should not fail": { + cfg: validConfig("ram"). + WithEnvVarAbtThreadStackSize(minABTThreadStackSizeDCPM - 1), + expPMEMOBJ_CONF: "sds.at_create=0", + expABTthreadStackSize: minABTThreadStackSizeDCPM - 1, + }, + "invalid config for RAM should fail": { + cfg: validConfig("ram").WithEnvVarPMemObjSdsAtCreate(1), + expErr: errors.New("env_var PMEMOBJ_CONF should contain " + + "'sds.at_create=0' for non-DCPM storage class, " + + "found 'sds.at_create=1'"), + expABTthreadStackSize: -1, + }, + "valid config for DCPM should not fail": { + cfg: validConfig("dcpm"), + expABTthreadStackSize: minABTThreadStackSizeDCPM, + }, + "invalid config for DCPM should not fail": { + cfg: validConfig("dcpm"). + WithEnvVarAbtThreadStackSize(minABTThreadStackSizeDCPM - 1), + expErr: errors.New("env_var ABT_THREAD_STACKSIZE should be >= 20480 " + + "for DCPM storage class, found 20479"), + expABTthreadStackSize: minABTThreadStackSizeDCPM - 1, + }, + } { + t.Run(name, func(t *testing.T) { + errTc := tc.cfg.UpdatePMDKEnvars() + test.CmpErr(t, tc.expErr, errTc) + if len(tc.expPMEMOBJ_CONF) > 0 { + sds_at_create, err := tc.cfg.GetEnvVar("PMEMOBJ_CONF") + test.AssertTrue(t, err == nil, "Missing env var PMEMOBJ_CONF") + test.AssertEqual(t, tc.expPMEMOBJ_CONF, sds_at_create, + "Invalid PMEMOBJ_CONF") + } + if tc.expABTthreadStackSize >= 0 { + stackSizeStr, err := tc.cfg.GetEnvVar("ABT_THREAD_STACKSIZE") + test.AssertTrue(t, err == nil, "Missing env var ABT_THREAD_STACKSIZE") + stackSizeVal, err := strconv.Atoi(stackSizeStr) + test.AssertTrue(t, err == nil, "Invalid env var ABT_THREAD_STACKSIZE") + test.AssertEqual(t, tc.expABTthreadStackSize, stackSizeVal, + "Invalid ABT_THREAD_STACKSIZE value") + } + }) + } +} diff --git a/src/control/server/server.go b/src/control/server/server.go index 4ac8ce5e04b..c9232dd1725 100644 --- a/src/control/server/server.go +++ b/src/control/server/server.go @@ -103,6 +103,12 @@ func processConfig(log logging.Logger, cfg *config.Server, fis *hardware.FabricI return err } + for _, ec := range cfg.Engines { + if err := ec.UpdatePMDKEnvars(); err != nil { + return err + } + } + return nil } diff --git a/src/mgmt/srv_target.c b/src/mgmt/srv_target.c index b03215d08aa..e1d6ee79bce 100644 --- a/src/mgmt/srv_target.c +++ b/src/mgmt/srv_target.c @@ -1180,7 +1180,7 @@ ds_mgmt_hdlr_tgt_create(crt_rpc_t *tc_req) /* A zero size accommodates the existing file */ vpa.vpa_scm_size = 0; vpa.vpa_nvme_size = tc_in->tc_nvme_size / dss_tgt_nr; - rc = dss_thread_collective(tgt_vos_create_one, &vpa, 0); + rc = dss_thread_collective(tgt_vos_create_one, &vpa, DSS_ULT_DEEP_STACK); if (rc) { D_ERROR(DF_UUID": thread collective tgt_vos_create_one failed, "DF_RC"\n", DP_UUID(tc_in->tc_pool_uuid), DP_RC(rc)); diff --git a/utils/build.config b/utils/build.config index 3642a730c13..4d770e6c924 100644 --- a/utils/build.config +++ b/utils/build.config @@ -4,7 +4,7 @@ component=daos [commit_versions] argobots=v1.1 fuse=fuse-3.16.2 -pmdk=2.0.0 +pmdk=2.1.0 isal=v2.30.0 isal_crypto=v2.23.0 spdk=v22.01.2 @@ -30,3 +30,4 @@ spdk=https://github.com/spdk/spdk/commit/b0aba3fcd5aceceea530a702922153bc7566497 ofi=https://github.com/ofiwg/libfabric/commit/d827c6484cc5bf67dfbe395890e258860c3f0979.diff mercury=https://raw.githubusercontent.com/daos-stack/mercury/f3dc286fb40ec1a3a38a2e17c45497bc2aa6290d/na_ucx.patch fuse=https://github.com/libfuse/libfuse/commit/c9905341ea34ff9acbc11b3c53ba8bcea35eeed8.diff +pmdk=https://github.com/pmem/pmdk/commit/2abe15ac0b4eed894b6768cd82a3b0a7c4336284.diff diff --git a/utils/rpms/daos.rpmlintrc b/utils/rpms/daos.rpmlintrc index aff4db9b7e6..b1553ca5141 100644 --- a/utils/rpms/daos.rpmlintrc +++ b/utils/rpms/daos.rpmlintrc @@ -47,10 +47,10 @@ addFilter("E: static-library-without-debuginfo \/usr\/lib64\/lib(dfuse|ioil)\.a" addFilter("W: no-soname \/usr\/lib64\/lib(ds3|daos_(common|cmd_hdlrs|self_test|tests|serialize|common_pmem)|dfs|dfuse|duns|ioil|pil4dfs|dpar(|_mpi)).so") # Tests rpm needs to be able to build daos from source so pulls in build deps and is expected. -addFilter("daos-client-tests.x86_64: E: devel-dependency protobuf-c-devel") +addFilter("daos-client-tests\.x86_64: E: devel-dependency protobuf-c-devel") # a functional test builds daos from source, so it needs the various *-devel packages for daos' build dependencies. -addFilter("daos-client-tests.x86_64: E: devel-dependency capstone-devel") -addFilter("daos-client-tests.x86_64: E: explicit-lib-dependency libcapstone-devel") -addFilter("daos-client-tests.x86_64: E: devel-dependency libcapstone-devel") -addFilter("daos-client-tests.x86_64: E: devel-dependency fuse3-devel") +addFilter("daos-client-tests\.x86_64: E: devel-dependency capstone-devel") +addFilter("daos-client-tests\.x86_64: E: explicit-lib-dependency lib(capstone|ndctl)-devel") +addFilter("daos-client-tests\.x86_64: E: devel-dependency libcapstone-devel") +addFilter("daos-client-tests\.x86_64: E: devel-dependency fuse3-devel") diff --git a/utils/rpms/daos.spec b/utils/rpms/daos.spec index 90ef0d5f413..e58af4e6d66 100644 --- a/utils/rpms/daos.spec +++ b/utils/rpms/daos.spec @@ -15,7 +15,7 @@ Name: daos Version: 2.6.1 -Release: 3%{?relval}%{?dist} +Release: 4%{?relval}%{?dist} Summary: DAOS Storage Engine License: BSD-2-Clause-Patent @@ -49,7 +49,7 @@ BuildRequires: libabt-devel >= 1.0rc1 BuildRequires: libjson-c-devel BuildRequires: boost-devel %endif -BuildRequires: libpmemobj-devel >= 2.0.0 +BuildRequires: libpmemobj-devel >= 2.1.0 %if (0%{?rhel} >= 8) BuildRequires: fuse3-devel >= 3 %else @@ -147,11 +147,11 @@ Requires: ndctl # needed to set PMem configuration goals in BIOS through control-plane %if (0%{?suse_version} >= 1500) Requires: ipmctl >= 03.00.00.0423 -Requires: libpmemobj1 >= 2.0.0-1.suse1500 +Requires: libpmemobj1 >= 2.1.0-1.suse1500 Requires: libfabric1 >= %{libfabric_version} %else Requires: ipmctl >= 03.00.00.0468 -Requires: libpmemobj >= 2.0.0-1%{?dist} +Requires: libpmemobj >= 2.1.0-1%{?dist} %endif Requires: libfabric >= %{libfabric_version} Requires: mercury >= %{mercury_version} @@ -232,6 +232,13 @@ Requires: fuse3-devel >= 3 Requires: fuse3-devel >= 3.4.2 %endif Requires: pciutils-devel +%if (0%{?suse_version} > 0) +Requires: libndctl-devel +%endif +%if (0%{?rhel} >= 8) +Requires: ndctl-devel +Requires: daxctl-devel +%endif %description client-tests This is the package needed to run the DAOS test suite (client tests) @@ -594,6 +601,20 @@ getent passwd daos_agent >/dev/null || useradd -s /sbin/nologin -r -g daos_agent # No files in a shim package %changelog + +* Wed Oct 02 2024 Tomasz Gromadzki 2.6.1-4 +- Add support of the PMDK package 2.1.0 with NDCTL enabled. + * Increase the default ULT stack size to 20KiB if the engine uses + the DCPM storage class. + * Prevent using the RAM storage class (simulated PMem) when + the shutdown state (SDS) is active. + * Automatically disable SDS for the RAM storage class on engine startup. + * Force explicitly setting the PMEMOBJ_CONF='sds.at_create=0' + environment variable to deactivate SDS for the DAOS tools + (ddb, daos_perf, vos_perf, etc.) when used WITHOUT DCPM. + Otherwise, a user is supposed to be stopped by an error + like: "Unsafe shutdown count is not supported for this source". + * Tue Oct 01 2024 Phillip Henderson 2.6.1-3 - Third release candidate for 2.6.1 diff --git a/utils/run_utest.py b/utils/run_utest.py index 2068360ab7d..d067deb3ef7 100755 --- a/utils/run_utest.py +++ b/utils/run_utest.py @@ -441,6 +441,7 @@ def run(self, base, memcheck, sudo): cmd = new_cmd self.last = cmd + self.env.update({"PMEMOBJ_CONF": "sds.at_create=0"}) if self.suite.gha: retval = run_cmd(cmd, env=self.env) else: diff --git a/utils/scripts/install-el8.sh b/utils/scripts/install-el8.sh index 81a044bfddb..472f88c9925 100755 --- a/utils/scripts/install-el8.sh +++ b/utils/scripts/install-el8.sh @@ -20,6 +20,7 @@ dnf --nodocs install \ clang-tools-extra \ cmake \ CUnit-devel \ + daxctl-devel \ diffutils \ e2fsprogs \ file \ @@ -48,6 +49,7 @@ dnf --nodocs install \ lz4-devel \ make \ ndctl \ + ndctl-devel \ numactl \ numactl-devel \ openmpi-devel \ diff --git a/utils/scripts/install-el9.sh b/utils/scripts/install-el9.sh index 9ddd8c257d6..092de8eba0f 100755 --- a/utils/scripts/install-el9.sh +++ b/utils/scripts/install-el9.sh @@ -18,6 +18,7 @@ dnf --nodocs install \ clang-tools-extra \ cmake \ CUnit-devel \ + daxctl-devel \ diffutils \ e2fsprogs \ file \ @@ -47,6 +48,7 @@ dnf --nodocs install \ lz4-devel \ make \ ndctl \ + ndctl-devel \ numactl \ numactl-devel \ openmpi-devel \ diff --git a/utils/scripts/install-leap15.sh b/utils/scripts/install-leap15.sh index fc9826ce508..0eb8ef44fee 100755 --- a/utils/scripts/install-leap15.sh +++ b/utils/scripts/install-leap15.sh @@ -38,6 +38,7 @@ dnf --nodocs install \ libjson-c-devel \ libltdl7 \ liblz4-devel \ + libndctl-devel \ libnuma-devel \ libopenssl-devel \ libprotobuf-c-devel \ diff --git a/utils/scripts/install-ubuntu.sh b/utils/scripts/install-ubuntu.sh index ec21c92f474..a36641d5f10 100755 --- a/utils/scripts/install-ubuntu.sh +++ b/utils/scripts/install-ubuntu.sh @@ -29,11 +29,13 @@ apt-get install \ libcapstone-dev \ libcmocka-dev \ libcunit1-dev \ + libdaxctl-dev \ libfuse3-dev \ libhwloc-dev \ libibverbs-dev \ libjson-c-dev \ liblz4-dev \ + libndctl-dev \ libnuma-dev \ libopenmpi-dev \ libpci-dev \