Skip to content

seaweedfs: tenant replicationFactor never reaches the master #4241

Open

Description

replicationFactor on a SeaweedFS tenant never reaches the master. The extra chart writes it to one key and the master reads another.

packages/extra/seaweedfs/templates/seaweedfs.yaml:232 (Simple) and :234 (MultiZone) emit master.defaultReplicaPlacement. The master is rendered from master.defaultReplication instead, at packages/system/seaweedfs/charts/seaweedfs/templates/master/master-statefulset.yaml:134:

-defaultReplication={{ .Values.master.defaultReplication }} \

Nothing in the chart reads master.defaultReplicaPlacement, so the master always starts with the defaultReplication pinned in packages/system/seaweedfs/values.yaml, currently 001, whatever the tenant set.

The filer side is fine. seaweedfs.yaml:327,329 emit filer.defaultReplicaPlacement and charts/seaweedfs/templates/filer/filer-statefulset.yaml:172 reads that key. Filer and master disagree as soon as replicationFactor is not 2.

Invisible on defaults, because replicationFactor: 2 renders 001, which is what the system chart pins anyway.

Effect: replicationFactor: 1 still gets two copies of every volume, and each logical volume still costs a slot on both volume servers. On a small install that halves how many buckets fit before the master starts answering Not enough data nodes found.

Not patching it yet, needs a call on whether to rename the emitted key or make the master template accept both.

Activity

  1. added
    kind/bugCategorizes issue or PR as related to a bug
    area/storageIssues or PRs related to storage (linstor, seaweedfs, bucket, velero, harbor)
    on Sep 14, 2026
  2. lexfrei commented on Sep 15, 2026

    @lexfrei
    ContributorAuthor

    The same dead key has a second consequence on MultiZone, with a different radius, which is worth recording here rather than separately.

    packages/extra/seaweedfs/templates/seaweedfs.yaml computes the cross-datacenter placement for MultiZone as "{{ sub .Values.replicationFactor 1 }}00" and writes it to master.defaultReplicaPlacement, which the master never reads. What it does read is master.defaultReplication, and that is "001" from the data-plane chart's own values (packages/system/seaweedfs/values.yaml:44 on main as of today, though the key is the durable anchor rather than the line). So the master's default stays "001" regardless of topology, and an assign that arrives without an explicit replication is placed within one rack instead of across zones. A weed shell grow and any direct client assign take that path.

    Ordinary S3 traffic is unaffected, and that is why this stays invisible: the filer supplies a placement on every request from filer.defaultReplicaPlacement, which is a live key and does follow replicationFactor. So the zone spread a MultiZone instance is configured for holds for everything that goes through the filer, and silently does not for anything that does not.

  3. lexfrei commented on Sep 16, 2026

    @lexfrei
    ContributorAuthor

    The filer block further down emits the same defaultReplicaPlacement key, and packages/system/seaweedfs/charts/seaweedfs/templates/filer/filer-statefulset.yaml:172 does read it (the global.seaweedfs.enableReplication branch above it renders the false arm by default), so replicationFactor is not dropped everywhere: it reaches the filer, which sends it on every assign, and the master parses the filer's string at the same call that would have parsed its own default. That call drops a fourth character without an error, so anything above replicationFactor: 10 arrives as a truncated placement and nothing reports it, which is #4294. Whichever way this one is fixed, renaming the emitted key or teaching the master template to accept both, it opens a second path into that parser, so a bound on the field belongs with the fix.

  4. added
    triage/acceptedIndicates an issue is ready to be actively worked on
    priority/important-longtermImportant over the long term, but may not be staffed and/or may need multiple releases to complete
    and removed
    triage/needs-triageIndicates an issue needs triage by a maintainer
    on Sep 23, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    area/storageIssues or PRs related to storage (linstor, seaweedfs, bucket, velero, harbor)kind/bugCategorizes issue or PR as related to a bugpriority/important-longtermImportant over the long term, but may not be staffed and/or may need multiple releases to completetriage/acceptedIndicates an issue is ready to be actively worked on

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions