Configuration Reference

This page describes the configuration layout of the current main branch. It is derived from the actual config structs in crates/common/curvine-config/src/*.rs and the sample file etc/curvine-cluster.toml.

conf/curvine-cluster.toml is the runtime source of truth. This page is a map of the sections and high-signal options; for every field, read the corresponding struct in crates/common/curvine-config/src/.

Config Sources

Curvine commonly uses these inputs together:

  • conf/curvine-cluster.toml: main cluster config
  • conf/curvine-env.sh: shell-side environment setup for scripts under bin/
  • conf/curvine-site.xml: Hadoop / Java client config

Important environment overrides:

VariablePurpose
CURVINE_CONF_FILEOverride the path to curvine-cluster.toml
CURVINE_MASTER_HOSTNAMEOverride the effective Master hostname
CURVINE_MDS_HOSTNAMEOverride the effective MDS hostname
CURVINE_WORKER_HOSTNAMEOverride the effective Worker hostname
CURVINE_CLIENT_HOSTNAMEOverride the client hostname used for locality checks
CURVINE_TRANSFER_HOSTNAMEOverride the effective Transfer service hostname

How the config is loaded

The load pipeline is:

file (TOML) -> environment allowlist -> deserialize -> normalize whitespace
            -> validate -> discovery.init -> resolve client.master_addrs
  • Unknown keys are reported as warnings by validation::warn_unknown_keys; they are not rejected. A misspelled key silently keeps its default value, so always check the startup warnings.
  • client.master_addrs may be omitted. If it is empty, Curvine derives it from journal.journal_addrs using master.rpc_port; if journal_addrs is also empty, it uses master.hostname:master.rpc_port.
  • The standalone Transfer service uses a reduced loader (ClusterConf::from_transfer) that validates only the client and transfer sections.

net_interface

When net_interface is non-empty (for example "eth0"), Curvine resolves the first IPv4 address of that interface and applies it to the master, mds, journal, worker, client, and transfer hostnames. When it is set, the CURVINE_*_HOSTNAME environment variables are ignored.

net_interface only fills in this node's own hostname. Cluster membership lists (journal.journal_addrs and client.master_addrs) must still be written explicitly, and each node's entry must use the exact IPv4 that its interface resolves to. Otherwise the node cannot locate itself in the Raft group, and startup fails with a clear error.

Top-Level Layout

The current ClusterConf contains these sections:

SectionPurpose
top-level flagsformat_master, format_worker, testing, cluster_id, net_interface
[master]Master RPC, web, metadata, TTL, quota, replication, locking
[mds]Optional standalone metadata service (FoundationDB or memory KV)
[journal]Raft / journal settings
[worker]Worker RPC, storage directories, replication, data-path execution
[client]Client defaults, retries, read/write buffers, unified FS behavior
[fuse]FUSE mount and cache settings
[log]Shared client / FUSE logging
[job]Legacy Master-side load-job lifecycle and concurrency
[transfer]Standalone Load and Export service, state store, and client routing
[cli]CLI log settings
[discovery]etcd-based service discovery (disabled by default)
[fault_injection]Test-only fault HTTP control plane
[master.compatibility], [worker.compatibility]Version compatibility policy

The [s3_gateway] section and worker.enable_s3_gateway no longer exist in the current code. The S3-compatible gateway is not part of the current server. Remove these keys from older configurations; they are ignored (with a warning) if present.

Cluster-Level Flags

FieldDefaultMeaning
format_mastertrueFormat Master metadata storage on startup
format_workertrueFormat Worker data storage on startup
testingfalseTest-only mode; data does not flow normally
cluster_idcurvineCluster identifier used in storage paths and service naming
net_interfaceemptyNetwork interface used to resolve the local IPv4 for all role hostnames

format_master deletes RocksDB metadata and format_worker deletes the Worker data directory. Always set both to false in an existing production deployment; the shipped etc/curvine-cluster.toml does so.

[master]

FieldDefaultMeaning
hostnamelocalhostMaster hostname; overridden by net_interface or CURVINE_MASTER_HOSTNAME
rpc_port8995Master RPC port
web_port9001Master web UI / REST port
io_threads32Master RPC I/O threads
worker_threadsmax(32, 2 × CPU)Master RPC worker threads
actor_threads4Actor runtime threads
io_timeout10mNetwork read/write timeout
io_close_idletrueClose idle Master RPC connections
meta_request_concurrenttrueProcess metadata requests concurrently on one connection
meta_dir<cwd>/fs-metaRocksDB metadata directory
min_block_size1MBMinimum block size
max_block_size100GBMaximum block size
min_replication1Minimum replica count
max_replication100Maximum replica count
max_path_len8000Maximum path length
max_path_depth1000Maximum path depth
retry_cache_enabletrueEnable the filesystem request retry cache
retry_cache_size100000Retry cache capacity
retry_cache_ttl10mRetry cache TTL
block_report_limit100000Maximum block count per block report
worker_policylocalWorker selection policy: local, robin, random, load_based, weighted
executor_threads10Master executor threads
executor_channel_size1000Master executor queue size
heartbeat_interval3sWorker heartbeat interval
worker_check_interval10sWorker state check interval
worker_blacklist_interval30sTime before an unhealthy Worker is blacklisted
worker_lost_interval10mTime before a Worker is marked lost
audit_logging_enabledtrueEnable audit logging
block_replication_enabledfalseEnable block replication management
block_replication_concurrency_limit1000Maximum concurrent replication jobs
block_replication_retry_interval5sReplication retry interval
block_replication_submit_timeout30sDeadline for the source Worker to accept a replication job
block_replication_job_timeout30mDeadline for a submitted replication attempt to report a result
ttl_checker_retry_attempts3TTL checker retry attempts
ttl_checker_interval1hTTL scan interval
ttl_bucket_interval1hTTL bucketing interval
ttl_max_retry_duration10mMaximum TTL retry duration
ttl_retry_interval1sTTL retry interval
enable_quota_evictionfalseEnable quota-driven eviction
quota_eviction_modefreeQuota eviction mode
quota_eviction_policylruQuota eviction policy
quota_eviction_high_rate0.8High watermark
quota_eviction_low_rate0.6Low watermark
quota_eviction_scan_page2Scan page count
quota_eviction_dry_runfalseReport eviction candidates without deleting
quota_eviction_capacity5000000Eviction scan capacity (entries)
lock_expire_time5mStale file-lock expiration
buffer_size128KBInternal buffer size
conn_limit8Per-connection in-flight request limit; must be > 0
global_limit4096Global in-flight request limit; must be > 0

worker_policy = "local" prefers a local Worker for the first replica and assigns the remaining replicas through the weighted policy. weighted allocates according to worker.weight.

[master.rocksdb] controls metadata RocksDB behavior. Its defaults come from MasterConf::rocksdb_default() (4 KB blocks, WAL disabled, bloom filters enabled, index/filter blocks cached and pinned).

[master.compatibility] is described in the Version Compatibility Policy section below.

[mds]

The MDS is an optional standalone metadata service, started with curvine-server --service mds. It is disabled by default.

FieldDefaultMeaning
enabledfalseEnable the MDS service
hostnamelocalhostMDS hostname
rpc_port8998MDS RPC port
web_port9004MDS web / health port
io_threads4MDS RPC I/O threads
worker_threads8MDS RPC worker threads
kv_backendfdbKV backend: fdb or memory
fdb_cluster_file/etc/foundationdb/fdb.clusterFoundationDB cluster file; required when kv_backend = "fdb"
fdb_txn_timeout_ms5000Per-transaction FoundationDB timeout
logmds.logMDS log config

kv_backend = "memory" is intended for tests only and loses all metadata when the process exits. fdb_txn_timeout_ms bounds how long an operation waits on an unreachable FoundationDB cluster; leave it at the default unless you have a specific reason to change it.

[journal]

FieldDefaultMeaning
enabletrueEnable Raft journal
group_nameraft-groupRaft group name
hostnamelocalhostLocal Raft hostname
rpc_port8996Raft RPC port
io_threads8Raft RPC I/O threads
worker_threads8Raft RPC worker threads
message_size200Raft RPC message size
journal_addrs[{id=1, hostname="localhost", port=8996}]Raft peers
journal_dirtesting/journal-<random>Journal / Raft log directory
writer_channel_size0Journal writer queue size; 0 means unbounded
writer_flush_batch_size1000Journal flush batch size
writer_flush_batch_ms10Journal flush interval
snapshot_interval6hFollower snapshot trigger interval
snapshot_min_interval10mMinimum gap between snapshots; 0 disables the limit
leader_create_snapshotunsetWhether the leader creates snapshots; unset means "only for a single-node group"
snapshot_entries1000000Entries between snapshots
snapshot_read_chunk_size1MBSnapshot read chunk size
conn_retry_max_duration_ms0Connection retry max duration
conn_retry_min_sleep_ms10000Connection retry min sleep
conn_retry_max_sleep_ms10000Connection retry max sleep
rpc_close_idlefalseClose idle Raft RPC connections
rpc_retry_max_duration_ms60000RPC retry max duration
rpc_retry_min_sleep_ms20000RPC retry min sleep
rpc_retry_max_sleep_ms20000RPC retry max sleep
conn_timeout_ms30000Connection timeout
io_timeout_ms60000RPC read/write timeout
conn_size1Shared connections per peer
raft_tick_interval_ms1000Raft tick interval
raft_election_tick10Election timeout in ticks
raft_heartbeat_tick3Heartbeat interval in ticks
raft_min_election_ticks10Raft randomized election lower bound
raft_max_election_ticks30Raft randomized election upper bound
raft_check_quorumtrueEnable quorum checks
raft_max_size_per_msg1MBMaximum message size
raft_max_inflight_msgs256Maximum in-flight messages
raft_max_committed_size_per_ready16MBMaximum committed size per ready
raft_batch_size8Batch append size
raft_retry_cache_size100000Raft retry cache capacity
raft_retry_cache_ttl10mRaft retry cache TTL
retain_checkpoint_num3Checkpoints to retain; 0 is rejected
ignore_reply_errorfalseSkip unreplayable journal batches instead of failing
max_retry_num1000Maximum replay retries
skip_failed_ufs_replay_after_retrytrueAdvance the UFS replay watermark after retries; metadata replay is never skipped
scan_batch_size1000Journal scan batch size
retry_interval_secs10Replay retry interval
ufs_copy_timeout20mTimeout for copying data to UFS
recover_from_peersunsetRaft ID of one lost HA member to explicitly rebuild from healthy peers

Key points:

  • journal_addrs must list the Raft peers, and the effective local hostname must match one of the entries (or net_interface must resolve to a matching IPv4). Otherwise startup fails.
  • retain_checkpoint_num also defines the retained log window (retain_checkpoint_num × snapshot_entries entries). Raising it increases journal disk usage.
  • leader_create_snapshot defaults to creating snapshots only for a single-node group. A multi-node group with this key unset has no leader-side log compaction and logs an error every few minutes; set leader_create_snapshot = true for production HA clusters.
  • ignore_reply_error = true can make a Master permanently diverge from its peers. Use it only for disaster recovery, never as a normal setting.
  • recover_from_peers is normally only needed for an operator-directed rebuild of a stale but non-empty member. Wiped members are quarantined automatically on rejoin when the cluster is healthy.

[worker]

FieldDefaultMeaning
hostnamelocalhostWorker hostname; overridden by net_interface or CURVINE_WORKER_HOSTNAME
weight1Relative allocation weight for weighted policy; 0 excludes the Worker from new allocations
rpc_port8997Worker RPC port
web_port9002Worker web / metrics port
dir_reserved0Fixed free space reserved per data directory
free_ratio0.0Strict free-space floor as a fraction of the device ([0.0, 1.0)); 0 disables
data_dir[]Worker data directories
io_slow_threshold300msSlow I/O threshold
io_threads32Worker RPC I/O threads
worker_threadsmax(32, 2 × CPU)Worker RPC worker threads
io_timeout10mWorker network timeout
io_close_idlefalseClose idle Worker RPC connections
scheduler_threads2Scheduler threads
executor_threads10Background executor threads
executor_channel_size1000Background executor queue size
enable_splicefalseEnable splice optimization
enable_send_filetrueEnable sendfile optimization
pipe_buf_size64KBPipe buffer size
pipe_pool_init_cap0Pipe pool initial capacity
pipe_pool_max_cap2000Pipe pool maximum capacity
pipe_pool_idle_time0Pipe idle recycle time
block_replication_concurrency_limit100Concurrent replication tasks
block_replication_chunk_size1MBReplication chunk size
spdk_diskdisabledSPDK NVMe-oF/RDMA disk configuration
compatibilitydiagnoseVersion compatibility policy for data-plane peers

data_dir entries support three forms:

data_dir = [
  "[SSD]/data/data1",          # storage type, capacity unbounded
  "[HDD:500GB]/data/data2",    # storage type + capacity
  "/data/data3"                # defaults to DISK, capacity unbounded
]

Storage types are SSD, HDD, DISK, and MEM. The Worker appends cluster_id below each path, so the effective data directory is <path>/<cluster_id>.

dir_reserved is a fixed byte reservation. free_ratio is a fraction of the physical device and also covers space consumed by other applications on the same disk. Both are enforced at write admission for new blocks and FileLayout rewrite staging copies.

[worker.spdk_disk] is only meaningful in server builds that enable SPDK (build.sh --spdk or --spdk-rdma). It contains enabled, app_name, reactor_mask, qpair_acquire_timeout, and a targets array (trtype, adrfam, traddr, trsvcid, subnqn).

[client]

FieldDefaultMeaning
master_addrs[]Master RPC addresses; derived if empty
hostnamelocalhostClient hostname; overridden by net_interface or CURVINE_CLIENT_HOSTNAME
io_threads16Client RPC I/O threads
worker_threadsmax(16, 2 × CPU)Client RPC worker threads
replicas1Default replica count
block_size128MBDefault block size
write_chunk_size128KBWrite chunk size
write_chunk_num8Write chunks per pipeline
read_chunk_size128KBRead chunk size
read_chunk_num8Read chunks per pipeline
read_parallel1Base read parallelism
read_slice_size0Read slice size; 0 means read_chunk_size × read_chunk_num
max_cache_block_handles10Maximum cached block handles
short_circuittrueEnable short-circuit reads
storage_typediskDefault storage type
ttl_ms0Default TTL
ttl_actionnoneDefault TTL action
auto_cache_enabledfalseAutomatically submit cache requests for UFS reads
auto_cache_ttl7dTTL for automatic cache entries
conn_retry_max_duration_ms60000Connection retry max duration
conn_retry_min_sleep_ms100Connection retry min sleep
conn_retry_max_sleep_ms2000Connection retry max sleep
rpc_retry_max_duration_ms120000RPC retry max duration
rpc_retry_min_sleep_ms100RPC retry min sleep
rpc_retry_max_sleep_ms10000RPC retry max sleep
rpc_close_idletrueClose idle RPC connections
conn_timeout_ms30000Connection timeout
rpc_timeout_ms120000RPC timeout
data_timeout_ms120000Data transfer timeout
pipeline_timeout_ms120000Pipeline timeout
master_conn_pool_size1Connections per Master
enable_read_aheadtrueEnable read-ahead
read_ahead_len0Read-ahead length; 0 means read_chunk_size × read_chunk_num
drop_cache_len1MBData length above which the page cache is dropped after reads
failed_worker_ttl_ms600000How long a failed Worker stays blacklisted
enable_unified_fstrueEnable the unified filesystem view
enable_rust_read_ufstrueAllow direct UFS reads on cache miss
audit_logging_enabledtrueEmit client audit logs
mount_update_ttl_ms10000Mount metadata refresh interval
umask022File creation umask (octal)
metric_report_enabletrueReport client metrics
clean_task_interval_ms60000Cleanup task interval
close_timeout_secs5Close timeout
sync_check_interval_min_ms100Minimum UFS sync polling interval
sync_check_interval_max_ms1000Maximum UFS sync polling interval
max_sync_wait_timeout_ms300000Maximum wait for a sync job
sync_check_log_tick3Polls between sync progress logs
enable_block_conn_pooltrueEnable the block connection pool
block_conn_idle_size128Idle block connections retained
block_conn_idle_time_ms60000Block connection idle time
small_file_size4MBSmall-file threshold
enable_smart_prefetchtrueEnable smart prefetch
large_file_size10GBLarge-file threshold
max_read_parallel8Maximum dynamic read parallelism
sequential_read_threshold7Sequential-read detection threshold

Size values are strings such as "128MB", "4MB", or "10GB". Duration fields ending in _ms accept integer milliseconds. The older unsuffixed aliases (mount_update_ttl, sync_check_interval_min, and so on) are still accepted.

[fuse]

FieldDefaultMeaning
debugfalseLog FUSE request/response traffic
audit_logging_enabledfalseEmit FUSE audit logs
metrics_enabledtrueEmit FUSE request/error/latency metrics
io_threads32FUSE I/O threads
mnt_path/curvine-fuseMount path
fs_path/Visible Curvine root within the mount
mnt_number1Number of mount points (mnt-0, mnt-1, ... under mnt_path)
tasks_per_mnt0Per-mount I/O tasks; 0 follows io_threads
clone_fdtrueEnable clone-fd optimization
fuse_channel_size0FUSE request queue size; 0 uses the backend default
stream_channel_size0Read/write request queue size; 0 uses the backend default
fuse_opts[]Extra mount options (see below)
readonlyfalseMount read-only at the kernel level
umask022Umask for synthesized ./.. permission bits
uid / gidcurrent processDefault owner of mounted entries
web_port9003FUSE web / metrics port
read_dir_fill_inotrueFill node IDs while listing directories
entry_timeout1sKernel dentry cache timeout
negative_timeout0Kernel negative-lookup cache timeout; 0 disables
attr_timeout1sKernel attribute cache timeout
rememberfalseRemember opened files and directories
max_background256Maximum background requests
congestion_threshold192Congestion threshold; must be ≤ max_background
enable_meta_cachefalseEnable the userspace metadata cache
meta_cache_timeout60sUserspace metadata cache TTL
node_cache_timeout1hInode/node map eviction TTL
direct_iofalseBypass the kernel page cache for all opens
open_direct_on_stalefalsePer-open direct I/O when local metadata is stale
write_back_cachefalseLet the kernel buffer writes
cache_readdirfalseCache directory listings
non_seekablefalseMark files non-seekable
check_permissiontrueEnforce permission checks
state_dirsystem temp dirDirectory for persisted FUSE state
max_readahead_kbunsetOverride the BDI read_ahead_kb; unset keeps the kernel default
list_limit1000Directory listing limit
enable_splicetrueUse splice/vmsplice for FUSE data transfer
path_lock_stripes1024Path lock stripes

Notes:

  • meta_cache_capacity and node_cache_size were removed. Use meta_cache_timeout and node_cache_timeout instead.
  • negative_timeout = 0 disables negative-lookup caching; it does not mean "cache forever".
  • direct_io and write_back_cache cannot both be enabled; startup rejects the combination.
  • fuse_opts supports the VFS pairs ro/rw, nodev/dev, nosuid/suid, noexec/exec, noatime/atime, sync/async, plus dirsync, allow_other, default_permissions, and big_write. The legacy libfuse options auto_unmount, allow_root, and max_write are not supported by the direct mount backend.
  • Duration values accept strings ("1s", "500ms", "1h") or bare integers interpreted as milliseconds. The older *_ms keys remain aliases.

[log], [cli], [job]

Global [log]

The top-level [log] section is shared by the Rust client and FUSE. Each service also has its own nested log table (master.log, worker.log, mds.log, transfer.log) and the CLI has [cli].log.

FieldDefaultMeaning
levelINFOLog level
log_dirstdoutstdout, stderr, or a directory for file logging
file_nameemptyBase log file name; empty means curvine
max_log_files10Rotated files to keep
max_file_size_mb100Size-based rotation threshold; 0 means no size limit
time_rotationemptydaily or hourly; empty means no time-based rotation
display_threadfalseInclude thread name and ID
display_positiontrueInclude source location
targets[]Split named log targets into separate files

Rotation only applies when log_dir is a directory. With size and time rotation both unset, files rotate by size at 100 MB. If max_file_size_mb = 0 and no valid time_rotation is configured, files rotate daily so they cannot grow without limit.

[cli]

CliConf contains only log. The default CLI log level is warn, with output to stdout.

[job]

[job] configures the legacy Master-side job implementation used by clients with transfer.enabled = false. Transfer jobs use [transfer] for ownership, recovery, and retention.

FieldDefaultMeaning
job_life_ttl24hJob record lifetime
job_cleanup_ttl10mCleanup interval for expired jobs
terminal_retention10mHow long terminal jobs stay queryable
job_max_files100000Maximum files per job
master_max_concurrent_load_jobs16Concurrent Master-side load planning jobs
master_max_background_load_jobs1024Background load jobs allowed to wait
master_max_pending_load_job_submits4096Pending submit requests before admission
master_load_job_runtime_threads4Runtime threads reserved for load planning
master_load_job_blocking_threads16Blocking threads reserved for load planning
master_failed_load_job_retry_interval30sReuse window for deterministic source-not-found failures
task_timeout1hMaximum task execution time
task_report_interval10sTask progress report interval
worker_max_concurrent_tasks100Maximum concurrent tasks per Worker

[transfer]

[transfer] is read by the standalone Transfer service and by clients that submit Load and Export work to it. A Transfer service also needs the normal [client] Master addresses. During a staged rollout, keep this section disabled in the Master and Worker configuration and enable it only in the Transfer and selected client configurations.

FieldDefaultMeaning
enabledfalseEnable Transfer routing in this process. On a client, load and export use Transfer; on a Transfer server, it starts the service.
store_urlempty; inferred as sqlite://data/transfer/transfer.dbState store URL. Schemes: memory://, sqlite://, mysql://, postgres://, postgresql://. Use one shared mysql:// or postgres:// URL for multiple instances.
hostnamelocalhostRPC and web bind hostname when explicit endpoints are not supplied
rpc_port9010Transfer RPC port
web_port9011Health and metrics HTTP port
endpoints["<hostname>:<rpc_port>"]Client-facing Transfer RPC addresses; use a Service or load-balancer address
instance_idemptyOptional stable service owner ID; a UUID is generated when empty
max_running_transfers64Maximum jobs this instance executes concurrently
client_pending_queue_size1024Maximum auto-cache requests waiting for or performing submission
client_submit_concurrency64Maximum concurrent client-side auto-cache submissions
max_tasks_per_transfer100000Maximum tasks per transfer job
ufs_max_concurrency_per_endpoint32Maximum concurrent tasks per UFS endpoint
task_max_retries3Maximum task retries
lease_timeout120sOwnership lease duration used for recovery and multi-instance coordination
terminal_retention168hRetention for completed, failed, and canceled job records
logtransfer.logTransfer log config

Do not use the deprecated inputs store_type, sqlite_path, or mysql_url in new configurations. store_url selects the backend from its scheme. Internal queue, probe, and scheduler values are not part of the supported user configuration surface.

For PostgreSQL with a private CA, append sslrootcert=/path/to/ca.pem to the store_url; TLS validates the system trust store by default.

[discovery]

Service discovery is disabled by default. When enabled, the only supported provider is etcd.

FieldDefaultMeaning
enabledfalseEnable etcd discovery
provideretcdDiscovery provider; must be etcd when enabled
endpoints[]etcd endpoints, for example ["http://etcd-0:2379"]
prefix/curvineAbsolute etcd key prefix
connect_timeout_ms3000etcd connect timeout
request_timeout_ms3000etcd request timeout
watch_reconnect_min_ms1000Watch reconnect backoff lower bound
watch_reconnect_max_ms30000Watch reconnect backoff upper bound
watch_reconnect_jitter_ratio0.2Watch reconnect jitter ratio (0.0–1.0)
allow_stale_cachetrueReturn stale cache while the watch is disconnected

When discovery is enabled, cluster_id must contain only lowercase letters, digits, _, and -. Effective keys are {prefix}/{cluster_id}/services/{kind}/{service_id}.

[fault_injection]

Test-only fault control plane. It is disabled by default and must not be enabled in normal deployments.

FieldDefaultMeaning
enabledfalseExpose fault HTTP routes
auth_token_envCURVINE_FAULT_TOKENEnvironment variable holding the bearer token

The HTTP routes require binaries built with the fault-injection Cargo feature (for example curvine-server/fault-injection). Enabling [fault_injection] without that feature fails server startup instead of silently omitting the route.

Version Compatibility Policy

[master.compatibility] and [worker.compatibility] share the same fields:

FieldDefaultMeaning
modediagnosediagnose logs incompatibilities; enforce rejects incompatible peers
min_worker_versionemptyLowest Worker release accepted by the Master (empty = not enforced)
min_client_versionemptyLowest client release accepted (empty = not enforced)
blocked_versions[]Versions rejected regardless of mode

The protocol version range is a code-level contract, not an operator setting. Invalid mode strings and unparseable version bounds degrade to the lenient default instead of failing closed.

enforce mode requires Workers that report component_info on their heartbeat. Workers older than the release that introduced this field resolve to MissingInfo and are rejected, so keep diagnose until the whole Worker fleet has been upgraded.

Example Skeleton

format_master = false
format_worker = false
# net_interface = "eth0"

[master]
meta_dir = "data/meta"
# [master.compatibility]
# mode = "diagnose"

[mds]
enabled = false
rpc_port = 8998
web_port = 9004
kv_backend = "fdb"
fdb_cluster_file = "/etc/foundationdb/fdb.cluster"

[journal]
journal_addrs = [
  { id = 1, hostname = "master1", port = 8996 },
  { id = 2, hostname = "master2", port = 8996 },
  { id = 3, hostname = "master3", port = 8996 },
]
journal_dir = "data/journal"
leader_create_snapshot = true

[worker]
data_dir = ["[SSD]/data/data1"]
weight = 1

[client]
master_addrs = [
  { hostname = "master1", port = 8995 },
  { hostname = "master2", port = 8995 },
  { hostname = "master3", port = 8995 },
]

[transfer]
enabled = false

[fuse]
mnt_path = "/curvine-fuse"
web_port = 9003

[log]
level = "info"
log_dir = "stdout"

[cli]
log = { level = "warn", log_dir = "stdout", file_name = "cli.log" }

[discovery]
enabled = false