Andrey Yarovoy created HDDS-16985:
-------------------------------------

             Summary: OM gRPC server / dist do not use Netty native epoll
                 Key: HDDS-16985
                 URL: https://issues.apache.org/jira/browse/HDDS-16985
             Project: Apache Ozone
          Issue Type: Improvement
          Components: OM
            Reporter: Andrey Yarovoy


## Problem

The OM gRPC server (used by S3 Gateway through `GrpcOmTransport`) always uses 
Netty's NIO transport, even on Linux where native epoll is available. The 
shipped tarball also cannot load unshaded native epoll at all, so the S3 
Gateway's OM gRPC client falls back to NIO without any warning.

## Current state

1. **`GrpcOzoneManagerServer` hard-codes NIO:**
- boss and worker groups are `new NioEventLoopGroup(...)`
-`NettyServerBuilder.channelType(NioServerSocketChannel.class)`

`XceiverServerGrpc` on the datanode already switches on `Epoll.isAvailable()` 
and picks `EpollEventLoopGroup` / `EpollServerSocketChannel` when it can. The 
OM server has no such switch.

2. **The dist is missing the native library for unshaded Netty.** 
`share/ozone/lib` contains only `netty-transport-native-epoll-<ver>.jar` with 
no classifier, and that jar has no `.so` in it. The `linux-x86_64` and 
`linux-aarch_64` classifier jars are not packaged. As a result, 
`io.netty.channel.epoll.Epoll.isAvailable()` returns `false` at runtime, which 
affects:
-`GrpcOzoneManagerServer`: it would stay on NIO even after fix 1 unless this is 
also fixed.
-`GrpcOmTransport` (S3 Gateway → OM client): it does not set a transport 
explicitly, so gRPC chooses epoll only when it is available. Today it always 
ends up on NIO.

The shaded gRPC/Netty from ratis-thirdparty is not affected, because 
`ratis-thirdparty-misc` bundles the shaded epoll `.so`. So the datanode, SCM HA 
and Ratis gRPC paths already get epoll on Linux.

3. **Minor:** the datanode `StreamingServer` / `StreamingClient` 
(`container/stream`) hard-code `NioEventLoopGroup(100)` and 
`Nio[Server]SocketChannel`. Today they are only called from tests and freon 
`StreamingGenerator`.

## Proposed change

- In `GrpcOzoneManagerServer`, select `EpollEventLoopGroup` + 
`EpollServerSocketChannel` when `Epoll.isAvailable()` is true and keep NIO as 
the fallback, mirroring `XceiverServerGrpc`. Log the selected channel type at 
startup.
- Package `io.netty:netty-transport-native-epoll` with the `linux-x86_64` and 
`linux-aarch_64` classifiers in the dist, and update `jar-report.txt` and 
`LICENSE.txt`.
- Optional: apply the same switch to `StreamingServer` / `StreamingClient`.

No protocol, config or compatibility impact. Platforms without epoll keep using 
NIO.

## Testing

- Existing OM gRPC / S3 Gateway unit and integration tests, which use the NIO 
fallback on macOS.
- Linux compose cluster: confirm the OM startup log shows the epoll channel 
type, and that jstack shows epoll event-loop threads in OM and S3 Gateway.



--
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