BUG: component_percona_udf Does Not Register Any UDFs on Percona Server 8.4.7‑7 (EL9)

BUG: component_percona_udf Does Not Register Any UDFs on Percona Server 8.4.7‑7 (EL9)

Missing component_udf_registration Component in EL9 Packaging

I believe I’ve encountered a packaging bug in Percona Server for MySQL 8.4.7‑7 on EL9 (Oracle).

The component_percona_udf component installs metadata correctly, but never loads, never registers UDFs, and writes no error log entries.
The root cause appears to be that the required dependency component component_udf_registration is not included in the EL9 packages.

Below are full details.


Environment

  • OS: Oracle Linux 9 (EL9 family)

  • Server version:

    8.4.7-7.1.el9.x86_64 Percona Server (GPL), Release 7, Revision 9a19f1fd
    
    
  • Installed RPMs:

    percona-server-server-8.4.7-7.1.el9.x86_64
    percona-server-client-8.4.7-7.1.el9.x86_64
    percona-server-shared-8.4.7-7.1.el9.x86_64
    
    

Summary of the issue

Running:

SQL

INSTALL COMPONENT ‘file://component_percona_udf’;

Show more lines

adds an entry to mysql.component, but:

  • No UDFs appear in mysql.func

  • No attempts to load the .so file appear in mysqld.log

  • The required dependency component component_udf_registration is missing entirely

This results in the UDF component being registered but never initialised.


Steps to reproduce

  1. Confirm the UDF component exists on disk:
/usr/lib64/mysql/plugin/component_percona_udf.so

  1. Install the component:

INSTALL COMPONENT 'file://component_percona_udf';

  1. Check components:
SELECT component_id, component_group_id, component_urn
FROM mysql.component
ORDER BY component_group_id, component_id;

Actual output:

file://component_validate_password
file://component_percona_telemetry
file://component_percona_udf

Expected:

Also include:

file://component_udf_registration

  1. Check UDFs:

SELECT * FROM mysql.func;

Actual:
Empty set.

  1. Check error log:
grep -i percona_udf /var/log/mysqld.log

Actual:
No output at all — indicating the component loader never attempted to load the .so.


Expected behaviour

Percona documentation says:

“Once the installation is complete, execute
INSTALL COMPONENT 'file://component_percona_udf'
to install these functions.”
(Percona Toolkit UDFs page) [docs.percona.com]

And the 8.4 component migration guide says:

“After running INSTALL COMPONENT, all functions are automatically registered.”
(Upgrade from plugins to components) [docs.percona.com]

Therefore:

  • The UDF component should load

  • Functions should automatically register in mysql.func

  • The error log should show component load activity


Actual behaviour

  • Component metadata is inserted

  • The component never loads

  • UDFs never register

  • No errors or warnings are logged

  • component_udf_registration is completely absent from the EL9 packages


Analysis

Based on behaviour and package contents, this appears to be a packaging omission:

  • component_percona_udf.so is shipped

  • But component_udf_registration.so is not shipped in any of the Percona Server EL9 packages

Since component_percona_udf depends on the registration service, the component remains inert.

This silent failure matches what happens when a dependency component is missing: MySQL does not attempt to load the dependent .so and therefore logs nothing.


Impact

  • Percona Toolkit UDFs (e.g., fnv1a_64, murmur_hash, uuid_to_bin) cannot be used

  • Tools that rely on these functions cannot operate

  • No diagnostics are logged, making this difficult to troubleshoot

  • Server behaviour contradicts the documentation


Request

Please confirm whether:

  1. component_udf_registration.so is unintentionally missing from the EL9 build, and

  2. Whether this is a packaging bug that needs correction in future releases.

If the omission is intentional, please update documentation to reflect the dependency and how to install the missing component.

Happy to provide logs, package listings, component tables, directory listings if needed.

Thanks!

Welcome to Percona Forum @mikepalmergee, and thanks for the detailed bug report.

I tested this on Percona Server 8.4.7-7 (Docker, EL9) and the component registers all three UDFs correctly. The key detail is that component-registered UDFs do not appear in mysql.func. That table only stores legacy UDFs created with CREATE FUNCTION ... SONAME. Component UDFs appear in performance_schema.user_defined_functions instead. This is standard MySQL 8.x component behavior, not a packaging issue.

Can you run this and share the output?

SELECT * FROM performance_schema.user_defined_functions
WHERE UDF_NAME IN ('fnv_64','fnv1a_64','murmur_hash');

On my test instance this returns all three functions with UDF_LIBRARY = NULL (meaning they’re provided by a component, not a standalone .so). You should also be able to call them directly:

SELECT fnv_64('test'), fnv1a_64('test'), murmur_hash('test');

Regarding component_udf_registration, this is not a separate .so file. The udf_registration service is built into mysqld itself (defined in sql/server_component/server_component.cc). When a component like component_percona_udf declares REQUIRES_SERVICE(udf_registration), it binds to the server’s built-in implementation at load time. There is nothing missing from the packages.

If the query above returns empty, the most likely cause is an upgrade from PS 8.0. In 8.0, these same hash functions were delivered as standalone plugins (libfnv_udf.so, libfnv1a_udf.so, libmurmur_udf.so) and registered via CREATE FUNCTION ... SONAME. If those entries still exist in mysql.func, the server loads them into its internal hash table at startup, and when the component tries to register the same names, it fails silently due to a name collision. This is tracked in PS-10326.

Fix for the upgrade scenario:

-- Remove stale legacy UDFs from mysql.func
DROP FUNCTION IF EXISTS fnv_64;
DROP FUNCTION IF EXISTS fnv1a_64;
DROP FUNCTION IF EXISTS murmur_hash;

-- Reinstall the component
UNINSTALL COMPONENT 'file://component_percona_udf';
INSTALL COMPONENT 'file://component_percona_udf';

-- Verify in the correct table
SELECT * FROM performance_schema.user_defined_functions
WHERE UDF_NAME IN ('fnv_64','fnv1a_64','murmur_hash');

Was this a fresh install of PS 8.4.7, or an upgrade from an earlier version (8.0, 8.1)?

References: