Skip to content

DAOS-11169 control: decouple storage format from engine start - #19255

Open
mjmac wants to merge 6 commits into
masterfrom
mjmac/DAOS-11169-explicit-startup
Open

mjmac wants to merge 6 commits into
masterfrom
mjmac/DAOS-11169-explicit-startup

Conversation

@mjmac

@mjmac mjmac commented Oct 12, 2026 •

Copy link
Copy Markdown
Contributor

Rework the default system bringup flow to decouple storage format
from engine startup. This separation enables easier automation by
blocking until each phase of deployment has finished with a clear
success or failure status.

With this commit, the following behavior is default:

  • dmg storage format -l [hostlist] does not start engines
  • dmg system initialize -l [hostlist] starts engines and reports
    success or failure before exiting

The pre-3.0 storage format behavior may be enabled via the --start
flag. This commit also modifies the "Stopped" rank state such that
it may only be entered via dmg system stop, and a stopped rank
remains stopped until the admin starts it again.

Features: control server pool
Signed-off-by: Michael MacDonald mjmac@vectorsolutionsgroup.com

@github-actions

github-actions Bot commented Oct 12, 2026 •

Copy link
Copy Markdown

Ticket title is 'Improve DAOS format/startup workflow with explicit system start'
Status is 'In Progress'
Labels: 'usability'
https://daosio.atlassian.net/browse/DAOS-11169

@mjmac
mjmac force-pushed the mjmac/DAOS-11169-explicit-startup branch from 8623f37 to dbee278 Compare October 12, 2026 21:40
@daosbuild3

Copy link
Copy Markdown
Collaborator

@daosbuild3

Copy link
Copy Markdown
Collaborator

@mjmac
mjmac force-pushed the mjmac/DAOS-11169-explicit-startup branch from dbee278 to 51c54c6 Compare October 13, 2026 00:21
@mjmac mjmac changed the title mjmac/DAOS 11169 explicit startup DAOS-11169 control: hold engines for an explicit system start Oct 13, 2026
@mjmac
mjmac force-pushed the mjmac/DAOS-11169-explicit-startup branch 2 times, most recently from c5ffb49 to 0971682 Compare October 13, 2026 01:59
@daosbuild3

Copy link
Copy Markdown
Collaborator

Test stage Test RPMs on Leap 15 completed with status FAILURE. https://jenkins-3.daos.hpc.amslabs.hpecorp.net/job/daos-stack/job/daos/job/PR-19255/4/display/redirect

@mjmac mjmac changed the title DAOS-11169 control: hold engines for an explicit system start DAOS-11169 control: decouple format from engine start Oct 13, 2026
@mjmac mjmac changed the title DAOS-11169 control: decouple format from engine start DAOS-11169 control: decouple storage format from engine start Oct 13, 2026
@mjmac
mjmac force-pushed the mjmac/DAOS-11169-explicit-startup branch from 0971682 to 3420d29 Compare October 13, 2026 15:45
@daosbuild3

Copy link
Copy Markdown
Collaborator

@daosbuild3

Copy link
Copy Markdown
Collaborator

@daosbuild3

Copy link
Copy Markdown
Collaborator

Test stage Functional Cluster Box Medium MD on SSD completed with status FAILURE. https://jenkins-3.daos.hpc.amslabs.hpecorp.net//job/daos-stack/job/daos/view/change-requests/job/PR-19255/6/execution/node/1721/log

@daosbuild3

Copy link
Copy Markdown
Collaborator

Test stage Functional Hardware Large MD on SSD completed with status FAILURE. https://jenkins-3.daos.hpc.amslabs.hpecorp.net//job/daos-stack/job/daos/view/change-requests/job/PR-19255/6/execution/node/1860/log

@daosbuild3

Copy link
Copy Markdown
Collaborator

Test stage Functional Hardware Medium MD on SSD completed with status FAILURE. https://jenkins-3.daos.hpc.amslabs.hpecorp.net//job/daos-stack/job/daos/view/change-requests/job/PR-19255/6/execution/node/1917/log

@mjmac
mjmac force-pushed the mjmac/DAOS-11169-explicit-startup branch from 3420d29 to 8ec4ada Compare October 15, 2026 16:45
@daosbuild3

Copy link
Copy Markdown
Collaborator

Test stage Functional Hardware Medium MD on SSD completed with status FAILURE. https://jenkins-3.daos.hpc.amslabs.hpecorp.net//job/daos-stack/job/daos/view/change-requests/job/PR-19255/7/execution/node/1852/log

@mjmac
mjmac force-pushed the mjmac/DAOS-11169-explicit-startup branch from 8ec4ada to 4ef6d2f Compare October 17, 2026 16:54
@daosbuild3

Copy link
Copy Markdown
Collaborator

@daosbuild3

Copy link
Copy Markdown
Collaborator

@mjmac
mjmac force-pushed the mjmac/DAOS-11169-explicit-startup branch from 4ef6d2f to d459450 Compare October 17, 2026 19:04
@daosbuild3

Copy link
Copy Markdown
Collaborator

@daosbuild3

Copy link
Copy Markdown
Collaborator

Test stage Functional Hardware Medium MD on SSD completed with status FAILURE. https://jenkins-3.daos.hpc.amslabs.hpecorp.net//job/daos-stack/job/daos/view/change-requests/job/PR-19255/9/execution/node/1864/log

mjmac added 4 commits October 27, 2026 11:59
Engines will hold after format until released by dmg system initialize
or extend. The server needs an RPC to release held engines, and the
management service needs one that tells a rank whether to start.

Signed-off-by: Michael MacDonald <mjmac@vectorsolutionsgroup.com>
Engines launch themselves after format, so a reboot restarts ranks the
admin stopped on purpose and a fresh system starts before anyone asked.
Hold them until dmg system initialize or extend releases them, or until
the management service says the rank should restart; a dmg-stopped rank
stays Stopped, out of the group map, until dmg system start.

Signed-off-by: Michael MacDonald <mjmac@vectorsolutionsgroup.com>
Engines no longer launch themselves after format, so the harness, NLT
and the tests that format storage must start them explicitly, and
servers added to a running system join through dmg system extend.
New tests cover the behaviour itself and the legacy configuration.

Signed-off-by: Michael MacDonald <mjmac@vectorsolutionsgroup.com>
Features: control server pool
Signed-off-by: Michael MacDonald <mjmac@vectorsolutionsgroup.com>
@mjmac
mjmac force-pushed the mjmac/DAOS-11169-explicit-startup branch from d459450 to 90e6366 Compare October 27, 2026 16:18
@mjmac
mjmac marked this pull request as ready for review October 27, 2026 19:58
@mjmac
mjmac requested review from a team as code owners October 27, 2026 19:58
@mjmac
mjmac requested review from kjacque and tanabarr and removed request for a team October 27, 2026 19:58
@daosbuild3

Copy link
Copy Markdown
Collaborator

Test stage Functional Hardware Large MD on SSD completed with status FAILURE. https://jenkins-3.daos.hpc.amslabs.hpecorp.net//job/daos-stack/job/daos/view/change-requests/job/PR-19255/10/execution/node/1967/log

@daosbuild3

Copy link
Copy Markdown
Collaborator

Test stage Functional Hardware Medium MD on SSD completed with status UNSTABLE. https://jenkins-3.daos.hpc.amslabs.hpecorp.net/job/daos-stack/job/daos//view/change-requests/job/PR-19255/10/testReport/

@mjmac

mjmac commented Oct 29, 2026

Copy link
Copy Markdown
Contributor Author

Known failures:

  • DAOS-15518 (dmg network scan/ucx)
  • DAOS-18951 (container destroy slowdown hits timeout)

@tanabarr

tanabarr commented Nov 3, 2026

Copy link
Copy Markdown
Contributor

oof this is a huge PR

@tanabarr tanabarr left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

first round of review comments

// SystemExtendReq supplies system extend parameters.
message SystemExtendReq
{
string sys = 1; // DAOS system name

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

nit: shares the same message fields as system init, embed shared message type

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

IMO this is fine as-is. Trying to combine things like that is a false economy that is undermined over time as things evolve and diverge, and we wind up with frankenmessages that have different fields used depending on the RPC.

Comment thread src/proto/mgmt/svc.proto
uint32 daos_version = 7; // DAOS version that system supported.
}

// EnginePreflightReq asks what a server needs to know before it launches engines.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

nit: clarity of comment could be improved, currently the check is just whether to start and why if not

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The name of the method reflects the longer-term intent. You're right that currently it only checks to see if an engine should start, but the plan is to leverage this to rework the CR mode switch logic so that we don't have the weird start/join/restart/join dance that can lead to mode bugs (e.g. https://daosio.atlassian.net/browse/DAOS-18622).

Comment thread src/proto/mgmt/mgmt.proto Resolved
Comment thread src/control/server/harness.go Outdated
continue
}
if rank, _ := ei.GetRank(); !rank.Equals(e.Rank) {
h.log.Noticef("instance %d: preflight result for rank %s ignored; now rank %s and asking again",

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

When would this rank update happen? does this case cover the initial assignment or later change? does the "asking again" statement refer to the next time to the next time runPreflight() gets called on the timer? Presumably the next time it's run the request gets sent with the new updated rank in the request?

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The log message should be fixed. What this guards against is a race where a preflight request is made for rank X, and then the engine instance is erased/reformatted before the response comes back. A new preflight request will be made for the reformatted instance, so we can ignore this stale response.

Returns:
tuple: the host as a NodeSet and its rank
"""
host = NodeSet(self.server_managers[0].hosts.difference(self.mgmt_svc_replicas)[-1])

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

If you wanted to sprinkle some randomness

Suggested change
host = NodeSet(self.server_managers[0].hosts.difference(self.mgmt_svc_replicas)[-1])
host = NodeSet(
self.random.choice(self.server_managers[0].hosts.difference(self.mgmt_svc_replicas)))

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Nice, added that in.

Comment on lines +67 to +74
Args:
host (NodeSet): host to check
seconds (int): seconds to keep checking
"""
for _ in range(seconds):
if self.engine_running(host):
self.fail(f"An engine started on {host}")
time.sleep(1)

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Nit - The run_remote / clush can sometimes take ~0.1 seconds or more depending on the system. So technically this is trying up to seconds TIMES, not necessarily 30 seconds. But not a big deal

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yeah, good point. I'll change it to have a proper deadline if I need to make other changes.

if self.server_managers[0].check_rank_state([rank], [state], checks):
self.fail(f"Rank {rank} did not reach the {state} state")

def test_initialize(self):

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

These test_* names are global across the framework, so I'd recommend putting some context in there. Maybe one of these?

test_dmg_system_initialize
test_dmg_system_init

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Fixed, thanks.

Comment on lines +115 to +116
self.log_step('Scenario 2 - Kill a rank and verify it is not excluded')
self.server_managers[0].kill_ranks(ranks_x)

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Why change the stop to a kill? Are we potentially missing test coverage?

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This PR changes the Stopped state such that it can only be entered or exited by explicit admin action, and it's persistent. Some of the tests relied on stopped ranks eventually going into the Excluded state, but Stopped->Excluded is an invalid transition now, deliberately. In order for a rank to be Excluded, it has to have exited unexpectedly and been marked dead by SWIM.

telemetry_before = self.collect_telemetry(rank_count=rank_count)

# 2. Stop a rank.
# 2. Kill a rank.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Similar here. Why change the stop to a kill?

mjmac added 2 commits November 7, 2026 08:51
* Fix test names to reflect test_dmg_[cmd] idiom
* Randomize the server used for testing engine restarts
* Improve log message for stale preflight response

Features: control server pool
Signed-off-by: Michael MacDonald <mjmac@vectorsolutionsgroup.com>

This branch has not been deployed

No deployments
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Development

Successfully merging this pull request may close these issues.

4 participants