- Fix decompress_and_parse_entries_standard() Unexpected end of buffer while parsing name bug ([!312](https://storage.bsc.es/gitlab/hpc/gekkofs/-/merge_requests/312))
- Fix client dissapearing on malleability ends with an error. ([!313](https://storage.bsc.es/gitlab/hpc/gekkofs/-/merge_requests/313))
- Fixed buffer-size validation issues in filtered directory listing paths.
For shrink-only operations, no new daemons are needed; just mark leaving entries with `-`. For expand-only operations, no `-` entries are needed; start the added daemons with `GKFS_DAEMON_EXPAND=ON` so they append `+` entries.
### User-level resize examples
The examples below use plain GekkoFS commands: start daemons with `gkfs_daemon` and control topology changes with
`gkfs_malleability`. They assume GekkoFS was configured with tools enabled, for example `-DGKFS_BUILD_TOOLS=ON`, and that
`gkfs_daemon`, `gkfs_malleability`, and `libgkfs_intercept.so` come from the same installation.
Common shell setup:
```bash
# installation and workspace paths
export GKFS_INSTALL=/path/to/install
export GKFS_WORKDIR=/scratch/$USER/gkfs
export GKFS_HOSTFILE=$GKFS_WORKDIR/gkfs_hosts.txt
export GKFS_ROOTDIR=/local/ssd/$USER/gkfs-root
export GKFS_MOUNTDIR=$GKFS_WORKDIR/mount
mkdir-p"$GKFS_WORKDIR""$GKFS_MOUNTDIR"
# client and tool input: one shared hostfile for the current GekkoFS instance
export LIBGKFS_HOSTS_FILE=$GKFS_HOSTFILE
# daemon-side hostfile path; the same path is also passed with -H below
export GKFS_HOSTS_FILE=$GKFS_HOSTFILE
# keep the hosts file while daemons are stopped or resized; this is important for marker-based mutations
export GKFS_DAEMON_KEEP_HOSTS_FILE=ON
# choose one placement strategy and export it everywhere: daemons, clients, proxies, and tools
export GKFS_DISTRIBUTION_STRATEGY=simple_hash
# CutShift substantially reduces inter-node data movement during expand-only resizes
Useful daemon and tool options for these examples:
| Option or command | Meaning |
|---|---|
| `gkfs_daemon -r, --rootdir <path>` | Local data directory for each daemon |
| `gkfs_daemon -m, --mountdir <path>` | GekkoFS mount directory visible to clients |
| `gkfs_daemon -H, --hosts-file <path>` | Shared hostfile written by daemons and read by clients/tools |
| `gkfs_daemon -l <iface>` | Network interface or address to bind, for example `ib0` |
| `gkfs_daemon -P <protocol>` | RPC protocol, for example `ofi+sockets` or `ofi+verbs` |
| `gkfs_malleability mutate start` | Start redistribution from the marked hostfile topology |
| `gkfs_malleability mutate status` | Poll redistribution status |
| `gkfs_malleability mutate finalize` | Stop daemons marked with `-`, clean the hostfile markers, and complete the topology change |
### Random Slicing and CutShift
Set the same distribution variables for daemons, clients, proxies, and tools:
@@ -566,6 +761,11 @@ For `random_slicing`, `mutate start` writes the chosen interval table into the w
CutShift is applied for expand-only Random Slicing operations (`+` entries present, no `-` entries). Other Random Slicing mutate cases currently fall back to the final equal RS layout.
Using `GKFS_DISTRIBUTION_STRATEGY=random_slicing` together with `GKFS_RANDOM_SLICING_CUTSHIFT=ON` is recommended for
expand-heavy workflows because it avoids rebuilding an entirely new balanced placement from scratch. Instead, CutShift
adjusts the existing Random Slicing interval layout and assigns ranges to the added daemons, so most data remains on its
current owner and only a smaller subset has to move between nodes.
Reference: Random Slicing is based on "Random slicing: Efficient and scalable data placement for large-scale storage systems" by Alberto Miranda, Sascha Effert, Yangwook Kang, Ethan L. Miller, Ivan Popov, Andre Brinkmann, Tom Friedetzky, and Toni Cortes, published in ACM Transactions on Storage 10(3), 2014. See the [Google Scholar entry](https://scholar.google.com/citations?view_op=view_citation&hl=en&user=hK-ogNAAAAAJ&cstart=20&pagesize=80&sortby=pubdate&citation_for_view=hK-ogNAAAAAJ:RGFaLdJalmkC).
### Manual `gkfs_malleability` workflow
@@ -588,7 +788,7 @@ unset GKFS_DAEMON_EXPAND
gkfs_malleability mutate start
while! gkfs_malleability mutate status 2>&1 | grep-q"No mutate";do sleep 2;done