[ 
https://issues.apache.org/jira/browse/HADOOP-20031?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=18128826#comment-18128826
 ] 

ASF GitHub Bot commented on HADOOP-20031:
-----------------------------------------

GauthamBanasandra opened a new pull request, #8844:
URL: https://github.com/apache/hadoop/pull/8844

   ### Description of PR
   
   `mvn clean install` with `-Pnative-win` cannot complete on Windows. The 
Docker image described in
   BUILDING.txt no longer builds at all, and even with a working image the 
native build fails in
   libhdfspp and again in the YARN capacity-scheduler UI. There is no single 
cause — eight separate
   defects have accumulated, each of which independently stops the build.
   
   **The build image no longer builds**
   
   1. `Dockerfile_windows_10` installs Azul JDK 8. Hadoop requires JDK 17, so 
the enforcer rejects the
      build immediately. This line has not been touched since 2022.
   2. `vcpkg install` fails because the pinned `protobuf 3.25.5` cannot be 
resolved from vcpkg's
      version database. The pin was added by HADOOP-19605 on 2025-11-10.
   3. The pinned vcpkg tag `2025.03.19` references MSYS2 packages 
(`msys2-runtime-3.5.4-2`) that have
      since been purged from the upstream mirror. MSYS2 keeps only current 
versions.
   4. The `libzstd` and `rsync` MSYS2 pins in the Dockerfile have been purged 
for the same reason.
   
   **The native build fails**
   
   5. Boost is not pinned explicitly — its version comes from 
`builtin-baseline`, so it floats as the
      baseline moves. Boost 1.87 removed `boost/asio/io_service.hpp`, which 
five libhdfspp files still
      include (`ioservice.h`, `ioservice_impl.h`, `mock_connection.{h,cc}`,
      `remote_block_reader_test.cc`).
   6. The protobuf/protoc compatibility check in `libhdfspp/CMakeLists.txt` 
leaves
      `CMAKE_REQUIRED_LIBRARIES` pointing at the Abseil targets. Abseil carries 
C++ feature
      requirements that a later C-language `check_symbol_exists()` cannot 
satisfy under the Visual
      Studio generator, so that check fails spuriously.
   7. The legacy `PROTOBUF_LIBRARY`, `PROTOBUF_PROTOC_LIBRARY` and 
`PROTOBUF_LIBRARIES` variables
      resolve to import DLLs under vcpkg, which MSVC rejects with `LNK1107`.
   8. `hadoop-yarn-capacity-scheduler-ui` sets `packageManagerScript` to
      `node_modules/.bin/react-router`. On Windows that path is an `sh` shim, 
which `node` cannot
      execute.
   
   **Why Linux is unaffected**
   
   The Linux build *pins* its native dependencies inside the repository —
   `dev-support/docker/install-boost.sh` hard-codes Boost 1.86.0 and 
`install-protobuf.sh` hard-codes
   Protobuf 3.25.5, both built from source. The Windows build instead delegates 
to vcpkg and lets
   versions float with the baseline. That asymmetry is the root cause of 
defects 2, 5 and arguably 3:
   the Windows build has no equivalent of the version lock the Linux build has 
had all along.
   
   **Fix**
   
   - **Dockerfile**: install the Microsoft Build of OpenJDK 17; move to vcpkg 
tag `2026.07.29`; refresh
     the `libzstd` and `rsync` pins; refresh CMake to 3.30.2. Switch the base 
image to
     `windows/servercore`, which carries everything the build needs at a 
fraction of the size, and
     relax the password policy that Server Core enables by default so the 
existing passwordless
     `HadoopBuilder` account can still be created.
   - **vcpkg.json**: narrow the Boost dependency from the `boost` metapackage 
to the four ports
     libhdfspp actually includes (asio, date-time, program-options, system), 
and pin all 55
     transitively required Boost ports to 1.86.0 — the same version 
`install-boost.sh` pins for Linux.
     Pin protobuf to a version vcpkg publishes.
   - **libhdfspp**: reset `CMAKE_REQUIRED_INCLUDES` and 
`CMAKE_REQUIRED_LIBRARIES` after the protoc
     compatibility check, and migrate from the legacy `PROTOBUF_*` variables to 
the
     `protobuf::libprotobuf` and `protobuf::libprotoc` imported targets.
   - **hadoop-yarn-capacity-scheduler-ui**: point `packageManagerScript` at the 
real entry point,
     `node_modules/@react-router/dev/bin.js`.
   - **BUILDING.txt**: correct the Windows Docker section. It omitted that 
Docker Desktop must be
     switched to Windows containers; it documented the Maven repository mount 
under
     `ContainerAdministrator` although the Dockerfile ends with `USER 
HadoopBuilder`, so the documented
     mount is silently ignored; it recommended `docker cp`, which fails against 
a running Hyper-V
     isolated container; it omitted the container memory the build needs; and 
the manual vcpkg route
     still pinned the purged `2025.03.19` tag.
   
   ### How was this patch tested?
   
   Tested in the Windows container built from this PR's own 
`Dockerfile_windows_10`
   (`windows/servercore:ltsc2019`, Hyper-V isolation, 8 GB), against a fresh 
clone of trunk with these
   changes applied.
   
   **Full build** — a single clean `mvn clean install` with 
`-Pnative-win,dist`, no resume:
   
   - **120 of 120 modules SUCCESS**, no failures and no skipped modules
   - 48:59 min against a warm Maven repository
   - produces `winutils.exe`, `hadoop.dll` and `hdfs.dll`, present both in
     `hadoop-dist/target/hadoop-3.6.0-SNAPSHOT/bin` and inside the distribution 
tarball
   
   **winutils smoke test** — `systeminfo`, `ls`, `chmod` and `hardlink` all run 
correctly against the
   produced binary.
   
   **Unit tests** — `hadoop-common`, 5564 tests in 39:02 min: 5063 passed, 38 
failures, 78 errors, 385
   skipped. None of the failures are attributable to this PR: no file under 
`hadoop-common` or
   `winutils` is modified here, so that module builds and tests as pristine 
trunk. The failures are the
   pre-existing Windows set (`TestSSLHttpServer`, `TestHttpServer`, 
`TestShellBasedUnixGroupsMapping`,
   `TestGroupFallback` and similar), plus some forked-JVM `OutOfMemoryError`s 
caused by the 8 GB
   container limit rather than by any code defect.
   
   Two honest caveats, both pre-existing and outside this PR's scope:
   
   - `hadoop checknative -a` reports `winutils: true` and `hadoop: true`, but 
`zlib`, `bzip2`,
     `openssl`, `ISA-L` and `PMDK` all `false`. This PR restores the ability to 
build; it does not add
     codec support.
   - `-Drequire.openssl` does not appear to be enforced on the Windows native 
path: vcpkg installs
     openssl 3.6.3 and `libssl.lib`/`libcrypto.lib` are present, yet the build 
reports "build does not
     support openssl" and still succeeds. Worth a separate issue.
   
   Separately, `-Dcmake.prefix.path` as documented in BUILDING.txt is read by 
nothing — the only reader
   in the tree is `${windows.cmake.prefix.path}` in 
`hadoop-hdfs-native-client/pom.xml`, and neither
   property is defined in any pom, so the documented flag left 
`CMAKE_PREFIX_PATH` holding an
   unexpanded literal. BUILDING.txt is corrected here. The same misspelling 
also appears in
   `dev-support/bin/hadoop.sh` and may deserve its own issue. Note that the 
verified build above ran
   with the *misspelled* flag, i.e. exactly as BUILDING.txt documented it 
before this change.
   
   ### For code changes:
   
   - [x] Does the title of this PR start with the corresponding JIRA issue id 
(e.g. 'HADOOP-17799. Your PR title ...')?
   - [ ] Object storage: Have the integration tests been executed and the 
endpoint
         declared according to the connector-specific documentation? *Note: 
Automated CI
         testing doesn't cover all cases so manual testing with cloud storage 
is still
         required.* — not applicable, no object storage code is touched.
   - [x] If adding new dependencies to the code, are these dependencies 
licensed in a way that is compatible for inclusion under [ASF 
2.0](http://www.apache.org/legal/resolved.html#category-a)? — no new dependency 
is introduced. Boost, Protocol Buffers, OpenSSL and zlib were already used by 
the Windows build; this PR only pins the versions vcpkg resolves at image-build 
time.
   - [ ] If applicable, have you updated the `LICENSE`, `LICENSE-binary`, 
`NOTICE-binary` files? — not applicable, nothing new is bundled into Hadoop's 
artifacts.
   
   ### AI Tooling
   
   If an AI tool was used:
   
   - [x] The PR includes the phrase "Contains content generated by <tool>"
         where <tool> is the name of the AI tool used.
   - [x] My use of AI contributions follows the ASF legal policy
         https://www.apache.org/legal/generative-tooling.html
   
   Contains content generated by Claude Code.
   
   🤖 Generated with [Claude Code](https://claude.com/claude-code)
   




> Fix the Windows native build: Docker image, libhdfspp CMake and YARN UI
> -----------------------------------------------------------------------
>
>                 Key: HADOOP-20031
>                 URL: https://issues.apache.org/jira/browse/HADOOP-20031
>             Project: Hadoop Common
>          Issue Type: Bug
>          Components: hadoop-common
>    Affects Versions: 3.5.0
>         Environment: Windows 10/11
>            Reporter: Gautham Banasandra
>            Assignee: Gautham Banasandra
>            Priority: Major
>             Fix For: 3.5.0
>
>
> h2. Problem
> {{mvn clean install}} with {{-Pnative-win}} cannot complete on Windows. The
> Docker image described in BUILDING.txt no longer builds at all, and even with 
> a
> working image the native build fails in libhdfspp and again in the YARN
> capacity-scheduler UI. There is no single cause -- eight separate defects have
> accumulated, each of which independently stops the build.
> h2. Root causes
> h3. The build image no longer builds
> # {{Dockerfile_windows_10}} installs Azul JDK 8. Hadoop requires JDK 17, so 
> the
>   enforcer rejects the build immediately. This line has not been touched since
>   2022.
> # {{vcpkg install}} fails because the pinned {{protobuf 3.25.5}} cannot be
>   resolved from vcpkg's version database. The pin was added by HADOOP-19605 on
>   2025-11-10, so the Windows image has been unbuildable for roughly eleven
>   months.
> # The pinned vcpkg tag {{2025.03.19}} references MSYS2 packages
>   ({{msys2-runtime-3.5.4-2}}) that have since been purged from the upstream
>   mirror. MSYS2 keeps only current versions.
> # The {{libzstd}} and {{rsync}} MSYS2 pins in the Dockerfile have been purged
>   from the same mirror for the same reason.
> h3. The native build fails
> # Boost is not pinned explicitly -- its version comes from
>   {{builtin-baseline}}, so it floats as the baseline moves. Boost 1.87 removed
>   {{boost/asio/io_service.hpp}}, which five libhdfspp files still include
>   (ioservice.h, ioservice_impl.h, mock_connection.{h,cc},
>   remote_block_reader_test.cc).
> # The protobuf/protoc compatibility check in
>   {{libhdfspp/CMakeLists.txt}} leaves {{CMAKE_REQUIRED_LIBRARIES}} pointing at
>   the Abseil targets. Abseil carries C++ feature requirements that a later
>   C-language {{check_symbol_exists()}} cannot satisfy under the Visual Studio
>   generator, so that check fails spuriously.
> # The legacy {{PROTOBUF_LIBRARY}}, {{PROTOBUF_PROTOC_LIBRARY}} and
>   {{PROTOBUF_LIBRARIES}} variables resolve to import DLLs under vcpkg, which
>   MSVC rejects with {{LNK1107}}.
> # {{hadoop-yarn-capacity-scheduler-ui}} sets {{packageManagerScript}} to
>   {{node_modules/.bin/react-router}}. On Windows that path is an {{sh}} shim,
>   which {{node}} cannot execute.
> h2. Why Linux is unaffected
> The Linux build *pins* its native dependencies inside the repository --
> {{dev-support/docker/install-boost.sh}} hard-codes Boost 1.86.0 and
> {{install-protobuf.sh}} hard-codes Protobuf 3.25.5, both built from source. 
> The
> Windows build instead delegates to vcpkg and lets the versions float with the
> baseline. That asymmetry is the root cause of defects 2, 5 and arguably 3: the
> Windows build has no equivalent of the version lock the Linux build has had 
> all
> along.
> h2. Fix
> * Dockerfile: install the Microsoft Build of OpenJDK 17; move to vcpkg tag
>   {{2026.07.29}}; refresh the {{libzstd}} and {{rsync}} pins; refresh CMake to
>   3.30.2. Switch the base image to {{windows/servercore}}, which carries
>   everything the build needs at a fraction of the size, and relax the password
>   policy that Server Core enables by default so the existing passwordless
>   {{HadoopBuilder}} account can still be created.
> * {{vcpkg.json}}: narrow the Boost dependency from the {{boost}} metapackage 
> to
>   the four ports libhdfspp actually includes (asio, date-time, 
> program-options,
>   system), and pin all 55 transitively required Boost ports to 1.86.0 -- the
>   same version {{install-boost.sh}} pins for Linux. Pin protobuf to a version
>   vcpkg publishes.
> * {{libhdfspp}}: reset {{CMAKE_REQUIRED_INCLUDES}} and
>   {{CMAKE_REQUIRED_LIBRARIES}} after the protoc compatibility check, and
>   migrate from the legacy {{PROTOBUF_*}} variables to the
>   {{protobuf::libprotobuf}} and {{protobuf::libprotoc}} imported targets.
> * {{hadoop-yarn-capacity-scheduler-ui}}: point {{packageManagerScript}} at the
>   real entry point, {{node_modules/@react-router/dev/bin.js}}.
> * BUILDING.txt: correct the Windows Docker section. It omitted that Docker
>   Desktop must be switched to Windows containers; it documented the Maven
>   repository mount under {{ContainerAdministrator}} although the Dockerfile
>   ends with {{USER HadoopBuilder}}, so the documented mount is silently
>   ignored; it recommended {{docker cp}}, which fails against a running Hyper-V
>   isolated container; it omitted the container memory the build needs; and the
>   manual vcpkg route still pinned the purged {{2025.03.19}} tag.
> h2. Testing
> Verified with a single clean {{mvn clean install}} inside the Windows 
> container,
> from a fresh trunk clone with these changes applied:
> * *120 of 120 modules SUCCESS*, no failures and no skipped modules
> * 48:59 min, against a warm Maven repository
> * Produces {{winutils.exe}}, {{hadoop.dll}} and {{hdfs.dll}}, present both in
>   {{hadoop-dist/target/hadoop-3.6.0-SNAPSHOT/bin}} and inside the distribution
>   tarball
> * {{winutils.exe systeminfo}}, {{ls}}, {{chmod}} and {{hardlink}} all run
>   correctly against the produced binary
> No new tests are added: these are build, packaging and documentation changes,
> and the test is that the build completes and emits working native binaries.
> h2. Notes
> While investigating, {{-Dcmake.prefix.path}} was found to be read by nothing.
> The only reader in the tree is {{${windows.cmake.prefix.path}}} in
> {{hadoop-hdfs-native-client/pom.xml}}, and neither property is defined in any
> pom, so the flag documented in BUILDING.txt left {{CMAKE_PREFIX_PATH}} holding
> an unexpanded literal. BUILDING.txt is corrected here; the same misspelling 
> also
> appears in {{dev-support/bin/hadoop.sh}} and may deserve a separate issue.



--
This message was sent by Atlassian Jira
(v8.20.10#820010)

---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to