Description:
Building MySQL from source and using the cmake options -DWITH_INNODB_MEMCACHED=ON and -DWITH_LIBEVENT=system results in a libmemcached.so that is not linked with libevent. Attempting to install the daemon_memcached plugin results in an error due to an unresolved symbol.
How to repeat:
Build the source tree with -DWITH_INNODB_MEMCACHED=ON -DWITH_LIBEVENT=system:
## Typical build for RPM
$ mkdir build && cd build
$ cmake .. -DBUILD_CONFIG=mysql_release \
-DFEATURE_SET="community" \
-DINSTALL_LAYOUT=RPM \
-DCMAKE_INSTALL_PREFIX="/usr" \
-DINSTALL_INCLUDEDIR=include/mysql \
-DINSTALL_INFODIR=share/info \
-DINSTALL_LIBDIR="lib64/mysql" \
-DINSTALL_MANDIR=share/man \
-DINSTALL_MYSQLSHAREDIR=share/mysql \
-DINSTALL_MYSQLTESTDIR=share/mysql-test \
-DINSTALL_PLUGINDIR="lib64/mysql/plugin" \
-DINSTALL_SBINDIR=libexec \
-DINSTALL_SCRIPTDIR=bin \
-DINSTALL_SQLBENCHDIR=share \
-DINSTALL_SUPPORTFILESDIR=share/mysql \
-DMYSQL_DATADIR="/var/lib/mysql" \
-DMYSQL_UNIX_ADDR="/var/lib/mysql/mysql.sock" \
-DENABLED_LOCAL_INFILE=ON \
-DENABLE_DTRACE=ON \
-DWITH_EMBEDDED_SERVER=ON \
-DWITH_EDITLINE=system \
-DWITH_LIBEVENT=system \
-DWITH_INNODB_MEMCACHED=ON \
-DWITH_SSL=system \
-DWITH_ZLIB=system \
-DWITH_MYSQLD_LDFLAGS="-Wl,-z,relro,-z,now"
Attempt to install the daemon_memcached plugin per:
https://dev.mysql.com/doc/refman/5.6/en/innodb-memcached-setup.html
mysql> install plugin daemon_memcached soname "libmemcached.so";
ERROR 1126 (HY000): Can't open shared library '/usr/lib64/mysql/plugin/libmemcached.so' (errno: 2 /usr/lib64/mysql/plugin/libmemcached.so: undefined symbol: event_get_version)
Suggested fix:
The bundled macro sets LIBEVENT_LIBRARY which innodb_memcached/daemon_memcached looks for. When using "system" LIBEVENT_LIBRARIES is set instead. I suspect this is just a bug in naming conventions.
With the following changes the correct linking seems to occur and I can successfully install and use the plugin:
--- a/cmake/libevent.cmake
+++ b/cmake/libevent.cmake
@@ -75,7 +75,7 @@ MACRO (MYSQL_CHECK_LIBEVENT)
IF(LIBEVENT_FOUND)
SET(LIBEVENT_SOURCES "")
- SET(LIBEVENT_LIBRARIES ${LIBEVENT_LIBS})
+ SET(LIBEVENT_LIBRARY ${LIBEVENT_LIBS})
SET(LIBEVENT_INCLUDE_DIRS ${LIBEVENT_INCLUDE_DIR})
SET(LIBEVENT_DEFINES "-DHAVE_LIBEVENT")
ELSE()
Rebuilding allows the plugin to install correctly:
mysql> install plugin daemon_memcached soname "libmemcached.so";
Query OK, 0 rows affected (0.00 sec)
And the plugin works as expected:
$ mysql < /usr/share/mysql/innodb_memcached_config.sql
$ nc 127.0.0.1 11222
set a11 10 0 9
123456789
STORED
get a11
VALUE a11 10 9
123456789
END
quit
Description: Building MySQL from source and using the cmake options -DWITH_INNODB_MEMCACHED=ON and -DWITH_LIBEVENT=system results in a libmemcached.so that is not linked with libevent. Attempting to install the daemon_memcached plugin results in an error due to an unresolved symbol. How to repeat: Build the source tree with -DWITH_INNODB_MEMCACHED=ON -DWITH_LIBEVENT=system: ## Typical build for RPM $ mkdir build && cd build $ cmake .. -DBUILD_CONFIG=mysql_release \ -DFEATURE_SET="community" \ -DINSTALL_LAYOUT=RPM \ -DCMAKE_INSTALL_PREFIX="/usr" \ -DINSTALL_INCLUDEDIR=include/mysql \ -DINSTALL_INFODIR=share/info \ -DINSTALL_LIBDIR="lib64/mysql" \ -DINSTALL_MANDIR=share/man \ -DINSTALL_MYSQLSHAREDIR=share/mysql \ -DINSTALL_MYSQLTESTDIR=share/mysql-test \ -DINSTALL_PLUGINDIR="lib64/mysql/plugin" \ -DINSTALL_SBINDIR=libexec \ -DINSTALL_SCRIPTDIR=bin \ -DINSTALL_SQLBENCHDIR=share \ -DINSTALL_SUPPORTFILESDIR=share/mysql \ -DMYSQL_DATADIR="/var/lib/mysql" \ -DMYSQL_UNIX_ADDR="/var/lib/mysql/mysql.sock" \ -DENABLED_LOCAL_INFILE=ON \ -DENABLE_DTRACE=ON \ -DWITH_EMBEDDED_SERVER=ON \ -DWITH_EDITLINE=system \ -DWITH_LIBEVENT=system \ -DWITH_INNODB_MEMCACHED=ON \ -DWITH_SSL=system \ -DWITH_ZLIB=system \ -DWITH_MYSQLD_LDFLAGS="-Wl,-z,relro,-z,now" Attempt to install the daemon_memcached plugin per: https://dev.mysql.com/doc/refman/5.6/en/innodb-memcached-setup.html mysql> install plugin daemon_memcached soname "libmemcached.so"; ERROR 1126 (HY000): Can't open shared library '/usr/lib64/mysql/plugin/libmemcached.so' (errno: 2 /usr/lib64/mysql/plugin/libmemcached.so: undefined symbol: event_get_version) Suggested fix: The bundled macro sets LIBEVENT_LIBRARY which innodb_memcached/daemon_memcached looks for. When using "system" LIBEVENT_LIBRARIES is set instead. I suspect this is just a bug in naming conventions. With the following changes the correct linking seems to occur and I can successfully install and use the plugin: --- a/cmake/libevent.cmake +++ b/cmake/libevent.cmake @@ -75,7 +75,7 @@ MACRO (MYSQL_CHECK_LIBEVENT) IF(LIBEVENT_FOUND) SET(LIBEVENT_SOURCES "") - SET(LIBEVENT_LIBRARIES ${LIBEVENT_LIBS}) + SET(LIBEVENT_LIBRARY ${LIBEVENT_LIBS}) SET(LIBEVENT_INCLUDE_DIRS ${LIBEVENT_INCLUDE_DIR}) SET(LIBEVENT_DEFINES "-DHAVE_LIBEVENT") ELSE() Rebuilding allows the plugin to install correctly: mysql> install plugin daemon_memcached soname "libmemcached.so"; Query OK, 0 rows affected (0.00 sec) And the plugin works as expected: $ mysql < /usr/share/mysql/innodb_memcached_config.sql $ nc 127.0.0.1 11222 set a11 10 0 9 123456789 STORED get a11 VALUE a11 10 9 123456789 END quit