Feature #1544

mroongaをMariaDBのストレージエンジンとして組み込んだ状態で使用できるようにする

Added by Kentaro HAYASHI almost 6 years ago. Updated over 5 years ago.

Status:担当者作業中Start date:11/15/2012
Priority:NormalDue date:
Assignee:Kentaro HAYASHI% Done:

0%

Category:MariaDB対応
Target version:-

Description

h1. 動機

mroongaをMariaDBに組み込んだ状態で使えるようにしたい。 組み込んで使えるとmroongaをMariaDBと一緒にバンドルしてもらうための敷居が低くなり、 使ってくれる人が増やせるかもしれない。

h1. ゴール

  • mariadb/storage/mroonga以下にmroongaのソースコードを配置して以下のようにして組み込んだ状態でビルドできること
  cmake . -DWITH_MROONGA_STORAGE_ENGINE=1
  make
  • 組み込んだ状態でMariaDBサーバーを起動し、show engines;でmroongaがストレージエンジンとして予め使える状態になっていること (install plugin soname 'ha_mroonga.so'を実行せずにmroongaが使えること)

  • mroongaをMariaDBに組み込んだ状態とプラグインとでmysqlテストの結果が一致すること(組み込みかプラグインかに影響されず同じように動作すること)

h1. 実現方法

-DWITH_MROONGA_STORAGE_ENGINE=1でcmakeの実行ができるようにするところからはじめ、 -DWITH_MROONGA_STORAGE_ENGINE=1が定義されているときのビルドに対応できるように CMakeLists.txtを修正し問題を潰していく。

make-test-20121120-1334.log - 5.5.28にmroongaを組み込んだ状態でmake testを実行した際のログ (4.82 KB) Kentaro HAYASHI, 11/20/2012 01:35 pm

run-test-20121120-1748.log - run-sql-test.shをset -xを指定してmysql-testを実行したログ (1.28 MB) Kentaro HAYASHI, 11/20/2012 06:10 pm

mroonga-storage-20121205-1139-commentout-uninstall.log - storageでプラグインアンインストール箇所をコメントアウトしたテスト結果 (1.17 KB) Kentaro HAYASHI, 12/05/2012 01:20 pm

mroonga-wrapper-20121205-1143-commentout-uninstall.log - wrapperでプラグインアンインストール箇所をコメントアウトしたテスト結果 (1.35 KB) Kentaro HAYASHI, 12/05/2012 01:20 pm

mroonga-wrapper-innodb-20121205-1143-commentout-uninstall.log - mroonga_wrapper_innodbでプラグインアンインストール箇所をコメントアウトしたテスト結果 (19.6 KB) Kentaro HAYASHI, 12/05/2012 01:20 pm


Related issues

Related to Feature #1644: MariaDB組み込みビルド用対応 完了チェック待ち 02/23/2013

History

#1 Updated by Kentaro HAYASHI over 5 years ago

  • cmake . -DCMAKE_INSTALL_PREFIX=/tmp/localでインストールした後、/tmp/local/scripts以下にインストールされるスクリプトで初期データベースを構築しておくこと。

    % ./scripts/mysql_install_db --basedir=/tmp/local --defaults-file=my.cnf --datadir=/tmp/local/var/lib/mysql
    

  • /tmp/localへとインストールしたmysqldは以下のようにして起動できる(が、組み込みのXtraDBのところで刺さっている)

./bin/mysqld --defaults-file=/tmp/local/my.cnf --lc-messages-dir=/tmp/local/share/ --datadir=/tmp/local/var/lib/mysql --bootstrap --verbose 

#2 Updated by Kentaro HAYASHI over 5 years ago

  • libmroonga.aとしてmroongaをmysqldビルド時にリンクしているがmroonga/lib以下相当のシンボルが未解決となる。
cd /home/khayashi/work/mariadb/mariadb-5.5.28/sql && /usr/bin/cmake -E cmake_link_script CMakeFiles/mysqld.dir/link.txt --verbose=1
/usr/bin/c++   -Wall  -Wno-unused-parameter -fno-implicit-templates -fno-exceptions -fno-rtti -O3 -g -static-libgcc -fno-omit-frame-pointer -fno-strict-aliasing -DDBUG_OFF    -Wl,--export-dynamic CMakeFiles/mysqld.dir/main.cc.o  -o 
mysqld  -lpthread libsql.a ../storage/maria/libaria.a ../storage/perfschema/libperfschema.a ../storage/xtradb/libxtradb.a -laio ../storage/myisam/libmyisam.a ../storage/myisammrg/libmyisammrg.a ../storage/csv/libcsv.a ../storage/mro
onga/libmroonga.a -lgroonga ../storage/heap/libheap.a ../mysys/libmysys.a ../dbug/libdbug.a ../mysys/libmysys.a ../dbug/libdbug.a -lz -lm -lrt ../strings/libstrings.a ../vio/libvio.a ../regex/libregex.a -lpthread -lcrypt -ldl 
../storage/mroonga/libmroonga.a(ha_mroonga.cpp.o): In function `mrn_drop_db':
/home/khayashi/work/mariadb/mariadb-5.5.28/storage/mroonga/ha_mroonga.cpp:1250: undefined reference to `mrn::PathMapper::PathMapper(char const*, char const*)'
/home/khayashi/work/mariadb/mariadb-5.5.28/storage/mroonga/ha_mroonga.cpp:1253: undefined reference to `mrn::PathMapper::db_name()'
/home/khayashi/work/mariadb/mariadb-5.5.28/storage/mroonga/ha_mroonga.cpp:1265: undefined reference to `mrn::PathMapper::db_name()'
/home/khayashi/work/mariadb/mariadb-5.5.28/storage/mroonga/ha_mroonga.cpp:1261: undefined reference to `mrn::PathMapper::db_path()'
/home/khayashi/work/mariadb/mariadb-5.5.28/storage/mroonga/ha_mroonga.cpp:1255: undefined reference to `mrn::PathMapper::db_path()'
/home/khayashi/work/mariadb/mariadb-5.5.28/storage/mroonga/ha_mroonga.cpp:1256: undefined reference to `mrn::PathMapper::db_path()'
...以下未解決シンボルが続く

次、libmroonga.aビルド時のログの確認。

#3 Updated by Kentaro HAYASHI over 5 years ago

  • 5.5.28でmroongaを組み込むとmysqldの起動時に刺さっていた件については、初期化で失敗している。
[New Thread 0x7fffd8b3d700 (LWP 5459)]
121116 18:25:36  InnoDB: Waiting for the background threads to start
121116 18:25:37 Percona XtraDB (http://www.percona.com) 1.1.8-29.0 started; log sequence number 1597945
121116 18:25:37 [ERROR] Plugin 'mroonga' init function returned error.
121116 18:25:37 [ERROR] Plugin 'mroonga' registration as a STORAGE ENGINE failed.
  • 作業用の.gdbinit
    % cat .gdbinit
    set args --defaults-file=/tmp/local/my.cnf --lc-messages-dir=/tmp/local/share/ --datadir=/tmp/local/var/lib/mysql --bootstrap  --verbose 
    
  • デバッグ用のconfigure
    % cat mroonga.configure.sh
    cmake . -DBUILD_CONFIG=mysql_release \
    -DWITH_DEBUG_FULL=TRUE \
    -DFEATURE_SET=small \
    -DWITH_MROONGA_STORAGE_ENGINE=1 \
    -DCMAKE_INSTALL_PREFIX=/tmp/local
    

#4 Updated by Kentaro HAYASHI over 5 years ago

  • mrn_init()でgroongaの初期化をしているがgrn_init()時点で!=GRN_SUCCESSのため失敗している
1662      mrn_hton_ptr = hton;
(gdb) 
1665      if (grn_init() != GRN_SUCCESS) {
(gdb) 
1751      return -1;
(gdb) bt
#0  mrn_init (p=) at /home/khayashi/work/mariadb/mariadb-5.5.28/storage/mroonga/ha_mroonga.cpp:1751
#1  0x00000000006ced68 in ha_initialize_handlerton (plugin=0x29639a8) at /home/khayashi/work/mariadb/mariadb-5.5.28/sql/handler.cc:469
#2  0x00000000005a9b3b in plugin_initialize (plugin=0x29639a8) at /home/khayashi/work/mariadb/mariadb-5.5.28/sql/sql_plugin.cc:1354
#3  0x00000000005abb26 in plugin_init (argc=0x11c83d0, argv=0x1a0daf8, flags=2) at /home/khayashi/work/mariadb/mariadb-5.5.28/sql/sql_plugin.cc:1596
#4  0x000000000051c5d9 in init_server_components () at /home/khayashi/work/mariadb/mariadb-5.5.28/sql/mysqld.cc:4299
#5  0x0000000000520eab in mysqld_main (argc=27, argv=0x1a0daf8) at /home/khayashi/work/mariadb/mariadb-5.5.28/sql/mysqld.cc:4855
#6  0x00007ffff680976d in __libc_start_main () from /lib/x86_64-linux-gnu/libc.so.6
#7  0x0000000000517d81 in _start ()
(gdb) 

#5 Updated by Kouhei Sutou over 5 years ago

@grn_init()@ のどこで失敗しているかを確認しないといけませんね。

#6 Updated by Kentaro HAYASHI over 5 years ago

  • デバッガでステップ実行する限りではgrn_init()は0(GRN_SUCCESS)を返す
  • mysqldを--bootstrapオプションつきで実行したときに以下のように途中で止まる
  • mysqldを--bootstrapオプションなしで実行すると正常に起動する
  • 比較のため5.5.28(mroonga組み込み無し)で--bootstrapオプションありで実行したら途中で止まった -> mroonga組み込みによる問題ではない

--bootstrapつきで実行した場合

-[81893]% ./mroonga.mysqld.sh --bootstrap
121120 12:47:35 InnoDB: The InnoDB memory heap is disabled
121120 12:47:35 InnoDB: Mutexes and rw_locks use GCC atomic builtins
121120 12:47:35 InnoDB: Compressed tables use zlib 1.2.3
121120 12:47:35 InnoDB: Using Linux native AIO
121120 12:47:35 InnoDB: Initializing buffer pool, size = 128.0M
121120 12:47:35 InnoDB: Completed initialization of buffer pool
121120 12:47:35 InnoDB: highest supported file format is Barracuda.
121120 12:47:36  InnoDB: Waiting for the background threads to start
121120 12:47:37 Percona XtraDB (http://www.percona.com) 1.1.8-29.0 started; log sequence number 1597945

--bootstrapなしで実行した場合

-[81894]% ./mroonga.mysqld.sh 
121120 12:48:14 InnoDB: The InnoDB memory heap is disabled
121120 12:48:14 InnoDB: Mutexes and rw_locks use GCC atomic builtins
121120 12:48:14 InnoDB: Compressed tables use zlib 1.2.3
121120 12:48:14 InnoDB: Using Linux native AIO
121120 12:48:14 InnoDB: Initializing buffer pool, size = 128.0M
121120 12:48:14 InnoDB: Completed initialization of buffer pool
121120 12:48:14 InnoDB: highest supported file format is Barracuda.
121120 12:48:14  InnoDB: Waiting for the background threads to start
121120 12:48:15 Percona XtraDB (http://www.percona.com) 1.1.8-29.0 started; log sequence number 1597945
121120 12:48:15 [Note] Event Scheduler: Loaded 0 events
121120 12:48:15 [Note] /tmp/local/bin/mysqld: ready for connections.
Version: '5.5.28-MariaDB'  socket: '/tmp/mysql.sock'  port: 3306  MariaDB Server

mroonga.mysqld.shの中身 -[81895]% cat mroonga.mysqld.sh

/tmp/local/bin/mysqld --defaults-file=/tmp/local/support-files/my-small.cnf --lc-messages-dir=/tmp/local/share/ --datadir=/tmp/local/var/lib/mysql  --verbose $*

mroonga組み込まずにビルドインストールしたものを--bootstrap付きで実行した場合。(Ctrl+Dで中断)

-[81920]% ./mroonga.mysqld.sh --bootstrap
121120 13:01:48 InnoDB: The InnoDB memory heap is disabled
121120 13:01:48 InnoDB: Mutexes and rw_locks use GCC atomic builtins
121120 13:01:48 InnoDB: Compressed tables use zlib 1.2.3.4
121120 13:01:48 InnoDB: Using Linux native AIO
121120 13:01:48 InnoDB: Initializing buffer pool, size = 128.0M
121120 13:01:48 InnoDB: Completed initialization of buffer pool
121120 13:01:48 InnoDB: highest supported file format is Barracuda.
121120 13:01:48  InnoDB: Waiting for the background threads to start
121120 13:01:49 Percona XtraDB (http://www.percona.com) 1.1.8-29.0 started; log sequence number 1597945
121120 13:04:01  InnoDB: Starting shutdown...
121120 13:04:02  InnoDB: Shutdown completed; log sequence number 1597945
-[81922]% cat mroonga.mysqld.sh
/tmp/local-5.5.28-orig-install/bin/mysqld --defaults-file=/tmp/local-5.5.28-orig-install/support-files/my-small.cnf --lc-messages-dir=/tmp/local-5.5.28-orig-install/share/ --datadir=/tmp/local-5.5.28-orig-install/var/lib/mysql  --verbose $*

実行環境の準備手順 * make installにてインストール実行 * mysql_install_dbで初期データベースの構築 /tmp/local/scripts/mysql_install_db --defaults-file=/tmp/local/support-files/my-small.cnf --basedir=/tmp/local --datadir=/tmp/local/var/lib/mysql --user=ユーザ

#7 Updated by Kentaro HAYASHI over 5 years ago

  • トップディレクトリでmake testを実行するとテストは通った状態となった。詳細ログは添付。
    Running tests...
    Test project /home/khayashi/work/mariadb/mariadb-5.5.28
      Start  1: strings
    1/45 Test  #1: strings ..........................   Passed    0.07 sec
      Start  2: simple
    2/45 Test  #2: simple ...........................   Passed    0.22 sec
    ...省略
      Start 42: pfs_instr
    42/45 Test #42: pfs_instr ........................   Passed    0.03 sec
      Start 43: pfs_instr-oom
    43/45 Test #43: pfs_instr-oom ....................   Passed    0.04 sec
      Start 44: pfs
    44/45 Test #44: pfs ..............................   Passed    0.60 sec
      Start 45: dbug
    45/45 Test #45: dbug .............................   Passed    0.10 sec

100% tests passed, 0 tests failed out of 45

Total Test time (real) = 23.82 sec

#8 Updated by Kentaro HAYASHI over 5 years ago

テストの実施結果

  • set default_storage_engine=mroongaクエリで失敗している
At line 28: query 'set default_storage_engine=mroonga' failed: 1286: Unknown storage engine 'mroonga'
Too many tests(10) failed! Terminating...

Only  11  of 350 completed.
--------------------------------------------------------------------------
The servers were restarted 7 times
Spent 0.000 of 15 seconds executing testcases

Too many failed: Failed 10/10 tests, 0.00% were successful.

Failing test(s): mroonga/storage/alter_table.engine_decimal mroonga/wrapper/binlog.TODO_SPLIT_ME mroonga/wrapper/version_55.performance_schema mroonga/storage/binlog.TODO_SPLIT_ME mroonga/storage.flush_logs mroonga/storage.temporary_table mroonga/storage.truncate mroonga/storage/alter_table.add_column

The log files in var/log may give you some hint of what went wrong.

If you want to report this error, please read first the documentation
at http://dev.mysql.com/doc/mysql/en/mysql-test-suite.html

1 tests were skipped, 1 by the test itself.

mysql-test-run: *** ERROR: there were failing test cases

テストの実施手順

  • mroonga/test/run-sql-test.shを実行しテストデータのセットアップとmysql-testの実行を同時に行う。

    • テストデータはmysql-test/suite/mroonga(mroongaのtest/sql/suite/mroongaディレクトリへのシンボリックリンク)とmysql-test/suite/mroonga_wrapper_innodbが存在する。

コンソールからset default_storage_engine=mroongaを実行した場合には成功する。

-[82573]% ./bin/mysql --socket=/tmp/mysql.sock
Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MariaDB connection id is 2
Server version: 5.5.28-MariaDB Source distribution

Copyright (c) 2000, 2012, Oracle, Monty Program Ab and others.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

MariaDB [(none)]> show engines; +--------------------+---------+----------------------------------------------------------------------------+--------------+------+------------+ | Engine | Support | Comment | Transactions | XA | Savepoints | +--------------------+---------+----------------------------------------------------------------------------+--------------+------+------------+ | MyISAM | YES | MyISAM storage engine | NO | NO | NO | | InnoDB | DEFAULT | Percona-XtraDB, Supports transactions, row-level locking, and foreign keys | YES | YES | YES | | MRG_MYISAM | YES | Collection of identical MyISAM tables | NO | NO | NO | | CSV | YES | CSV storage engine | NO | NO | NO | | MEMORY | YES | Hash based, stored in memory, useful for temporary tables | NO | NO | NO | | PERFORMANCE_SCHEMA | YES | Performance Schema | NO | NO | NO | | mroonga | YES | CJK-ready fulltext search, column store | NO | NO | NO | | Aria | YES | Crash-safe tables with MyISAM heritage | NO | NO | NO | +--------------------+---------+----------------------------------------------------------------------------+--------------+------+------------+ 8 rows in set (0.00 sec)

MariaDB [(none)]> set default_storage_engine=mroonga; Query OK, 0 rows affected (0.00 sec)

MariaDB [(none)]> show engines; +--------------------+---------+----------------------------------------------------------------------------+--------------+------+------------+ | Engine | Support | Comment | Transactions | XA | Savepoints | +--------------------+---------+----------------------------------------------------------------------------+--------------+------+------------+ | MyISAM | YES | MyISAM storage engine | NO | NO | NO | | InnoDB | YES | Percona-XtraDB, Supports transactions, row-level locking, and foreign keys | YES | YES | YES | | MRG_MYISAM | YES | Collection of identical MyISAM tables | NO | NO | NO | | CSV | YES | CSV storage engine | NO | NO | NO | | MEMORY | YES | Hash based, stored in memory, useful for temporary tables | NO | NO | NO | | PERFORMANCE_SCHEMA | YES | Performance Schema | NO | NO | NO | | mroonga | DEFAULT | CJK-ready fulltext search, column store | NO | NO | NO | | Aria | YES | Crash-safe tables with MyISAM heritage | NO | NO | NO | +--------------------+---------+----------------------------------------------------------------------------+--------------+------+------------+ 8 rows in set (0.00 sec)

失敗しているテストケースの一覧

  • mariadb/mysql-test/var/log以下に格納されたログディレクトリ
  drwxrwxr-x 12 khayashi khayashi 4096 11月 20 17:49 ..
  drwxr-xr-x  4 khayashi khayashi 4096 11月 20 17:49 alter_table.add_column
  drwxr-xr-x  4 khayashi khayashi 4096 11月 20 17:49 alter_table.engine_decimal-innodb_plugin
  drwxr-xr-x  4 khayashi khayashi 4096 11月 20 17:49 binlog.TODO_SPLIT_ME
  drwxr-xr-x  4 khayashi khayashi 4096 11月 20 17:49 binlog.TODO_SPLIT_ME-innodb_plugin
  drwxr-xr-x  4 khayashi khayashi 4096 11月 20 17:49 binlog.TODO_SPLIT_ME-xtradb
  -rw-r--r--  1 khayashi khayashi 2938 11月 20 17:49 bootstrap.log
  drwxr-xr-x  4 khayashi khayashi 4096 11月 20 17:49 storage.flush_logs
  drwxr-xr-x  4 khayashi khayashi 4096 11月 20 17:49 storage.temporary_table
  drwxr-xr-x  4 khayashi khayashi 4096 11月 20 17:49 storage.truncate
  drwxr-xr-x  4 khayashi khayashi 4096 11月 20 17:49 version_55.performance_schema-innodb_plugin
  drwxr-xr-x  4 khayashi khayashi 4096 11月 20 17:49 version_55.performance_schema-xtradb

#9 Updated by Kouhei Sutou over 5 years ago

失敗するset default_storage_engine=mroongaの前でshow enginesするとどうなりますか?

#10 Updated by Kentaro HAYASHI over 5 years ago

テスト実行中にmroongaが有効化どうか確認

  • mysql-test/include/have_mroonga.incでset default_storage_engine=mroongaを呼び出しているのでその直前にshow engines;を追加

テスト実行結果からの抜粋(mysql-test/var/log/mysqltest.log)

  • supportの欄がmroongaはNOになっている。

コンソールで実行したときはSupport欄がYESになっていたのが相違点。

At line 29: query 'set default_storage_engine=mroonga' failed: 1286: Unknown storage engine 'mroonga'

The result from queries just before the failure was:
Engine  Support Comment Transactions    XA  Savepoints
MyISAM  DEFAULT MyISAM storage engine   NO  NO  NO
InnoDB  NO  Percona-XtraDB, Supports transactions, row-level locking, and foreign keys  NULL    NULL    NULL
MRG_MYISAM  YES Collection of identical MyISAM tables   NO  NO  NO
CSV YES CSV storage engine  NO  NO  NO
MEMORY  YES Hash based, stored in memory, useful for temporary tables   NO  NO  NO
partition   NO  Partition Storage Engine Helper NULL    NULL    NULL
PERFORMANCE_SCHEMA  YES Performance Schema  NO  NO  NO
mroonga NO  CJK-ready fulltext search, column store NULL    NULL    NULL
Aria    YES Crash-safe tables with MyISAM heritage  NO  NO  NO
safe_process[6736]: Got signal 17, child_pid: 6737
safe_process[6736]: Killing child: 6737
safe_process[6736]: Child exit: 1

#11 Updated by Kentaro HAYASHI over 5 years ago

  • Unknown storage engine 'mroonga'についてはCMakeLists.txtのMYSQL_ADD_PLUINGマクロを修正することで解決した。

  • 再度mysql-testを実行するとプラグインであることを前提としていることによるエラーが発生した。

    • 組み込みの場合にはuninstall plugin を実行しないようにする。(mroongaにサーバー変数を追加して、組み込みかプラグインかを判断できるようにする)
CURRENT_TEST: mroonga/wrapper.repair_table
safe_process[16850]: parent_pid: 16830
safe_process[16850]: Started child 16851, terminated: 0
mysqltest: In included file "./include/have_mroonga_deinit.inc": 
included from /home/khayashi/work/mariadb/mariadb-5.5.28.barebone/mysql-test/suite/mroonga/wrapper/t/repair_table.test at line 64:
At line 34: query 'UNINSTALL PLUGIN mroonga_stats' failed: 1305: PLUGIN mroonga_stats does not exist

The result from queries just before the failure was:
< snip >
SELECT * FROM diaries WHERE MATCH(body) AGAINST("starting");
id  title   body
2   groonga (1) starting groonga...
FLUSH TABLES;
SELECT * FROM diaries WHERE MATCH(body) AGAINST("starting");
ERROR HY000: syscall error 'repair_test.mrn.0000101' (No such file or directory)
REPAIR TABLE diaries;
Table   Op  Msg_type    Msg_text
repair_test.diaries repair  status  OK
SELECT * FROM diaries;
id  title   body
1   survey  will start groonga!
2   groonga (1) starting groonga...
3   groonga (2) started groonga.
SELECT * FROM diaries WHERE MATCH(body) AGAINST("starting");
id  title   body
2   groonga (1) starting groonga...
DROP TABLE diaries;
DROP DATABASE repair_test;
USE test;

#12 Updated by Kentaro HAYASHI over 5 years ago

やったこと

  • uninstall pluginをコメントアウトしてそれ以降のテストが通るかの確認を行った。

その結果

  • mroonga/storageはテストにすべてパスした。(Completed: All 3 tests were successful.)
  • mroonga/wrapperはテストにすべてパスした。(Completed: All 6 tests were successful.)
  • mroonga_wrapper_innodbはすべてのテストにはパスしなかった。(Too many failed: Failed 10/18 tests, 44.44% were successful.)

再現手順

コメントアウトはstorage/mroonga/test/sql/include/have_mroonga_deinit.incに対して行った。

diff --git a/test/sql/include/have_mroonga_deinit.inc b/test/sql/include/have_mroonga_deinit.inc
index 370c189..6683ea5 100644
--- a/test/sql/include/have_mroonga_deinit.inc
+++ b/test/sql/include/have_mroonga_deinit.inc
@@ -31,7 +31,7 @@ if ($have_default_tmp_storage_engine_variable)
   set default_tmp_storage_engine=MyISAM;
 }
 
-UNINSTALL PLUGIN mroonga_stats;
-UNINSTALL PLUGIN mroonga;
+#UNINSTALL PLUGIN mroonga_stats;
+#UNINSTALL PLUGIN mroonga;
 
 enable_query_log;

mysql-testディレクトリの下にsuite/mroonga/storage,suite/mroonga/wrapper,suite/mroonga_wrapper_innodbディレクトリが あるのでその3つに対して以下のコマンドをそれぞれ実行した。 ※mysql-test/suite以下のmroongaのテスト用ディレクトリはstorage/mroonga/test/以下にあるrun-sql-test.shを実行すると テストファイルをかき集めて配置されるようになっている。

./mysql-run-test.pl --force --suite=mroonga/storage 2>&1 | mroonga-storage.log
./mysql-run-test.pl --force --suite=mroonga/wrapper 2>&1 | mroonga-wrapper.log
./mysql-run-test.pl --force --suite=mroonga_wrapper_innodb 2>&1 | mroonga-wrapper-innodb.log

パスしていないテストの内容類別

  • mroongaをラッパーモードで使うときに主キーなしでcreate tableしようとするとエラーになる (既知のラッパーモードの制約)
  • bug29807テーブルが見つからない(InnoDB: Error: table test.bug29807 does not exist in the InnoDB internal)
***Warnings generated in error logs during shutdown after running tests: mroonga_wrapper_innodb.innodb_mysql

121205 11:47:46 [ERROR] Cannot find or open table test/bug29807 from
121205 11:47:46  InnoDB: Error: table `test`.`bug29807` does not exist in the InnoDB internal
  • binlog_snapshot_positionの値が異なる (一定値だけずれている傾向)
--- /home/khayashi/work/mariadb/mariadb-5.5.28.barebone/mysql-test/suite/mroonga_wrapper_innodb/r/binlog_consistent.result      2012-11-20 17:26:54.840837652 +0900
+++ /home/khayashi/work/mariadb/mariadb-5.5.28.barebone/mysql-test/suite/mroonga_wrapper_innodb/r/binlog_consistent.reject      2012-12-05 11:50:20.013297830 +0900
@@ -3,11 +3,11 @@
 CREATE TABLE t1 (a INT, b VARCHAR(100), PRIMARY KEY (a,b)) ENGINE=mroonga COMMENT='ENGINE "InnoDB"';
 SHOW MASTER STATUS;
 File   Position        Binlog_Do_DB    Binlog_Ignore_DB
-master-bin.000001      380             
+master-bin.000001      407             
 SHOW STATUS LIKE 'binlog_snapshot_%';
 Variable_name  Value
 binlog_snapshot_file   master-bin.000001
-binlog_snapshot_position       380
+binlog_snapshot_position       407
 BEGIN;
 INSERT INTO t1 VALUES (0, "");
 # Connection con1
@@ -38,10 +38,10 @@
 SHOW STATUS LIKE 'binlog_snapshot_%';
 Variable_name  Value
 binlog_snapshot_file   master-bin.000001
-binlog_snapshot_position       904
+binlog_snapshot_position       931
 SHOW MASTER STATUS;
 File   Position        Binlog_Do_DB    Binlog_Ignore_DB
-master-bin.000001      1316            
+master-bin.000001      1385            
 SELECT * FROM t2 ORDER BY a;
 a

次、パスしていないテストの詳細確認。

#13 Updated by Kentaro HAYASHI over 5 years ago

mysql-testの実行方法が不完全だった。(--suiteの指定が不十分)

./mysql-test-run.pl --no-check-testcases --parallel=4 --retry=1 --suite=mroonga,mroonga/storage,mroonga/storage/delete,mroonga/storage/delete/index,mroonga/storage/delete/index/btree,mroonga/storage/delete/index/hash,mroonga/storage/index,mroonga/storage/index/multiple_column,mroonga/storage/index/multiple_column/select,mroonga/storage/index/multiple_column/unique,mroonga/storage/index/multiple_column/unique/date,mroonga/storage/index/multiple_column/unique/date/order,mroonga/storage/index/multiple_column/unique/date/order/64bit,mroonga/storage/index/multiple_column/unique/date/order/32bit,mroonga/storage/index/multiple_column/unique/date/64bit,mroonga/storage/index/multiple_column/unique/date/32bit,mroonga/storage/index/multiple_column/unique/datetime,mroonga/storage/index/multiple_column/unique/datetime/order,mroonga/storage/index/multiple_column/unique/year,mroonga/storage/index/multiple_column/unique/year/order,mroonga/storage/index/multiple_column/unique/year/order/64bit,mroonga/storage/index/multiple_column/unique/year/order/32bit,mroonga/storage/index/multiple_column/unique/year/64bit,mroonga/storage/index/multiple_column/unique/year/32bit,mroonga/storage/index/multiple_column/unique/timestamp,mroonga/storage/index/multiple_column/unique/timestamp/order,mroonga/storage/index/multiple_column/unique/time,mroonga/storage/index/multiple_column/unique/time/order,mroonga/storage/index/multiple_column/update,mroonga/storage/index/multiple_column/primary,mroonga/storage/index/range,mroonga/storage/index/range/less_than,mroonga/storage/index/range/less_than_or_equal,mroonga/storage/index/range/greater_than_or_equal,mroonga/storage/index/range/greater_than,mroonga/storage/index/btree,mroonga/storage/index/btree/equal,mroonga/storage/index/hash,mroonga/storage/index/read,mroonga/storage/index/read/normal,mroonga/storage/index/read/multiple,mroonga/storage/index/read/primary,mroonga/storage/index/primary,mroonga/storage/index/primary/varchar,mroonga/storage/index/primary/char,mroonga/storage/index/primary/decimal,mroonga/storage/index/primary/datetime,mroonga/storage/index/primary/timestamp,mroonga/storage/index/primary/time,mroonga/storage/drop,mroonga/storage/drop/database,mroonga/storage/drop/table,mroonga/storage/alter_table,mroonga/storage/alter_table/enable_keys,mroonga/storage/alter_table/enable_keys/version_55,mroonga/storage/alter_table/enable_keys/version_56,mroonga/storage/alter_table/disable_keys,mroonga/storage/alter_table/disable_keys/version_55,mroonga/storage/alter_table/disable_keys/version_56,mroonga/storage/select,mroonga/storage/binlog,mroonga/storage/replace,mroonga/storage/geometry,mroonga/storage/show,mroonga/storage/show/create_table,mroonga/storage/auto_increment,mroonga/storage/column,mroonga/storage/column/unsigned_tinyint,mroonga/storage/column/signed_bigint,mroonga/storage/column/signed_int,mroonga/storage/column/unsigned_int,mroonga/storage/column/tinyint,mroonga/storage/column/unsigned_smallint,mroonga/storage/column/int,mroonga/storage/column/signed_tinyint,mroonga/storage/column/signed_mediumint,mroonga/storage/column/set,mroonga/storage/column/date,mroonga/storage/column/enum,mroonga/storage/column/unsigned_bigint,mroonga/storage/column/decimal,mroonga/storage/column/decimal/fractional_seconds,mroonga/storage/column/datetime,mroonga/storage/column/datetime/fractional_seconds,mroonga/storage/column/datetime/64bit,mroonga/storage/column/datetime/64bit/version_55,mroonga/storage/column/datetime/64bit/version_56,mroonga/storage/column/datetime/32bit,mroonga/storage/column/year,mroonga/storage/column/timestamp,mroonga/storage/column/timestamp/fractional_seconds,mroonga/storage/column/time,mroonga/storage/column/time/fractional_seconds,mroonga/storage/column/unsigned_mediumint,mroonga/storage/column/signed_smallint,mroonga/storage/create,mroonga/storage/create/database,mroonga/storage/create/table,mroonga/storage/variable,mroonga/storage/variable/dry_write,mroonga/storage/variable/match_escalation_threshold,mroonga/storage/variable/log_level,mroonga/storage/variable/log_file,mroonga/storage/optimization,mroonga/storage/optimization/order_limit,mroonga/storage/optimization/skip_count,mroonga/storage/insert,mroonga/storage/insert/on_duplicate_key_update,mroonga/storage/update,mroonga/storage/information_schema,mroonga/storage/information_schema/tables,mroonga/storage/information_schema/tables/auto_increment,mroonga/storage/fulltext,mroonga/storage/fulltext/boolean_mode,mroonga/storage/fulltext/parser,mroonga/storage/fulltext/order,mroonga/storage/fulltext/charset,mroonga/storage/fulltext/insert,mroonga/storage/fulltext/multiple_column_index,mroonga/storage/sub_query,mroonga/storage/function,mroonga/storage/function/last_insert_id,mroonga/storage/function/snippet,mroonga/wrapper,mroonga/wrapper/delete,mroonga/wrapper/alter_table,mroonga/wrapper/alter_table/enable_keys,mroonga/wrapper/alter_table/enable_keys/version_55,mroonga/wrapper/alter_table/enable_keys/version_56,mroonga/wrapper/alter_table/disable_keys,mroonga/wrapper/alter_table/disable_keys/version_55,mroonga/wrapper/alter_table/disable_keys/version_56,mroonga/wrapper/binlog,mroonga/wrapper/transaction,mroonga/wrapper/geometry,mroonga/wrapper/version_55,mroonga/wrapper/auto_increment,mroonga/wrapper/create,mroonga/wrapper/create/table,mroonga/wrapper/count_star,mroonga/wrapper/variable,mroonga/wrapper/variable/dry_write,mroonga/wrapper/variable/match_escalation_threshold,mroonga/wrapper/optimization,mroonga/wrapper/optimization/order_limit,mroonga/wrapper/insert,mroonga/wrapper/insert/on_duplicate_key_update,mroonga/wrapper/update,mroonga/wrapper/version_56,mroonga/wrapper/fulltext,mroonga/wrapper/fulltext/boolean_mode,mroonga/wrapper/fulltext/parser,mroonga/wrapper/fulltext/order,mroonga/wrapper/fulltext/charset,mroonga/wrapper/fulltext/insert,mroonga/wrapper/fulltext/multiple_column_index,mroonga/wrapper/function,mroonga/wrapper/function/last_insert_id --force --max-test-fail=1000

備考

  • --max-test-fail=を指定しない場合には標準で10件のエラーが検出された時点で止まる。
  • mariadbにはinclude/have_32bit.inc,include/have_64bit.incが含まれていない

#14 Updated by Kentaro HAYASHI over 5 years ago

mysql-testの実行方法にて--suiteを指定しなおして再度実行した際の結果は以下の通りとなった。

The servers were restarted 46 times
Spent 457.735 of 165 seconds executing testcases

Completed: Failed 28/353 tests, 92.07% were successful.

Failing test(s): mroonga/storage/information_schema/tables.data_length mroonga/storage/information_schema/tables/auto_increment.use mroonga/storage/information_schema/tables/auto_increment.none mroonga/storage/column/timestamp/fractional_seconds.with_index mroonga/wrapper/alter_table/disable_keys/version_55.normal mroonga/storage/alter_table/disable_keys/version_55.normal mroonga/wrapper/alter_table/enable_keys/version_55.normal mroonga/storage/alter_table/enable_keys/version_55.multiple_column mroonga/storage/alter_table/enable_keys/version_55.normal mroonga/storage/column/datetime/64bit.before_unix_epoch mroonga/storage/column/datetime/64bit/version_55.out_of_range mroonga/storage/function.last_insert_grn_id mroonga/wrapper/function.last_insert_grn_id mroonga/storage/function/snippet.ascii mroonga/storage/function/snippet.cp932 mroonga/storage/function/snippet.eucjpms mroonga/storage/index/multiple_column/unique/date/order/64bit.asc mroonga/storage/index/multiple_column/unique/date/order/64bit.desc mroonga/storage/function/snippet.japanese mroonga/storage/index/multiple_column/unique/datetime/order.asc mroonga/storage/index/multiple_column/unique/date/64bit.equal mroonga/storage/index/multiple_column/unique/datetime/order.desc mroonga/storage/index/primary/timestamp.with_fractional_seconds mroonga/storage/update.last_insert_grn_id mroonga/storage/variable.database_path_prefix

エラーログに記録された個々のエラー要因は以下の通りであった。

|テストファイル|失敗理由| |mroonga/storage/information_schema/tables.data_length|mysqld起動失敗| |mroonga/storage/information_schema/tables/auto_increment.use|mysqld起動失敗| |mroonga/storage/information_schema/tables/auto_increment.none|mysqld起動失敗| |mroonga/storage/column/timestamp/fractional_seconds.with_index|signal 11| |mroonga/wrapper/alter_table/disable_keys/version_55.normal|Using where欄の有無(MariaDBではなし)| |mroonga/storage/alter_table/disable_keys/version_55.normal|Using where欄の有無(MariaDBではなし)| |mroonga/wrapper/alter_table/enable_keys/version_55.normal|Using where欄の有無(MariaDBではなし)| |mroonga/storage/alter_table/enable_keys/version_55.multiple_column|結果の不一致| |mroonga/storage/alter_table/enable_keys/version_55.normal|Using where欄の有無(MariaDBではなし)| |mroonga/storage/column/datetime/64bit.before_unix_epoch|挿入した値と一致しない| |mroonga/storage/column/datetime/64bit/version_55.out_of_range|MySQLとMariaDBとで扱いが異なる| |mroonga/storage/function.last_insert_grn_id|signal 11| |mroonga/wrapper/function.last_insert_grn_id|signal 11| |mroonga/storage/function/snippet.ascii |signal 11| |mroonga/storage/function/snippet.cp932 |signal 11| |mroonga/storage/function/snippet.eucjpms |signal 11| |mroonga/storage/index/multiple_column/unique/date/order/64bit.asc |結果の不一致| |mroonga/storage/index/multiple_column/unique/date/order/64bit.desc |結果の不一致| |mroonga/storage/function/snippet.japanese |signal 11| |mroonga/storage/index/multiple_column/unique/datetime/order.asc |結果の不一致| |mroonga/storage/index/multiple_column/unique/date/64bit.equal |結果の不一致| |mroonga/storage/index/multiple_column/unique/datetime/order.desc |結果の不一致| |mroonga/storage/index/primary/timestamp.with_fractional_seconds |signal 11| |mroonga/storage/update.last_insert_grn_id|signal 11| |mroonga/storage/variable.database_path_prefix|command "file_exists"失敗|

#15 Updated by Kentaro HAYASHI over 5 years ago

次、

  • mroongaをMariaDBにプラグインとしてインストールした状態でmysql-testを実施する。+2
  • プラグインとしてmysq-testを実行したときと(すでに実施済みの)組み込んだときのmysql-testと結果を比較する。
  • プラグイン/組み込み時のテスト実施結果の比較をチケットにまとめる +1
  • mroongaをMariaDBにプラグインとしてインストールしたときと組み込み時で

    • 同じ動きをする -> 追加作業発生しない(組み込み作業完了)
    • 異なる動作をする -> 追加作業見積もり  

#16 Updated by Kentaro HAYASHI over 5 years ago

  • Description updated (diff)

#17 Updated by Kentaro HAYASHI over 5 years ago

mroongaをMariaDB組み込みとしてビルドし、mysql-testを実行したときと mroongaを従来通りプラグインとしてビルドし、mysql-testを実行したときの結果を比較すると以下のようになった。

  • 組み込みにすることによってsignal 11により失敗するテストが存在する
  • プラグインで失敗しているテストは組み込みでも同様に失敗する(失敗時の差分が同一であることをログから確認)

組み込みとプラグインとを比較し、同様に動作していないテストは以下の通り。(組み込みとプラグインとで失敗時の差分が一致するものを除く)

|テストファイル|失敗理由| |mroonga/storage/function.last_insert_grn_id|signal 11| |mroonga/wrapper/function.last_insert_grn_id|signal 11| |mroonga/storage/function/snippet.ascii|signal 11| |mroonga/storage/function/snippet.cp932|signal 11| |mroonga/storage/function/snippet.eucjpms|signal 11| |mroonga/storage/function/snippet.japanese|signal 11| |mroonga/storage/update.last_insert_grn_id|signal 11| |mroonga/storage/variable.database_path_prefix|command "file_exists"失敗|

variable.database_path_prefixテスト失敗時のログ抜粋

mroonga/storage/variable.database_path_prefix w3 [ fail ]
        Test ended at 2012-12-10 11:26:32

CURRENT_TEST: mroonga/storage/variable.database_path_prefix mysqltest: At line 27: command "file_exists" failed with error: 1 my_errno: 0 errno: 2

The result from queries just before the failure was: SET GLOBAL mroonga_database_path_prefix = "mroonga.data/"; SHOW GLOBAL VARIABLES LIKE 'mroonga_database_path_prefix'; Variable_name Value mroonga_database_path_prefix mroonga.data/ CREATE TABLE counts ( id INT PRIMARY KEY AUTO_INCREMENT );

mroongaをMariaDBのプラグインとしてビルドし、make checkによりmysql-testを実行したときの結果は以下の通り。

The servers were restarted 33 times
Spent 409.287 of 146 seconds executing testcases

Completed: Failed 19/353 tests, 94.62% were successful.

Failing test(s): mroonga/storage/information_schema/tables.data_length mroonga/storage/information_schema/tables/auto_increment.use mroonga/storage/information_schema/tables/auto_increment.none mroonga/storage/column/timestamp/fractional_seconds.with_index mroonga/wrapper/alter_table/disable_keys/version_55.normal mroonga/storage/alter_table/disable_keys/version_55.normal mroonga/wrapper/alter_table/enable_keys/version_55.normal mroonga/storage/alter_table/enable_keys/version_55.multiple_column mroonga/storage/alter_table/enable_keys/version_55.normal mroonga/storage/column/datetime/64bit.before_unix_epoch mroonga/storage/column/datetime/64bit/version_55.out_of_range mroonga/storage/index/multiple_column/unique/date/64bit.equal mroonga/storage/index/multiple_column/unique/date/order/64bit.asc mroonga/storage/index/multiple_column/unique/date/order/64bit.desc mroonga/storage/index/multiple_column/unique/datetime/order.asc mroonga/storage/index/multiple_column/unique/datetime/order.desc mroonga/storage/index/primary/timestamp.with_fractional_seconds

The log files in var/log may give you some hint of what went wrong.

プラグインでmysql-testを実施したときの失敗した場合の一覧は以下の通り。

|テストファイル|失敗理由| |mroonga/storage/information_schema/tables.data_length|mysqld起動失敗| |mroonga/storage/information_schema/tables/auto_increment.use|mysqld起動失敗| |mroonga/storage/information_schema/tables/auto_increment.none|mysqld起動失敗| |mroonga/storage/column/timestamp/fractional_seconds.with_index|signal 11| |mroonga/wrapper/alter_table/disable_keys/version_55.normal|Using where欄の有無(MariaDBではなし)| |mroonga/storage/alter_table/disable_keys/version_55.normal|Using where欄の有無(MariaDBではなし)| |mroonga/wrapper/alter_table/enable_keys/version_55.normal|Using where欄の有無(MariaDBではなし)| |mroonga/storage/alter_table/enable_keys/version_55.multiple_column|結果の不一致| <-要確認 |mroonga/storage/alter_table/enable_keys/version_55.normal|Using where欄の有無(MariaDBではなし)| |mroonga/wrapper/alter_table/disable_keys/version_55.normal|Using where欄の有無(MariaDBではなし)| 重複? |mroonga/storage/column/datetime/64bit.before_unix_epoch|結果の不一致| |mroonga/storage/column/datetime/64bit/version_55.out_of_range|MySQLとMariaDBとで扱いが異なる| |mroonga/wrapper/alter_table/enable_keys/version_55.normal|Using where欄の有無(MariaDBではなし)| |mroonga/storage/index/multiple_column/unique/date/64bit.equal|結果の不一致| |mroonga/storage/index/multiple_column/unique/date/order/64bit.asc|結果の不一致| |mroonga/storage/index/multiple_column/unique/date/order/64bit.desc|結果の不一致| |mroonga/storage/index/multiple_column/unique/datetime/order.asc|結果の不一致| |mroonga/storage/index/multiple_column/unique/datetime/order.desc|結果の不一致| |mroonga/storage/index/primary/timestamp.with_fractional_seconds|signal 11|

#18 Updated by Kentaro HAYASHI over 5 years ago

組み込みにすることによりsignal 11で落ちるテストが存在していたが、これはUDFを使用しているテストでcreate function ... 構文の箇所で落ちていることを確認。

#19 Updated by Kentaro HAYASHI over 5 years ago

組み込みにしたときにmroonga/storage/variable.database_path_prefixのテストが失敗する

  • -SET GLOBALによりmroonga_database_path_prefixを設定できてはいるが、mroonga.data/ディレクトリ以下にtest.mrnが意図どおりに作成されない。-

    • 採取したディレクトリが後続のテストで上書きされていたので判断保留

失敗しているテストデータ:

--source include/have_mroonga.inc
--source include/have_mroonga_helper.inc

SET GLOBAL mroonga_database_path_prefix = "mroonga.data/"; SHOW GLOBAL VARIABLES LIKE 'mroonga_database_path_prefix';

CREATE TABLE counts ( id INT PRIMARY KEY AUTO_INCREMENT );

--file_exists $MYSQLD_DATADIR/mroonga.data/test.mrn

INSERT INTO counts VALUES (NULL);

SELECT * FROM counts;

DROP TABLE counts;

--source include/have_mroonga_deinit.inc

失敗箇所

--file_exists $MYSQLD_DATADIR/mroonga.data/test.mrn

失敗時のログ

worker[2] > Stopping all servers...
worker[2] Saving datadirs...
worker[2]  - saving '/home/khayashi/work/mariadb/mariadb-5.5.28.barebone/mysql-test/var/2/mysqld.1'
worker[2] mroonga/storage/variable.database_path_prefix w2 worker[2] [ fail ]
        Test ended at 2013-01-21 12:36:22
worker[2] 
CURRENT_TEST: mroonga/storage/variable.database_path_prefix
safe_process[29995]: parent_pid: 26862
safe_process[29995]: Started child 30002, terminated: 0
mysqltest: At line 27: command "file_exists" failed with error: 1  my_errno: 0  errno: 2

The result from queries just before the failure was: SET GLOBAL mroonga_database_path_prefix = "mroonga.data/"; SHOW GLOBAL VARIABLES LIKE 'mroonga_database_path_prefix'; Variable_name Value mroonga_database_path_prefix mroonga.data/ CREATE TABLE counts ( id INT PRIMARY KEY AUTO_INCREMENT ); safe_process[29995]: Got signal 17, child_pid: 30002 safe_process[29995]: Killing child: 30002 safe_process[29995]: Child exit: 1

失敗時のディレクトリ階層

  /home/khayashi/work/mariadb/mariadb-5.5.28.barebone/mysql-test/var/2/mysqld.1/data:
  合計 28780
  drwxr-xr-x 6 khayashi khayashi     4096  1月 21 12:36 .
  drwxr-xr-x 3 khayashi khayashi     4096  1月 21 12:36 ..
  -rw-rw---- 1 khayashi khayashi    16384  1月 21 12:36 aria_log.00000001
  -rw-rw---- 1 khayashi khayashi       52  1月 21 12:36 aria_log_control
  -rw-r--r-- 1 khayashi khayashi     8096  1月 21 12:36 groonga.log
  -rw-rw---- 1 khayashi khayashi  5242880  1月 21 12:36 ib_logfile0
  -rw-rw---- 1 khayashi khayashi  5242880  1月 21 12:36 ib_logfile1
  -rw-rw---- 1 khayashi khayashi 18874368  1月 21 12:36 ibdata1
  drwxr-xr-x 2 khayashi khayashi     4096  1月 21 12:36 mtr
  drwxr-xr-x 2 khayashi khayashi     4096  1月 21 12:36 mysql
  drwxr-xr-x 2 khayashi khayashi     4096  1月 21 12:36 performance_schema
  drwxr-xr-x 2 khayashi khayashi     4096  1月 21 12:36 test
  -rw-rw---- 1 khayashi khayashi     4096  1月 21 12:36 test.mrn
  -rw-rw---- 1 khayashi khayashi 12857344  1月 21 12:36 test.mrn.0000000
  -rw-rw---- 1 khayashi khayashi  1048576  1月 21 12:36 test.mrn.001

-[97342]% tree
.
├── data
│   ├── aria_log.00000001
│   ├── aria_log_control
│   ├── groonga.log
│   ├── mtr
│   │   ├── db.opt
│   │   ├── global_suppressions.MYD
│   │   ├── global_suppressions.MYI
│   │   ├── global_suppressions.TRG
│   │   ├── global_suppressions.frm
│   │   ├── gs_insert.TRN
│   │   ├── test_suppressions.MYD
│   │   ├── test_suppressions.MYI
│   │   ├── test_suppressions.TRG
│   │   ├── test_suppressions.frm
│   │   └── ts_insert.TRN
│   ├── mysql
│   │   ├── columns_priv.MYD
│   │   ├── columns_priv.MYI
│   │   ├── columns_priv.frm
│   │   ├── db.MYD
│   │   ├── db.MYI
│   │   ├── db.frm
│   │   ├── event.MYD
│   │   ├── event.MYI
│   │   ├── event.frm
│   │   ├── func.MYD
│   │   ├── func.MYI
│   │   ├── func.frm
│   │   ├── general_log.CSM
│   │   ├── general_log.CSV
│   │   ├── general_log.frm
│   │   ├── help_category.MYD
│   │   ├── help_category.MYI
│   │   ├── help_category.frm
│   │   ├── help_keyword.MYD
│   │   ├── help_keyword.MYI
│   │   ├── help_keyword.frm
│   │   ├── help_relation.MYD
│   │   ├── help_relation.MYI
│   │   ├── help_relation.frm
│   │   ├── help_topic.MYD
│   │   ├── help_topic.MYI
│   │   ├── help_topic.frm
│   │   ├── host.MYD
│   │   ├── host.MYI
│   │   ├── host.frm
│   │   ├── ndb_binlog_index.MYD
│   │   ├── ndb_binlog_index.MYI
│   │   ├── ndb_binlog_index.frm
│   │   ├── plugin.MYD
│   │   ├── plugin.MYI
│   │   ├── plugin.frm
│   │   ├── proc.MYD
│   │   ├── proc.MYI
│   │   ├── proc.frm
│   │   ├── procs_priv.MYD
│   │   ├── procs_priv.MYI
│   │   ├── procs_priv.frm
│   │   ├── proxies_priv.MYD
│   │   ├── proxies_priv.MYI
│   │   ├── proxies_priv.frm
│   │   ├── servers.MYD
│   │   ├── servers.MYI
│   │   ├── servers.frm
│   │   ├── slow_log.CSM
│   │   ├── slow_log.CSV
│   │   ├── slow_log.frm
│   │   ├── tables_priv.MYD
│   │   ├── tables_priv.MYI
│   │   ├── tables_priv.frm
│   │   ├── time_zone.MYD
│   │   ├── time_zone.MYI
│   │   ├── time_zone.frm
│   │   ├── time_zone_leap_second.MYD
│   │   ├── time_zone_leap_second.MYI
│   │   ├── time_zone_leap_second.frm
│   │   ├── time_zone_name.MYD
│   │   ├── time_zone_name.MYI
│   │   ├── time_zone_name.frm
│   │   ├── time_zone_transition.MYD
│   │   ├── time_zone_transition.MYI
│   │   ├── time_zone_transition.frm
│   │   ├── time_zone_transition_type.MYD
│   │   ├── time_zone_transition_type.MYI
│   │   ├── time_zone_transition_type.frm
│   │   ├── user.MYD
│   │   ├── user.MYI
│   │   └── user.frm
│   ├── performance_schema
│   │   ├── cond_instances.frm
│   │   ├── db.opt
│   │   ├── events_waits_current.frm
│   │   ├── events_waits_history.frm
│   │   ├── events_waits_history_long.frm
│   │   ├── events_waits_summary_by_instance.frm
│   │   ├── events_waits_summary_by_thread_by_event_name.frm
│   │   ├── events_waits_summary_global_by_event_name.frm
│   │   ├── file_instances.frm
│   │   ├── file_summary_by_event_name.frm
│   │   ├── file_summary_by_instance.frm
│   │   ├── mutex_instances.frm
│   │   ├── performance_timers.frm
│   │   ├── rwlock_instances.frm
│   │   ├── setup_consumers.frm
│   │   ├── setup_instruments.frm
│   │   ├── setup_timers.frm
│   │   └── threads.frm
│   ├── test
│   ├── test.mrn
│   ├── test.mrn.0000000
│   └── test.mrn.001
├── mysqld-slow.log
└── mysqld.log

5 directories, 109 files

#20 Updated by Kentaro HAYASHI over 5 years ago

後続テストでエラーが上書きされていたので、max-save-datadir=0を試す。

#21 Updated by Kentaro HAYASHI over 5 years ago

database_path_prefixのテストで失敗する件については

  • mysql-test ./mysql-test-run.pl --max-save-datadir=0 --no-check-testcases --parallel=4 --retry=1 --force --max-fail=0 --suite=....でまとめて実行するとテストに失敗する
  • mysql-test ./mysql-test-run.pl --max-save-datadir=0 --no-check-testcases --parallel=1 --retry=1 --force --max-fail=0 --suite=....にして並行実行なしにしてもテストに失敗する(parallelは影響しない)
  • mysql-test ./mysql-test-run.pl --max-save-datadir=0 --no-check-testcases --parallel=4 --retry=1 --force --max-fail=0 --suite=mroonga/storage/variableを指定し問題となっているテストに絞って実行するとテストは成功する(このとき実行されるのはversion.testとdatabase_path_prefix.test)

...はmroongaのテスト指定 (コメント #13に記載)

#22 Updated by Kentaro HAYASHI over 5 years ago

テストデータが上書きされずに保存される再現性のある小さなテストの実行手順は以下の通り。この例に対してsuiteを増減させるとvariable.database_path_prefixのテストに成功/失敗が変化する。

./mysql-test-run.pl --force --no-check-testcases --parallel=4 --retry=1 --suite=mroonga/storage/variable,mroonga/storage/optimization,mroonga/storage/insert/on_duplicate_key_update,mroonga/storage/information_schema,mroonga/storage/fulltext/boolean_mode

#23 Updated by Kentaro HAYASHI over 5 years ago

  • mysql-test-run.plのオプションとして--force-restartを適用することで、database_path_prefixのテストに成功するようになった。

    • テスト単位でサーバーをリスタートするので、他のテストと設定が干渉してテストが失敗するということがなくなる。

参考: http://dev.mysql.com/doc/mysqltest/2.0/en/mysql-test-run-pl.html

#24 Updated by Kentaro HAYASHI over 5 years ago

手元で再度、再現環境を用意した。

組み込みにすることでsignal 11で落ちていたテストについて、--force-restartでも同様に落ちていることを確認した。 database_path_prefixの場合とは違って他のテストとの干渉が要因でないことがわかった。

次、個別のテストで原因を調べる。

#25 Updated by Kentaro HAYASHI over 5 years ago

signal 11で落ちているテストでは、 drop functionで一旦削除し、create functionでプラグインのha_mroonga.soから再度登録する流れでテストしていた。 その際のcreate functionで落ちている。

以下のようにして落ちるテストを個別に実行した。(これはlast_insert_grn_idのテスト)

./mysql-test-run.pl --verbose --no-check-testcases --parallel=4 --retry=1 --force --max-test-fail=1000 --suite=mroonga/storage/function

drop functionやcreate functionを実行している箇所をコメントアウトして実行するとlast_insert_grn_idが存在しない。(これは期待とは異なる結果)

CURRENT_TEST: mroonga/storage/function.last_insert_grn_id
safe_process[21584]: parent_pid: 21576
safe_process[21584]: Started child 21585, terminated: 0
mysqltest: At line 27: query 'select last_insert_grn_id()' failed: 1305: FUNCTION test.last_insert_grn_id does not exist

The result from queries just before the failure was: drop table if exists t1, t2, t3; create table t1 (_id int, c1 int); select last_insert_grn_id(); safe_process[21584]: Got signal 17, child_pid: 21585 safe_process[21584]: Killing child: 21585 safe_process[21584]: Child exit: 1

mroonga/storage/function.last_insert_grn_id w2 [ fail ] Test ended at 2013-02-15 15:16:20

CURRENT_TEST: mroonga/storage/function.last_insert_grn_id safe_process[21584]: parent_pid: 21576 safe_process[21584]: Started child 21585, terminated: 0 mysqltest: At line 27: query 'select last_insert_grn_id()' failed: 1305: FUNCTION test.last_insert_grn_id does not exist

The result from queries just before the failure was: drop table if exists t1, t2, t3; create table t1 (_id int, c1 int); select last_insert_grn_id(); safe_process[21584]: Got signal 17, child_pid: 21585 safe_process[21584]: Killing child: 21585 safe_process[21584]: Child exit: 1

組み込みでビルドしているはずなので、シンボルを確認してみたところlast_insert_grn_idは存在する(これは期待どおり)

-[108121]% nm bin/mysqld|grep last_insert_grn_id
0000000000a0e990 t last_insert_grn_id
0000000000a0e9c0 t last_insert_grn_id_deinit
0000000000a0e920 t last_insert_grn_id_init
-[108122]% nm bin/mysqld|grep mroonga_snippet
0000000000a0f030 t mroonga_snippet
0000000000a0f2d0 t mroonga_snippet_deinit
0000000000a0ebe0 t mroonga_snippet_init

#26 Updated by Kentaro HAYASHI over 5 years ago

-DWITH_DEBUG_FULLを有効にしてから/tmp/local-testへインストールした状態で該当箇所のバックトレースをとろうとしたが、 mysql-testを実行したときと症状が異なる。

-[108206]% sudo ./bin/mysql --socket=/tmp/mysql.sock
Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MariaDB connection id is 2
Server version: 5.5.28-MariaDB MariaDB Server

Copyright (c) 2000, 2012, Oracle, Monty Program Ab and others.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

MariaDB [(none)]> select * from mysql.func; Empty set (0.00 sec)

MariaDB [(none)]> select * from information_schema.plugins where plugin_name like 'mroonga%' -> ; +---------------+----------------+---------------+--------------------+---------------------+----------------+------------------------+---------------------+-----------------------------------------+----------------+-------------+-----------------+---------------------+ | PLUGIN_NAME | PLUGIN_VERSION | PLUGIN_STATUS | PLUGIN_TYPE | PLUGIN_TYPE_VERSION | PLUGIN_LIBRARY | PLUGIN_LIBRARY_VERSION | PLUGIN_AUTHOR | PLUGIN_DESCRIPTION | PLUGIN_LICENSE | LOAD_OPTION | PLUGIN_MATURITY | PLUGIN_AUTH_VERSION | +---------------+----------------+---------------+--------------------+---------------------+----------------+------------------------+---------------------+-----------------------------------------+----------------+-------------+-----------------+---------------------+ | mroonga | 2.11 | ACTIVE | STORAGE ENGINE | 50528.0 | NULL | NULL | The mroonga project | CJK-ready fulltext search, column store | GPL | FORCE | Stable | 2.11 | | mroonga_stats | 2.11 | ACTIVE | INFORMATION SCHEMA | 50528.0 | NULL | NULL | The mroonga project | Statistics for mroonga | GPL | FORCE | Stable | 2.11 | +---------------+----------------+---------------+--------------------+---------------------+----------------+------------------------+---------------------+-----------------------------------------+----------------+-------------+-----------------+---------------------+ 2 rows in set (0.00 sec)

MariaDB [(none)]> create function last_insert_grn_id returns integer soname 'ha_mroonga.so'; ERROR 1126 (HY000): Can't open shared library 'ha_mroonga.so' (errno: 0 /tmp/local-test/lib/plugin/ha_mroonga.so: undefined symbol: safe_mutex_lock) MariaDB [(none)]> quit

#27 Updated by Kentaro HAYASHI over 5 years ago

テスト対象ファイル: suite/mroonga/function/t/last_insert_grn_id.test テスト実行方法: ./mysql-test-run.pl --verbose --no-check-testcases --parallel=4 --retry=1 --force --max-test-fail=1000 --suite=mroonga/storage/function

  1. mysqltestを実施
  2. mysqltestを実施(ただしdrop functionやcreate functionはコメントアウト)
  3. ../storage/mroonga/ha_mroonga.soを削除してmysqltest実施
  4. ../storage/mroonga/ha_mroonga.soを削除した上で、テストからdrop functionやcreate functionをコメントアウトしてmysqltest実施
  • 1.でSEGVが再現 (今回の問題点)
  • 2.ではlast_insert_grn_idが見つからない

    • mysqltest: At line 30: query 'select last_insert_grn_id()' failed: 1305: FUNCTION test.last_insert_grn_id does not exist (これは期待とは異なる)
  • 3.ではha_mroonga.soが見つからない

    • mysqltest: At line 27: query 'create function last_insert_grn_id returns integer soname 'ha_mroonga.so'' failed: 1126: Can't open shared library 'ha_mroonga.so' (errno: 0 /home/khayashi/work/mariadb/mariadb-5.5.28.barebone/mysql-test/var/3/plugins/ha_mroonga.so: cannot open shared object file: No s) (これは期待どおり)
  • 4.ではlast_insert_grn_idが見つからない

    • mysqltest: At line 30: query 'select last_insert_grn_id()' failed: 1305: FUNCTION test.last_insert_grn_id does not exist (これは期待とは異なる)

mysqltestでha_mroonga.soを参照してしまっていたので、mroongaを組み込んだ状態でさらにプラグインのUDFを登録しようとして落ちていることがわかった。 それとは別で、プラグインのUDFだったlast_insert_grn_idが組み込みんだときに見つからないのが問題であることもわかった。

#28 Updated by Kentaro HAYASHI over 5 years ago

残り作業と

  • WITH_MROONGA_STORAGE_ENGINEが指定されたときにプラグインをビルドインストールしないようにする -> 1h?
  • WITH_MROONGA_STORAGE_ENGINEが指定されたときにビルトイン関数相当としてlast_insert_grn_idとmroonga_snippetを提供する  * UDFは.soで提供することが前提なので目的に沿わないのと、ビルトイン関数にするにはMariaDBのソースを修正しないといけない。組み込みのストレージエンジンからcreate functionせずに使うための方法を調べる -> ?

#29 Updated by Kouhei Sutou over 5 years ago

  • Category set to MariaDB対応

Also available in: Atom PDF