Since 27a1b2b ("chore(core): Flatten FST store code"), the bucket loop in
`FstStorePool::dump_action` checked the type and name of the collection
entry instead of the bucket entry. As a collection is a directory, every
bucket was skipped: `TRIGGER backup` answered `OK` but wrote no FST, and
`TRIGGER restore` restored none.
Add a test which backs up a consolidated FST and restores it.
`TRIGGER backup` answered `ERR internal_error` in two common cases:
- a KV store was open in the pool (e.g. right after a `PUSH`): the backup
opened the database a second time, which RocksDB refuses as its `LOCK`
file is held. The pooled store is now backed up instead, after a flush.
- the KV or FST store directory did not exist yet (nothing ingested, or
nothing consolidated yet): listing it failed. There is nothing to back up
in that case.
Also enable the `trigger_backup` test, which covers both cases.
Fixes#274
Values longer than 128 bytes or with non-ASCII characters are rejected by
`StoreItemPart::from_str` with `ERR invalid_argument(...)`, but the
protocol did not say so.
Closes#319
A read timeout or an abrupt client hang-up unwound the channel thread,
which flooded the logs with "closing channel" panics and skipped the
connected clients counter decrement, leaking a client slot each time.
Fixes#256