to cleanup open connections
It was possible to UNINSTALL storage engine plugin when binding
between THD object and storage engine is still active (e.g. in
the middle of transaction).
To avoid unclean deactivation (uninstall) of storage engine plugin
in the middle of transaction, additional storage engine plugin
lock is acquired by thd_set_ha_data().
If ha_data is not null and storage engine plugin was not locked
by thd_set_ha_data() in this connection before, storage engine
plugin gets locked.
If ha_data is null and storage engine plugin was locked by
thd_set_ha_data() in this connection before, storage engine
plugin lock gets released.
If handlerton::close_connection() didn't reset ha_data, server does
it immediately after calling handlerton::close_connection().
Note that this is just a framework fix, storage engines must switch
to thd_set_ha_data() from thd_ha_data() if they want to see fit.
include/mysql/plugin.h:
As thd_{get|set}_ha_data() have some extra logic now, they
must be implemented on server side.
include/mysql/plugin.h.pp:
As thd_{get|set}_ha_data() have some extra logic now, they
must be implemented on server side.
sql/handler.cc:
Make sure ha_data is reset and ha_data lock is released.
sql/handler.h:
hton is not supposed to be updated by ha_lock_engine(),
make it const.
sql/sql_class.cc:
As thd_{get|set}_ha_data() have some extra logic now, they
must be implemented on server side.
sql/sql_class.h:
Added ha_data lock.
added a rule that use gcc to generate preprocessor output (gcc -E)
that can be then compared to a already generated output using
the diff utility.
Ran make test on the repository to verify changes.
Makefile.am:
Added a rule for checking that the abi/api has not changed.
The following steps are followed in the rule in makefile.am
1) Generate preprocessor output for the files that need to
be tested for abi/api changes. use -nostdinc to prevent
generation of preprocessor output for system headers. This
results in messages in stderr saying that these headers
were not found. Redirect the stderr output to /dev/null
to prevent seeing these messages.
2) sed the output to remove blank lines and lines that begin
with # (The header information is retained to enable easy
analysis of abi diffs at a later stage).
3) diff the generated file and the canons (.pp files already in
the repository).
4) delete the .out file that is generated.
If the diff fails, the generated file is not removed. This will
be useful for analysis of ABI differences (e.g. using a visual
diff tool).
A ABI change that causes a build to fail will always be
accompanied by new canons (.out files). The .out files that
are not removed will be replaced as the new .pp files.
e.g. If include/mysql/plugin.h has an ABI change then this
rule would leave a include/mysql/plugin.out file.
A developer with a justified API change will then do a
mv include/mysql/plugin.out include/mysql/plugin.pp to
replace the old canons with the new ones.
configure.in:
1) Removed the part of the file that was icheck related.
2) Added an entry for the configure variable DIFF
include/mysql.h.pp:
The pre-processor output canon file for include/mysql.h
include/mysql/plugin.h.pp:
The pre-processor output canon file for include/mysql/plugin.h
include/mysql_h.ic:
since the icheck target has been removed, this file need
no longer be present in the repository
sql/mysql_priv.h.pp:
The pre-processor output canon file for sql/mysql_priv.h