wallner-avat opened a new pull request, #18178:
URL: https://github.com/apache/iotdb/pull/18178
…ntains a space
Fixes #18177
## Description
### Symptom
On Windows, when IoTDB is located under a path that contains a space (e.g.
`C:\Program Files\iotdb`), the health-check tool's *Installation
Environment(Directory Access)* check splits directory paths at the space. It:
- **creates a stray empty directory** such as `C:\Program`, and
- prints garbled results — `"C:\Program" has write permission` followed by
`"Files\...\ext\pipe" has write permission` — instead of one line for the real
directory.
Reproduced on 2.0.8 and current `master` (identical code). Present since
the tool was added (#12325); not addressed by #12435 (launch scripts) or #12450
(permission-detection logic).
### Root cause
In `scripts/tools/windows/ops/health_check.bat`, `:local_dirs_check` joins
the directory variables into `spacedirs` with **spaces** and iterates them with
`for %%a in (%spacedirs%)`. The `for ... in (set)` form tokenizes on spaces (and
`,`/`;`), so a path containing a space is split into two tokens. The inner
`for %%b`/`%%c` loops already preserve spaces for the `;`/`,` multi-dir
separators (via the `"!var:;=" "!"` technique), but the outer space-join
defeats that.
Separately, `%%c` (from `for %%c in ("...")`) carries its surrounding
quotes, so `mkdir "%%c"` expands to `mkdir ""C:\Program Files\..."" ` — a
doubly-quoted path the argument parser re-splits, recreating the stray
directory even after the
outer loop is fixed.
### Fix
Two coordinated changes in `:local_dirs_check`, both required:
1. Build the directory list with **each entry individually quoted** and
de-quote it with `%%~a`, so the outer loop yields exactly one entry per
configured variable with spaces intact.
2. Use the de-quoted `%%~c` for **every filesystem operation and result
message** (`mkdir`, `if not exist`, and the temp-file write/exist/delete), so
they receive a single correctly-quoted path. The `for %%c in (...)` loop
variable itself is
unchanged.
A short `@REM` in `:local_dirs_check` documents why the list is quoted.
Behavior:
- Space-free installs are unchanged.
- Existing `;`/`,`-separated multi-directory values still split correctly.
- A spaced path is now checked as a single directory; no stray directory
is created; the output has one clean line per directory.
Alternatives considered:
- *Rewriting the loop with `for /f` and explicit `,`/`;` delimiters* — a
larger change with no functional advantage; the quote-preserving approach is
minimal and reuses the technique already present in the inner loops.
- *Relying on the "no spaces in the install path" documentation alone* —
the docs do recommend a space-free path, but the tool should still degrade
gracefully (not create stray directories or emit corrupt output) when that
guidance isn't met,
which is common on Windows where `C:\Program Files` is the natural
location.
### Testing
No automated harness exists for the batch tool, so verified manually on
Windows:
- Install under `C:\Program Files\iotdb`, run `health_check.bat -o local`:
**before** → stray empty `C:\Program` created + split/garbled Directory Access
lines; **after** → no stray directory, one clean line per directory (e.g.
`C:\Program
Files\iotdb\ext\pipe has write permission`).
- Space-free install: output unchanged.
- Config with a `;`/`,`-separated `dn_data_dirs`: still enumerated
correctly.
<hr>
This PR has:
- [x] been self-reviewed.
- [x] added comments explaining the "why" and the intent of the code
wherever would not be obvious for an unfamiliar reader.
<hr>
##### Key changed/added classes (or packages if there are too many
classes) in this PR
- `scripts/tools/windows/ops/health_check.bat` — `:local_dirs_check`
routine (Windows batch script; no Java classes changed).
--
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.
To unsubscribe, e-mail: [email protected]
For queries about this service, please contact Infrastructure at:
[email protected]