Update objectindex/objectreadproxy flag_config and CMS log IDs for new SLS config schema

XMLWordPrintableJSON

    • Type: Task
    • Resolution: Fixed
    • Priority: Major - P3
    • 9.1.0-rc0
    • Affects Version/s: None
    • Component/s: Replication
    • None
    • RSSD
    • Major Change
    • None
    • None
    • None
    • None
    • None
    • None
    • None

      Generated by the sls-pin-bump skill, operated by @awang01810.

      The SLS pin bump in SERVER-132939 (PR #60406, pin 9ca39015 -> 665e99c1, 466 SLS commits) turns every disagg jstest suite red at fixture setup. Three independent config-drift breaks are involved. The gate only ever surfaced the first, because fixture setup dies there and never reaches the rest.

      1. objectindexd and objectreadproxyd require a new flag_config section

      ObjectIndexServerConfig and ObjectReadProxyServerConfig both gained a required top-level flag_config field, sibling to server_config and service_config. Both structs are #[serde(deny_unknown_fields)].

      The reason these two daemons broke and logd / paged / pagematd / cms did not is the load path. config::load_config_with_optional_defaults(default, files) merges YAML over figment Serialized::defaults. Daemons that pass Some(default) absorb newly-added fields silently. objectindexd and objectreadproxyd pass None, so every field lacking #[serde(default)] must be present in the YAML.

      Observed failure:

      objectindexd-1 | Error: Error { kind: MissingField("flag_config"), ... }
      objectindexd-1 exited with code 1
      testdriver-1   | WARN TCP client connection failed reason=dns_nxdomain
                       remote_addr="http://objectindexd:30003/"
      RuntimeError: Timed out after 300s waiting for SLS to be ready
      

      The DNS error is downstream of the container exiting on config parse, not a separate problem.

      objectreadproxyd depends_on: objectindexd, so it would have failed on the next gate run after fixing objectindexd alone.

      Neither service mounted the flags-state file, so both the config block and the mount are needed. TargetingContext carries #[validate(length(min = 1))] on cell, environment and pod, so the values must be non-empty. Neither daemon is cell-scoped; SLS's own deployment configs target them at cell global.

      2. CMS log ID 9999 is no longer recognized as a CMS log

      SLS-9687 deleted CellMetadataLogConfig::get_current_cell_log_id() and collapsed the page materializer's CMS-log detection from log_id == self.cms_log_id || log_id.is_cms() to a bare log_id.is_cms().

      LogId::is_cms() is a bit test: partition value 0x6 in the 4-bit field at bits 48..51. 9999 >> 48 == 0, so it fails. The page materializer would treat the CMS log as an ordinary data log: PSE lookup for it, PHYLOG seal machinery on an oplog-only log, and no materialized-offset filtering.

      SLS changed 9999 to LogId::WELL_KNOWN_CMS (1700000000000000) across its own compose environments in the same commit, using per-cell offsets for multi-cell setups.

      Scope

      Two mongo-maintained config sites, matching the shape SLS uses in its own multi-cell environments:

      • buildscripts/modules/atlas/sls-multicell-docker-compose.yml - the multicell fixture. Adds flag_config and the flags_state mount for both services, moves the CMS log IDs in cms_config and crs_config, and drops the now-deprecated-and-ignored pagematd_config.cell_metadata block, which hardcoded the stale ID.
      • src/mongo/db/modules/atlas/jstests/disagg_storage/libs/slstest.js - the single-cell SLSBackupRestoreTest harness, which has its own objectindex/objectreadproxy service configs and its own CMS log ID. This is why disagg_backup_restore_jscore_passthrough is among the failing suites.

      Plus the four jstests that pass an explicit CMS logId to startCMS and so override the default: mongod_waits_for_cms.js, mongod_reconnects_to_new_cms_for_pse_info.js, libs/sls_minimal_three_cell_test.js and log_segment_missing.js.

      Landing

      The old pin requires the old config shape, so this change cannot land separately from the pin bump. It goes into the same squash as SERVER-132939, the same way SERVER-131421 landed with SERVER-131334's bump.

      Note that buildscripts/modules/atlas/sls-docker-compose.yml also carries stale CMS log IDs but is referenced by nothing in the repo - the fixture defaults to the multicell file and no suite overrides it. Left alone here; worth a separate cleanup.

            Assignee:
            Andrew Wang
            Reporter:
            Andrew Wang
            Votes:
            0 Vote for this issue
            Watchers:
            2 Start watching this issue

              Created:
              Updated:
              Resolved: