[ 
https://issues.apache.org/jira/browse/HBASE-30472?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
 ]

ASF GitHub Bot updated HBASE-30472:
-----------------------------------
    Labels: pull-request-available  (was: )

> [hbase-thirdparty] Make netty/netty-tcnative native-library relocation 
> self-maintaining with a glob mapper
> ----------------------------------------------------------------------------------------------------------
>
>                 Key: HBASE-30472
>                 URL: https://issues.apache.org/jira/browse/HBASE-30472
>             Project: HBase
>          Issue Type: Improvement
>          Components: thirdparty
>    Affects Versions: thirdparty-4.1.14
>            Reporter: Xavier Fernandis
>            Assignee: Xavier Fernandis
>            Priority: Major
>              Labels: pull-request-available
>             Fix For: thirdparty-4.1.15
>
>
> h2. Summary
> currently hbase-shaded-netty and hbase-shaded-netty-tcnative relocate netty 
> from io.netty to org.apache.hbase.thirdparty.io.netty. Netty's 
> NativeLibraryLoader derives the native library filename from the (relocated) 
> package of its own loader class at runtime, so the native .so/.jnilib/.dll 
> files bundled under META-INF/native/ must be physically renamed from 
> libnetty_*/netty_* to the shaded 
> liborg_apache_hbase_thirdparty_netty_*/org_apache_hbase_thirdparty_netty_* 
> form to match. Today this rename is done with a hard-coded list of 
> maven-antrun-plugin <move> entries one line per known native filename. 
> current state of manually renaming :
> netty :  
> [https://github.com/apache/hbase-thirdparty/blob/master/hbase-shaded-netty/pom.xml#L130]
> tcnative : 
> [https://github.com/apache/hbase-thirdparty/blob/master/hbase-shaded-netty-tcnative/pom.xml#L131]
> h2. *Issue :* 
> The hard-coded list is not self-maintaining. It enumerates specific 
> filenames, so any native library netty adds or renames in a later release is 
> silently left un-relocated unless a committer remembers to add a matching 
> <move> entry in lockstep. This couples the pom to netty's internal, 
> version-dependent set of native artifacts.
> ||Native library||Relocated today?||
> |{{netty_transport_native_epoll_x86_64.so}}|yes|
> |{{netty_transport_native_epoll_aarch_64.so}}|yes|
> |{{netty_transport_native_kqueue_x86_64.jnilib}}|yes|
> |{{netty_resolver_dns_native_macos_x86_64.jnilib}}|yes|
> |{{netty_transport_native_epoll_riscv64.so}}|no|
> |{{netty_transport_native_kqueue_aarch_64.jnilib}}|no|
> |{{netty_resolver_dns_native_macos_aarch_64.jnilib}}|no|
> ||Native library||Relocated today?||
> |{{netty_tcnative_linux_x86_64.so}}|yes|
> |{{netty_tcnative_linux_aarch_64.so}}|yes|
> |{{netty_tcnative_osx_x86_64.jnilib}}|yes|
> |{{netty_tcnative_osx_aarch_64.jnilib}}|yes|
> |{{netty_tcnative_windows_x86_64.dll}}|no|
> An un-relocated native keeps its original io.netty name, which no longer 
> matches the shaded name NativeLibraryLoader computes for the relocated 
> classes so that platform cannot load it.
> Even where HBase does not request these natives today, the glob approach is 
> future-proof: the moment HBase enables a transport/arch it currently doesn't 
> (or netty adds a new native in an upgrade), the relocation covers it 
> automatically with no pom change.
> h2. proposed change
> Replace the hard-coded <move> entries with Ant <move> driven by a <fileset> 
> and <globmapper>, relocating whatever native libraries are present at build 
> time:
> {code:java}
>   <!-- Unix/macOS libs carry a 'lib' prefix: libnetty_* -> 
> liborg_apache_hbase_thirdparty_netty_* -->
>   <move todir="${project.build.directory}/unpacked/META-INF/native">
>     <fileset dir="${project.build.directory}/unpacked/META-INF/native">
>       <include name="libnetty_*"/>
>     </fileset>
>     <globmapper from="libnetty_*" 
> to="liborg_apache_hbase_thirdparty_netty_*"/>
>   </move>{code}
>   For tcnative, a second mapper additionally handles the Windows DLL (no lib 
> prefix): netty_* -> org_apache_hbase_thirdparty_netty_*. An empty fileset is 
> a no-op, and the native artifacts are bundled in the dependency jars (not 
> host-OS dependent), so the step is correct on any build platform.



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

Reply via email to