Ladybug version
v0.19.0
What operating system are you using?
ubuntu24
What happened?
Incident and cause
During a large COPY FROM, stopping the NFS-Ganesha server could make the operation fail in the checkpoint phase after the transaction had already been published. TransactionManager::commit() removes the transaction from activeTransactions before running the forced or automatic checkpoint. The context still held a non-owning activeTransaction pointer when the checkpoint threw. Error handling then attempted to roll back an object that the manager had already destroyed; connection teardown could repeat that rollback and let an exception escape a destructor, producing std::terminate/SIGABRT.
The same NFS outage can also fail page reads, dirty-page flushes, WAL cleanup, or shadow-file replay. Leaving a page locked, retaining a reserved frame, or deleting a WAL without syncing its directory can make the next open unrecoverable even after the original outage has ended.
How to reproduce?
- build loopback file disk
sudo fallocate -l 4G /var/tmp/lbug-fsfreeze.img
sudo mkfs.ext4 -F /var/tmp/lbug-fsfreeze.img
sudo mkdir -p /mnt/lbug-fsfreeze
sudo mount -o loop /var/tmp/lbug-fsfreeze.img /mnt/lbug-fsfreeze
findmnt /mnt/lbug-fsfreeze\
- mount NFS CLIENT
sudo apt update
sudo apt install -y nfs-ganesha nfs-ganesha-vfs
sudo systemctl disable --now nfs-server.service
sudo install -d -m 0755 /etc/ganesha
sudo cp -a /etc/ganesha/ganesha.conf /etc/ganesha/ganesha.conf.bak
sudo tee /etc/ganesha/ganesha.conf >/dev/null <<'EOF'
NFS_Core_Param {
Protocols = 4;
}
EXPORT {
Export_Id = 77;
Path = /mnt/lbug-fsfreeze;
Pseudo = /lbug-fsfreeze;
Access_Type = RW;
Squash = No_Root_Squash;
SecType = sys;
Protocols = 4;
Transports = TCP;
}
EOF
sudo systemctl enable --now nfs-ganesha
sudo systemctl status nfs-ganesha --no-pager
sudo systemctl restart nfs-ganesha
sudo systemctl status nfs-ganesha --no-pager -l
sudo mkdir -p /mnt/lbug-nfs-client
sudo mount -t nfs4
-o vers=4.1,proto=tcp,hard,timeo=600,retrans=5
127.0.0.1:/lbug-fsfreeze /mnt/lbug-nfs-client
findmnt -T /mnt/lbug-fsfreeze -o TARGET,SOURCE,FSTYPE,OPTIONS
findmnt -T /mnt/lbug-nfs-client -o TARGET,SOURCE,FSTYPE,OPTIONS
- use this test script to reproduce
python3 reconciler/cases/tc_local_lbug_copy_fsfreeze.py
--scenario nfs-node-copy-inflight-reopen
--mountpoint /mnt/lbug-nfs-client
--db-path /mnt/lbug-nfs-client/nfs-node-scenario-reopen.lbug
--freeze-seconds 180
--inflight-copy-nodes 1000000
--keep-db
or
python3 reconciler/cases/tc_local_lbug_copy_fsfreeze.py
--scenario nfs-copy-inflight
--mountpoint /mnt/lbug-nfs-client
--db-path /mnt/lbug-nfs-client/nfs-rel-scenario.lbug
--freeze-seconds 180
--inflight-copy-edges 1000000
--keep-db
tc_local_lbug_copy_fsfreeze.py
Are there known steps to reproduce?
No response
Ladybug version
v0.19.0
What operating system are you using?
ubuntu24
What happened?
Incident and cause
During a large COPY FROM, stopping the NFS-Ganesha server could make the operation fail in the checkpoint phase after the transaction had already been published. TransactionManager::commit() removes the transaction from activeTransactions before running the forced or automatic checkpoint. The context still held a non-owning activeTransaction pointer when the checkpoint threw. Error handling then attempted to roll back an object that the manager had already destroyed; connection teardown could repeat that rollback and let an exception escape a destructor, producing std::terminate/SIGABRT.
The same NFS outage can also fail page reads, dirty-page flushes, WAL cleanup, or shadow-file replay. Leaving a page locked, retaining a reserved frame, or deleting a WAL without syncing its directory can make the next open unrecoverable even after the original outage has ended.
How to reproduce?
sudo fallocate -l 4G /var/tmp/lbug-fsfreeze.img
sudo mkfs.ext4 -F /var/tmp/lbug-fsfreeze.img
sudo mkdir -p /mnt/lbug-fsfreeze
sudo mount -o loop /var/tmp/lbug-fsfreeze.img /mnt/lbug-fsfreeze
findmnt /mnt/lbug-fsfreeze\
sudo apt update
sudo apt install -y nfs-ganesha nfs-ganesha-vfs
sudo systemctl disable --now nfs-server.service
sudo install -d -m 0755 /etc/ganesha
sudo cp -a /etc/ganesha/ganesha.conf /etc/ganesha/ganesha.conf.bak
sudo tee /etc/ganesha/ganesha.conf >/dev/null <<'EOF'
NFS_Core_Param {
Protocols = 4;
}
EXPORT {
Export_Id = 77;
Path = /mnt/lbug-fsfreeze;
Pseudo = /lbug-fsfreeze;
Access_Type = RW;
Squash = No_Root_Squash;
SecType = sys;
Protocols = 4;
Transports = TCP;
}
EOF
sudo systemctl enable --now nfs-ganesha
sudo systemctl status nfs-ganesha --no-pager
sudo systemctl restart nfs-ganesha
sudo systemctl status nfs-ganesha --no-pager -l
sudo mkdir -p /mnt/lbug-nfs-client
sudo mount -t nfs4
-o vers=4.1,proto=tcp,hard,timeo=600,retrans=5
127.0.0.1:/lbug-fsfreeze /mnt/lbug-nfs-client
findmnt -T /mnt/lbug-fsfreeze -o TARGET,SOURCE,FSTYPE,OPTIONS
findmnt -T /mnt/lbug-nfs-client -o TARGET,SOURCE,FSTYPE,OPTIONS
python3 reconciler/cases/tc_local_lbug_copy_fsfreeze.py
--scenario nfs-node-copy-inflight-reopen
--mountpoint /mnt/lbug-nfs-client
--db-path /mnt/lbug-nfs-client/nfs-node-scenario-reopen.lbug
--freeze-seconds 180
--inflight-copy-nodes 1000000
--keep-db
or
python3 reconciler/cases/tc_local_lbug_copy_fsfreeze.py
--scenario nfs-copy-inflight
--mountpoint /mnt/lbug-nfs-client
--db-path /mnt/lbug-nfs-client/nfs-rel-scenario.lbug
--freeze-seconds 180
--inflight-copy-edges 1000000
--keep-db
tc_local_lbug_copy_fsfreeze.py
Are there known steps to reproduce?
No response