mirror of
https://github.com/seaweedfs/seaweedfs.git
synced 2026-10-25 22:40:44 +01:00
* master: release the post-mint allocation hold after a quiet pulse DeferAllocation armed a fixed warmup window whenever the leader minted a fresh topology id, so the first write on a brand-new cluster blocked for the whole window even though no prior state could exist. The window still has to cover a rebuilt master's veteran servers, which report on their first post-reconnect heartbeat. Track the last heartbeat that could carry prior cluster state — a server joining, held volumes or shards, a nonzero id bound, or a foreign topology id — and lift the hold one pulse after it goes quiet, capped by the original window. * master: make the post-mint allocation hold configurable master.volume_growth.allocation_deferral overrides the warmup window a leader holds volume id allocation for after minting a fresh topology id. Unset keeps the existing window; "0s" disables the hold for setups that know the cluster is fresh (test harnesses, single-node labs); any other duration replaces the cap while the quiet-pulse early release still applies. * master: re-check the allocation deadline while it is held NextVolumeId slept for the whole computed delay, so a heartbeat landing mid-sleep that pushed the quiet deadline out was ignored — the pending allocation could still run ahead of a straggler's report. Wait in short slices, re-evaluating the deadline and the growth freeze each round. * master: count only ids above the issued bound as prior-state evidence Heartbeat echoes of volumes and shards this master allocated during the hold refreshed the quiet window, so each growth allocation re-extended the deferral until the hard cap. Evidence now requires an id beyond the bound this leader has issued, a higher reported bound, or a foreign topology id; a joining server (dn == nil) still counts once. * master: reject an unparseable allocation_deferral instead of disabling the hold Generated with [Devin](https://devin.ai) Co-Authored-By: Devin <158243242+devin-ai-integration[bot]@users.noreply.github.com> * master: do not count a skipped heartbeat as a joining server Generated with [Devin](https://devin.ai) Co-Authored-By: Devin <158243242+devin-ai-integration[bot]@users.noreply.github.com> * test: assert the allocation hold extends past the original quiet deadline Generated with [Devin](https://devin.ai) Co-Authored-By: Devin <158243242+devin-ai-integration[bot]@users.noreply.github.com> * master: release the post-mint hold after two quiet pulses One pulse proved short for a veteran that reconnects on a staggered restart: with only five seconds of quiet, allocation could resume and reuse ids before a slower server landed its first heartbeat. Two pulses still halves the fresh-cluster first-write stall versus the full warmup cap, and known-fresh setups keep the "0s" override. * master: pick once more when assign times out as growth concludes The pick loop's final attempt can predate the growth it triggered concluding: growth registers its volumes in the layout before clearing the pending flag, so a timeout landing on that boundary used to shed a hard 406 over volumes that had just arrived. Pick once more after the loop in both the http and grpc assign paths before deciding how to shed. --------- Co-authored-by: Devin <158243242+devin-ai-integration[bot]@users.noreply.github.com>
79 lines
3.5 KiB
TOML
79 lines
3.5 KiB
TOML
# Put this file to one of the location, with descending priority
|
|
# ./master.toml
|
|
# $HOME/.seaweedfs/master.toml
|
|
# /etc/seaweedfs/master.toml
|
|
# this file is read by master
|
|
|
|
[master]
|
|
# cap on writable volumes per volume layout (collection + replica placement +
|
|
# ttl + disk type) that write assignments spread over; fullest picked first.
|
|
# 0 = no limit
|
|
max_writable_volumes_per_layout = 0
|
|
|
|
|
|
[master.maintenance]
|
|
# periodically run these scripts are the same as running them from 'weed shell'
|
|
# Scripts are skipped while an admin server is connected.
|
|
scripts = """{{DEFAULT_MAINTENANCE_SCRIPTS}}"""
|
|
sleep_minutes = 17 # sleep minutes between each script execution
|
|
|
|
|
|
# vacuum reclaims deleted space by compacting volumes
|
|
[master.vacuum]
|
|
# concurrent volume compactions per volume server; overrides the deprecated
|
|
# -maxParallelVacuumPerServer flag (default 1) when set; 0 = no limit
|
|
# max_parallel_per_server = 1
|
|
# concurrent volume copies compacting within one rack; 0 = no limit
|
|
max_parallel_per_rack = 0
|
|
|
|
|
|
[master.sequencer]
|
|
type = "raft" # Choose [raft|snowflake] type for storing the file id sequence
|
|
# when sequencer.type = snowflake, the snowflake id must be different from other masters
|
|
sequencer_snowflake_id = 0 # any number between 1~1023
|
|
|
|
|
|
# configurations for tiered cloud storage
|
|
# old volumes are transparently moved to cloud for cost efficiency
|
|
[storage.backend]
|
|
[storage.backend.s3.default]
|
|
enabled = false
|
|
aws_access_key_id = "" # if empty, loads from the shared credentials file (~/.aws/credentials).
|
|
aws_secret_access_key = "" # if empty, loads from the shared credentials file (~/.aws/credentials).
|
|
region = "us-east-2"
|
|
bucket = "your_bucket_name" # an existing bucket
|
|
endpoint = ""
|
|
storage_class = "STANDARD_IA"
|
|
# optional HTTP client tuning for S3-compatible services:
|
|
# disable_http2 = false # true keeps the client on HTTP/1.1, one connection per concurrent request
|
|
# max_connections = 0 # cap on connections to the endpoint, 0 = no cap
|
|
# idle_connection_timeout_seconds = 0 # close idle connections sooner, 0 = Go default (90s)
|
|
|
|
# create this number of logical volumes if no more writable volumes
|
|
# count_x means how many copies of data.
|
|
# e.g.:
|
|
# 000 has only one copy, copy_1
|
|
# 010 and 001 has two copies, copy_2
|
|
# 011 has only 3 copies, copy_3
|
|
[master.volume_growth]
|
|
copy_1 = 7 # create 1 x 7 = 7 actual volumes
|
|
copy_2 = 6 # create 2 x 6 = 12 actual volumes
|
|
copy_3 = 3 # create 3 x 3 = 9 actual volumes
|
|
copy_other = 1 # create n x 1 = n actual volumes
|
|
threshold = 0.9 # create threshold
|
|
reservation_timeout = "5m"# capacity reservation timeout before unreleased reservations expire
|
|
disable = false # disables volume growth if true
|
|
# allocation_deferral = "15s" # hold the first volume id allocation after a fresh
|
|
# topology id is minted, giving a rebuilt master's
|
|
# veteran volume servers time to report. The hold
|
|
# lifts early once heartbeats stay clean for two
|
|
# pulses. "0s" disables it (e.g. test setups).
|
|
|
|
# configuration flags for replication
|
|
[master.replication]
|
|
# any replication counts should be considered minimums. If you specify 010 and
|
|
# have 3 different racks, that's still considered writable. Writes will still
|
|
# try to replicate to all available volumes. You should only use this option
|
|
# if you are doing your own replication or periodic sync of volumes.
|
|
treat_replication_as_minimums = false
|