Page History
...
It borrows lots of ideas from orphan and volatile files in Lustre (which stores in "ROOT/PENDING
" directory on each MDT). During the format and setup, each MDT creates a "ROOT/TRASH.lustre/Trash
" directory as a Trash Can to store "undeleted" files.
The POSIX API is used to traverse the files under the Trash Can on a given MDT. First, a client can get the FID of Trash Can directory ROOT/TRASH
on .lustre/Trash
on the MDT. Then the client can get the file handle via FID open: dir_fd=llapi_open_by_fid().
After that, the "undeleted" files within the Trash Can can be traversed via readdir(dir_fd)
; it can open by openat(dir_fd, ent->d_name)
and obtain the "trusted.unrm
" XATTR, which contains the necessary information to resotre, via fgetxattr(fd, "trusted.recyclebinunrm")
; The client can even read the data or swap layouts of the "undeleted" file on the Trash Can for restore: opendir()/readddir()/openat()/fgetxattr("trusted.recyclebinunrm")/close()/closedir().
The workflow for the Trash Can is as follows:
...
# ls /mnt/lustre/.lustre/trashTrash/MDT0002
0x200034021:0x1:0x0
0x200034021:0x2:0x0
...
# lfs trash ls /mnt/lustre/.lustre/recycleTrash/MDT0002/0x200034021:0x1:0x0
0 0 4096 Nov 14 08:11 [0x200034021:0x1:0x0]->/mnt/lustre/f1
# lfs trash list /mnt/lustre/.lustre/recycleTrash/MDT0002
MDT index: 1
uid gid size delete time FID Fullpath
0 0 4096 Nov 14 08:11 [0x200034021:0x1:0x0]->/mnt/lustre/f1
0 0 32104 Nov 14 08:07 [0x200034021:0x2:0x0]->/mnt/lustre/dir/f2
...
...