In DNE system, MDTs are likely to become imbalanced over time, and user may also add/remove MDTs. So there is a need to move load from one MDT to anothe, this is what dir restripe can do.
Directory restripe should meet below requirements:
- After directory restripe, the load (disk usage, incoming requests) should be shared fairly between MDTs.
- In the process of directory restriping, the directory should be accessed without problem.
- Move as little data as necessary to make restripe quick and to minimize system impact.
- Keep object fid unchanged to support NFS on Lustre.
- A new hash type will be introduced, directory with this hash type should move as little data as necessary in each restripe. To achieve this, directory with this hash type doesn't hash(name) mod stripe_count, but a fixed number like maximum MDT count, so that each restripe won't cause file hash change. And unlike old striped directory, each stripe contains a range of numbers of between [0, maximum_MDT_count], e.g, [0, 99], and each restripe will split this stripe into two, and each with half the range, i.e, [0, 49] and [50, 99], that means only half of the files needs to be moved.
- Directory restripe will be done automatically, when MDT finds a directory or stripe is growing fast, it will put this directory or stripe into a global list, and a dedicated thread will scan this list and split directories or stripes in this list. Stripe merge should be similar, when a stripe size is shrinking below a limit, it will be merged to its previous stripe.
- Unlike directory migration, restripe doesn't move file inode, but only dirent. So after restripe, half of the files under this stripe will become remote objects.