<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>http://wiki.lustre.org/index.php?action=history&amp;feed=atom&amp;title=Lustre_Common_Mistakes</id>
	<title>Lustre Common Mistakes - Revision history</title>
	<link rel="self" type="application/atom+xml" href="http://wiki.lustre.org/index.php?action=history&amp;feed=atom&amp;title=Lustre_Common_Mistakes"/>
	<link rel="alternate" type="text/html" href="http://wiki.lustre.org/index.php?title=Lustre_Common_Mistakes&amp;action=history"/>
	<updated>2026-08-08T21:41:30Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.39.7</generator>
	<entry>
		<id>http://wiki.lustre.org/index.php?title=Lustre_Common_Mistakes&amp;diff=5514&amp;oldid=prev</id>
		<title>Elliswilson: Created page with &quot;== Common Lustre Mistakes and How to Avoid Them ==  This page collects common pitfalls encountered by Lustre administrators and users. These are real issues drawn from community experience, the Lustre Operations Manual, and the FAQ. Reading this page before putting a Lustre filesystem into production can save significant trouble.  === Installation &amp; Startup ===  ==== Mounting Servers in the Wrong Order ====  &#039;&#039;&#039;Mistake:&#039;&#039;&#039; Mounting OSTs or clients before the MGS/MDT is u...&quot;</title>
		<link rel="alternate" type="text/html" href="http://wiki.lustre.org/index.php?title=Lustre_Common_Mistakes&amp;diff=5514&amp;oldid=prev"/>
		<updated>2026-05-11T14:53:06Z</updated>

		<summary type="html">&lt;p&gt;Created page with &amp;quot;== Common Lustre Mistakes and How to Avoid Them ==  This page collects common pitfalls encountered by Lustre administrators and users. These are real issues drawn from community experience, the Lustre Operations Manual, and the FAQ. Reading this page before putting a Lustre filesystem into production can save significant trouble.  === Installation &amp;amp; Startup ===  ==== Mounting Servers in the Wrong Order ====  &amp;#039;&amp;#039;&amp;#039;Mistake:&amp;#039;&amp;#039;&amp;#039; Mounting OSTs or clients before the MGS/MDT is u...&amp;quot;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;== Common Lustre Mistakes and How to Avoid Them ==&lt;br /&gt;
&lt;br /&gt;
This page collects common pitfalls encountered by Lustre administrators&lt;br /&gt;
and users. These are real issues drawn from community experience, the&lt;br /&gt;
Lustre Operations Manual, and the FAQ. Reading this page before putting&lt;br /&gt;
a Lustre filesystem into production can save significant trouble.&lt;br /&gt;
&lt;br /&gt;
=== Installation &amp;amp; Startup ===&lt;br /&gt;
&lt;br /&gt;
==== Mounting Servers in the Wrong Order ====&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Mistake:&amp;#039;&amp;#039;&amp;#039; Mounting OSTs or clients before the MGS/MDT is up.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;What happens:&amp;#039;&amp;#039;&amp;#039; The mount hangs or fails because the server cannot&lt;br /&gt;
reach the MGS to register itself and retrieve configuration.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Fix:&amp;#039;&amp;#039;&amp;#039; Always start in this order:&lt;br /&gt;
# MGT (Management Target)&lt;br /&gt;
# MDT(s) (Metadata Targets)&lt;br /&gt;
# OST(s) (Object Storage Targets)&lt;br /&gt;
# Clients&lt;br /&gt;
&lt;br /&gt;
Shut down in &amp;#039;&amp;#039;&amp;#039;reverse&amp;#039;&amp;#039;&amp;#039; order: clients first, then OSTs, then&lt;br /&gt;
MDT, then MGT. Failure to unmount clients first causes client hangs&lt;br /&gt;
and evictions.&lt;br /&gt;
&lt;br /&gt;
==== Port 988 Blocked by Firewall ====&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Mistake:&amp;#039;&amp;#039;&amp;#039; Forgetting to open TCP port 988 between Lustre nodes.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;What happens:&amp;#039;&amp;#039;&amp;#039; Mounts hang or time out with &amp;quot;Connection timed&lt;br /&gt;
out.&amp;quot; LNet cannot establish connections.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Fix:&amp;#039;&amp;#039;&amp;#039; Open port 988 on all Lustre nodes:&lt;br /&gt;
&lt;br /&gt;
 firewall-cmd --permanent --add-port=988/tcp&lt;br /&gt;
 firewall-cmd --reload&lt;br /&gt;
&lt;br /&gt;
==== Port 988 Blocked by Firewall ====&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Mistake:&amp;#039;&amp;#039;&amp;#039; Forgetting to open TCP port 988 between Lustre nodes.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;What happens:&amp;#039;&amp;#039;&amp;#039; Mounts hang or time out with &amp;quot;Connection timed&lt;br /&gt;
out.&amp;quot; LNet cannot establish connections.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Fix:&amp;#039;&amp;#039;&amp;#039; Open port 988 on all Lustre nodes:&lt;br /&gt;
&lt;br /&gt;
 firewall-cmd --permanent --add-port=988/tcp&lt;br /&gt;
 firewall-cmd --reload&lt;br /&gt;
&lt;br /&gt;
==== Not Using _netdev or noauto in fstab ====&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Mistake:&amp;#039;&amp;#039;&amp;#039; Adding Lustre mounts to &amp;lt;code&amp;gt;/etc/fstab&amp;lt;/code&amp;gt; without&lt;br /&gt;
&amp;lt;code&amp;gt;_netdev&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;noauto&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;What happens:&amp;#039;&amp;#039;&amp;#039; The system tries to mount Lustre before the&lt;br /&gt;
network is up during boot, causing a hang or boot failure.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Fix:&amp;#039;&amp;#039;&amp;#039; Always include &amp;lt;code&amp;gt;_netdev&amp;lt;/code&amp;gt; (and &amp;lt;code&amp;gt;noauto&amp;lt;/code&amp;gt;&lt;br /&gt;
if using an HA manager like Pacemaker):&lt;br /&gt;
&lt;br /&gt;
 LABEL=testfs-MDT0000 /mnt/mdt lustre defaults,_netdev,noauto 0 0&lt;br /&gt;
&lt;br /&gt;
For systemd-based systems, also add&lt;br /&gt;
&amp;lt;code&amp;gt;x-systemd.requires=lnet.service&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==== Running a Lustre Client on a Server Node ====&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Mistake:&amp;#039;&amp;#039;&amp;#039; Mounting the Lustre filesystem on the same node that&lt;br /&gt;
runs an MDS or OSS.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;What happens:&amp;#039;&amp;#039;&amp;#039; Under memory pressure, the client and server&lt;br /&gt;
compete for memory, which can cause &amp;#039;&amp;#039;&amp;#039;deadlocks&amp;#039;&amp;#039;&amp;#039;. The server needs&lt;br /&gt;
to allocate memory to process the client&amp;#039;s I/O, but the client is&lt;br /&gt;
waiting for the server, and the system is out of memory.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Fix:&amp;#039;&amp;#039;&amp;#039; Use dedicated client nodes. Do not mount the filesystem&lt;br /&gt;
on MDS or OSS nodes.&lt;br /&gt;
&lt;br /&gt;
==== Not Specifying --index at Format Time ====&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Mistake:&amp;#039;&amp;#039;&amp;#039; Running &amp;lt;code&amp;gt;mkfs.lustre&amp;lt;/code&amp;gt; without&lt;br /&gt;
&amp;lt;code&amp;gt;--index=N&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;What happens:&amp;#039;&amp;#039;&amp;#039; The target gets an unassigned index (label ends&lt;br /&gt;
in &amp;lt;code&amp;gt;FFFF&amp;lt;/code&amp;gt;) until its first mount, making it harder to&lt;br /&gt;
identify and manage.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Fix:&amp;#039;&amp;#039;&amp;#039; Always specify &amp;lt;code&amp;gt;--index=0&amp;lt;/code&amp;gt;,&lt;br /&gt;
&amp;lt;code&amp;gt;--index=1&amp;lt;/code&amp;gt;, etc. when formatting MDTs and OSTs.&lt;br /&gt;
&lt;br /&gt;
=== Networking ===&lt;br /&gt;
&lt;br /&gt;
==== Inconsistent UID/GID Across Nodes ====&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Mistake:&amp;#039;&amp;#039;&amp;#039; Different &amp;lt;code&amp;gt;/etc/passwd&amp;lt;/code&amp;gt; or&lt;br /&gt;
&amp;lt;code&amp;gt;/etc/group&amp;lt;/code&amp;gt; contents on client and server nodes.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;What happens:&amp;#039;&amp;#039;&amp;#039; Files appear owned by the wrong user. Operations&lt;br /&gt;
fail with &amp;lt;code&amp;gt;EIDRM&amp;lt;/code&amp;gt; (error -43) when a UID/GID on the&lt;br /&gt;
client doesn&amp;#039;t match any known identity on the MDS.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Fix:&amp;#039;&amp;#039;&amp;#039; Use a centralized identity service (LDAP, FreeIPA, NIS) or&lt;br /&gt;
ensure &amp;lt;code&amp;gt;/etc/passwd&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;/etc/group&amp;lt;/code&amp;gt; are&lt;br /&gt;
consistent across all nodes.&lt;br /&gt;
&lt;br /&gt;
==== Assuming Multi-Rail Provides HA ====&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Mistake:&amp;#039;&amp;#039;&amp;#039; Configuring multiple LNet interfaces (Multi-Rail)&lt;br /&gt;
and assuming it provides network failover.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;What happens:&amp;#039;&amp;#039;&amp;#039; Multi-Rail aggregates bandwidth across multiple&lt;br /&gt;
interfaces, but if the underlying switch fails, all rails connected&lt;br /&gt;
to that switch go down simultaneously.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Fix:&amp;#039;&amp;#039;&amp;#039; Multi-Rail is for bandwidth, not high availability. For&lt;br /&gt;
true network redundancy, ensure rails go through &amp;#039;&amp;#039;&amp;#039;independent&lt;br /&gt;
network paths&amp;#039;&amp;#039;&amp;#039; (different switches, different fabrics).&lt;br /&gt;
&lt;br /&gt;
=== Storage &amp;amp; OST Management ===&lt;br /&gt;
&lt;br /&gt;
==== Striping Across All OSTs With stripe_count=-1 ====&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Mistake:&amp;#039;&amp;#039;&amp;#039; Setting &amp;lt;code&amp;gt;lfs setstripe -c -1&amp;lt;/code&amp;gt; (stripe&lt;br /&gt;
across every OST) as the default for a directory or filesystem.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;What happens:&amp;#039;&amp;#039;&amp;#039; Every file must allocate space on &amp;#039;&amp;#039;&amp;#039;every&amp;#039;&amp;#039;&amp;#039; OST.&lt;br /&gt;
When any single OST fills up, &amp;#039;&amp;#039;&amp;#039;all&amp;#039;&amp;#039;&amp;#039; new writes fail with&lt;br /&gt;
&amp;lt;code&amp;gt;ENOSPC&amp;lt;/code&amp;gt; — even if the filesystem as a whole has plenty&lt;br /&gt;
of free space. The MDS cannot skip full OSTs when stripe_count equals&lt;br /&gt;
the total OST count.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Fix:&amp;#039;&amp;#039;&amp;#039; Use a stripe count less than the total number of OSTs&lt;br /&gt;
(e.g., &amp;lt;code&amp;gt;-c 4&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;-c 8&amp;lt;/code&amp;gt;). This lets the MDS&lt;br /&gt;
skip full OSTs and distribute new files to OSTs with free space. Use&lt;br /&gt;
&amp;lt;code&amp;gt;-c -1&amp;lt;/code&amp;gt; only for specific large files that genuinely need&lt;br /&gt;
aggregate bandwidth across all OSTs.&lt;br /&gt;
&lt;br /&gt;
==== Explicitly Setting the Starting OST Index ====&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Mistake:&amp;#039;&amp;#039;&amp;#039; Using &amp;lt;code&amp;gt;lfs setstripe -i 0&amp;lt;/code&amp;gt; for every file&lt;br /&gt;
or directory.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;What happens:&amp;#039;&amp;#039;&amp;#039; All files start on OST 0, causing severe&lt;br /&gt;
imbalance. OST 0 fills up while other OSTs are nearly empty.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Fix:&amp;#039;&amp;#039;&amp;#039; Let the MDS auto-select the starting OST (omit the&lt;br /&gt;
&amp;lt;code&amp;gt;-i&amp;lt;/code&amp;gt; option). Lustre uses a weighted round-robin algorithm&lt;br /&gt;
that automatically balances across OSTs based on free space.&lt;br /&gt;
&lt;br /&gt;
==== Not Planning for OST Growth ====&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Mistake:&amp;#039;&amp;#039;&amp;#039; Waiting until the filesystem is 95%+ full before adding&lt;br /&gt;
OSTs.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;What happens:&amp;#039;&amp;#039;&amp;#039; Rebalancing data across OSTs is slow and&lt;br /&gt;
disruptive. The MDS has no room to maneuver for load balancing. Users&lt;br /&gt;
experience write failures.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Fix:&amp;#039;&amp;#039;&amp;#039; Plan to add OSTs before hitting 80% usage. Add at least&lt;br /&gt;
25% more capacity each time. You cannot shrink OSTs online — only&lt;br /&gt;
growth is supported.&lt;br /&gt;
&lt;br /&gt;
==== Using writeconf Without Understanding the Consequences ====&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Mistake:&amp;#039;&amp;#039;&amp;#039; Running &amp;lt;code&amp;gt;tunefs.lustre --writeconf&amp;lt;/code&amp;gt; without&lt;br /&gt;
realizing what it destroys.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;What happens:&amp;#039;&amp;#039;&amp;#039; &amp;lt;code&amp;gt;writeconf&amp;lt;/code&amp;gt; regenerates the&lt;br /&gt;
configuration log from scratch. This &amp;#039;&amp;#039;&amp;#039;erases all persistent&lt;br /&gt;
parameter settings&amp;#039;&amp;#039;&amp;#039;, including pool definitions, striping defaults,&lt;br /&gt;
quota settings, and NRS policies. After writeconf, the filesystem&lt;br /&gt;
reverts to factory defaults.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Fix:&amp;#039;&amp;#039;&amp;#039; Only use &amp;lt;code&amp;gt;writeconf&amp;lt;/code&amp;gt; when you genuinely need&lt;br /&gt;
to regenerate the configuration log (e.g., after changing server&lt;br /&gt;
NIDs). Document all persistent settings beforehand so you can&lt;br /&gt;
restore them. Consider using &amp;lt;code&amp;gt;replace_nids&amp;lt;/code&amp;gt; instead if&lt;br /&gt;
you are only changing network addresses.&lt;br /&gt;
&lt;br /&gt;
==== Not Backing Up the MDT ====&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Mistake:&amp;#039;&amp;#039;&amp;#039; Backing up file data (OSTs) but not the MDT.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;What happens:&amp;#039;&amp;#039;&amp;#039; If the MDT is lost, &amp;#039;&amp;#039;&amp;#039;the entire filesystem is&lt;br /&gt;
lost&amp;#039;&amp;#039;&amp;#039; — even if every OST is perfectly intact. The MDT contains&lt;br /&gt;
the namespace: all directory structures, filenames, permissions, and&lt;br /&gt;
file-to-object mappings. Without it, the data on OSTs is an&lt;br /&gt;
unrecoverable pile of objects.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Fix:&amp;#039;&amp;#039;&amp;#039; The MDT is the single most critical component. Back it up&lt;br /&gt;
regularly. Device-level backups (LVM snapshot, ZFS send) are fastest.&lt;br /&gt;
See [[Backing Up a Lustre File System]].&lt;br /&gt;
&lt;br /&gt;
=== Quota Management ===&lt;br /&gt;
&lt;br /&gt;
==== Assuming Quotas Are Enforced by Default ====&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Mistake:&amp;#039;&amp;#039;&amp;#039; Setting quota limits with &amp;lt;code&amp;gt;lfs setquota&amp;lt;/code&amp;gt;&lt;br /&gt;
and assuming they are enforced.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;What happens:&amp;#039;&amp;#039;&amp;#039; Quota &amp;#039;&amp;#039;&amp;#039;accounting&amp;#039;&amp;#039;&amp;#039; is enabled by default&lt;br /&gt;
on ldiskfs, but quota &amp;#039;&amp;#039;&amp;#039;enforcement&amp;#039;&amp;#039;&amp;#039; is &amp;#039;&amp;#039;&amp;#039;not&amp;#039;&amp;#039;&amp;#039;. Users can&lt;br /&gt;
exceed their limits freely.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Fix:&amp;#039;&amp;#039;&amp;#039; Explicitly enable enforcement on all MDTs and OSTs:&lt;br /&gt;
&lt;br /&gt;
 lctl set_param osd-*.*.quota_slave_dt.enabled=ugp&lt;br /&gt;
 lctl set_param osd-*.*.quota_slave_md.enabled=ugp&lt;br /&gt;
&lt;br /&gt;
Use &amp;lt;code&amp;gt;set_param -P&amp;lt;/code&amp;gt; to make it persistent.&lt;br /&gt;
&lt;br /&gt;
==== Quota Granted Cache Overshoot ====&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Mistake:&amp;#039;&amp;#039;&amp;#039; Setting a hard quota limit (e.g., 400 GB) and&lt;br /&gt;
expecting it to be exact.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;What happens:&amp;#039;&amp;#039;&amp;#039; OSTs grant write cache to clients for&lt;br /&gt;
performance. Clients can write data that has been locally&lt;br /&gt;
acknowledged but not yet accounted against quota on the server.&lt;br /&gt;
Actual usage can &amp;#039;&amp;#039;&amp;#039;significantly exceed&amp;#039;&amp;#039;&amp;#039; the configured limit.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Fix:&amp;#039;&amp;#039;&amp;#039; This is a known design trade-off, not a bug. To minimize&lt;br /&gt;
overshoot, reduce client dirty cache:&lt;br /&gt;
&lt;br /&gt;
 lctl set_param osc.*.max_dirty_mb=8&lt;br /&gt;
&lt;br /&gt;
The overshoot cannot be eliminated entirely without destroying&lt;br /&gt;
write performance.&lt;br /&gt;
&lt;br /&gt;
=== Client Behavior ===&lt;br /&gt;
&lt;br /&gt;
==== Not Checking Write Return Codes ====&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Mistake:&amp;#039;&amp;#039;&amp;#039; Writing data to a Lustre file and not checking&lt;br /&gt;
the return value of &amp;lt;code&amp;gt;write()&amp;lt;/code&amp;gt; or calling&lt;br /&gt;
&amp;lt;code&amp;gt;fsync()&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;What happens:&amp;#039;&amp;#039;&amp;#039; If a client is &amp;#039;&amp;#039;&amp;#039;evicted&amp;#039;&amp;#039;&amp;#039; (due to network&lt;br /&gt;
timeout, server failover, or lock callback expiration), all dirty&lt;br /&gt;
pages in the client cache are &amp;#039;&amp;#039;&amp;#039;silently dropped&amp;#039;&amp;#039;&amp;#039;. This is&lt;br /&gt;
standard POSIX semantics — the write was buffered, not committed.&lt;br /&gt;
Without checking return codes, the application has no way to know&lt;br /&gt;
the data was lost.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Fix:&amp;#039;&amp;#039;&amp;#039; Applications must check &amp;lt;code&amp;gt;write()&amp;lt;/code&amp;gt; return&lt;br /&gt;
values AND call &amp;lt;code&amp;gt;fsync()&amp;lt;/code&amp;gt; before considering data&lt;br /&gt;
committed. This is not Lustre-specific — it applies to any&lt;br /&gt;
filesystem with write-back caching.&lt;br /&gt;
&lt;br /&gt;
==== Confusing -EROFS With Read-Only Mount ====&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Mistake:&amp;#039;&amp;#039;&amp;#039; Seeing error -30 (&amp;lt;code&amp;gt;EROFS&amp;lt;/code&amp;gt;) and assuming&lt;br /&gt;
the filesystem was mounted read-only intentionally.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;What happens:&amp;#039;&amp;#039;&amp;#039; &amp;lt;code&amp;gt;EROFS&amp;lt;/code&amp;gt; in Lustre means the backend&lt;br /&gt;
filesystem (ldiskfs or ZFS) detected a &amp;#039;&amp;#039;&amp;#039;storage error&amp;#039;&amp;#039;&amp;#039; and&lt;br /&gt;
remounted itself read-only to prevent further corruption. This is&lt;br /&gt;
an &amp;#039;&amp;#039;&amp;#039;emergency&amp;#039;&amp;#039;&amp;#039; condition.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Fix:&amp;#039;&amp;#039;&amp;#039; Investigate storage hardware immediately. Check&lt;br /&gt;
&amp;lt;code&amp;gt;dmesg&amp;lt;/code&amp;gt; for disk errors. A Lustre service restart is&lt;br /&gt;
required to return to read-write mode — there is no other way&lt;br /&gt;
to ensure cache consistency.&lt;br /&gt;
&lt;br /&gt;
==== Expecting Fully Coherent atime ====&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Mistake:&amp;#039;&amp;#039;&amp;#039; Relying on &amp;lt;code&amp;gt;atime&amp;lt;/code&amp;gt; (access time) being&lt;br /&gt;
updated in real time across all clients.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;What happens:&amp;#039;&amp;#039;&amp;#039; Lustre updates &amp;lt;code&amp;gt;atime&amp;lt;/code&amp;gt; lazily for&lt;br /&gt;
performance. It is piggy-backed on other inode changes or updated&lt;br /&gt;
at file close. A read from cache may not update atime at all.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Fix:&amp;#039;&amp;#039;&amp;#039; Don&amp;#039;t rely on atime for cross-client synchronization.&lt;br /&gt;
If atime is not needed, mount with &amp;lt;code&amp;gt;noatime&amp;lt;/code&amp;gt; for a&lt;br /&gt;
small performance improvement.&lt;br /&gt;
&lt;br /&gt;
=== Configuration Management ===&lt;br /&gt;
&lt;br /&gt;
==== Using lctl set_param Without -P ====&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Mistake:&amp;#039;&amp;#039;&amp;#039; Changing a tunable with &amp;lt;code&amp;gt;lctl set_param&amp;lt;/code&amp;gt;&lt;br /&gt;
and forgetting to make it permanent.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;What happens:&amp;#039;&amp;#039;&amp;#039; The change takes effect immediately but is lost&lt;br /&gt;
on the next server restart. The filesystem reverts to its previous&lt;br /&gt;
behavior.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Fix:&amp;#039;&amp;#039;&amp;#039; Use &amp;lt;code&amp;gt;lctl set_param -P&amp;lt;/code&amp;gt; to persist the change&lt;br /&gt;
in the MGS configuration log:&lt;br /&gt;
&lt;br /&gt;
 lctl set_param -P osc.*.max_dirty_mb=64&lt;br /&gt;
&lt;br /&gt;
==== New MDTs Don&amp;#039;t Automatically Get Used ====&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Mistake:&amp;#039;&amp;#039;&amp;#039; Adding a new MDT and expecting existing directories&lt;br /&gt;
to automatically spread across it.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;What happens:&amp;#039;&amp;#039;&amp;#039; Nothing. Existing directories stay on their&lt;br /&gt;
original MDT. The new MDT sits empty unless explicitly used.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Fix:&amp;#039;&amp;#039;&amp;#039; After adding a new MDT, create new top-level directories&lt;br /&gt;
on it:&lt;br /&gt;
&lt;br /&gt;
 lfs mkdir -i &amp;lt;mdt_index&amp;gt; /mnt/lustre/new_project&lt;br /&gt;
&lt;br /&gt;
New files and subdirectories under &amp;lt;code&amp;gt;/mnt/lustre/new_project&amp;lt;/code&amp;gt;&lt;br /&gt;
will be managed by the new MDT.&lt;br /&gt;
&lt;br /&gt;
=== See Also ===&lt;br /&gt;
&lt;br /&gt;
* [[Frequently Asked Questions]]&lt;br /&gt;
* [[Lustre Quota Troubleshooting]]&lt;br /&gt;
* [[Handling Full OSTs]]&lt;br /&gt;
* [[Lustre Debugging Procedures]]&lt;br /&gt;
* [[Lustre Getting Started]]&lt;/div&gt;</summary>
		<author><name>Elliswilson</name></author>
	</entry>
</feed>