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