So, you’ve decided to write a Storage Engine for Drizzle. This is excellent news! The API is continually being improved and if you’ve worked on a Storage Engine for MySQL, you’ll notice quite a few differences in some areas.
The first step is to create a skeleton StorageEngine plugin.
You can see my skeleton embedded_innodb StorageEngine plugin in its merge request.
The important steps are:
1. Create the plugin directory
e.g. mkdir plugin/embedded_innodb
2. Create the plugin.ini file describing the plugin
create the plugin.ini file in the plugin directory (so it’s plugin/plugin_name/plugin.ini
)
An example plugin.ini for embedded_innodb is.
[plugin]
title=InnoDB Storage Engine using the Embedded InnoDB library
description=Work in progress engine using libinnodb instead of including it in tree.
sources=embedded_innodb_engine.cc
headers=embedded_innodb_engine.h
This gives us a title and description, along with telling the build system what sources to compile and what headers to make sure to include in any source distribution.
3. Add plugin dependencies
Your plugin may require extra libraries on the system. For example, the embedded_innodb plugin uses the Embedded InnoDB library (libinnodb).
Other examples include the MD5 function requiring either openssl or gnutls, the gearman related plugins requiring gearman libraries, the UUID()
function requiring libuuid and BlitzDB requiring Tokyo Cabinet libraries.
For embedded_innodb, pandora-build has a macro for finding libinnodb on the system. We want to run this configure check, so we create a plugin.ac file in the plugin directory (i.e. plugin/plugin_name/plugin.ac
) and add the check to it.
For embedded_innodb, the plugin.ac file just contains this one line:
PANDORA_HAVE_LIBINNODB
We also want to add two things to plugin.ini; one to tell the build system only to build our plugin if libinnodb was found and the other to link our plugin with libinnodb. For embedded_innodb, it’s these two lines:
build_conditional="x${ac_cv_libinnodb}" = "xyes"
ldflags=${LTLIBINNODB}
Not too hard at all! This should look relatively familiar for those who have seen autoconf and automake in the past.
Some plugins (such as the md5 function) have a bit more custom auto-foo in plugin.ini and plugin.ac (as one of two libraries can be used). You can do pretty much anything with the plugin system, but you’re a lot more likely to keep it simple like we have here.
4. Add skeleton source code for your StorageEngine
While this will change a little bit over time (and is a little long to just paste into here), you can see what I did for embedded_innodb in the skeleton-embedded-innodb-engine tree.
5. Build!
You will need to re-run ./config/autorun.sh
so the build system picks up your new plugin. When you run ./configure --help
afterwards, you should see options for building with/without your new plugin.
6. Add a test
You will probably want to add a test to see that your plugin loads successfully. When your plugin is built, the test suite automatically picks up any tests you have in the plugin/plugin_name/tests
directory. This is in the same format as general MySQL and Drizzle tests: tests go in a t/
directory, expected results in a r/
directory.
Since we are loading a plugin, we will also need some server options to make sure that plugin is loaded. These are stored in the rather inappropriately named test-master.opt
file (that’s the test name with “-master.opt
” appended to the end instead of “.test
“). For the embedded_innodb plugin_load test, we have a plugin/embedded_innodb/tests/t/plugin_load-master.opt
file with the following content:
--plugin_add=embedded_innodb
You can have pretty much anything in the plugin_load.test file… if you’re fancy, you’ll have a SELECT
query on data_dictionary.plugins
to check that the plugin really is there. Be sure to also add a r/plugin_load.result
file (My preferred method is to just create an empty result file, run the test suite and examine the rejected output before renaming the .reject
file to .result
)
Once you’ve added your test, you can run it either by just typing “make test
” (which will run the whole test suite), or you can go into the main tests/
directory and run ./test-run.pl --suite=plugin_name
(which will just run the tests for your plugin).
7. Check the code in, feel good about self
and you’re done. Well… the start of a Storage Engine plugin is done :)
This blog post (but not the whole blog) is published under the Creative Commons Attribution-Share Alike License. Attribution is by linking back to this post and mentioning my name (Stewart Smith).
Like this:
Like Loading...