Skip to content

Bug: NFS COPY post-commit checkpoint failure cause core dump #783

Description

@ericyuanhui

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?

  1. 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\

  1. 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;

FSAL {
    Name = VFS;
}

}
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

  1. 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

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugSomething isn't working

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions