summaryrefslogtreecommitdiff
path: root/storage
diff options
context:
space:
mode:
authorunknown <monty@mysql.com>2005-11-05 01:32:55 +0200
committerunknown <monty@mysql.com>2005-11-05 01:32:55 +0200
commit2361720c981fc2eb27bc97c1ea7e043b634ffae1 (patch)
tree4a7b533b6da471261f5c13c46e4e9f256ec63a0c /storage
parenta3db4abe8b5ecad27adaff3baa78a913d0b84f10 (diff)
parentd4a7867a9ee0a44c8c943c75b5eb15e450ac61a7 (diff)
downloadmariadb-git-2361720c981fc2eb27bc97c1ea7e043b634ffae1.tar.gz
Merge mysql.com:/home/my/mysql-5.0
into mysql.com:/home/my/mysql-5.1 BUILD/FINISH.sh: Auto merged BitKeeper/deleted/.del-makefilewin.i~5c8479dcb8a455b2: Auto merged BitKeeper/deleted/.del-makefilewin~13888739357b3025: Auto merged BitKeeper/deleted/.del-makefilewin~14f24a4a173e2fcd: Auto merged BitKeeper/deleted/.del-makefilewin~15e9e5c9e8fa870b: Auto merged BitKeeper/deleted/.del-makefilewin~1c53f31b88dd36e: Auto merged BitKeeper/deleted/.del-makefilewin~1dbc058d76ebf1db: Auto merged BitKeeper/deleted/.del-makefilewin~2e0407fe123f8365: Auto merged BitKeeper/deleted/.del-makefilewin~2fc379bd4065c995: Auto merged BitKeeper/deleted/.del-makefilewin~389ee2dcf79afb79: Auto merged BitKeeper/deleted/.del-makefilewin~4d139e182457e553: Auto merged BitKeeper/deleted/.del-makefilewin~5104767c73775697: Auto merged BitKeeper/deleted/.del-makefilewin~608ed49dcd88e0f7: Auto merged BitKeeper/deleted/.del-makefilewin~63acd666293282a: Auto merged BitKeeper/deleted/.del-makefilewin~6ba64863bce3d0b8: Auto merged BitKeeper/deleted/.del-makefilewin~72a64128bacce71b: Auto merged BitKeeper/deleted/.del-makefilewin~78000390c783b1c5: Auto merged BitKeeper/deleted/.del-makefilewin~7a9d7d5a42bbfaf5: Auto merged Makefile.am: Auto merged BitKeeper/deleted/.del-makefilewin~a40ea12eebdd6ef0: Auto merged BitKeeper/deleted/.del-makefilewin~aeea7c82f21f7cf5: Auto merged BitKeeper/deleted/.del-makefilewin~b643e38d8da389ac: Auto merged BitKeeper/deleted/.del-makefilewin~c7b621c745e5de95: Auto merged BitKeeper/deleted/.del-makefilewin~c8273a47b90f52bb: Auto merged BitKeeper/deleted/.del-makefilewin~d1a9d1f7d33fcb73: Auto merged BitKeeper/deleted/.del-makefilewin~d37b6b303348c871: Auto merged BitKeeper/deleted/.del-makefilewin~d90f35fdc3f2ee5f: Auto merged BitKeeper/deleted/.del-makefilewin~dc4b8ad5ea53bd: Auto merged BitKeeper/deleted/.del-makefilewin~dea10ec1c94f7be: Auto merged BitKeeper/deleted/.del-makefilewin~ef3a208fa0e9b0db: Auto merged BitKeeper/deleted/.del-makefilewin~f1e3b890aa1c9ea3: Auto merged BitKeeper/deleted/.del-makefilewin~f4b7b99a887b7de: Auto merged BitKeeper/deleted/.del-makefilewin~fdda94ad32fa9e34: Auto merged BitKeeper/deleted/.del-my_cnf~977f69858affc57b: Auto merged BitKeeper/etc/config: Auto merged VC++Files/libmysqld/libmysqld.dsp: Auto merged VC++Files/sql/mysqld.dsp: Auto merged client/mysqltest.c: Auto merged include/Makefile.am: Auto merged include/base64.h: Auto merged include/my_base.h: Auto merged include/mysql_com.h: Auto merged libmysqld/Makefile.am: Auto merged mysql-test/mysql-test-run.pl: Auto merged mysql-test/mysql-test-run.sh: Auto merged mysql-test/r/ndb_basic.result: Auto merged mysql-test/r/ndb_condition_pushdown.result: Auto merged mysql-test/t/alter_table.test: Auto merged mysql-test/t/disabled.def: Auto merged mysql-test/t/query_cache.test: Auto merged mysys/Makefile.am: Auto merged mysys/base64.c: Auto merged scripts/make_win_src_distribution.sh: Auto merged scripts/mysql_create_system_tables.sh: Auto merged scripts/mysql_fix_privilege_tables.sql: Auto merged sql/Makefile.am: Auto merged sql/field.cc: Auto merged sql/field.h: Auto merged sql/ha_berkeley.cc: Auto merged sql/ha_berkeley.h: Auto merged sql/ha_federated.cc: Auto merged sql/ha_innodb.cc: Auto merged sql/ha_myisam.cc: Auto merged sql/ha_ndbcluster.cc: Auto merged sql/handler.h: Auto merged sql/item.cc: Auto merged sql/item_subselect.cc: Auto merged sql/log.cc: Auto merged sql/log_event.cc: Auto merged sql/mysqld.cc: Auto merged sql/opt_range.cc: Auto merged sql/repl_failsafe.cc: Auto merged sql/slave.cc: Auto merged sql/slave.h: Auto merged sql/sp.cc: Auto merged sql/sql_acl.cc: Auto merged sql/sql_base.cc: Auto merged sql/sql_cache.cc: Auto merged sql/sql_class.h: Auto merged sql/sql_delete.cc: Auto merged sql/sql_help.cc: Auto merged sql/sql_insert.cc: Auto merged sql/sql_lex.cc: Auto merged sql/sql_lex.h: Auto merged sql/sql_load.cc: Auto merged sql/sql_parse.cc: Auto merged sql/sql_prepare.cc: Auto merged sql/sql_repl.cc: Auto merged sql/sql_select.cc: Auto merged sql/sql_select.h: Auto merged sql/sql_show.cc: Auto merged sql/sql_yacc.yy: Auto merged sql/table.h: Auto merged storage/heap/_check.c: Auto merged storage/heap/hp_create.c: Auto merged storage/innobase/include/Makefile.am: Auto merged storage/innobase/include/rem0rec.h: Auto merged storage/innobase/include/rem0rec.ic: Auto merged storage/innobase/row/row0ins.c: Auto merged storage/innobase/row/row0upd.c: Auto merged storage/myisam/mi_check.c: Auto merged storage/myisam/mi_delete.c: Auto merged storage/myisam/mi_rkey.c: Auto merged storage/myisam/mi_rnext_same.c: Auto merged storage/myisam/mi_search.c: Auto merged storage/myisam/mi_write.c: Auto merged storage/myisam/myisamchk.c: Auto merged storage/myisam/myisamdef.h: Auto merged storage/myisam/sort.c: Auto merged storage/myisammrg/myrg_queue.c: Auto merged storage/ndb/config/type_util.mk.am: Auto merged storage/ndb/include/kernel/signaldata/DumpStateOrd.hpp: Auto merged storage/ndb/include/mgmapi/mgmapi_config_parameters.h: Auto merged storage/ndb/include/mgmapi/ndbd_exit_codes.h: Auto merged storage/ndb/include/transporter/TransporterCallback.hpp: Auto merged storage/ndb/src/common/mgmcommon/IPCConfig.cpp: Auto merged storage/ndb/src/common/transporter/SHM_Transporter.cpp: Auto merged storage/ndb/src/common/transporter/SHM_Transporter.hpp: Auto merged storage/ndb/src/common/transporter/SHM_Transporter.unix.cpp: Auto merged storage/ndb/src/common/transporter/SHM_Transporter.win32.cpp: Auto merged storage/ndb/src/common/transporter/Transporter.hpp: Auto merged storage/ndb/src/common/transporter/TransporterRegistry.cpp: Auto merged storage/ndb/src/common/util/Makefile.am: Auto merged storage/ndb/src/common/util/Parser.cpp: Auto merged storage/ndb/src/kernel/blocks/dbdict/Dbdict.cpp: Auto merged storage/ndb/src/kernel/blocks/dbtc/DbtcMain.cpp: Auto merged storage/ndb/src/kernel/blocks/ndbcntr/NdbcntrMain.cpp: Auto merged storage/ndb/src/kernel/blocks/qmgr/QmgrMain.cpp: Auto merged storage/ndb/src/kernel/error/ndbd_exit_codes.c: Auto merged storage/ndb/src/kernel/vm/FastScheduler.cpp: Auto merged storage/ndb/src/kernel/vm/TransporterCallback.cpp: Auto merged storage/ndb/src/kernel/vm/VMSignal.hpp: Auto merged storage/ndb/src/mgmapi/mgmapi.cpp: Auto merged storage/ndb/src/mgmsrv/ConfigInfo.cpp: Auto merged storage/ndb/src/mgmsrv/InitConfigFileParser.cpp: Auto merged storage/ndb/src/mgmsrv/MgmtSrvr.cpp: Auto merged storage/ndb/src/mgmsrv/MgmtSrvr.hpp: Auto merged storage/ndb/src/mgmsrv/Services.cpp: Auto merged storage/ndb/src/ndbapi/TransporterFacade.cpp: Auto merged storage/ndb/test/ndbapi/testBackup.cpp: Auto merged storage/ndb/test/ndbapi/testOperations.cpp: Auto merged storage/ndb/test/src/HugoCalculator.cpp: Auto merged storage/ndb/tools/ndb_condig.cpp: Auto merged strings/ctype-big5.c: Auto merged strings/ctype-ucs2.c: Auto merged support-files/mysql.spec.sh: Auto merged BUILD/SETUP.sh: manual merge configure.in: manual merge mysql-test/r/alter_table.result: manual merge sql/handler.cc: manual merge sql/mysql_priv.h: manual merge sql/records.cc: manual merge sql/share/errmsg.txt: manual merge sql/sql_table.cc: manual merge Fix labels sql/sql_update.cc: manual merge sql/table.cc: manual merge sql/unireg.cc: manual merge storage/ndb/config/type_ndbapi.mk.am: manual merge
Diffstat (limited to 'storage')
-rw-r--r--storage/heap/_check.c4
-rw-r--r--storage/heap/hp_create.c4
-rw-r--r--storage/innobase/btr/makefilewin16
-rw-r--r--storage/innobase/buf/makefilewin20
-rw-r--r--storage/innobase/data/makefilewin11
-rw-r--r--storage/innobase/dict/makefilewin21
-rw-r--r--storage/innobase/dyn/makefilewin9
-rw-r--r--storage/innobase/eval/makefilewin10
-rw-r--r--storage/innobase/fil/makefilewin10
-rw-r--r--storage/innobase/fsp/makefilewin9
-rw-r--r--storage/innobase/fut/makefilewin12
-rw-r--r--storage/innobase/ha/makefilewin10
-rw-r--r--storage/innobase/ibuf/makefilewin7
-rw-r--r--storage/innobase/include/Makefile.am2
-rw-r--r--storage/innobase/include/makefilewin.i34
-rw-r--r--storage/innobase/include/rem0rec.h9
-rw-r--r--storage/innobase/include/rem0rec.ic16
-rw-r--r--storage/innobase/lock/makefilewin7
-rw-r--r--storage/innobase/log/makefilewin10
-rw-r--r--storage/innobase/mach/makefilewin9
-rw-r--r--storage/innobase/makefilewin164
-rw-r--r--storage/innobase/mem/makefilewin10
-rw-r--r--storage/innobase/mtr/makefilewin14
-rw-r--r--storage/innobase/my_cnf63
-rw-r--r--storage/innobase/os/makefilewin17
-rw-r--r--storage/innobase/page/makefilewin12
-rw-r--r--storage/innobase/pars/makefilewin26
-rw-r--r--storage/innobase/que/makefilewin7
-rw-r--r--storage/innobase/read/makefilewin7
-rw-r--r--storage/innobase/rem/makefilewin12
-rw-r--r--storage/innobase/row/makefilewin34
-rw-r--r--storage/innobase/row/row0upd.c12
-rw-r--r--storage/innobase/srv/makefilewin15
-rw-r--r--storage/innobase/sync/makefilewin14
-rw-r--r--storage/innobase/thr/makefilewin9
-rw-r--r--storage/innobase/trx/makefilewin26
-rw-r--r--storage/innobase/usr/makefilewin7
-rw-r--r--storage/innobase/ut/makefilewin21
-rw-r--r--storage/myisam/mi_check.c251
-rw-r--r--storage/myisam/mi_delete.c6
-rw-r--r--storage/myisam/mi_rkey.c4
-rw-r--r--storage/myisam/mi_rnext_same.c4
-rw-r--r--storage/myisam/mi_search.c65
-rw-r--r--storage/myisam/mi_write.c6
-rw-r--r--storage/myisam/myisamchk.c23
-rw-r--r--storage/myisam/myisamdef.h7
-rw-r--r--storage/myisam/sort.c8
-rw-r--r--storage/myisammrg/myrg_queue.c4
-rw-r--r--storage/ndb/config/type_ndbapi.mk.am4
-rw-r--r--storage/ndb/config/type_util.mk.am4
-rw-r--r--storage/ndb/include/kernel/signaldata/DumpStateOrd.hpp2
-rw-r--r--storage/ndb/include/mgmapi/mgmapi_config_parameters.h1
-rw-r--r--storage/ndb/include/mgmapi/ndbd_exit_codes.h2
-rw-r--r--storage/ndb/include/transporter/TransporterCallback.hpp72
-rw-r--r--storage/ndb/include/util/Base64.hpp28
-rw-r--r--storage/ndb/src/common/mgmcommon/IPCConfig.cpp24
-rw-r--r--storage/ndb/src/common/transporter/SHM_Transporter.cpp22
-rw-r--r--storage/ndb/src/common/transporter/SHM_Transporter.hpp2
-rw-r--r--storage/ndb/src/common/transporter/SHM_Transporter.unix.cpp28
-rw-r--r--storage/ndb/src/common/transporter/SHM_Transporter.win32.cpp6
-rw-r--r--storage/ndb/src/common/transporter/Transporter.hpp3
-rw-r--r--storage/ndb/src/common/transporter/TransporterRegistry.cpp4
-rw-r--r--storage/ndb/src/common/util/Base64.cpp212
-rw-r--r--storage/ndb/src/common/util/Makefile.am2
-rw-r--r--storage/ndb/src/common/util/Parser.cpp7
-rw-r--r--storage/ndb/src/kernel/blocks/dbdict/Dbdict.cpp76
-rw-r--r--storage/ndb/src/kernel/blocks/dbtc/DbtcMain.cpp30
-rw-r--r--storage/ndb/src/kernel/blocks/ndbcntr/NdbcntrMain.cpp10
-rw-r--r--storage/ndb/src/kernel/blocks/qmgr/QmgrMain.cpp10
-rw-r--r--storage/ndb/src/kernel/error/ndbd_exit_codes.c4
-rw-r--r--storage/ndb/src/kernel/vm/FastScheduler.cpp15
-rw-r--r--storage/ndb/src/kernel/vm/TransporterCallback.cpp92
-rw-r--r--storage/ndb/src/kernel/vm/VMSignal.hpp10
-rw-r--r--storage/ndb/src/mgmapi/mgmapi.cpp14
-rw-r--r--storage/ndb/src/mgmsrv/ConfigInfo.cpp350
-rw-r--r--storage/ndb/src/mgmsrv/InitConfigFileParser.cpp19
-rw-r--r--storage/ndb/src/mgmsrv/MgmtSrvr.cpp38
-rw-r--r--storage/ndb/src/mgmsrv/MgmtSrvr.hpp8
-rw-r--r--storage/ndb/src/mgmsrv/Services.cpp13
-rw-r--r--storage/ndb/src/ndbapi/TransporterFacade.cpp13
-rw-r--r--storage/ndb/test/ndbapi/testBackup.cpp11
-rw-r--r--storage/ndb/test/ndbapi/testOperations.cpp3
-rw-r--r--storage/ndb/test/src/HugoCalculator.cpp1
-rw-r--r--storage/ndb/tools/ndb_condig.cpp105
84 files changed, 895 insertions, 1428 deletions
diff --git a/storage/heap/_check.c b/storage/heap/_check.c
index 4316a9926f7..cc832f8ed5b 100644
--- a/storage/heap/_check.c
+++ b/storage/heap/_check.c
@@ -167,7 +167,7 @@ static int check_one_rb_key(HP_INFO *info, uint keynr, ulong records,
ulong found= 0;
byte *key, *recpos;
uint key_length;
- uint not_used;
+ uint not_used[2];
if ((key= tree_search_edge(&keydef->rb_tree, info->parents,
&info->last_pos, offsetof(TREE_ELEMENT, left))))
@@ -177,7 +177,7 @@ static int check_one_rb_key(HP_INFO *info, uint keynr, ulong records,
memcpy(&recpos, key + (*keydef->get_key_length)(keydef,key), sizeof(byte*));
key_length= hp_rb_make_key(keydef, info->recbuf, recpos, 0);
if (ha_key_cmp(keydef->seg, (uchar*) info->recbuf, (uchar*) key,
- key_length, SEARCH_FIND | SEARCH_SAME, &not_used))
+ key_length, SEARCH_FIND | SEARCH_SAME, not_used))
{
error= 1;
DBUG_PRINT("error",("Record in wrong link: key: %d Record: 0x%lx\n",
diff --git a/storage/heap/hp_create.c b/storage/heap/hp_create.c
index 8fcf7dde000..47dcb00278a 100644
--- a/storage/heap/hp_create.c
+++ b/storage/heap/hp_create.c
@@ -203,9 +203,9 @@ int heap_create(const char *name, uint keys, HP_KEYDEF *keydef,
static int keys_compare(heap_rb_param *param, uchar *key1, uchar *key2)
{
- uint not_used;
+ uint not_used[2];
return ha_key_cmp(param->keyseg, key1, key2, param->key_length,
- param->search_flag, &not_used);
+ param->search_flag, not_used);
}
static void init_block(HP_BLOCK *block, uint reclength, ulong min_records,
diff --git a/storage/innobase/btr/makefilewin b/storage/innobase/btr/makefilewin
deleted file mode 100644
index a5806b74a51..00000000000
--- a/storage/innobase/btr/makefilewin
+++ /dev/null
@@ -1,16 +0,0 @@
-include ..\include\makefile.i
-
-btr.lib: btr0cur.obj btr0btr.obj btr0pcur.obj btr0sea.obj
- lib -out:..\libs\btr.lib btr0cur.obj btr0btr.obj btr0pcur.obj btr0sea.obj
-
-btr0cur.obj: btr0cur.c
- $(CCOM) $(CFL) -c btr0cur.c
-
-btr0btr.obj: btr0btr.c
- $(CCOM) $(CFL) -c btr0btr.c
-
-btr0sea.obj: btr0sea.c
- $(CCOM) $(CFL) -c btr0sea.c
-
-btr0pcur.obj: btr0pcur.c
- $(CCOM) $(CFL) -c btr0pcur.c
diff --git a/storage/innobase/buf/makefilewin b/storage/innobase/buf/makefilewin
deleted file mode 100644
index ce62cb95958..00000000000
--- a/storage/innobase/buf/makefilewin
+++ /dev/null
@@ -1,20 +0,0 @@
-include ..\include\makefile.i
-
-buf.lib: buf0buf.obj buf0lru.obj buf0flu.obj buf0rea.obj
- lib -out:..\libs\buf.lib buf0buf.obj buf0lru.obj buf0flu.obj buf0rea.obj
-
-buf0buf.obj: buf0buf.c
- $(CCOM) $(CFL) -c buf0buf.c
-
-buf0lru.obj: buf0lru.c
- $(CCOM) $(CFL) -c buf0lru.c
-
-buf0flu.obj: buf0flu.c
- $(CCOM) $(CFL) -c buf0flu.c
-
-buf0rea.obj: buf0rea.c
- $(CCOM) $(CFL) -c buf0rea.c
-
-
-
-
diff --git a/storage/innobase/data/makefilewin b/storage/innobase/data/makefilewin
deleted file mode 100644
index 785b75fbb2b..00000000000
--- a/storage/innobase/data/makefilewin
+++ /dev/null
@@ -1,11 +0,0 @@
-include ..\include\makefile.i
-
-data.lib: data0type.obj data0data.obj
- lib -out:..\libs\data.lib data0type.obj data0data.obj
-
-data0type.obj: data0type.c
- $(CCOM) $(CFL) -c data0type.c
-
-data0data.obj: data0data.c
- $(CCOM) $(CFL) -c data0data.c
-
diff --git a/storage/innobase/dict/makefilewin b/storage/innobase/dict/makefilewin
deleted file mode 100644
index e828d06943c..00000000000
--- a/storage/innobase/dict/makefilewin
+++ /dev/null
@@ -1,21 +0,0 @@
-include ..\include\makefile.i
-
-dict.lib: dict0dict.obj dict0boot.obj dict0load.obj dict0mem.obj dict0crea.obj
- lib -out:..\libs\dict.lib dict0dict.obj dict0boot.obj dict0load.obj dict0mem.obj dict0crea.obj
-
-dict0dict.obj: dict0dict.c
- $(CCOM) $(CFL) -c dict0dict.c
-
-dict0boot.obj: dict0boot.c
- $(CCOM) $(CFL) -c dict0boot.c
-
-dict0mem.obj: dict0mem.c
- $(CCOM) $(CFL) -c dict0mem.c
-
-dict0crea.obj: dict0crea.c
- $(CCOM) $(CFL) -c dict0crea.c
-
-dict0load.obj: dict0load.c
- $(CCOM) $(CFL) -c dict0load.c
-
-
diff --git a/storage/innobase/dyn/makefilewin b/storage/innobase/dyn/makefilewin
deleted file mode 100644
index 71a58a756c1..00000000000
--- a/storage/innobase/dyn/makefilewin
+++ /dev/null
@@ -1,9 +0,0 @@
-include ..\include\makefile.i
-
-dyn.lib: dyn0dyn.obj makefile
- lib -out:..\libs\dyn.lib dyn0dyn.obj
-
-dyn0dyn.obj: dyn0dyn.c
- $(CCOM) $(CFL) -c dyn0dyn.c
-
-
diff --git a/storage/innobase/eval/makefilewin b/storage/innobase/eval/makefilewin
deleted file mode 100644
index f587f2a05a6..00000000000
--- a/storage/innobase/eval/makefilewin
+++ /dev/null
@@ -1,10 +0,0 @@
-include ..\include\makefile.i
-
-eval.lib: eval0eval.obj eval0proc.obj
- lib -out:..\libs\eval.lib eval0eval.obj eval0proc.obj
-
-eval0eval.obj: eval0eval.c
- $(CCOM) $(CFL) -c eval0eval.c
-
-eval0proc.obj: eval0proc.c
- $(CCOM) $(CFL) -c eval0proc.c
diff --git a/storage/innobase/fil/makefilewin b/storage/innobase/fil/makefilewin
deleted file mode 100644
index 1b2d6ab2dbb..00000000000
--- a/storage/innobase/fil/makefilewin
+++ /dev/null
@@ -1,10 +0,0 @@
-include ..\include\makefile.i
-
-fil.lib: fil0fil.obj
- lib -out:..\libs\fil.lib fil0fil.obj
-
-fil0fil.obj: fil0fil.c
- $(CCOM) $(CFL) -c fil0fil.c
-
-
-
diff --git a/storage/innobase/fsp/makefilewin b/storage/innobase/fsp/makefilewin
deleted file mode 100644
index 503cf27f490..00000000000
--- a/storage/innobase/fsp/makefilewin
+++ /dev/null
@@ -1,9 +0,0 @@
-include ..\include\makefile.i
-
-fsp.lib: fsp0fsp.obj
- lib -out:..\libs\fsp.lib fsp0fsp.obj
-
-fsp0fsp.obj: fsp0fsp.c
- $(CCOM) $(CFL) -c fsp0fsp.c
-
-
diff --git a/storage/innobase/fut/makefilewin b/storage/innobase/fut/makefilewin
deleted file mode 100644
index 40f3161015c..00000000000
--- a/storage/innobase/fut/makefilewin
+++ /dev/null
@@ -1,12 +0,0 @@
-include ..\include\makefile.i
-
-fut.lib: fut0lst.obj fut0fut.obj
- lib -out:..\libs\fut.lib fut0lst.obj fut0fut.obj
-
-fut0lst.obj: fut0lst.c
- $(CCOM) $(CFL) -c fut0lst.c
-
-fut0fut.obj: fut0fut.c
- $(CCOM) $(CFL) -c fut0fut.c
-
-
diff --git a/storage/innobase/ha/makefilewin b/storage/innobase/ha/makefilewin
deleted file mode 100644
index c7cd130ceea..00000000000
--- a/storage/innobase/ha/makefilewin
+++ /dev/null
@@ -1,10 +0,0 @@
-include ..\include\makefile.i
-
-ha.lib: ha0ha.obj hash0hash.obj
- lib -out:..\libs\ha.lib ha0ha.obj hash0hash.obj
-
-ha0ha.obj: ha0ha.c
- $(CCOM) $(CFL) -c ha0ha.c
-
-hash0hash.obj: hash0hash.c
- $(CCOM) $(CFL) -c hash0hash.c
diff --git a/storage/innobase/ibuf/makefilewin b/storage/innobase/ibuf/makefilewin
deleted file mode 100644
index 86bf9794520..00000000000
--- a/storage/innobase/ibuf/makefilewin
+++ /dev/null
@@ -1,7 +0,0 @@
-include ..\include\makefile.i
-
-ibuf.lib: ibuf0ibuf.obj
- lib -out:..\libs\ibuf.lib ibuf0ibuf.obj
-
-ibuf0ibuf.obj: ibuf0ibuf.c
- $(CCOM) $(CFL) -c ibuf0ibuf.c
diff --git a/storage/innobase/include/Makefile.am b/storage/innobase/include/Makefile.am
index eb1e3b72877..b83aee06680 100644
--- a/storage/innobase/include/Makefile.am
+++ b/storage/innobase/include/Makefile.am
@@ -28,7 +28,7 @@ noinst_HEADERS = btr0btr.h btr0btr.ic btr0cur.h btr0cur.ic \
ha0ha.h ha0ha.ic hash0hash.h hash0hash.ic \
ibuf0ibuf.h ibuf0ibuf.ic ibuf0types.h lock0lock.h \
lock0lock.ic lock0types.h log0log.h log0log.ic log0recv.h \
- log0recv.ic mach0data.h mach0data.ic makefilewin.i \
+ log0recv.ic mach0data.h mach0data.ic \
mem0dbg.h mem0dbg.ic mem0mem.h mem0mem.ic mem0pool.h \
mem0pool.ic mtr0log.h mtr0log.ic mtr0mtr.h mtr0mtr.ic \
mtr0types.h os0file.h os0proc.h os0proc.ic \
diff --git a/storage/innobase/include/makefilewin.i b/storage/innobase/include/makefilewin.i
deleted file mode 100644
index f756cf2ea3a..00000000000
--- a/storage/innobase/include/makefilewin.i
+++ /dev/null
@@ -1,34 +0,0 @@
-# File included in all makefiles of the database
-# (c) Innobase Oy 1995 - 2000
-
-CCOM=cl
-
-# Flags for the debug version
-#CFL= -MTd -Za -Zi -W4 -WX -F8192 -D "WIN32"
-#CFLN = -MTd -Zi -W4 -F8192 -D "WIN32"
-#CFLW = -MTd -Zi -W3 -WX -F8192 -D "WIN32"
-#LFL =
-
-# Flags for the fast version
-#CFL= -MT -Zi -Og -O2 -W3 -WX -D "WIN32"
-#CFLN = -MT -Zi -Og -O2 -W3 -D "WIN32"
-#CFLW = -MT -Zi -Og -O2 -W3 -WX -D "WIN32"
-#LFL =
-
-# Flags for the fast debug version
-CFL= -MTd -Zi -W3 -WX -F8192 -D "WIN32"
-CFLN = -MTd -Zi -W3 -F8192 -D "WIN32"
-CFLW = -MTd -Zi -W3 -WX -F8192 -D "WIN32"
-LFL = /link/NODEFAULTLIB:LIBCMT
-
-# Flags for the profiler version
-#CFL= -MT -Zi -Og -O2 -W3 -WX -D "WIN32"
-#CFLN = -MT -Zi -Og -O2 -WX -D "WIN32"
-#CFLW = -MT -Zi -Og -O2 -W3 -WX -D "WIN32"
-#LFL= -link -PROFILE
-
-# Flags for the fast version without debug info (= the production version)
-#CFL= -MT -Og -O2 -G6 -W3 -WX -D "WIN32"
-#CFLN = -MT -Og -O2 -G6 -W3 -D "WIN32"
-#CFLW = -MT -Og -O2 -G6 -W3 -WX -D "WIN32"
-#LFL =
diff --git a/storage/innobase/include/rem0rec.h b/storage/innobase/include/rem0rec.h
index 1d15b8d1c77..69b397c9682 100644
--- a/storage/innobase/include/rem0rec.h
+++ b/storage/innobase/include/rem0rec.h
@@ -312,6 +312,15 @@ rec_offs_nth_extern(
const ulint* offsets,/* in: array returned by rec_get_offsets() */
ulint n); /* in: nth field */
/**********************************************************
+Returns nonzero if the SQL NULL bit is set in nth field of rec. */
+UNIV_INLINE
+ulint
+rec_offs_nth_sql_null(
+/*==================*/
+ /* out: nonzero if SQL NULL */
+ const ulint* offsets,/* in: array returned by rec_get_offsets() */
+ ulint n); /* in: nth field */
+/**********************************************************
Gets the physical size of a field. */
UNIV_INLINE
ulint
diff --git a/storage/innobase/include/rem0rec.ic b/storage/innobase/include/rem0rec.ic
index e2dceb6bae5..9c24f385f4f 100644
--- a/storage/innobase/include/rem0rec.ic
+++ b/storage/innobase/include/rem0rec.ic
@@ -955,6 +955,22 @@ rec_offs_nth_extern(
}
/**********************************************************
+Returns nonzero if the SQL NULL bit is set in nth field of rec. */
+UNIV_INLINE
+ulint
+rec_offs_nth_sql_null(
+/*==================*/
+ /* out: nonzero if SQL NULL */
+ const ulint* offsets,/* in: array returned by rec_get_offsets() */
+ ulint n) /* in: nth field */
+{
+ ut_ad(rec_offs_validate(NULL, NULL, offsets));
+ ut_ad(n < rec_offs_n_fields(offsets));
+ return(UNIV_UNLIKELY(rec_offs_base(offsets)[1 + n]
+ & REC_OFFS_SQL_NULL));
+}
+
+/**********************************************************
Gets the physical size of a field. */
UNIV_INLINE
ulint
diff --git a/storage/innobase/lock/makefilewin b/storage/innobase/lock/makefilewin
deleted file mode 100644
index 149b0a2fed6..00000000000
--- a/storage/innobase/lock/makefilewin
+++ /dev/null
@@ -1,7 +0,0 @@
-include ..\include\makefile.i
-
-lock.lib: lock0lock.obj
- lib -out:..\libs\lock.lib lock0lock.obj
-
-lock0lock.obj: lock0lock.c
- $(CCOM) $(CFL) -c lock0lock.c
diff --git a/storage/innobase/log/makefilewin b/storage/innobase/log/makefilewin
deleted file mode 100644
index a690af3bb35..00000000000
--- a/storage/innobase/log/makefilewin
+++ /dev/null
@@ -1,10 +0,0 @@
-include ..\include\makefile.i
-
-log.lib: log0log.obj log0recv.obj
- lib -out:..\libs\log.lib log0log.obj log0recv.obj
-
-log0log.obj: log0log.c
- $(CCOM) $(CFL) -c log0log.c
-
-log0recv.obj: log0recv.c
- $(CCOM) $(CFL) -c log0recv.c
diff --git a/storage/innobase/mach/makefilewin b/storage/innobase/mach/makefilewin
deleted file mode 100644
index 5306b0fe14c..00000000000
--- a/storage/innobase/mach/makefilewin
+++ /dev/null
@@ -1,9 +0,0 @@
-include ..\include\makefile.i
-
-mach.lib: mach0data.obj
- lib -out:..\libs\mach.lib mach0data.obj
-
-mach0data.obj: mach0data.c
- $(CCOM) $(CFLN) -c mach0data.c
-
-
diff --git a/storage/innobase/makefilewin b/storage/innobase/makefilewin
deleted file mode 100644
index 1bd8d96e5e7..00000000000
--- a/storage/innobase/makefilewin
+++ /dev/null
@@ -1,164 +0,0 @@
-doall: del_libs pb_all os.lib ut.lib mach.lib sync.lib mem.lib dyn.lib ha.lib com.lib thr.lib srv.lib fil.lib buf.lib log.lib mtr.lib log.lib fut.lib fsp.lib dict.lib data.lib rem.lib page.lib btr.lib ibuf.lib usr.lib que.lib trx.lib lock.lib read.lib row.lib pars.lib eval.lib ib_odbc.lib
-
-del_libs:
- cd libs
- del *.lib
- cd ..
-
-pb_all:
- pb_all
-
-os.lib:
- cd os
- remake
- cd ..
-
-ut.lib:
- cd ut
- remake
- cd ..
-
-mach.lib:
- cd mach
- remake
- cd ..
-
-sync.lib:
- cd sync
- remake
- cd ..
-
-mem.lib:
- cd mem
- remake
- cd ..
-
-dyn.lib:
- cd dyn
- remake
- cd ..
-
-ha.lib:
- cd ha
- remake
- cd ..
-
-com.lib:
- cd com
- remake
- cd ..
-
-thr.lib:
- cd thr
- remake
- cd ..
-
-srv.lib:
- cd srv
- remake
- cd ..
-
-fil.lib:
- cd fil
- remake
- cd ..
-
-buf.lib:
- cd buf
- remake
- cd ..
-
-log.lib:
- cd log
- remake
- cd ..
-
-mtr.lib:
- cd mtr
- remake
- cd ..
-
-fut.lib:
- cd fut
- remake
- cd ..
-
-fsp.lib:
- cd fsp
- remake
- cd ..
-
-dict.lib:
- cd dict
- remake
- cd ..
-
-data.lib:
- cd data
- remake
- cd ..
-
-rem.lib:
- cd rem
- remake
- cd ..
-
-page.lib:
- cd page
- remake
- cd ..
-
-btr.lib:
- cd btr
- remake
- cd ..
-
-ibuf.lib:
- cd ibuf
- remake
- cd ..
-
-usr.lib:
- cd usr
- remake
- cd ..
-
-que.lib:
- cd que
- remake
- cd ..
-
-trx.lib:
- cd trx
- remake
- cd ..
-
-lock.lib:
- cd lock
- remake
- cd ..
-
-read.lib:
- cd read
- remake
- cd ..
-
-row.lib:
- cd row
- remake
- cd ..
-
-pars.lib:
- cd pars
- remake
- cd ..
-
-eval.lib:
- cd eval
- remake
- cd ..
-
-ib_odbc.lib:
- cd odbc
- remake
- cd ..
diff --git a/storage/innobase/mem/makefilewin b/storage/innobase/mem/makefilewin
deleted file mode 100644
index 8a30f8a6e71..00000000000
--- a/storage/innobase/mem/makefilewin
+++ /dev/null
@@ -1,10 +0,0 @@
-include ..\include\makefile.i
-
-mem.lib: mem0mem.obj mem0pool.obj makefile
- lib -out:..\libs\mem.lib mem0mem.obj mem0pool.obj
-
-mem0mem.obj: mem0mem.c mem0dbg.c
- $(CCOM) $(CFL) -c mem0mem.c
-
-mem0pool.obj: mem0pool.c
- $(CCOM) $(CFL) -c mem0pool.c
diff --git a/storage/innobase/mtr/makefilewin b/storage/innobase/mtr/makefilewin
deleted file mode 100644
index 9da0863bd28..00000000000
--- a/storage/innobase/mtr/makefilewin
+++ /dev/null
@@ -1,14 +0,0 @@
-include ..\include\makefile.i
-
-mtr.lib: mtr0mtr.obj mtr0log.obj
- lib -out:..\libs\mtr.lib mtr0mtr.obj mtr0log.obj
-
-mtr0mtr.obj: mtr0mtr.c
- $(CCOM) $(CFL) -c mtr0mtr.c
-
-mtr0log.obj: mtr0log.c
- $(CCOM) $(CFL) -c mtr0log.c
-
-
-
-
diff --git a/storage/innobase/my_cnf b/storage/innobase/my_cnf
deleted file mode 100644
index 94365237841..00000000000
--- a/storage/innobase/my_cnf
+++ /dev/null
@@ -1,63 +0,0 @@
-# Example mysql config file.
-# Copy this file to c:\my.cnf to set global options
-#
-# One can use all long options that the program supports.
-# Run the program with --help to get a list of available options
-
-# This will be passed to all mysql clients
-[client]
-#password=my_password
-port=3306
-#socket=MySQL
-
-# Here is entries for some specific programs
-# The following values assume you have at least 32M ram
-
-# The MySQL server
-[mysqld]
-port=3306
-#socket=MySQL
-skip-locking
-default-character-set=latin1
-set-variable = key_buffer=2M
-set-variable = max_allowed_packet=1M
-set-variable = thread_stack=128K
-set-variable = flush_time=1800
-
-innobase_data_home_dir = e:\ibdata\
-innobase_data_file_path = ibdata1:25M;ibdata2:37M;ibdata3:100M;ibdata4:300M
-set-variable = innobase_mirrored_log_groups=1
-innobase_log_group_home_dir = e:\iblogs\
-set-variable = innobase_log_files_in_group=3
-set-variable = innobase_log_file_size=5M
-set-variable = innobase_log_buffer_size=8M
-innobase_flush_log_at_trx_commit=1
-innobase_log_arch_dir = e:\iblogs\
-innobase_log_archive=0
-set-variable = innobase_buffer_pool_size=16M
-set-variable = innobase_additional_mem_pool_size=2M
-set-variable = innobase_file_io_threads=4
-set-variable = innobase_lock_wait_timeout=50
-
-
-# Uncomment the following row if you move the MySQL distribution to another
-# location
-#basedir = d:/mysql/
-
-[mysqldump]
-quick
-set-variable = max_allowed_packet=16M
-
-[mysql]
-no-auto-rehash
-
-[isamchk]
-set-variable= key=16M
-
-[client_fltk]
-help_file= c:\mysql\sql_client\MySQL.help
-client_file= c:\mysql\MySQL.options
-history_length=20
-database = test
-queries_root= c:\mysql\queries
-last_database_file= c:\mysql\lastdb
diff --git a/storage/innobase/os/makefilewin b/storage/innobase/os/makefilewin
deleted file mode 100644
index 8bc8d08611b..00000000000
--- a/storage/innobase/os/makefilewin
+++ /dev/null
@@ -1,17 +0,0 @@
-include ..\include\makefile.i
-
-os.lib: os0sync.obj os0thread.obj os0proc.obj os0file.obj
- lib -out:..\libs\os.lib os0sync.obj os0thread.obj os0proc.obj os0file.obj
-
-os0sync.obj: os0sync.c
- $(CCOM) $(CFLW) -c os0sync.c
-
-os0thread.obj: os0thread.c
- $(CCOM) $(CFLW) -c os0thread.c
-
-os0proc.obj: os0proc.c
- $(CCOM) $(CFLW) -c os0proc.c
-
-os0file.obj: os0file.c
- $(CCOM) $(CFLW) -c os0file.c
-
diff --git a/storage/innobase/page/makefilewin b/storage/innobase/page/makefilewin
deleted file mode 100644
index 4a132cf828c..00000000000
--- a/storage/innobase/page/makefilewin
+++ /dev/null
@@ -1,12 +0,0 @@
-include ..\include\makefile.i
-
-page.lib: page0page.obj page0cur.obj
- lib -out:..\libs\page.lib page0page.obj page0cur.obj
-
-page0page.obj: page0page.c
- $(CCOM) $(CFL) -c page0page.c
-
-page0cur.obj: page0cur.c
- $(CCOM) $(CFL) -c page0cur.c
-
-
diff --git a/storage/innobase/pars/makefilewin b/storage/innobase/pars/makefilewin
deleted file mode 100644
index f183d89cbe2..00000000000
--- a/storage/innobase/pars/makefilewin
+++ /dev/null
@@ -1,26 +0,0 @@
-include ..\include\makefile.i
-
-pars.lib: pars0grm.obj lexyy.obj pars0pars.obj pars0opt.obj pars0sym.obj rename_and_copy
- lib -out:..\libs\pars.lib pars0grm.obj lexyy.obj pars0pars.obj pars0opt.obj pars0sym.obj
-
-pars0grm.obj: pars0grm.y
- bs pars0grm.y
- $(CCOM) $(CFLW) -c pars0grm.c
-
-rename_and_copy:
- ren pars0grm.h pars0grm.h
- copy pars0grm.h ..\include
-
-lexyy.obj: pars0lex.l
- fl pars0lex.l
- $(CCOM) $(CFLN) -c lexyy.c
-
-pars0pars.obj: pars0pars.c
- $(CCOM) $(CFL) -c pars0pars.c
-
-pars0opt.obj: pars0opt.c
- $(CCOM) $(CFL) -c pars0opt.c
-
-pars0sym.obj: pars0sym.c
- $(CCOM) $(CFL) -c pars0sym.c
-
diff --git a/storage/innobase/que/makefilewin b/storage/innobase/que/makefilewin
deleted file mode 100644
index 9661c716551..00000000000
--- a/storage/innobase/que/makefilewin
+++ /dev/null
@@ -1,7 +0,0 @@
-include ..\include\makefile.i
-
-que.lib: que0que.obj
- lib -out:..\libs\que.lib que0que.obj
-
-que0que.obj: que0que.c
- $(CCOM) $(CFL) -c que0que.c
diff --git a/storage/innobase/read/makefilewin b/storage/innobase/read/makefilewin
deleted file mode 100644
index 39593993a67..00000000000
--- a/storage/innobase/read/makefilewin
+++ /dev/null
@@ -1,7 +0,0 @@
-include ..\include\makefile.i
-
-read.lib: read0read.obj
- lib -out:..\libs\read.lib read0read.obj
-
-read0read.obj: read0read.c
- $(CCOM) $(CFL) -c read0read.c
diff --git a/storage/innobase/rem/makefilewin b/storage/innobase/rem/makefilewin
deleted file mode 100644
index 51ca4a92012..00000000000
--- a/storage/innobase/rem/makefilewin
+++ /dev/null
@@ -1,12 +0,0 @@
-include ..\include\makefile.i
-
-rem.lib: rem0rec.obj rem0cmp.obj
- lib -out:..\libs\rem.lib rem0rec.obj rem0cmp.obj
-
-rem0rec.obj: rem0rec.c
- $(CCOM) $(CFL) -c rem0rec.c
-
-rem0cmp.obj: rem0cmp.c
- $(CCOM) $(CFL) -c rem0cmp.c
-
-
diff --git a/storage/innobase/row/makefilewin b/storage/innobase/row/makefilewin
deleted file mode 100644
index c17240c6119..00000000000
--- a/storage/innobase/row/makefilewin
+++ /dev/null
@@ -1,34 +0,0 @@
-include ..\include\makefile.i
-
-row.lib: row0mysql.obj row0upd.obj row0sel.obj row0umod.obj row0uins.obj row0ins.obj row0upd.obj row0undo.obj row0purge.obj row0vers.obj row0row.obj
- lib -out:..\libs\row.lib row0mysql.obj row0sel.obj row0umod.obj row0uins.obj row0ins.obj row0upd.obj row0undo.obj row0purge.obj row0vers.obj row0row.obj
-
-row0mysql.obj: row0mysql.c
- $(CCOM) $(CFL) -c row0mysql.c
-
-row0ins.obj: row0ins.c
- $(CCOM) $(CFL) -c row0ins.c
-
-row0sel.obj: row0sel.c
- $(CCOM) $(CFL) -c row0sel.c
-
-row0upd.obj: row0upd.c
- $(CCOM) $(CFL) -c row0upd.c
-
-row0undo.obj: row0undo.c
- $(CCOM) $(CFL) -c row0undo.c
-
-row0purge.obj: row0purge.c
- $(CCOM) $(CFL) -c row0purge.c
-
-row0row.obj: row0row.c
- $(CCOM) $(CFL) -c row0row.c
-
-row0vers.obj: row0vers.c
- $(CCOM) $(CFL) -c row0vers.c
-
-row0umod.obj: row0umod.c
- $(CCOM) $(CFL) -c row0umod.c
-
-row0uins.obj: row0uins.c
- $(CCOM) $(CFL) -c row0uins.c
diff --git a/storage/innobase/row/row0upd.c b/storage/innobase/row/row0upd.c
index 4f44dbeae67..ff1ad1dfd05 100644
--- a/storage/innobase/row/row0upd.c
+++ b/storage/innobase/row/row0upd.c
@@ -395,6 +395,18 @@ row_upd_changes_field_size_or_external(
old_len = rec_offs_nth_size(offsets, upd_field->field_no);
+ if (rec_offs_comp(offsets)
+ && rec_offs_nth_sql_null(offsets, upd_field->field_no)) {
+ /* Note that in the compact table format, for a
+ variable length field, an SQL NULL will use zero
+ bytes in the offset array at the start of the physical
+ record, but a zero-length value (empty string) will
+ use one byte! Thus, we cannot use update-in-place
+ if we update an SQL NULL varchar to an empty string! */
+
+ old_len = UNIV_SQL_NULL;
+ }
+
if (old_len != new_len) {
return(TRUE);
diff --git a/storage/innobase/srv/makefilewin b/storage/innobase/srv/makefilewin
deleted file mode 100644
index 129c65ec220..00000000000
--- a/storage/innobase/srv/makefilewin
+++ /dev/null
@@ -1,15 +0,0 @@
-include ..\include\makefile.i
-
-srv.lib: srv0srv.obj srv0que.obj srv0start.obj
- lib -out:..\libs\srv.lib srv0srv.obj srv0que.obj srv0start.obj
-
-srv0srv.obj: srv0srv.c
- $(CCOM) $(CFL) -c srv0srv.c
-
-srv0que.obj: srv0que.c
- $(CCOM) $(CFL) -c srv0que.c
-
-srv0start.obj: srv0start.c
- $(CCOM) $(CFL) -c srv0start.c
-
-
diff --git a/storage/innobase/sync/makefilewin b/storage/innobase/sync/makefilewin
deleted file mode 100644
index 73cff40405a..00000000000
--- a/storage/innobase/sync/makefilewin
+++ /dev/null
@@ -1,14 +0,0 @@
-include ..\include\makefile.i
-
-sync.lib: sync0sync.obj sync0rw.obj sync0arr.obj
- lib -out:..\libs\sync.lib sync0sync.obj sync0rw.obj sync0arr.obj
-
-sync0sync.obj: sync0sync.c
- $(CCOM) $(CFLN) -c sync0sync.c
-
-sync0rw.obj: sync0rw.c
- $(CCOM) $(CFL) -c sync0rw.c
-
-sync0arr.obj: sync0arr.c
- $(CCOM) $(CFL) -c sync0arr.c
-
diff --git a/storage/innobase/thr/makefilewin b/storage/innobase/thr/makefilewin
deleted file mode 100644
index 3f29ea1d3e3..00000000000
--- a/storage/innobase/thr/makefilewin
+++ /dev/null
@@ -1,9 +0,0 @@
-include ..\include\makefile.i
-
-thr.lib: thr0loc.obj
- lib -out:..\libs\thr.lib thr0loc.obj
-
-thr0loc.obj: thr0loc.c
- $(CCOM) $(CFL) -c thr0loc.c
-
-
diff --git a/storage/innobase/trx/makefilewin b/storage/innobase/trx/makefilewin
deleted file mode 100644
index 35588779d66..00000000000
--- a/storage/innobase/trx/makefilewin
+++ /dev/null
@@ -1,26 +0,0 @@
-include ..\include\makefile.i
-
-trx.lib: trx0sys.obj trx0trx.obj trx0rseg.obj trx0undo.obj trx0rec.obj trx0roll.obj trx0purge.obj
- lib -out:..\libs\trx.lib trx0sys.obj trx0trx.obj trx0rseg.obj trx0undo.obj trx0rec.obj trx0roll.obj trx0purge.obj
-
-trx0trx.obj: trx0trx.c
- $(CCOM) $(CFL) -c -I.. trx0trx.c
-
-trx0sys.obj: trx0sys.c
- $(CCOM) $(CFL) -c -I.. trx0sys.c
-
-trx0rseg.obj: trx0rseg.c
- $(CCOM) $(CFL) -c -I.. trx0rseg.c
-
-trx0undo.obj: trx0undo.c
- $(CCOM) $(CFL) -c -I.. trx0undo.c
-
-trx0rec.obj: trx0rec.c
- $(CCOM) $(CFL) -c -I.. trx0rec.c
-
-trx0roll.obj: trx0roll.c
- $(CCOM) $(CFL) -c -I.. trx0roll.c
-
-trx0purge.obj: trx0purge.c
- $(CCOM) $(CFL) -c -I.. trx0purge.c
-
diff --git a/storage/innobase/usr/makefilewin b/storage/innobase/usr/makefilewin
deleted file mode 100644
index 66a77275e9b..00000000000
--- a/storage/innobase/usr/makefilewin
+++ /dev/null
@@ -1,7 +0,0 @@
-include ..\include\makefile.i
-
-usr.lib: usr0sess.obj
- lib -out:..\libs\usr.lib usr0sess.obj
-
-usr0sess.obj: usr0sess.c
- $(CCOM) $(CFL) -c usr0sess.c
diff --git a/storage/innobase/ut/makefilewin b/storage/innobase/ut/makefilewin
deleted file mode 100644
index 2fda190773b..00000000000
--- a/storage/innobase/ut/makefilewin
+++ /dev/null
@@ -1,21 +0,0 @@
-include ..\include\makefile.i
-
-ut.lib: ut0ut.obj ut0mem.obj ut0byte.obj ut0dbg.obj ut0rnd.obj
- lib -out:..\libs\ut.lib ut0ut.obj ut0mem.obj ut0byte.obj ut0dbg.obj ut0rnd.obj
-
-ut0ut.obj: ut0ut.c
- $(CCOM) $(CFL) -c ut0ut.c
-
-ut0mem.obj: ut0mem.c
- $(CCOM) $(CFL) -c ut0mem.c
-
-ut0byte.obj: ut0byte.c
- $(CCOM) $(CFL) -c ut0byte.c
-
-ut0dbg.obj: ut0dbg.c
- $(CCOM) $(CFL) -c ut0dbg.c
-
-ut0rnd.obj: ut0rnd.c
- $(CCOM) $(CFL) -c ut0rnd.c
-
-
diff --git a/storage/myisam/mi_check.c b/storage/myisam/mi_check.c
index 074a1b23686..6296193d6b0 100644
--- a/storage/myisam/mi_check.c
+++ b/storage/myisam/mi_check.c
@@ -392,7 +392,10 @@ int chk_key(MI_CHECK *param, register MI_INFO *info)
found_keys++;
param->record_checksum=init_checksum;
+
bzero((char*) &param->unique_count,sizeof(param->unique_count));
+ bzero((char*) &param->notnull_count,sizeof(param->notnull_count));
+
if ((!(param->testflag & T_SILENT)))
printf ("- check data record references index: %d\n",key+1);
if (keyinfo->flag & HA_FULLTEXT)
@@ -497,7 +500,9 @@ int chk_key(MI_CHECK *param, register MI_INFO *info)
if (param->testflag & T_STATISTICS)
update_key_parts(keyinfo, rec_per_key_part, param->unique_count,
- (ulonglong) info->state->records);
+ param->stats_method == MI_STATS_METHOD_IGNORE_NULLS?
+ param->notnull_count: NULL,
+ (ulonglong)info->state->records);
}
if (param->testflag & T_INFO)
{
@@ -553,6 +558,96 @@ err:
return 1;
}
+
+/*
+ "Ignore NULLs" statistics collection method: process first index tuple.
+
+ SYNOPSIS
+ mi_collect_stats_nonulls_first()
+ keyseg IN Array of key part descriptions
+ notnull INOUT Array, notnull[i] = (number of {keypart1...keypart_i}
+ tuples that don't contain NULLs)
+ key IN Key values tuple
+
+ DESCRIPTION
+ Process the first index tuple - find out which prefix tuples don't
+ contain NULLs, and update the array of notnull counters accordingly.
+*/
+
+static
+void mi_collect_stats_nonulls_first(HA_KEYSEG *keyseg, ulonglong *notnull,
+ uchar *key)
+{
+ uint first_null, kp;
+ first_null= ha_find_null(keyseg, key) - keyseg;
+ /*
+ All prefix tuples that don't include keypart_{first_null} are not-null
+ tuples (and all others aren't), increment counters for them.
+ */
+ for (kp= 0; kp < first_null; kp++)
+ notnull[kp]++;
+}
+
+
+/*
+ "Ignore NULLs" statistics collection method: process next index tuple.
+
+ SYNOPSIS
+ mi_collect_stats_nonulls_next()
+ keyseg IN Array of key part descriptions
+ notnull INOUT Array, notnull[i] = (number of {keypart1...keypart_i}
+ tuples that don't contain NULLs)
+ prev_key IN Previous key values tuple
+ last_key IN Next key values tuple
+
+ DESCRIPTION
+ Process the next index tuple:
+ 1. Find out which prefix tuples of last_key don't contain NULLs, and
+ update the array of notnull counters accordingly.
+ 2. Find the first keypart number where the prev_key and last_key tuples
+ are different(A), or last_key has NULL value(B), and return it, so the
+ caller can count number of unique tuples for each key prefix. We don't
+ need (B) to be counted, and that is compensated back in
+ update_key_parts().
+
+ RETURN
+ 1 + number of first keypart where values differ or last_key tuple has NULL
+*/
+
+static
+int mi_collect_stats_nonulls_next(HA_KEYSEG *keyseg, ulonglong *notnull,
+ uchar *prev_key, uchar *last_key)
+{
+ uint diffs[2];
+ uint first_null_seg, kp;
+ HA_KEYSEG *seg;
+
+ /*
+ Find the first keypart where values are different or either of them is
+ NULL. We get results in diffs array:
+ diffs[0]= 1 + number of first different keypart
+ diffs[1]=offset: (last_key + diffs[1]) points to first value in
+ last_key that is NULL or different from corresponding
+ value in prev_key.
+ */
+ ha_key_cmp(keyseg, prev_key, last_key, USE_WHOLE_KEY,
+ SEARCH_FIND | SEARCH_NULL_ARE_NOT_EQUAL, diffs);
+ seg= keyseg + diffs[0] - 1;
+
+ /* Find first NULL in last_key */
+ first_null_seg= ha_find_null(seg, last_key + diffs[1]) - keyseg;
+ for (kp= 0; kp < first_null_seg; kp++)
+ notnull[kp]++;
+
+ /*
+ Return 1+ number of first key part where values differ. Don't care if
+ these were NULLs and not .... We compensate for that in
+ update_key_parts.
+ */
+ return diffs[0];
+}
+
+
/* Check if index is ok */
static int chk_index(MI_CHECK *param, MI_INFO *info, MI_KEYDEF *keyinfo,
@@ -564,7 +659,7 @@ static int chk_index(MI_CHECK *param, MI_INFO *info, MI_KEYDEF *keyinfo,
uchar key[MI_MAX_POSSIBLE_KEY_BUFF],*temp_buff,*keypos,*old_keypos,*endpos;
my_off_t next_page,record;
char llbuff[22];
- uint diff_pos;
+ uint diff_pos[2];
DBUG_ENTER("chk_index");
DBUG_DUMP("buff",(byte*) buff,mi_getint(buff));
@@ -622,7 +717,7 @@ static int chk_index(MI_CHECK *param, MI_INFO *info, MI_KEYDEF *keyinfo,
}
if ((*keys)++ &&
(flag=ha_key_cmp(keyinfo->seg,info->lastkey,key,key_length,
- comp_flag, &diff_pos)) >=0)
+ comp_flag, diff_pos)) >=0)
{
DBUG_DUMP("old",(byte*) info->lastkey, info->lastkey_length);
DBUG_DUMP("new",(byte*) key, key_length);
@@ -641,8 +736,20 @@ static int chk_index(MI_CHECK *param, MI_INFO *info, MI_KEYDEF *keyinfo,
if (param->stats_method == MI_STATS_METHOD_NULLS_NOT_EQUAL)
ha_key_cmp(keyinfo->seg,info->lastkey,key,USE_WHOLE_KEY,
SEARCH_FIND | SEARCH_NULL_ARE_NOT_EQUAL,
- &diff_pos);
- param->unique_count[diff_pos-1]++;
+ diff_pos);
+ else if (param->stats_method == MI_STATS_METHOD_IGNORE_NULLS)
+ {
+ diff_pos[0]= mi_collect_stats_nonulls_next(keyinfo->seg,
+ param->notnull_count,
+ info->lastkey, key);
+ }
+ param->unique_count[diff_pos[0]-1]++;
+ }
+ else
+ {
+ if (param->stats_method == MI_STATS_METHOD_IGNORE_NULLS)
+ mi_collect_stats_nonulls_first(keyinfo->seg, param->notnull_count,
+ key);
}
}
(*key_checksum)+= mi_byte_checksum((byte*) key,
@@ -1047,9 +1154,12 @@ int chk_data_link(MI_CHECK *param, MI_INFO *info,int extend)
/* We don't need to lock the key tree here as we don't allow
concurrent threads when running myisamchk
*/
- int search_result= (keyinfo->flag & HA_SPATIAL) ?
+ int search_result=
+#ifdef HAVE_RTREE_KEYS
+ (keyinfo->flag & HA_SPATIAL) ?
rtree_find_first(info, key, info->lastkey, key_length,
SEARCH_SAME) :
+#endif
_mi_search(info,keyinfo,info->lastkey,key_length,
SEARCH_SAME, info->s->state.key_root[key]);
if (search_result)
@@ -1291,25 +1401,30 @@ int mi_repair(MI_CHECK *param, register MI_INFO *info,
param->calc_checksum=1;
info->update= (short) (HA_STATE_CHANGED | HA_STATE_ROW_CHANGED);
+
+ /*
+ Clear all keys. Note that all key blocks allocated until now remain
+ "dead" parts of the key file. (Bug #4692)
+ */
for (i=0 ; i < info->s->base.keys ; i++)
share->state.key_root[i]= HA_OFFSET_ERROR;
+
+ /* Drop the delete chain. */
for (i=0 ; i < share->state.header.max_block_size ; i++)
share->state.key_del[i]= HA_OFFSET_ERROR;
/*
- I think mi_repair and mi_repair_by_sort should do the same
- (according, e.g. to ha_myisam::repair), but as mi_repair doesn't
- touch key_map it cannot be used to T_CREATE_MISSING_KEYS.
- That is what the next line is for
+ If requested, activate (enable) all keys in key_map. In this case,
+ all indexes will be (re-)built.
*/
-
if (param->testflag & T_CREATE_MISSING_KEYS)
- mi_copy_keys_active(share->state.key_map, share->base.keys,
- param->keys_in_use);
+ mi_set_all_keys_active(share->state.key_map, share->base.keys);
info->state->key_file_length=share->base.keystart;
lock_memory(param); /* Everything is alloced */
+
+ /* Re-create all keys, which are set in key_map. */
while (!(error=sort_get_next_record(&sort_param)))
{
if (writekeys(param,info,(byte*)sort_param.record,sort_param.filepos))
@@ -1732,9 +1847,10 @@ static int sort_one_index(MI_CHECK *param, MI_INFO *info, MI_KEYDEF *keyinfo,
_mi_kpointer(info,keypos-nod_flag,param->new_file_pos); /* Save new pos */
if (sort_one_index(param,info,keyinfo,next_page,new_file))
{
- DBUG_PRINT("error",("From page: %ld, keyoffset: %d used_length: %d",
- (ulong) pagepos, (int) (keypos - buff),
- (int) used_length));
+ DBUG_PRINT("error",
+ ("From page: %ld, keyoffset: %lu used_length: %d",
+ (ulong) pagepos, (ulong) (keypos - buff),
+ (int) used_length));
DBUG_DUMP("buff",(byte*) buff,used_length);
goto err;
}
@@ -2089,7 +2205,8 @@ int mi_repair_by_sort(MI_CHECK *param, register MI_INFO *info,
if (param->testflag & T_STATISTICS)
update_key_parts(sort_param.keyinfo, rec_per_key_part, sort_param.unique,
- (ulonglong) info->state->records);
+ param->stats_method == MI_STATS_METHOD_IGNORE_NULLS?
+ sort_param.notnull: NULL,(ulonglong) info->state->records);
mi_set_key_active(share->state.key_map, sort_param.key);
if (sort_param.fix_datafile)
@@ -3233,15 +3350,15 @@ int sort_write_record(MI_SORT_PARAM *sort_param)
static int sort_key_cmp(MI_SORT_PARAM *sort_param, const void *a,
const void *b)
{
- uint not_used;
+ uint not_used[2];
return (ha_key_cmp(sort_param->seg, *((uchar**) a), *((uchar**) b),
- USE_WHOLE_KEY, SEARCH_SAME,&not_used));
+ USE_WHOLE_KEY, SEARCH_SAME, not_used));
} /* sort_key_cmp */
static int sort_key_write(MI_SORT_PARAM *sort_param, const void *a)
{
- uint diff_pos;
+ uint diff_pos[2];
char llbuff[22],llbuff2[22];
SORT_INFO *sort_info=sort_param->sort_info;
MI_CHECK *param= sort_info->param;
@@ -3251,16 +3368,26 @@ static int sort_key_write(MI_SORT_PARAM *sort_param, const void *a)
{
cmp=ha_key_cmp(sort_param->seg,sort_info->key_block->lastkey,
(uchar*) a, USE_WHOLE_KEY,SEARCH_FIND | SEARCH_UPDATE,
- &diff_pos);
+ diff_pos);
if (param->stats_method == MI_STATS_METHOD_NULLS_NOT_EQUAL)
ha_key_cmp(sort_param->seg,sort_info->key_block->lastkey,
(uchar*) a, USE_WHOLE_KEY,
- SEARCH_FIND | SEARCH_NULL_ARE_NOT_EQUAL, &diff_pos);
- sort_param->unique[diff_pos-1]++;
+ SEARCH_FIND | SEARCH_NULL_ARE_NOT_EQUAL, diff_pos);
+ else if (param->stats_method == MI_STATS_METHOD_IGNORE_NULLS)
+ {
+ diff_pos[0]= mi_collect_stats_nonulls_next(sort_param->seg,
+ sort_param->notnull,
+ sort_info->key_block->lastkey,
+ (uchar*)a);
+ }
+ sort_param->unique[diff_pos[0]-1]++;
}
else
{
cmp= -1;
+ if (param->stats_method == MI_STATS_METHOD_IGNORE_NULLS)
+ mi_collect_stats_nonulls_first(sort_param->seg, sort_param->notnull,
+ (uchar*)a);
}
if ((sort_param->keyinfo->flag & HA_NOSAME) && cmp == 0)
{
@@ -3978,24 +4105,34 @@ void update_auto_increment_key(MI_CHECK *param, MI_INFO *info,
/*
Update statistics for each part of an index
-
+
SYNOPSIS
update_key_parts()
- keyinfo Index information (only key->keysegs used)
+ keyinfo IN Index information (only key->keysegs used)
rec_per_key_part OUT Store statistics here
- unique IN Array of #distinct values collected over index
- run.
+ unique IN Array of (#distinct tuples)
+ notnull_tuples IN Array of (#tuples), or NULL
records Number of records in the table
-
- NOTES
+
+ DESCRIPTION
+ This function is called produce index statistics values from unique and
+ notnull_tuples arrays after these arrays were produced with sequential
+ index scan (the scan is done in two places: chk_index() and
+ sort_key_write()).
+
+ This function handles all 3 index statistics collection methods.
+
Unique is an array:
- unique[0]= (#different values of {keypart1}) - 1
- unique[1]= (#different values of {keypart2,keypart1} tuple) - unique[0] - 1
- ...
- The 'unique' array is collected in one sequential scan through the entire
- index. This is done in two places: in chk_index() and in sort_key_write().
- Statistics collection may consider NULLs as either equal or unequal (see
- SEARCH_NULL_ARE_NOT_EQUAL, MI_STATS_METHOD_*).
+ unique[0]= (#different values of {keypart1}) - 1
+ unique[1]= (#different values of {keypart1,keypart2} tuple)-unique[0]-1
+ ...
+
+ For MI_STATS_METHOD_IGNORE_NULLS method, notnull_tuples is an array too:
+ notnull_tuples[0]= (#of {keypart1} tuples such that keypart1 is not NULL)
+ notnull_tuples[1]= (#of {keypart1,keypart2} tuples such that all
+ keypart{i} are not NULL)
+ ...
+ For all other statistics collection methods notnull_tuples==NULL.
Output is an array:
rec_per_key_part[k] =
@@ -4007,25 +4144,53 @@ void update_auto_increment_key(MI_CHECK *param, MI_INFO *info,
index tuples}
= #tuples-in-the-index / #distinct-tuples-in-the-index.
+
+ The #tuples-in-the-index and #distinct-tuples-in-the-index have different
+ meaning depending on which statistics collection method is used:
+
+ MI_STATS_METHOD_* how are nulls compared? which tuples are counted?
+ NULLS_EQUAL NULL == NULL all tuples in table
+ NULLS_NOT_EQUAL NULL != NULL all tuples in table
+ IGNORE_NULLS n/a tuples that don't have NULLs
*/
void update_key_parts(MI_KEYDEF *keyinfo, ulong *rec_per_key_part,
- ulonglong *unique, ulonglong records)
+ ulonglong *unique, ulonglong *notnull,
+ ulonglong records)
{
- ulonglong count=0,tmp;
+ ulonglong count=0,tmp, unique_tuples;
+ ulonglong tuples= records;
uint parts;
for (parts=0 ; parts < keyinfo->keysegs ; parts++)
{
count+=unique[parts];
- if (count == 0)
- tmp=records;
+ unique_tuples= count + 1;
+ if (notnull)
+ {
+ tuples= notnull[parts];
+ /*
+ #(unique_tuples not counting tuples with NULLs) =
+ #(unique_tuples counting tuples with NULLs as different) -
+ #(tuples with NULLs)
+ */
+ unique_tuples -= (records - notnull[parts]);
+ }
+
+ if (unique_tuples == 0)
+ tmp= 1;
+ else if (count == 0)
+ tmp= tuples; /* 1 unique tuple */
else
- tmp= (records + (count+1)/2) / (count+1);
- /* for some weird keys (e.g. FULLTEXT) tmp can be <1 here.
- let's ensure it is not */
+ tmp= (tuples + unique_tuples/2) / unique_tuples;
+
+ /*
+ for some weird keys (e.g. FULLTEXT) tmp can be <1 here.
+ let's ensure it is not
+ */
set_if_bigger(tmp,1);
if (tmp >= (ulonglong) ~(ulong) 0)
tmp=(ulonglong) ~(ulong) 0;
+
*rec_per_key_part=(ulong) tmp;
rec_per_key_part++;
}
diff --git a/storage/myisam/mi_delete.c b/storage/myisam/mi_delete.c
index 62ca7f8ff61..bf99830b37f 100644
--- a/storage/myisam/mi_delete.c
+++ b/storage/myisam/mi_delete.c
@@ -407,7 +407,8 @@ static int del(register MI_INFO *info, register MI_KEYDEF *keyinfo, uchar *key,
MYISAM_SHARE *share=info->s;
MI_KEY_PARAM s_temp;
DBUG_ENTER("del");
- DBUG_PRINT("enter",("leaf_page: %ld keypos: %lx",leaf_page,keypos));
+ DBUG_PRINT("enter",("leaf_page: %ld keypos: 0x%lx", leaf_page,
+ (ulong) keypos));
DBUG_DUMP("leaf_buff",(byte*) leaf_buff,mi_getint(leaf_buff));
endpos=leaf_buff+mi_getint(leaf_buff);
@@ -512,7 +513,8 @@ static int underflow(register MI_INFO *info, register MI_KEYDEF *keyinfo,
MI_KEY_PARAM s_temp;
MYISAM_SHARE *share=info->s;
DBUG_ENTER("underflow");
- DBUG_PRINT("enter",("leaf_page: %ld keypos: %lx",(long) leaf_page,keypos));
+ DBUG_PRINT("enter",("leaf_page: %ld keypos: 0x%lx",(long) leaf_page,
+ (ulong) keypos));
DBUG_DUMP("anc_buff",(byte*) anc_buff,mi_getint(anc_buff));
DBUG_DUMP("leaf_buff",(byte*) leaf_buff,mi_getint(leaf_buff));
diff --git a/storage/myisam/mi_rkey.c b/storage/myisam/mi_rkey.c
index 575a5e34488..e6f4d39ab49 100644
--- a/storage/myisam/mi_rkey.c
+++ b/storage/myisam/mi_rkey.c
@@ -31,8 +31,8 @@ int mi_rkey(MI_INFO *info, byte *buf, int inx, const byte *key, uint key_len,
HA_KEYSEG *last_used_keyseg;
uint pack_key_length, use_key_length, nextflag;
DBUG_ENTER("mi_rkey");
- DBUG_PRINT("enter", ("base: %p buf: %p inx: %d search_flag: %d",
- info, buf, inx, search_flag));
+ DBUG_PRINT("enter", ("base: %lx buf: %lx inx: %d search_flag: %d",
+ (long) info, (long) buf, inx, search_flag));
if ((inx = _mi_check_index(info,inx)) < 0)
DBUG_RETURN(my_errno);
diff --git a/storage/myisam/mi_rnext_same.c b/storage/myisam/mi_rnext_same.c
index 4d770258a72..92692d0517f 100644
--- a/storage/myisam/mi_rnext_same.c
+++ b/storage/myisam/mi_rnext_same.c
@@ -28,7 +28,7 @@
int mi_rnext_same(MI_INFO *info, byte *buf)
{
int error;
- uint inx,not_used;
+ uint inx,not_used[2];
MI_KEYDEF *keyinfo;
DBUG_ENTER("mi_rnext_same");
@@ -69,7 +69,7 @@ int mi_rnext_same(MI_INFO *info, byte *buf)
info->s->state.key_root[inx])))
break;
if (ha_key_cmp(keyinfo->seg, info->lastkey, info->lastkey2,
- info->last_rkey_length, SEARCH_FIND, &not_used))
+ info->last_rkey_length, SEARCH_FIND, not_used))
{
error=1;
my_errno=HA_ERR_END_OF_FILE;
diff --git a/storage/myisam/mi_search.c b/storage/myisam/mi_search.c
index 185f196a814..a6c2cbd6082 100644
--- a/storage/myisam/mi_search.c
+++ b/storage/myisam/mi_search.c
@@ -128,13 +128,13 @@ int _mi_search(register MI_INFO *info, register MI_KEYDEF *keyinfo,
if ((nextflag & (SEARCH_SMALLER | SEARCH_LAST)) && flag != 0)
{
- uint not_used;
+ uint not_used[2];
if (_mi_get_prev_key(info,keyinfo, buff, info->lastkey, keypos,
&info->lastkey_length))
goto err;
if (!(nextflag & SEARCH_SMALLER) &&
ha_key_cmp(keyinfo->seg, info->lastkey, key, key_len, SEARCH_FIND,
- &not_used))
+ not_used))
{
my_errno=HA_ERR_KEY_NOT_FOUND; /* Didn't find key */
goto err;
@@ -179,7 +179,7 @@ int _mi_bin_search(MI_INFO *info, register MI_KEYDEF *keyinfo, uchar *page,
{
reg4 int start,mid,end,save_end;
int flag;
- uint totlength,nod_flag,not_used;
+ uint totlength,nod_flag,not_used[2];
DBUG_ENTER("_mi_bin_search");
LINT_INIT(flag);
@@ -193,7 +193,7 @@ int _mi_bin_search(MI_INFO *info, register MI_KEYDEF *keyinfo, uchar *page,
{
mid= (start+end)/2;
if ((flag=ha_key_cmp(keyinfo->seg,page+(uint) mid*totlength,key,key_len,
- comp_flag,&not_used))
+ comp_flag, not_used))
>= 0)
end=mid;
else
@@ -201,7 +201,7 @@ int _mi_bin_search(MI_INFO *info, register MI_KEYDEF *keyinfo, uchar *page,
}
if (mid != start)
flag=ha_key_cmp(keyinfo->seg,page+(uint) start*totlength,key,key_len,
- comp_flag,&not_used);
+ comp_flag, not_used);
if (flag < 0)
start++; /* point at next, bigger key */
*ret_pos=page+(uint) start*totlength;
@@ -242,7 +242,7 @@ int _mi_seq_search(MI_INFO *info, register MI_KEYDEF *keyinfo, uchar *page,
uchar *buff, my_bool *last_key)
{
int flag;
- uint nod_flag,length,not_used;
+ uint nod_flag,length,not_used[2];
uchar t_buff[MI_MAX_KEY_BUFF],*end;
DBUG_ENTER("_mi_seq_search");
@@ -259,15 +259,16 @@ int _mi_seq_search(MI_INFO *info, register MI_KEYDEF *keyinfo, uchar *page,
{
mi_print_error(info->s, HA_ERR_CRASHED);
my_errno=HA_ERR_CRASHED;
- DBUG_PRINT("error",("Found wrong key: length: %u page: %p end: %p",
- length, page, end));
+ DBUG_PRINT("error",("Found wrong key: length: %u page: %lx end: %lx",
+ length, (long) page, (long) end));
DBUG_RETURN(MI_FOUND_WRONG_KEY);
}
if ((flag=ha_key_cmp(keyinfo->seg,t_buff,key,key_len,comp_flag,
- &not_used)) >= 0)
+ not_used)) >= 0)
break;
#ifdef EXTRA_DEBUG
- DBUG_PRINT("loop",("page: %p key: '%s' flag: %d", page, t_buff, flag));
+ DBUG_PRINT("loop",("page: %lx key: '%s' flag: %d", (long) page, t_buff,
+ flag));
#endif
memcpy(buff,t_buff,length);
*ret_pos=page;
@@ -275,7 +276,7 @@ int _mi_seq_search(MI_INFO *info, register MI_KEYDEF *keyinfo, uchar *page,
if (flag == 0)
memcpy(buff,t_buff,length); /* Result is first key */
*last_key= page == end;
- DBUG_PRINT("exit",("flag: %d ret_pos: %p", flag, *ret_pos));
+ DBUG_PRINT("exit",("flag: %d ret_pos: %lx", flag, (long) *ret_pos));
DBUG_RETURN(flag);
} /* _mi_seq_search */
@@ -415,8 +416,8 @@ int _mi_prefix_search(MI_INFO *info, register MI_KEYDEF *keyinfo, uchar *page,
{
mi_print_error(info->s, HA_ERR_CRASHED);
my_errno=HA_ERR_CRASHED;
- DBUG_PRINT("error",("Found wrong key: length: %u page: %p end: %p",
- length, page, end));
+ DBUG_PRINT("error",("Found wrong key: length: %u page: %lx end: %lx",
+ length, (long) page, (long) end));
DBUG_RETURN(MI_FOUND_WRONG_KEY);
}
@@ -506,9 +507,9 @@ int _mi_prefix_search(MI_INFO *info, register MI_KEYDEF *keyinfo, uchar *page,
cmp_rest:
if (key_len_left>0)
{
- uint not_used;
+ uint not_used[2];
if ((flag = ha_key_cmp(keyinfo->seg+1,vseg,
- k,key_len_left,nextflag,&not_used)) >= 0)
+ k, key_len_left, nextflag, not_used)) >= 0)
break;
}
else
@@ -550,7 +551,7 @@ int _mi_prefix_search(MI_INFO *info, register MI_KEYDEF *keyinfo, uchar *page,
*last_key= page == end;
- DBUG_PRINT("exit",("flag: %d ret_pos: %p", flag, *ret_pos));
+ DBUG_PRINT("exit",("flag: %d ret_pos: %lx", flag, (long) *ret_pos));
DBUG_RETURN(flag);
} /* _mi_prefix_search */
@@ -812,8 +813,8 @@ uint _mi_get_pack_key(register MI_KEYDEF *keyinfo, uint nod_flag,
if (length > keyseg->length)
{
DBUG_PRINT("error",
- ("Found too long null packed key: %u of %u at %p",
- length, keyseg->length, *page_pos));
+ ("Found too long null packed key: %u of %u at %lx",
+ length, keyseg->length, (long) *page_pos));
DBUG_DUMP("key",(char*) *page_pos,16);
mi_print_error(keyinfo->share, HA_ERR_CRASHED);
my_errno=HA_ERR_CRASHED;
@@ -869,8 +870,8 @@ uint _mi_get_pack_key(register MI_KEYDEF *keyinfo, uint nod_flag,
}
if (length > (uint) keyseg->length)
{
- DBUG_PRINT("error",("Found too long packed key: %u of %u at %p",
- length, keyseg->length, *page_pos));
+ DBUG_PRINT("error",("Found too long packed key: %u of %u at %lx",
+ length, keyseg->length, (long) *page_pos));
DBUG_DUMP("key",(char*) *page_pos,16);
mi_print_error(keyinfo->share, HA_ERR_CRASHED);
my_errno=HA_ERR_CRASHED;
@@ -935,8 +936,8 @@ uint _mi_get_binary_pack_key(register MI_KEYDEF *keyinfo, uint nod_flag,
{
if (length > keyinfo->maxlength)
{
- DBUG_PRINT("error",("Found too long binary packed key: %u of %u at %p",
- length, keyinfo->maxlength, *page_pos));
+ DBUG_PRINT("error",("Found too long binary packed key: %u of %u at %lx",
+ length, keyinfo->maxlength, (long) *page_pos));
DBUG_DUMP("key",(char*) *page_pos,16);
mi_print_error(keyinfo->share, HA_ERR_CRASHED);
my_errno=HA_ERR_CRASHED;
@@ -983,9 +984,9 @@ uint _mi_get_binary_pack_key(register MI_KEYDEF *keyinfo, uint nod_flag,
length-=tmp;
from=page; from_end=page_end;
}
- DBUG_PRINT("info",("key: %p from: %p length: %u",
- key, from, length));
- memcpy_overlap((byte*) key, (byte*) from, (size_t) length);
+ DBUG_PRINT("info",("key: %lx from: %lx length: %u",
+ (long) key, (long) from, length));
+ memmove((byte*) key, (byte*) from, (size_t) length);
key+=length;
from+=length;
}
@@ -1041,7 +1042,8 @@ uchar *_mi_get_key(MI_INFO *info, MI_KEYDEF *keyinfo, uchar *page,
}
}
}
- DBUG_PRINT("exit",("page: %p length: %u", page, *return_key_length));
+ DBUG_PRINT("exit",("page: %lx length: %u", (long) page,
+ *return_key_length));
DBUG_RETURN(page);
} /* _mi_get_key */
@@ -1093,7 +1095,7 @@ uchar *_mi_get_last_key(MI_INFO *info, MI_KEYDEF *keyinfo, uchar *page,
uint nod_flag;
uchar *lastpos;
DBUG_ENTER("_mi_get_last_key");
- DBUG_PRINT("enter",("page: %p endpos: %p", page, endpos));
+ DBUG_PRINT("enter",("page: %lx endpos: %lx", (long) page, (long) endpos));
nod_flag=mi_test_if_nod(page);
if (! (keyinfo->flag & (HA_VAR_LENGTH_KEY | HA_BINARY_PACK_KEY)))
@@ -1113,14 +1115,16 @@ uchar *_mi_get_last_key(MI_INFO *info, MI_KEYDEF *keyinfo, uchar *page,
*return_key_length=(*keyinfo->get_key)(keyinfo,nod_flag,&page,lastkey);
if (*return_key_length == 0)
{
- DBUG_PRINT("error",("Couldn't find last key: page: %p", page));
+ DBUG_PRINT("error",("Couldn't find last key: page: %lx",
+ (long) page));
mi_print_error(info->s, HA_ERR_CRASHED);
my_errno=HA_ERR_CRASHED;
DBUG_RETURN(0);
}
}
}
- DBUG_PRINT("exit",("lastpos: %p length: %u", lastpos, *return_key_length));
+ DBUG_PRINT("exit",("lastpos: %lx length: %u", (long) lastpos,
+ *return_key_length));
DBUG_RETURN(lastpos);
} /* _mi_get_last_key */
@@ -1659,7 +1663,8 @@ _mi_calc_var_pack_key_length(MI_KEYDEF *keyinfo,uint nod_flag,uchar *next_key,
ref_length=0;
next_length_pack=0;
}
- DBUG_PRINT("test",("length: %d next_key: %p", length, next_key));
+ DBUG_PRINT("test",("length: %d next_key: %lx", length,
+ (long) next_key));
{
uint tmp_length;
diff --git a/storage/myisam/mi_write.c b/storage/myisam/mi_write.c
index 8785adae9a2..2dd84674bff 100644
--- a/storage/myisam/mi_write.c
+++ b/storage/myisam/mi_write.c
@@ -898,10 +898,10 @@ int _mi_ck_write_tree(register MI_INFO *info, uint keynr, uchar *key,
static int keys_compare(bulk_insert_param *param, uchar *key1, uchar *key2)
{
- uint not_used;
+ uint not_used[2];
return ha_key_cmp(param->info->s->keyinfo[param->keynr].seg,
- key1, key2, USE_WHOLE_KEY, SEARCH_SAME,
- &not_used);
+ key1, key2, USE_WHOLE_KEY, SEARCH_SAME,
+ not_used);
}
diff --git a/storage/myisam/myisamchk.c b/storage/myisam/myisamchk.c
index a90495e5fcb..b3d95d21eb7 100644
--- a/storage/myisam/myisamchk.c
+++ b/storage/myisam/myisamchk.c
@@ -339,7 +339,8 @@ static struct my_option my_long_options[] =
REQUIRED_ARG, 0, 0, 0, 0, 0, 0},
{"stats_method", OPT_STATS_METHOD,
"Specifies how index statistics collection code should threat NULLs. "
- "Possible values of name are \"nulls_unequal\" (default behavior for 4.1/5.0), and \"nulls_equal\" (emulate 4.0 behavior).",
+ "Possible values of name are \"nulls_unequal\" (default behavior for 4.1/5.0), "
+ "\"nulls_equal\" (emulate 4.0 behavior), and \"nulls_ignored\".",
(gptr*) &myisam_stats_method_str, (gptr*) &myisam_stats_method_str, 0,
GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0},
{ 0, 0, 0, 0, 0, 0, GET_NO_ARG, NO_ARG, 0, 0, 0, 0, 0, 0}
@@ -451,6 +452,10 @@ static void usage(void)
-a, --analyze Analyze distribution of keys. Will make some joins in\n\
MySQL faster. You can check the calculated distribution\n\
by using '--description --verbose table_name'.\n\
+ --stats_method=name Specifies how index statistics collection code should\n\
+ threat NULLs. Possible values of name are \"nulls_unequal\"\n\
+ (default for 4.1/5.0), \"nulls_equal\" (emulate 4.0), and \n\
+ \"nulls_ignored\".\n\
-d, --description Prints some information about table.\n\
-A, --set-auto-increment[=value]\n\
Force auto_increment to start at this or higher value\n\
@@ -472,7 +477,7 @@ static void usage(void)
#include <help_end.h>
const char *myisam_stats_method_names[] = {"nulls_unequal", "nulls_equal",
- NullS};
+ "nulls_ignored", NullS};
TYPELIB myisam_stats_method_typelib= {
array_elements(myisam_stats_method_names) - 1, "",
myisam_stats_method_names, NULL};
@@ -699,13 +704,25 @@ get_one_option(int optid,
case OPT_STATS_METHOD:
{
int method;
+ enum_mi_stats_method method_conv;
myisam_stats_method_str= argument;
if ((method=find_type(argument, &myisam_stats_method_typelib, 2)) <= 0)
{
fprintf(stderr, "Invalid value of stats_method: %s.\n", argument);
exit(1);
}
- check_param.stats_method= (enum_mi_stats_method) (method-1);
+ switch (method-1) {
+ case 0:
+ method_conv= MI_STATS_METHOD_NULLS_EQUAL;
+ break;
+ case 1:
+ method_conv= MI_STATS_METHOD_NULLS_NOT_EQUAL;
+ break;
+ case 2:
+ method_conv= MI_STATS_METHOD_IGNORE_NULLS;
+ break;
+ }
+ check_param.stats_method= method_conv;
break;
}
#ifdef DEBUG /* Only useful if debugging */
diff --git a/storage/myisam/myisamdef.h b/storage/myisam/myisamdef.h
index 36328c9d9f1..6ccb52aff22 100644
--- a/storage/myisam/myisamdef.h
+++ b/storage/myisam/myisamdef.h
@@ -298,7 +298,14 @@ typedef struct st_mi_sort_param
pthread_t thr;
IO_CACHE read_cache, tempfile, tempfile_for_exceptions;
DYNAMIC_ARRAY buffpek;
+
+ /*
+ The next two are used to collect statistics, see update_key_parts for
+ description.
+ */
ulonglong unique[MI_MAX_KEY_SEG+1];
+ ulonglong notnull[MI_MAX_KEY_SEG+1];
+
my_off_t pos,max_pos,filepos,start_recpos;
uint key, key_length,real_key_length,sortbuff_size;
uint maxbuffers, keys, find_length, sort_keys_length;
diff --git a/storage/myisam/sort.c b/storage/myisam/sort.c
index 6c718a0d453..c3eaddb3e92 100644
--- a/storage/myisam/sort.c
+++ b/storage/myisam/sort.c
@@ -481,8 +481,12 @@ int thr_write_keys(MI_SORT_PARAM *sort_param)
{
mi_set_key_active(share->state.key_map, sinfo->key);
if (param->testflag & T_STATISTICS)
- update_key_parts(sinfo->keyinfo, rec_per_key_part,
- sinfo->unique, (ulonglong) info->state->records);
+ update_key_parts(sinfo->keyinfo, rec_per_key_part, sinfo->unique,
+ param->stats_method == MI_STATS_METHOD_IGNORE_NULLS?
+ sinfo->notnull: NULL,
+ (ulonglong) info->state->records);
+
+
if (!sinfo->buffpek.elements)
{
if (param->testflag & T_VERBOSE)
diff --git a/storage/myisammrg/myrg_queue.c b/storage/myisammrg/myrg_queue.c
index dfb434d6397..7172b9f0e2a 100644
--- a/storage/myisammrg/myrg_queue.c
+++ b/storage/myisammrg/myrg_queue.c
@@ -20,9 +20,9 @@ static int queue_key_cmp(void *keyseg, byte *a, byte *b)
{
MI_INFO *aa=((MYRG_TABLE *)a)->table;
MI_INFO *bb=((MYRG_TABLE *)b)->table;
- uint not_used;
+ uint not_used[2];
int ret= ha_key_cmp((HA_KEYSEG *)keyseg, aa->lastkey, bb->lastkey,
- USE_WHOLE_KEY, SEARCH_FIND, &not_used);
+ USE_WHOLE_KEY, SEARCH_FIND, not_used);
return ret < 0 ? -1 : ret > 0 ? 1 : 0;
} /* queue_key_cmp */
diff --git a/storage/ndb/config/type_ndbapi.mk.am b/storage/ndb/config/type_ndbapi.mk.am
index d4be0c40b36..29523e3378f 100644
--- a/storage/ndb/config/type_ndbapi.mk.am
+++ b/storage/ndb/config/type_ndbapi.mk.am
@@ -1,6 +1,8 @@
INCLUDES += \
- -I$(srcdir) -I$(top_srcdir)/include -I$(top_srcdir)/storage/ndb/include \
+ -I$(srcdir) -I$(top_srcdir)/include \
+ -I$(top_srcdir)/mysys \
+ -I$(top_srcdir)/storage/ndb/include \
-I$(top_srcdir)/storage/ndb/include/kernel \
-I$(top_srcdir)/storage/ndb/include/transporter \
-I$(top_srcdir)/storage/ndb/include/debugger \
diff --git a/storage/ndb/config/type_util.mk.am b/storage/ndb/config/type_util.mk.am
index 5d7ad6e57b9..2b232d2010a 100644
--- a/storage/ndb/config/type_util.mk.am
+++ b/storage/ndb/config/type_util.mk.am
@@ -1,5 +1,7 @@
-INCLUDES += -I$(srcdir) -I$(top_srcdir)/include \
+INCLUDES += -I$(srcdir) \
+ -I$(top_srcdir)/include \
+ -I$(top_srcdir)/mysys \
-I$(top_srcdir)/storage/ndb/include \
-I$(top_srcdir)/storage/ndb/include/util \
-I$(top_srcdir)/storage/ndb/include/portlib \
diff --git a/storage/ndb/include/kernel/signaldata/DumpStateOrd.hpp b/storage/ndb/include/kernel/signaldata/DumpStateOrd.hpp
index 7368a0ec40d..bde690e056d 100644
--- a/storage/ndb/include/kernel/signaldata/DumpStateOrd.hpp
+++ b/storage/ndb/include/kernel/signaldata/DumpStateOrd.hpp
@@ -98,6 +98,8 @@ public:
StartTcTimer = 2509,
StopTcTimer = 2510,
StartPeriodicTcTimer = 2511,
+ TcStartDumpIndexOpCount = 2512,
+ TcDumpIndexOpCount = 2513,
CmvmiDumpConnections = 2600,
CmvmiDumpLongSignalMemory = 2601,
CmvmiSetRestartOnErrorInsert = 2602,
diff --git a/storage/ndb/include/mgmapi/mgmapi_config_parameters.h b/storage/ndb/include/mgmapi/mgmapi_config_parameters.h
index 48edc6eaaa0..c257a61bcab 100644
--- a/storage/ndb/include/mgmapi/mgmapi_config_parameters.h
+++ b/storage/ndb/include/mgmapi/mgmapi_config_parameters.h
@@ -115,6 +115,7 @@
#define CFG_CONNECTION_HOSTNAME_1 407
#define CFG_CONNECTION_HOSTNAME_2 408
#define CFG_CONNECTION_GROUP 409
+#define CFG_CONNECTION_NODE_ID_SERVER 410
#define CFG_TCP_SERVER 452
#define CFG_TCP_SEND_BUFFER_SIZE 454
diff --git a/storage/ndb/include/mgmapi/ndbd_exit_codes.h b/storage/ndb/include/mgmapi/ndbd_exit_codes.h
index 794329ce637..2a0802add02 100644
--- a/storage/ndb/include/mgmapi/ndbd_exit_codes.h
+++ b/storage/ndb/include/mgmapi/ndbd_exit_codes.h
@@ -100,9 +100,11 @@ typedef ndbd_exit_classification_enum ndbd_exit_classification;
#define NDBD_EXIT_SIGNAL_LOST 6051
#define NDBD_EXIT_SIGNAL_LOST_SEND_BUFFER_FULL 6052
#define NDBD_EXIT_ILLEGAL_SIGNAL 6053
+#define NDBD_EXIT_CONNECTION_SETUP_FAILED 6054
/* NDBCNTR 6100-> */
#define NDBD_EXIT_RESTART_TIMEOUT 6100
+#define NDBD_EXIT_RESTART_DURING_SHUTDOWN 6101
/* TC 6200-> */
/* DIH 6300-> */
diff --git a/storage/ndb/include/transporter/TransporterCallback.hpp b/storage/ndb/include/transporter/TransporterCallback.hpp
index f2432edd394..ef9be8c5a69 100644
--- a/storage/ndb/include/transporter/TransporterCallback.hpp
+++ b/storage/ndb/include/transporter/TransporterCallback.hpp
@@ -81,7 +81,9 @@ reportConnect(void * callbackObj, NodeId nodeId);
void
reportDisconnect(void * callbackObj,
NodeId nodeId, Uint32 errNo);
-
+
+#define TE_DO_DISCONNECT 0x8000
+
enum TransporterError {
TE_NO_ERROR = 0,
/**
@@ -111,7 +113,7 @@ enum TransporterError {
*
* Recommended behavior: setPerformState(PerformDisconnect)
*/
- TE_INVALID_MESSAGE_LENGTH = 0x8003,
+ TE_INVALID_MESSAGE_LENGTH = 0x3 | TE_DO_DISCONNECT,
/**
* TE_INVALID_CHECKSUM
@@ -120,7 +122,7 @@ enum TransporterError {
*
* Recommended behavior: setPerformState(PerformDisonnect)
*/
- TE_INVALID_CHECKSUM = 0x8004,
+ TE_INVALID_CHECKSUM = 0x4 | TE_DO_DISCONNECT,
/**
* TE_COULD_NOT_CREATE_SOCKET
@@ -129,7 +131,7 @@ enum TransporterError {
*
* Recommended behavior: setPerformState(PerformDisonnect)
*/
- TE_COULD_NOT_CREATE_SOCKET = 0x8005,
+ TE_COULD_NOT_CREATE_SOCKET = 0x5,
/**
* TE_COULD_NOT_BIND_SOCKET
@@ -138,7 +140,7 @@ enum TransporterError {
*
* Recommended behavior: setPerformState(PerformDisonnect)
*/
- TE_COULD_NOT_BIND_SOCKET = 0x8006,
+ TE_COULD_NOT_BIND_SOCKET = 0x6,
/**
* TE_LISTEN_FAILED
@@ -147,7 +149,7 @@ enum TransporterError {
*
* Recommended behavior: setPerformState(PerformDisonnect)
*/
- TE_LISTEN_FAILED = 0x8007,
+ TE_LISTEN_FAILED = 0x7,
/**
* TE_ACCEPT_RETURN_ERROR
@@ -158,7 +160,7 @@ enum TransporterError {
* Recommended behavior: Ignore
* (or possible do setPerformState(PerformDisconnect)
*/
- TE_ACCEPT_RETURN_ERROR = 0x8008
+ TE_ACCEPT_RETURN_ERROR = 0x8
/**
* TE_SHM_DISCONNECT
@@ -167,7 +169,7 @@ enum TransporterError {
*
* Recommended behavior: setPerformState(PerformDisonnect)
*/
- ,TE_SHM_DISCONNECT = 0x800b
+ ,TE_SHM_DISCONNECT = 0xb | TE_DO_DISCONNECT
/**
* TE_SHM_IPC_STAT
@@ -178,7 +180,12 @@ enum TransporterError {
*
* Recommended behavior: setPerformState(PerformDisonnect)
*/
- ,TE_SHM_IPC_STAT = 0x800c
+ ,TE_SHM_IPC_STAT = 0xc | TE_DO_DISCONNECT
+
+ /**
+ * Permanent error
+ */
+ ,TE_SHM_IPC_PERMANENT = 0x21
/**
* TE_SHM_UNABLE_TO_CREATE_SEGMENT
@@ -188,7 +195,7 @@ enum TransporterError {
*
* Recommended behavior: setPerformState(PerformDisonnect)
*/
- ,TE_SHM_UNABLE_TO_CREATE_SEGMENT = 0x800d
+ ,TE_SHM_UNABLE_TO_CREATE_SEGMENT = 0xd
/**
* TE_SHM_UNABLE_TO_ATTACH_SEGMENT
@@ -198,7 +205,7 @@ enum TransporterError {
*
* Recommended behavior: setPerformState(PerformDisonnect)
*/
- ,TE_SHM_UNABLE_TO_ATTACH_SEGMENT = 0x800e
+ ,TE_SHM_UNABLE_TO_ATTACH_SEGMENT = 0xe
/**
* TE_SHM_UNABLE_TO_REMOVE_SEGMENT
@@ -208,12 +215,12 @@ enum TransporterError {
* Recommended behavior: Ignore (not much to do)
* Print warning to logfile
*/
- ,TE_SHM_UNABLE_TO_REMOVE_SEGMENT = 0x800f
+ ,TE_SHM_UNABLE_TO_REMOVE_SEGMENT = 0xf
- ,TE_TOO_SMALL_SIGID = 0x0010
- ,TE_TOO_LARGE_SIGID = 0x0011
- ,TE_WAIT_STACK_FULL = 0x8012
- ,TE_RECEIVE_BUFFER_FULL = 0x8013
+ ,TE_TOO_SMALL_SIGID = 0x10
+ ,TE_TOO_LARGE_SIGID = 0x11
+ ,TE_WAIT_STACK_FULL = 0x12 | TE_DO_DISCONNECT
+ ,TE_RECEIVE_BUFFER_FULL = 0x13 | TE_DO_DISCONNECT
/**
* TE_SIGNAL_LOST_SEND_BUFFER_FULL
@@ -222,7 +229,7 @@ enum TransporterError {
* a signal is dropped!! very bad very bad
*
*/
- ,TE_SIGNAL_LOST_SEND_BUFFER_FULL = 0x8014
+ ,TE_SIGNAL_LOST_SEND_BUFFER_FULL = 0x14 | TE_DO_DISCONNECT
/**
* TE_SIGNAL_LOST
@@ -231,14 +238,14 @@ enum TransporterError {
* a signal is dropped!! very bad very bad
*
*/
- ,TE_SIGNAL_LOST = 0x8015
+ ,TE_SIGNAL_LOST = 0x15
/**
* TE_SEND_BUFFER_FULL
*
* The send buffer was full, but sleeping for a while solved it
*/
- ,TE_SEND_BUFFER_FULL = 0x0016
+ ,TE_SEND_BUFFER_FULL = 0x16
/**
* TE_SCI_UNABLE_TO_CLOSE_CHANNEL
@@ -246,7 +253,7 @@ enum TransporterError {
* Unable to close the sci channel and the resources allocated by
* the sisci api.
*/
- ,TE_SCI_UNABLE_TO_CLOSE_CHANNEL = 0x8016
+ ,TE_SCI_UNABLE_TO_CLOSE_CHANNEL = 0x22
/**
* TE_SCI_LINK_ERROR
@@ -255,7 +262,7 @@ enum TransporterError {
* No point in continuing. Must check the connections.
* Recommended behavior: setPerformState(PerformDisonnect)
*/
- ,TE_SCI_LINK_ERROR = 0x8017
+ ,TE_SCI_LINK_ERROR = 0x0017
/**
* TE_SCI_UNABLE_TO_START_SEQUENCE
@@ -264,14 +271,14 @@ enum TransporterError {
* are exumed or no sequence has been created.
* Recommended behavior: setPerformState(PerformDisonnect)
*/
- ,TE_SCI_UNABLE_TO_START_SEQUENCE = 0x8018
+ ,TE_SCI_UNABLE_TO_START_SEQUENCE = 0x18 | TE_DO_DISCONNECT
/**
* TE_SCI_UNABLE_TO_REMOVE_SEQUENCE
*
* Could not remove a sequence
*/
- ,TE_SCI_UNABLE_TO_REMOVE_SEQUENCE = 0x8019
+ ,TE_SCI_UNABLE_TO_REMOVE_SEQUENCE = 0x19 | TE_DO_DISCONNECT
/**
* TE_SCI_UNABLE_TO_CREATE_SEQUENCE
@@ -280,7 +287,7 @@ enum TransporterError {
* exempted. Must reboot.
* Recommended behavior: setPerformState(PerformDisonnect)
*/
- ,TE_SCI_UNABLE_TO_CREATE_SEQUENCE = 0x801a
+ ,TE_SCI_UNABLE_TO_CREATE_SEQUENCE = 0x1a | TE_DO_DISCONNECT
/**
* TE_SCI_UNRECOVERABLE_DATA_TFX_ERROR
@@ -288,7 +295,7 @@ enum TransporterError {
* Tried to send data on redundant link but failed.
* Recommended behavior: setPerformState(PerformDisonnect)
*/
- ,TE_SCI_UNRECOVERABLE_DATA_TFX_ERROR = 0x801b
+ ,TE_SCI_UNRECOVERABLE_DATA_TFX_ERROR = 0x1b | TE_DO_DISCONNECT
/**
* TE_SCI_CANNOT_INIT_LOCALSEGMENT
@@ -297,7 +304,7 @@ enum TransporterError {
* gone wrong (no system resources). Must reboot.
* Recommended behavior: setPerformState(PerformDisonnect)
*/
- ,TE_SCI_CANNOT_INIT_LOCALSEGMENT = 0x801c
+ ,TE_SCI_CANNOT_INIT_LOCALSEGMENT = 0x1c | TE_DO_DISCONNECT
/**
* TE_SCI_CANNOT_MAP_REMOTESEGMENT
@@ -306,7 +313,7 @@ enum TransporterError {
* Must reboot system.
* Recommended behavior: setPerformState(PerformDisonnect)
*/
- ,TE_SCI_CANNOT_MAP_REMOTESEGMENT = 0x801d
+ ,TE_SCI_CANNOT_MAP_REMOTESEGMENT = 0x1d | TE_DO_DISCONNECT
/**
* TE_SCI_UNABLE_TO_UNMAP_SEGMENT
@@ -314,7 +321,7 @@ enum TransporterError {
* Cannot free the resources used by this segment (step 1).
* Recommended behavior: setPerformState(PerformDisonnect)
*/
- ,TE_SCI_UNABLE_TO_UNMAP_SEGMENT = 0x801e
+ ,TE_SCI_UNABLE_TO_UNMAP_SEGMENT = 0x1e | TE_DO_DISCONNECT
/**
* TE_SCI_UNABLE_TO_REMOVE_SEGMENT
@@ -324,7 +331,7 @@ enum TransporterError {
* to map more segment
* Recommended behavior: setPerformState(PerformDisonnect)
*/
- ,TE_SCI_UNABLE_TO_REMOVE_SEGMENT = 0x801f
+ ,TE_SCI_UNABLE_TO_REMOVE_SEGMENT = 0x1f | TE_DO_DISCONNECT
/**
* TE_SCI_UNABLE_TO_DISCONNECT_SEGMENT
@@ -332,15 +339,18 @@ enum TransporterError {
* Cannot disconnect from a remote segment.
* Recommended behavior: setPerformState(PerformDisonnect)
*/
- ,TE_SCI_UNABLE_TO_DISCONNECT_SEGMENT = 0x8020
+ ,TE_SCI_UNABLE_TO_DISCONNECT_SEGMENT = 0x20 | TE_DO_DISCONNECT
+ /* Used 0x21 */
+ /* Used 0x22 */
};
/**
* Report error
*/
void
-reportError(void * callbackObj, NodeId nodeId, TransporterError errorCode);
+reportError(void * callbackObj, NodeId nodeId, TransporterError errorCode,
+ const char *info = 0);
void
transporter_recv_from(void* callbackObj, NodeId node);
diff --git a/storage/ndb/include/util/Base64.hpp b/storage/ndb/include/util/Base64.hpp
deleted file mode 100644
index f4b11ad9214..00000000000
--- a/storage/ndb/include/util/Base64.hpp
+++ /dev/null
@@ -1,28 +0,0 @@
-/* Copyright (C) 2003 MySQL AB
-
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation; either version 2 of the License, or
- (at your option) any later version.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with this program; if not, write to the Free Software
- Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */
-
-#ifndef __BASE64_HPP_INCLUDED__
-#define __BASE64_HPP_INCLUDED__
-
-#include <UtilBuffer.hpp>
-#include <BaseString.hpp>
-
-int base64_encode(const UtilBuffer &src, BaseString &dst);
-int base64_encode(const void * s, size_t src_len, BaseString &dst);
-int base64_decode(const BaseString &src, UtilBuffer &dst);
-int base64_decode(const char * s, size_t len, UtilBuffer &dst);
-
-#endif /* !__BASE64_HPP_INCLUDED__ */
diff --git a/storage/ndb/src/common/mgmcommon/IPCConfig.cpp b/storage/ndb/src/common/mgmcommon/IPCConfig.cpp
index f935f8ffab4..bc442ffc3ef 100644
--- a/storage/ndb/src/common/mgmcommon/IPCConfig.cpp
+++ b/storage/ndb/src/common/mgmcommon/IPCConfig.cpp
@@ -231,8 +231,11 @@ IPCConfig::configureTransporters(Uint32 nodeId,
Uint32 server_port= 0;
if(iter.get(CFG_CONNECTION_SERVER_PORT, &server_port)) break;
+ Uint32 nodeIdServer= 0;
+ if(iter.get(CFG_CONNECTION_NODE_ID_SERVER, &nodeIdServer)) break;
+
/*
- We check the node type. MGM node becomes server.
+ We check the node type.
*/
Uint32 node1type, node2type;
ndb_mgm_configuration_iterator node1iter(config, CFG_SECTION_NODE);
@@ -242,20 +245,12 @@ IPCConfig::configureTransporters(Uint32 nodeId,
node1iter.get(CFG_TYPE_OF_SECTION,&node1type);
node2iter.get(CFG_TYPE_OF_SECTION,&node2type);
- conf.serverNodeId= (nodeId1 < nodeId2)? nodeId1:nodeId2;
-
- conf.isMgmConnection= false;
- if(node2type==NODE_TYPE_MGM)
- {
- conf.isMgmConnection= true;
- conf.serverNodeId= nodeId2;
- }
- else if(node1type==NODE_TYPE_MGM)
- {
+ if(node1type==NODE_TYPE_MGM || node2type==NODE_TYPE_MGM)
conf.isMgmConnection= true;
- conf.serverNodeId= nodeId1;
- }
- else if (nodeId == conf.serverNodeId) {
+ else
+ conf.isMgmConnection= false;
+
+ if (nodeId == nodeIdServer && !conf.isMgmConnection) {
tr.add_transporter_interface(remoteNodeId, localHostName, server_port);
}
@@ -279,6 +274,7 @@ IPCConfig::configureTransporters(Uint32 nodeId,
conf.s_port = server_port;
conf.localHostName = localHostName;
conf.remoteHostName = remoteHostName;
+ conf.serverNodeId = nodeIdServer;
switch(type){
case CONNECTION_TYPE_SHM:
diff --git a/storage/ndb/src/common/transporter/SHM_Transporter.cpp b/storage/ndb/src/common/transporter/SHM_Transporter.cpp
index a225988d37f..93d718b8713 100644
--- a/storage/ndb/src/common/transporter/SHM_Transporter.cpp
+++ b/storage/ndb/src/common/transporter/SHM_Transporter.cpp
@@ -47,6 +47,9 @@ SHM_Transporter::SHM_Transporter(TransporterRegistry &t_reg,
shmKey(_shmKey),
shmSize(_shmSize)
{
+#ifndef NDB_WIN32
+ shmId= 0;
+#endif
_shmSegCreated = false;
_attached = false;
@@ -202,7 +205,8 @@ SHM_Transporter::connect_server_impl(NDB_SOCKET_TYPE sockfd)
// Create
if(!_shmSegCreated){
if (!ndb_shm_create()) {
- report_error(TE_SHM_UNABLE_TO_CREATE_SEGMENT);
+ make_error_info(buf, sizeof(buf));
+ report_error(TE_SHM_UNABLE_TO_CREATE_SEGMENT, buf);
NDB_CLOSE_SOCKET(sockfd);
DBUG_RETURN(false);
}
@@ -212,7 +216,8 @@ SHM_Transporter::connect_server_impl(NDB_SOCKET_TYPE sockfd)
// Attach
if(!_attached){
if (!ndb_shm_attach()) {
- report_error(TE_SHM_UNABLE_TO_ATTACH_SEGMENT);
+ make_error_info(buf, sizeof(buf));
+ report_error(TE_SHM_UNABLE_TO_ATTACH_SEGMENT, buf);
NDB_CLOSE_SOCKET(sockfd);
DBUG_RETURN(false);
}
@@ -224,7 +229,8 @@ SHM_Transporter::connect_server_impl(NDB_SOCKET_TYPE sockfd)
m_transporter_registry.m_shm_own_pid);
// Wait for ok from client
- if (s_input.gets(buf, 256) == 0)
+ DBUG_PRINT("info", ("Wait for ok from client"));
+ if (s_input.gets(buf, sizeof(buf)) == 0)
{
NDB_CLOSE_SOCKET(sockfd);
DBUG_RETURN(false);
@@ -262,10 +268,8 @@ SHM_Transporter::connect_client_impl(NDB_SOCKET_TYPE sockfd)
SocketOutputStream s_output(sockfd);
char buf[256];
-#if 1
-#endif
-
// Wait for server to create and attach
+ DBUG_PRINT("info", ("Wait for server to create and attach"));
if (s_input.gets(buf, 256) == 0) {
NDB_CLOSE_SOCKET(sockfd);
DBUG_PRINT("error", ("Server id %d did not attach",
@@ -293,7 +297,8 @@ SHM_Transporter::connect_client_impl(NDB_SOCKET_TYPE sockfd)
// Attach
if(!_attached){
if (!ndb_shm_attach()) {
- report_error(TE_SHM_UNABLE_TO_ATTACH_SEGMENT);
+ make_error_info(buf, sizeof(buf));
+ report_error(TE_SHM_UNABLE_TO_ATTACH_SEGMENT, buf);
NDB_CLOSE_SOCKET(sockfd);
DBUG_PRINT("error", ("Failed attach of shm seg to node %d",
remoteNodeId));
@@ -310,6 +315,7 @@ SHM_Transporter::connect_client_impl(NDB_SOCKET_TYPE sockfd)
if (r) {
// Wait for ok from server
+ DBUG_PRINT("info", ("Wait for ok from server"));
if (s_input.gets(buf, 256) == 0) {
NDB_CLOSE_SOCKET(sockfd);
DBUG_PRINT("error", ("No ok from server node %d",
@@ -330,8 +336,6 @@ bool
SHM_Transporter::connect_common(NDB_SOCKET_TYPE sockfd)
{
if (!checkConnected()) {
- DBUG_PRINT("error", ("Already connected to node %d",
- remoteNodeId));
return false;
}
diff --git a/storage/ndb/src/common/transporter/SHM_Transporter.hpp b/storage/ndb/src/common/transporter/SHM_Transporter.hpp
index e7a76225471..b25f9e538db 100644
--- a/storage/ndb/src/common/transporter/SHM_Transporter.hpp
+++ b/storage/ndb/src/common/transporter/SHM_Transporter.hpp
@@ -170,6 +170,8 @@ private:
bool hasDataToRead() const {
return reader->empty() == false;
}
+
+ void make_error_info(char info[], int sz);
};
#endif
diff --git a/storage/ndb/src/common/transporter/SHM_Transporter.unix.cpp b/storage/ndb/src/common/transporter/SHM_Transporter.unix.cpp
index 28882324fc0..7277f9e13ef 100644
--- a/storage/ndb/src/common/transporter/SHM_Transporter.unix.cpp
+++ b/storage/ndb/src/common/transporter/SHM_Transporter.unix.cpp
@@ -26,6 +26,12 @@
#include <sys/ipc.h>
#include <sys/shm.h>
+void SHM_Transporter::make_error_info(char info[], int sz)
+{
+ snprintf(info,sz,"Shm key=%d sz=%d id=%d",
+ shmKey, shmSize, shmId);
+}
+
bool
SHM_Transporter::ndb_shm_create()
{
@@ -64,12 +70,30 @@ SHM_Transporter::checkConnected(){
struct shmid_ds info;
const int res = shmctl(shmId, IPC_STAT, &info);
if(res == -1){
- report_error(TE_SHM_IPC_STAT);
+ char buf[128];
+ int r= snprintf(buf, sizeof(buf),
+ "shmctl(%d, IPC_STAT) errno: %d(%s). ", shmId,
+ errno, strerror(errno));
+ make_error_info(buf+r, sizeof(buf)-r);
+ DBUG_PRINT("error",(buf));
+ switch (errno)
+ {
+ case EACCES:
+ report_error(TE_SHM_IPC_PERMANENT, buf);
+ break;
+ default:
+ report_error(TE_SHM_IPC_STAT, buf);
+ break;
+ }
return false;
}
if(info.shm_nattch != 2){
+ char buf[128];
+ make_error_info(buf, sizeof(buf));
report_error(TE_SHM_DISCONNECT);
+ DBUG_PRINT("error", ("Already connected to node %d",
+ remoteNodeId));
return false;
}
return true;
@@ -91,6 +115,8 @@ SHM_Transporter::disconnectImpl(){
if(isServer && _shmSegCreated){
const int res = shmctl(shmId, IPC_RMID, 0);
if(res == -1){
+ char buf[64];
+ make_error_info(buf, sizeof(buf));
report_error(TE_SHM_UNABLE_TO_REMOVE_SEGMENT);
return;
}
diff --git a/storage/ndb/src/common/transporter/SHM_Transporter.win32.cpp b/storage/ndb/src/common/transporter/SHM_Transporter.win32.cpp
index c289a85da0e..86029b17885 100644
--- a/storage/ndb/src/common/transporter/SHM_Transporter.win32.cpp
+++ b/storage/ndb/src/common/transporter/SHM_Transporter.win32.cpp
@@ -26,6 +26,12 @@
#include <windows.h>
+void SHM_Transporter::make_error_info(char info[], int sz)
+{
+ snprintf(info,sz,"Shm key=%d sz=%d",
+ shmKey, shmSize);
+}
+
bool
SHM_Transporter::connectServer(Uint32 timeOutMillis){
if(!_shmSegCreated)
diff --git a/storage/ndb/src/common/transporter/Transporter.hpp b/storage/ndb/src/common/transporter/Transporter.hpp
index c9f4e9bda42..9e8bbd687ee 100644
--- a/storage/ndb/src/common/transporter/Transporter.hpp
+++ b/storage/ndb/src/common/transporter/Transporter.hpp
@@ -161,7 +161,8 @@ protected:
TransporterRegistry &m_transporter_registry;
void *get_callback_obj() { return m_transporter_registry.callbackObj; };
void report_disconnect(int err){m_transporter_registry.report_disconnect(remoteNodeId,err);};
- void report_error(enum TransporterError err){reportError(get_callback_obj(),remoteNodeId,err);};
+ void report_error(enum TransporterError err, const char *info = 0)
+ { reportError(get_callback_obj(), remoteNodeId, err, info); };
};
inline
diff --git a/storage/ndb/src/common/transporter/TransporterRegistry.cpp b/storage/ndb/src/common/transporter/TransporterRegistry.cpp
index 23ab799094f..633cfeb0ac2 100644
--- a/storage/ndb/src/common/transporter/TransporterRegistry.cpp
+++ b/storage/ndb/src/common/transporter/TransporterRegistry.cpp
@@ -1503,8 +1503,8 @@ TransporterRegistry::startReceiving()
{
DBUG_PRINT("error",("Install failed"));
g_eventLogger.error("Failed to install signal handler for"
- " SHM transporter errno: %d (%s)", errno,
- strerror(errno));
+ " SHM transporter, signum %d, errno: %d (%s)",
+ g_ndb_shm_signum, errno, strerror(errno));
}
}
#endif // NDB_SHM_TRANSPORTER
diff --git a/storage/ndb/src/common/util/Base64.cpp b/storage/ndb/src/common/util/Base64.cpp
deleted file mode 100644
index 3db911f481f..00000000000
--- a/storage/ndb/src/common/util/Base64.cpp
+++ /dev/null
@@ -1,212 +0,0 @@
-/* Copyright (C) 2003 MySQL AB
-
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation; either version 2 of the License, or
- (at your option) any later version.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with this program; if not, write to the Free Software
- Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */
-
-#include <ndb_global.h>
-#include <Base64.hpp>
-
-static char base64_table[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
- "abcdefghijklmnopqrstuvwxyz"
- "0123456789+/";
-
-int
-base64_encode(const UtilBuffer &src, BaseString &dst)
-{
- return base64_encode(src.get_data(), src.length(), dst);
-}
-
-int
-base64_encode(const void * _s, size_t src_len, BaseString &dst) {
- const unsigned char * s = (const unsigned char*)_s;
- size_t i = 0;
- size_t len = 0;
- while(i < src_len) {
- if(len == 76){
- len = 0;
- dst.append('\n');
- }
-
- unsigned c;
- c = s[i++];
- c <<= 8;
-
- if(i < src_len)
- c += s[i];
- c <<= 8;
- i++;
-
- if(i < src_len)
- c += s[i];
- i++;
-
- dst.append(base64_table[(c >> 18) & 0x3f]);
- dst.append(base64_table[(c >> 12) & 0x3f]);
-
- if(i > (src_len + 1))
- dst.append('=');
- else
- dst.append(base64_table[(c >> 6) & 0x3f]);
-
- if(i > src_len)
- dst.append('=');
- else
- dst.append(base64_table[(c >> 0) & 0x3f]);
-
- len += 4;
- }
- return 0;
-}
-
-static inline unsigned
-pos(unsigned char c) {
- return strchr(base64_table, c) - base64_table;
-}
-
-
-int
-base64_decode(const BaseString &src, UtilBuffer &dst) {
- return base64_decode(src.c_str(), src.length(), dst);
-}
-
-#define SKIP_SPACE(src, i, size){ \
- while(i < size && isspace(* src)){ \
- i++; \
- src++; \
- } \
- if(i == size){ \
- i = size + 1; \
- break; \
- } \
-}
-
-int
-base64_decode(const char * src, size_t size, UtilBuffer &dst) {
- size_t i = 0;
- while(i < size){
- unsigned c = 0;
- int mark = 0;
-
- SKIP_SPACE(src, i, size);
-
- c += pos(*src++);
- c <<= 6;
- i++;
-
- SKIP_SPACE(src, i, size);
-
- c += pos(*src++);
- c <<= 6;
- i++;
-
- SKIP_SPACE(src, i, size);
-
- if(* src != '=')
- c += pos(*src++);
- else {
- i = size;
- mark = 2;
- c <<= 6;
- goto end;
- }
- c <<= 6;
- i++;
-
- SKIP_SPACE(src, i, size);
-
- if(*src != '=')
- c += pos(*src++);
- else {
- i = size;
- mark = 1;
- goto end;
- }
- i++;
-
- end:
- char b[3];
- b[0] = (c >> 16) & 0xff;
- b[1] = (c >> 8) & 0xff;
- b[2] = (c >> 0) & 0xff;
-
- dst.append((void *)b, 3-mark);
- }
-
- if(i != size){
- abort();
- return -1;
- }
- return 0;
-}
-
-#ifdef __TEST__B64
-/**
- * USER_FLAGS="-D__TEST__B64" make Base64.o && g++ Base64.o BaseString.o
- */
-inline
-void
-require(bool b){
- if(!b)
- abort();
-}
-
-int
-main(void){
- for(int i = 0; i < 500; i++){
- const size_t len = rand() % 10000 + 1;
- UtilBuffer src;
- for(size_t j = 0; j<len; j++){
- char c = rand();
- src.append(&c, 1);
- }
- require(src.length() == len);
-
- BaseString str;
- require(base64_encode(src, str) == 0);
-
- if(str.length() == 3850){
- printf(">%s<\n", str.c_str());
- }
-
- UtilBuffer dst;
- require(base64_decode(str, dst) == 0);
- require(dst.length() == src.length());
-
- const char * c_src = (char*)src.get_data();
- const char * c_dst = (char*)dst.get_data();
- if(memcmp(src.get_data(), dst.get_data(), src.length()) != 0){
- printf("-- src --\n");
- for(int i2 = 0; i2<len; i2++){
- unsigned char c = c_src[i2];
- printf("%.2x ", (unsigned)c);
- if((i2 % 8) == 7)
- printf("\n");
- }
- printf("\n");
-
- printf("-- dst --\n");
- for(int i2 = 0; i2<len; i2++){
- unsigned char c = c_dst[i2];
- printf("%.2x ", (unsigned)c);
- if((i2 % 8) == 7)
- printf("\n");
- }
- printf("\n");
- abort();
- }
- }
- return 0;
-}
-
-#endif
diff --git a/storage/ndb/src/common/util/Makefile.am b/storage/ndb/src/common/util/Makefile.am
index 7ba3ef941c5..d9c43b2ace1 100644
--- a/storage/ndb/src/common/util/Makefile.am
+++ b/storage/ndb/src/common/util/Makefile.am
@@ -5,7 +5,7 @@ libgeneral_la_SOURCES = \
File.cpp md5_hash.cpp Properties.cpp socket_io.cpp \
SimpleProperties.cpp Parser.cpp InputStream.cpp \
SocketServer.cpp SocketClient.cpp SocketAuthenticator.cpp\
- OutputStream.cpp NdbOut.cpp BaseString.cpp Base64.cpp \
+ OutputStream.cpp NdbOut.cpp BaseString.cpp \
NdbSqlUtil.cpp new.cpp \
uucode.c random.c version.c \
strdup.c \
diff --git a/storage/ndb/src/common/util/Parser.cpp b/storage/ndb/src/common/util/Parser.cpp
index d692aa18392..3a86ae8f318 100644
--- a/storage/ndb/src/common/util/Parser.cpp
+++ b/storage/ndb/src/common/util/Parser.cpp
@@ -20,7 +20,6 @@
#include "Parser.hpp"
#include <NdbOut.hpp>
#include <Properties.hpp>
-#include <Base64.hpp>
#undef DEBUG
#define DEBUG(x) ndbout << x << endl;
@@ -316,11 +315,7 @@ ParserImpl::parseArg(Context * ctx,
}
case DummyRow::Properties: {
- Properties *sp = new Properties();
- BaseString v(value);
- UtilBuffer b;
- base64_decode(v, b);
- sp->unpack((const Uint32 *)b.get_data(), b.length());
+ abort();
break;
}
default:
diff --git a/storage/ndb/src/kernel/blocks/dbdict/Dbdict.cpp b/storage/ndb/src/kernel/blocks/dbdict/Dbdict.cpp
index 7292e5b0885..39f400de7d6 100644
--- a/storage/ndb/src/kernel/blocks/dbdict/Dbdict.cpp
+++ b/storage/ndb/src/kernel/blocks/dbdict/Dbdict.cpp
@@ -4400,6 +4400,44 @@ Dbdict::createTab_dih(Signal* signal,
sendSignal(DBDIH_REF, GSN_DIADDTABREQ, signal,
DiAddTabReq::SignalLength, JBB);
+
+ /**
+ * Create KeyDescriptor
+ */
+ KeyDescriptor* desc= g_key_descriptor_pool.getPtr(tabPtr.i);
+ new (desc) KeyDescriptor();
+
+ Uint32 key = 0;
+ Uint32 tAttr = tabPtr.p->firstAttribute;
+ while (tAttr != RNIL)
+ {
+ jam();
+ AttributeRecord* aRec = c_attributeRecordPool.getPtr(tAttr);
+ if (aRec->tupleKey)
+ {
+ desc->noOfKeyAttr ++;
+ desc->keyAttr[key].attributeDescriptor = aRec->attributeDescriptor;
+
+ Uint32 csNumber = (aRec->extPrecision >> 16);
+ if(csNumber)
+ {
+ desc->keyAttr[key].charsetInfo = all_charsets[csNumber];
+ ndbrequire(all_charsets[csNumber]);
+ desc->hasCharAttr = 1;
+ }
+ else
+ {
+ desc->keyAttr[key].charsetInfo = 0;
+ }
+ if(AttributeDescriptor::getDKey(aRec->attributeDescriptor))
+ {
+ desc->noOfDistrKeys ++;
+ }
+ key++;
+ }
+ tAttr = aRec->nextAttrInTable;
+ }
+ ndbrequire(key == tabPtr.p->noOfPrimkey);
}
static
@@ -4502,44 +4540,6 @@ Dbdict::execADD_FRAGREQ(Signal* signal) {
sendSignal(DBLQH_REF, GSN_LQHFRAGREQ, signal,
LqhFragReq::SignalLength, JBB);
}
-
- /**
- * Create KeyDescriptor
- */
- KeyDescriptor* desc= g_key_descriptor_pool.getPtr(tabPtr.i);
- new (desc) KeyDescriptor();
-
- Uint32 key = 0;
- Uint32 tAttr = tabPtr.p->firstAttribute;
- while (tAttr != RNIL)
- {
- jam();
- AttributeRecord* aRec = c_attributeRecordPool.getPtr(tAttr);
- if (aRec->tupleKey)
- {
- desc->noOfKeyAttr ++;
- desc->keyAttr[key].attributeDescriptor = aRec->attributeDescriptor;
-
- Uint32 csNumber = (aRec->extPrecision >> 16);
- if(csNumber)
- {
- desc->keyAttr[key].charsetInfo = all_charsets[csNumber];
- ndbrequire(all_charsets[csNumber]);
- desc->hasCharAttr = 1;
- }
- else
- {
- desc->keyAttr[key].charsetInfo = 0;
- }
- if(AttributeDescriptor::getDKey(aRec->attributeDescriptor))
- {
- desc->noOfDistrKeys ++;
- }
- key++;
- }
- tAttr = aRec->nextAttrInTable;
- }
- ndbrequire(key == tabPtr.p->noOfPrimkey);
}
void
diff --git a/storage/ndb/src/kernel/blocks/dbtc/DbtcMain.cpp b/storage/ndb/src/kernel/blocks/dbtc/DbtcMain.cpp
index 6eb83b880cc..91fc8780fae 100644
--- a/storage/ndb/src/kernel/blocks/dbtc/DbtcMain.cpp
+++ b/storage/ndb/src/kernel/blocks/dbtc/DbtcMain.cpp
@@ -4661,6 +4661,7 @@ void Dbtc::copyApi(Signal* signal)
regTmpApiPtr->commitAckMarker = RNIL;
regTmpApiPtr->firstTcConnect = RNIL;
regTmpApiPtr->lastTcConnect = RNIL;
+ releaseAllSeizedIndexOperations(regTmpApiPtr);
}//Dbtc::copyApi()
void Dbtc::unlinkApiConnect(Signal* signal)
@@ -10255,7 +10256,7 @@ void Dbtc::releaseAbortResources(Signal* signal)
// apiConnectptr.p->apiConnectstate = CS_CONNECTED;
apiConnectptr.p->apiConnectstate = CS_ABORTING;
apiConnectptr.p->abortState = AS_IDLE;
-
+ releaseAllSeizedIndexOperations(apiConnectptr.p);
if(apiConnectptr.p->m_exec_flag || apiConnectptr.p->apiFailState == ZTRUE){
jam();
bool ok = false;
@@ -10828,6 +10829,33 @@ Dbtc::execDUMP_STATE_ORD(Signal* signal)
signal->theData[0] = TcContinueB::ZTRANS_EVENT_REP;
sendSignalWithDelay(cownref, GSN_CONTINUEB, signal, 5000, 1);
}
+
+ if (dumpState->args[0] == DumpStateOrd::TcStartDumpIndexOpCount)
+ {
+ static int frequency = 1;
+ if (signal->getLength() > 1)
+ frequency = signal->theData[1];
+ else
+ if (refToBlock(signal->getSendersBlockRef()) != DBTC)
+ frequency = 1;
+
+ if (frequency)
+ {
+ dumpState->args[0] = DumpStateOrd::TcDumpIndexOpCount;
+ execDUMP_STATE_ORD(signal);
+ dumpState->args[0] = DumpStateOrd::TcStartDumpIndexOpCount;
+
+ Uint32 delay = 1000 * (frequency > 25 ? 25 : frequency);
+ sendSignalWithDelay(cownref, GSN_DUMP_STATE_ORD, signal, delay, 1);
+ }
+ }
+
+ if (dumpState->args[0] == DumpStateOrd::TcDumpIndexOpCount)
+ {
+ infoEvent("IndexOpCount: pool: %d free: %d",
+ c_theIndexOperationPool.getSize(),
+ c_theIndexOperationPool.getNoOfFree());
+ }
}//Dbtc::execDUMP_STATE_ORD()
void Dbtc::execSET_VAR_REQ(Signal* signal)
diff --git a/storage/ndb/src/kernel/blocks/ndbcntr/NdbcntrMain.cpp b/storage/ndb/src/kernel/blocks/ndbcntr/NdbcntrMain.cpp
index d89adb10fc5..88c0da8b9ae 100644
--- a/storage/ndb/src/kernel/blocks/ndbcntr/NdbcntrMain.cpp
+++ b/storage/ndb/src/kernel/blocks/ndbcntr/NdbcntrMain.cpp
@@ -531,6 +531,9 @@ Ndbcntr::execCNTR_START_REF(Signal * signal){
cmasterNodeId = ref->masterNodeId;
sendCntrStartReq(signal);
return;
+ case CntrStartRef::StopInProgress:
+ jam();
+ progError(__LINE__, NDBD_EXIT_RESTART_DURING_SHUTDOWN);
}
ndbrequire(false);
}
@@ -2035,7 +2038,9 @@ Ndbcntr::execSTOP_REQ(Signal* signal){
return;
}
- if(c_stopRec.stopReq.senderRef != 0){
+ if(c_stopRec.stopReq.senderRef != 0 ||
+ (cmasterNodeId == getOwnNodeId() && !c_start.m_starting.isclear()))
+ {
/**
* Requested a system shutdown
*/
@@ -2049,7 +2054,8 @@ Ndbcntr::execSTOP_REQ(Signal* signal){
/**
* Requested a node shutdown
*/
- if(StopReq::getSystemStop(c_stopRec.stopReq.requestInfo))
+ if(c_stopRec.stopReq.senderRef &&
+ StopReq::getSystemStop(c_stopRec.stopReq.requestInfo))
ref->errorCode = StopRef::SystemShutdownInProgress;
else
ref->errorCode = StopRef::NodeShutdownInProgress;
diff --git a/storage/ndb/src/kernel/blocks/qmgr/QmgrMain.cpp b/storage/ndb/src/kernel/blocks/qmgr/QmgrMain.cpp
index 76281426eea..b5e54e8adad 100644
--- a/storage/ndb/src/kernel/blocks/qmgr/QmgrMain.cpp
+++ b/storage/ndb/src/kernel/blocks/qmgr/QmgrMain.cpp
@@ -1823,11 +1823,14 @@ void Qmgr::execNDB_FAILCONF(Signal* signal)
/*******************************/
/* DISCONNECT_REP */
/*******************************/
+const char *lookupConnectionError(Uint32 err);
+
void Qmgr::execDISCONNECT_REP(Signal* signal)
{
jamEntry();
const DisconnectRep * const rep = (DisconnectRep *)&signal->theData[0];
const Uint32 nodeId = rep->nodeId;
+ const Uint32 err = rep->err;
c_connectedNodes.clear(nodeId);
NodeRecPtr nodePtr;
@@ -1838,10 +1841,17 @@ void Qmgr::execDISCONNECT_REP(Signal* signal)
jam();
break;
case ZINIT:
+ ndbrequire(false);
case ZSTARTING:
+ progError(__LINE__, NDBD_EXIT_CONNECTION_SETUP_FAILED,
+ lookupConnectionError(err));
+ ndbrequire(false);
case ZPREPARE_FAIL:
+ ndbrequire(false);
case ZFAIL_CLOSING:
+ ndbrequire(false);
case ZAPI_ACTIVE:
+ ndbrequire(false);
case ZAPI_INACTIVE:
ndbrequire(false);
}
diff --git a/storage/ndb/src/kernel/error/ndbd_exit_codes.c b/storage/ndb/src/kernel/error/ndbd_exit_codes.c
index 4d9a61d69d1..9b8c907cb7c 100644
--- a/storage/ndb/src/kernel/error/ndbd_exit_codes.c
+++ b/storage/ndb/src/kernel/error/ndbd_exit_codes.c
@@ -95,11 +95,15 @@ static const ErrStruct errArray[] =
{NDBD_EXIT_SIGNAL_LOST, XIE, "Signal lost (unknown reason)"},
{NDBD_EXIT_ILLEGAL_SIGNAL, XIE,
"Illegal signal (version mismatch a possibility)"},
+ {NDBD_EXIT_CONNECTION_SETUP_FAILED, XCE, "Connection setup failed"},
/* Ndbcntr */
{NDBD_EXIT_RESTART_TIMEOUT, XCE,
"Total restart time too long, consider increasing StartFailureTimeout "
"or investigate error(s) on other node(s)"},
+ {NDBD_EXIT_RESTART_DURING_SHUTDOWN, XRE,
+ "Node started while node shutdown in progress. "
+ "Please wait until shutdown complete before starting node"},
/* DIH */
{NDBD_EXIT_MAX_CRASHED_REPLICAS, XFL,
diff --git a/storage/ndb/src/kernel/vm/FastScheduler.cpp b/storage/ndb/src/kernel/vm/FastScheduler.cpp
index 5c68cbe6480..ad24a6795a4 100644
--- a/storage/ndb/src/kernel/vm/FastScheduler.cpp
+++ b/storage/ndb/src/kernel/vm/FastScheduler.cpp
@@ -394,7 +394,8 @@ void print_restart(FILE * output, Signal* signal, Uint32 aLevel);
void FastScheduler::dumpSignalMemory(FILE * output)
{
- Signal signal;
+ SignalT<25> signalT;
+ Signal &signal= *(Signal*)&signalT;
Uint32 ReadPtr[5];
Uint32 tJob;
Uint32 tLastJob;
@@ -483,17 +484,17 @@ print_restart(FILE * output, Signal* signal, Uint32 aLevel)
*/
void
FastScheduler::reportDoJobStatistics(Uint32 tMeanLoopCount) {
- Signal signal;
+ SignalT<2> signalT;
+ Signal &signal= *(Signal*)&signalT;
+
memset(&signal.header, 0, sizeof(signal.header));
+ signal.header.theLength = 2;
+ signal.header.theSendersSignalId = 0;
+ signal.header.theSendersBlockRef = numberToRef(0, 0);
signal.theData[0] = NDB_LE_JobStatistic;
signal.theData[1] = tMeanLoopCount;
- memset(&signal.header, 0, sizeof(SignalHeader));
- signal.header.theLength = 2;
- signal.header.theSendersSignalId = 0;
- signal.header.theSendersBlockRef = numberToRef(0, 0);
-
execute(&signal, JBA, CMVMI, GSN_EVENT_REP);
}
diff --git a/storage/ndb/src/kernel/vm/TransporterCallback.cpp b/storage/ndb/src/kernel/vm/TransporterCallback.cpp
index 0bdfcf16689..aab81957d07 100644
--- a/storage/ndb/src/kernel/vm/TransporterCallback.cpp
+++ b/storage/ndb/src/kernel/vm/TransporterCallback.cpp
@@ -39,6 +39,26 @@
*/
SectionSegmentPool g_sectionSegmentPool;
+struct ConnectionError
+{
+ enum TransporterError err;
+ const char *text;
+};
+
+static const ConnectionError connectionError[] =
+{
+ { TE_NO_ERROR, "No error"},
+ { TE_SHM_UNABLE_TO_CREATE_SEGMENT, "Unable to create shared memory segment"},
+ { (enum TransporterError) -1, "No connection error message available (please report a bug)"}
+};
+
+const char *lookupConnectionError(Uint32 err)
+{
+ int i= 0;
+ while ((Uint32)connectionError[i].err != err && (Uint32)connectionError[i].err != -1);
+ return connectionError[i].text;
+}
+
bool
import(Ptr<SectionSegment> & first, const Uint32 * src, Uint32 len){
/**
@@ -306,34 +326,58 @@ checkJobBuffer() {
}
void
-reportError(void * callbackObj, NodeId nodeId, TransporterError errorCode){
+reportError(void * callbackObj, NodeId nodeId,
+ TransporterError errorCode, const char *info)
+{
#ifdef DEBUG_TRANSPORTER
- char buf[255];
- sprintf(buf, "reportError (%d, 0x%x)", nodeId, errorCode);
- ndbout << buf << endl;
+ ndbout_c("reportError (%d, 0x%x) %s", nodeId, errorCode, info ? info : "")
#endif
- if(errorCode == TE_SIGNAL_LOST_SEND_BUFFER_FULL){
+ DBUG_ENTER("reportError");
+ DBUG_PRINT("info",("nodeId %d errorCode: 0x%x info: %s",
+ nodeId, errorCode, info));
+
+ switch (errorCode)
+ {
+ case TE_SIGNAL_LOST_SEND_BUFFER_FULL:
+ {
+ char msg[64];
+ snprintf(msg, sizeof(msg), "Remote note id %d.%s%s", nodeId,
+ info ? " " : "", info ? info : "");
ErrorReporter::handleError(NDBD_EXIT_SIGNAL_LOST_SEND_BUFFER_FULL,
- "", __FILE__,
- NST_ErrorHandler);
+ msg, __FILE__, NST_ErrorHandler);
}
-
- if(errorCode == TE_SIGNAL_LOST){
+ case TE_SIGNAL_LOST:
+ {
+ char msg[64];
+ snprintf(msg, sizeof(msg), "Remote node id %d,%s%s", nodeId,
+ info ? " " : "", info ? info : "");
ErrorReporter::handleError(NDBD_EXIT_SIGNAL_LOST,
- "", __FILE__,
- NST_ErrorHandler);
+ msg, __FILE__, NST_ErrorHandler);
}
-
- if(errorCode & 0x8000){
+ case TE_SHM_IPC_PERMANENT:
+ {
+ char msg[128];
+ snprintf(msg, sizeof(msg),
+ "Remote node id %d.%s%s",
+ nodeId, info ? " " : "", info ? info : "");
+ ErrorReporter::handleError(NDBD_EXIT_CONNECTION_SETUP_FAILED,
+ msg, __FILE__, NST_ErrorHandler);
+ }
+ default:
+ break;
+ }
+
+ if(errorCode & TE_DO_DISCONNECT){
reportDisconnect(callbackObj, nodeId, errorCode);
}
- Signal signal;
+ SignalT<3> signalT;
+ Signal &signal= *(Signal*)&signalT;
memset(&signal.header, 0, sizeof(signal.header));
- if(errorCode & 0x8000)
+ if(errorCode & TE_DO_DISCONNECT)
signal.theData[0] = NDB_LE_TransporterError;
else
signal.theData[0] = NDB_LE_TransporterWarning;
@@ -345,6 +389,8 @@ reportError(void * callbackObj, NodeId nodeId, TransporterError errorCode){
signal.header.theSendersSignalId = 0;
signal.header.theSendersBlockRef = numberToRef(0, globalData.ownId);
globalScheduler.execute(&signal, JBA, CMVMI, GSN_EVENT_REP);
+
+ DBUG_VOID_RETURN;
}
/**
@@ -354,7 +400,8 @@ void
reportSendLen(void * callbackObj,
NodeId nodeId, Uint32 count, Uint64 bytes){
- Signal signal;
+ SignalT<3> signalT;
+ Signal &signal= *(Signal*)&signalT;
memset(&signal.header, 0, sizeof(signal.header));
signal.header.theLength = 3;
@@ -373,7 +420,8 @@ void
reportReceiveLen(void * callbackObj,
NodeId nodeId, Uint32 count, Uint64 bytes){
- Signal signal;
+ SignalT<3> signalT;
+ Signal &signal= *(Signal*)&signalT;
memset(&signal.header, 0, sizeof(signal.header));
signal.header.theLength = 3;
@@ -392,7 +440,8 @@ reportReceiveLen(void * callbackObj,
void
reportConnect(void * callbackObj, NodeId nodeId){
- Signal signal;
+ SignalT<1> signalT;
+ Signal &signal= *(Signal*)&signalT;
memset(&signal.header, 0, sizeof(signal.header));
signal.header.theLength = 1;
@@ -409,7 +458,10 @@ reportConnect(void * callbackObj, NodeId nodeId){
void
reportDisconnect(void * callbackObj, NodeId nodeId, Uint32 errNo){
- Signal signal;
+ DBUG_ENTER("reportDisconnect");
+
+ SignalT<sizeof(DisconnectRep)/4> signalT;
+ Signal &signal= *(Signal*)&signalT;
memset(&signal.header, 0, sizeof(signal.header));
signal.header.theLength = DisconnectRep::SignalLength;
@@ -422,6 +474,8 @@ reportDisconnect(void * callbackObj, NodeId nodeId, Uint32 errNo){
rep->err = errNo;
globalScheduler.execute(&signal, JBA, CMVMI, GSN_DISCONNECT_REP);
+
+ DBUG_VOID_RETURN;
}
void
diff --git a/storage/ndb/src/kernel/vm/VMSignal.hpp b/storage/ndb/src/kernel/vm/VMSignal.hpp
index 45543c5d174..33f8a9f25c0 100644
--- a/storage/ndb/src/kernel/vm/VMSignal.hpp
+++ b/storage/ndb/src/kernel/vm/VMSignal.hpp
@@ -42,6 +42,16 @@ struct NodeReceiverGroup {
NodeBitmask m_nodes;
};
+template <unsigned T> struct SignalT
+{
+ SignalHeader header;
+ SegmentedSectionPtr m_sectionPtr[3];
+ union {
+ Uint32 theData[T];
+ Uint64 dummyAlign;
+ };
+};
+
/**
* class used for passing argumentes to blocks
*/
diff --git a/storage/ndb/src/mgmapi/mgmapi.cpp b/storage/ndb/src/mgmapi/mgmapi.cpp
index 9a874554955..2b31f0e638d 100644
--- a/storage/ndb/src/mgmapi/mgmapi.cpp
+++ b/storage/ndb/src/mgmapi/mgmapi.cpp
@@ -34,8 +34,8 @@
#include <Parser.hpp>
#include <OutputStream.hpp>
#include <InputStream.hpp>
-#include <Base64.hpp>
+#include <base64.h>
#define MGM_CMD(name, fun, desc) \
{ name, \
@@ -1770,11 +1770,15 @@ ndb_mgm_get_configuration(NdbMgmHandle handle, unsigned int version) {
} while(start < len);
if(buf64 == 0)
break;
-
+
+ void *tmp_data = malloc(base64_needed_decoded_length((size_t) (len - 1)));
+ const int res = base64_decode(buf64, len-1, tmp_data);
+ delete[] buf64;
UtilBuffer tmp;
- const int res = base64_decode(buf64, len-1, tmp);
- delete[] buf64;
- if(res != 0){
+ tmp.append((void *) tmp_data, res);
+ free(tmp_data);
+ if (res < 0)
+ {
fprintf(handle->errstream, "Failed to decode buffer\n");
break;
}
diff --git a/storage/ndb/src/mgmsrv/ConfigInfo.cpp b/storage/ndb/src/mgmsrv/ConfigInfo.cpp
index a870c395bd2..817943f5e51 100644
--- a/storage/ndb/src/mgmsrv/ConfigInfo.cpp
+++ b/storage/ndb/src/mgmsrv/ConfigInfo.cpp
@@ -57,7 +57,6 @@ ConfigInfo::m_sectionNameAliases[]={
const char*
ConfigInfo::m_sectionNames[]={
"SYSTEM",
- "EXTERNAL SYSTEM",
"COMPUTER",
DB_TOKEN,
@@ -78,9 +77,7 @@ sizeof(m_sectionNames)/sizeof(char*);
****************************************************************************/
static bool transformComputer(InitConfigFileParser::Context & ctx, const char *);
static bool transformSystem(InitConfigFileParser::Context & ctx, const char *);
-static bool transformExternalSystem(InitConfigFileParser::Context & ctx, const char *);
static bool transformNode(InitConfigFileParser::Context & ctx, const char *);
-static bool transformExtNode(InitConfigFileParser::Context & ctx, const char *);
static bool checkConnectionSupport(InitConfigFileParser::Context & ctx, const char *);
static bool transformConnection(InitConfigFileParser::Context & ctx, const char *);
static bool applyDefaultValues(InitConfigFileParser::Context & ctx, const char *);
@@ -93,7 +90,6 @@ static bool checkTCPConstraints(InitConfigFileParser::Context &, const char *);
static bool fixNodeHostname(InitConfigFileParser::Context & ctx, const char * data);
static bool fixHostname(InitConfigFileParser::Context & ctx, const char * data);
static bool fixNodeId(InitConfigFileParser::Context & ctx, const char * data);
-static bool fixExtConnection(InitConfigFileParser::Context & ctx, const char * data);
static bool fixDepricated(InitConfigFileParser::Context & ctx, const char *);
static bool saveInConfigValues(InitConfigFileParser::Context & ctx, const char *);
static bool fixFileSystemPath(InitConfigFileParser::Context & ctx, const char * data);
@@ -104,7 +100,6 @@ static bool checkLocalhostHostnameMix(InitConfigFileParser::Context & ctx, const
const ConfigInfo::SectionRule
ConfigInfo::m_SectionRules[] = {
{ "SYSTEM", transformSystem, 0 },
- { "EXTERNAL SYSTEM", transformExternalSystem, 0 },
{ "COMPUTER", transformComputer, 0 },
{ DB_TOKEN, transformNode, 0 },
@@ -150,20 +145,13 @@ ConfigInfo::m_SectionRules[] = {
{ "TCP", fixPortNumber, 0 }, // has to come after fixHostName
{ "SHM", fixPortNumber, 0 }, // has to come after fixHostName
{ "SCI", fixPortNumber, 0 }, // has to come after fixHostName
- { "SHM", fixShmKey, 0 },
- /**
- * fixExtConnection must be after fixNodeId
- */
- { "TCP", fixExtConnection, 0 },
- { "SHM", fixExtConnection, 0 },
- { "SCI", fixExtConnection, 0 },
- { "OSE", fixExtConnection, 0 },
-
{ "*", applyDefaultValues, "user" },
{ "*", fixDepricated, 0 },
{ "*", applyDefaultValues, "system" },
+ { "SHM", fixShmKey, 0 }, // has to come after apply default values
+
{ DB_TOKEN, checkLocalhostHostnameMix, 0 },
{ API_TOKEN, checkLocalhostHostnameMix, 0 },
{ MGM_TOKEN, checkLocalhostHostnameMix, 0 },
@@ -173,9 +161,6 @@ ConfigInfo::m_SectionRules[] = {
{ DB_TOKEN, checkDbConstraints, 0 },
- /**
- * checkConnectionConstraints must be after fixExtConnection
- */
{ "TCP", checkConnectionConstraints, 0 },
{ "SHM", checkConnectionConstraints, 0 },
{ "SCI", checkConnectionConstraints, 0 },
@@ -213,9 +198,6 @@ static bool add_node_connections(Vector<ConfigInfo::ConfigRuleSection>&sections,
static bool set_connection_priorities(Vector<ConfigInfo::ConfigRuleSection>&sections,
struct InitConfigFileParser::Context &ctx,
const char * rule_data);
-static bool add_server_ports(Vector<ConfigInfo::ConfigRuleSection>&sections,
- struct InitConfigFileParser::Context &ctx,
- const char * rule_data);
static bool check_node_vs_replicas(Vector<ConfigInfo::ConfigRuleSection>&sections,
struct InitConfigFileParser::Context &ctx,
const char * rule_data);
@@ -225,7 +207,6 @@ ConfigInfo::m_ConfigRules[] = {
{ sanity_checks, 0 },
{ add_node_connections, 0 },
{ set_connection_priorities, 0 },
- { add_server_ports, 0 },
{ check_node_vs_replicas, 0 },
{ 0, 0 }
};
@@ -241,9 +222,9 @@ struct DepricationTransform {
static
const DepricationTransform f_deprication[] = {
{ DB_TOKEN, "Discless", "Diskless", 0, 1 },
- { DB_TOKEN, "Id", "nodeid", 0, 1 },
- { API_TOKEN, "Id", "nodeid", 0, 1 },
- { MGM_TOKEN, "Id", "nodeid", 0, 1 },
+ { DB_TOKEN, "Id", "NodeId", 0, 1 },
+ { API_TOKEN, "Id", "NodeId", 0, 1 },
+ { MGM_TOKEN, "Id", "NodeId", 0, 1 },
{ 0, 0, 0, 0, 0}
};
@@ -421,7 +402,7 @@ const ConfigInfo::ParamInfo ConfigInfo::m_ParamInfo[] = {
{
CFG_NODE_ID,
- "nodeid",
+ "NodeId",
DB_TOKEN,
"Number identifying the database node ("DB_TOKEN_PRINT")",
ConfigInfo::CI_USED,
@@ -1272,7 +1253,7 @@ const ConfigInfo::ParamInfo ConfigInfo::m_ParamInfo[] = {
{
CFG_NODE_ID,
- "nodeid",
+ "NodeId",
API_TOKEN,
"Number identifying application node ("API_TOKEN_PRINT")",
ConfigInfo::CI_USED,
@@ -1415,7 +1396,7 @@ const ConfigInfo::ParamInfo ConfigInfo::m_ParamInfo[] = {
{
CFG_NODE_ID,
- "nodeid",
+ "NodeId",
MGM_TOKEN,
"Number identifying the management server node ("MGM_TOKEN_PRINT")",
ConfigInfo::CI_USED,
@@ -1578,6 +1559,17 @@ const ConfigInfo::ParamInfo ConfigInfo::m_ParamInfo[] = {
"0", "200" },
{
+ CFG_CONNECTION_NODE_ID_SERVER,
+ "NodeIdServer",
+ "TCP",
+ "",
+ ConfigInfo::CI_USED,
+ false,
+ ConfigInfo::CI_INT,
+ MANDATORY,
+ "1", "63" },
+
+ {
CFG_CONNECTION_SEND_SIGNAL_ID,
"SendSignalId",
"TCP",
@@ -1766,6 +1758,17 @@ const ConfigInfo::ParamInfo ConfigInfo::m_ParamInfo[] = {
"0", "200" },
{
+ CFG_CONNECTION_NODE_ID_SERVER,
+ "NodeIdServer",
+ "SHM",
+ "",
+ ConfigInfo::CI_USED,
+ false,
+ ConfigInfo::CI_INT,
+ MANDATORY,
+ "1", "63" },
+
+ {
CFG_CONNECTION_SEND_SIGNAL_ID,
"SendSignalId",
"SHM",
@@ -1798,7 +1801,7 @@ const ConfigInfo::ParamInfo ConfigInfo::m_ParamInfo[] = {
ConfigInfo::CI_USED,
false,
ConfigInfo::CI_INT,
- "0",
+ UNDEFINED,
"0",
STR_VALUE(MAX_INT_RNIL) },
@@ -1887,6 +1890,17 @@ const ConfigInfo::ParamInfo ConfigInfo::m_ParamInfo[] = {
"0", "200" },
{
+ CFG_CONNECTION_NODE_ID_SERVER,
+ "NodeIdServer",
+ "SCI",
+ "",
+ ConfigInfo::CI_USED,
+ false,
+ ConfigInfo::CI_INT,
+ MANDATORY,
+ "1", "63" },
+
+ {
CFG_CONNECTION_HOSTNAME_1,
"HostName1",
"SCI",
@@ -2554,29 +2568,32 @@ void ConfigInfo::print(const Properties * section,
bool
transformNode(InitConfigFileParser::Context & ctx, const char * data){
- Uint32 id;
- if(!ctx.m_currentSection->get("nodeid", &id) && !ctx.m_currentSection->get("Id", &id)){
+ Uint32 id, line;
+ if(!ctx.m_currentSection->get("NodeId", &id) && !ctx.m_currentSection->get("Id", &id)){
Uint32 nextNodeId= 1;
ctx.m_userProperties.get("NextNodeId", &nextNodeId);
id= nextNodeId;
- while (ctx.m_userProperties.get("AllocatedNodeId_", id, &id))
+ while (ctx.m_userProperties.get("AllocatedNodeId_", id, &line))
id++;
- ctx.m_userProperties.put("NextNodeId", id+1, true);
- ctx.m_currentSection->put("nodeid", id);
-#if 0
- ctx.reportError("Mandatory parameter Id missing from section "
- "[%s] starting at line: %d",
- ctx.fname, ctx.m_sectionLineno);
- return false;
-#endif
- } else if(ctx.m_userProperties.get("AllocatedNodeId_", id, &id)) {
+ if (id != nextNodeId)
+ {
+ fprintf(stderr,"Cluster configuration warning line %d: "
+ "Could not use next node id %d for section [%s], "
+ "using next unused node id %d.\n",
+ ctx.m_sectionLineno, nextNodeId, ctx.fname, id);
+ }
+ ctx.m_currentSection->put("NodeId", id);
+ } else if(ctx.m_userProperties.get("AllocatedNodeId_", id, &line)) {
ctx.reportError("Duplicate nodeid in section "
- "[%s] starting at line: %d",
- ctx.fname, ctx.m_sectionLineno);
+ "[%s] starting at line: %d. Previously used on line %d.",
+ ctx.fname, ctx.m_sectionLineno, line);
return false;
}
- ctx.m_userProperties.put("AllocatedNodeId_", id, id);
+ // next node id _always_ next numbers after last used id
+ ctx.m_userProperties.put("NextNodeId", id+1, true);
+
+ ctx.m_userProperties.put("AllocatedNodeId_", id, ctx.m_sectionLineno);
BaseString::snprintf(ctx.pname, sizeof(ctx.pname), "Node_%d", id);
ctx.m_currentSection->put("Type", ctx.fname);
@@ -2690,38 +2707,6 @@ fixBackupDataDir(InitConfigFileParser::Context & ctx, const char * data){
return false;
}
-bool
-transformExtNode(InitConfigFileParser::Context & ctx, const char * data){
-
- Uint32 id;
- const char * systemName;
-
- if(!ctx.m_currentSection->get("Id", &id)){
- ctx.reportError("Mandatory parameter 'Id' missing from section "
- "[%s] starting at line: %d",
- ctx.fname, ctx.m_sectionLineno);
- return false;
- }
-
- if(!ctx.m_currentSection->get("System", &systemName)){
- ctx.reportError("Mandatory parameter 'System' missing from section "
- "[%s] starting at line: %d",
- ctx.fname, ctx.m_sectionLineno);
- return false;
- }
-
- ctx.m_currentSection->put("Type", ctx.fname);
-
- Uint32 nodes = 0;
- ctx.m_userProperties.get("ExtNoOfNodes", &nodes);
- require(ctx.m_userProperties.put("ExtNoOfNodes",++nodes, true));
-
- BaseString::snprintf(ctx.pname, sizeof(ctx.pname), "EXTERNAL SYSTEM_%s:Node_%d",
- systemName, id);
-
- return true;
-}
-
/**
* Connection rule: Check support of connection
*/
@@ -2798,23 +2783,6 @@ transformSystem(InitConfigFileParser::Context & ctx, const char * data){
}
/**
- * External system rule: Just add it
- */
-bool
-transformExternalSystem(InitConfigFileParser::Context & ctx, const char * data){
- const char * name;
- if(!ctx.m_currentSection->get("Name", &name)){
- ctx.reportError("Mandatory parameter Name missing from section "
- "[%s] starting at line: %d",
- ctx.fname, ctx.m_sectionLineno);
- return false;
- }
- BaseString::snprintf(ctx.pname, sizeof(ctx.pname), "EXTERNAL SYSTEM_%s", name);
-
- return true;
-}
-
-/**
* Computer rule: Update "NoOfComputers", add "Type"
*/
bool
@@ -2990,87 +2958,6 @@ static bool fixNodeId(InitConfigFileParser::Context & ctx, const char * data)
}
/**
- * @returns true if connection is external (one node is external)
- * Also returns:
- * - name of external system in parameter extSystemName, and
- * - nodeId of external node in parameter extSystemNodeId.
- */
-static bool
-isExtConnection(InitConfigFileParser::Context & ctx,
- const char **extSystemName, Uint32 * extSystemNodeId){
-
- Uint32 nodeId1, nodeId2;
-
- if (ctx.m_currentSection->contains("System1") &&
- ctx.m_currentSection->get("System1", extSystemName) &&
- ctx.m_currentSection->get("NodeId1", &nodeId1)) {
- *extSystemNodeId = nodeId1;
- return true;
- }
-
- if (ctx.m_currentSection->contains("System2") &&
- ctx.m_currentSection->get("System2", extSystemName) &&
- ctx.m_currentSection->get("NodeId2", &nodeId2)) {
- *extSystemNodeId = nodeId2;
- return true;
- }
-
- return false;
-}
-
-/**
- * External Connection Rule:
- * If connection is to an external system, then move connection into
- * external system configuration (i.e. a sub-property).
- */
-static bool
-fixExtConnection(InitConfigFileParser::Context & ctx, const char * data){
-
- const char * extSystemName;
- Uint32 extSystemNodeId;
-
- if (isExtConnection(ctx, &extSystemName, &extSystemNodeId)) {
-
- Uint32 connections = 0;
- ctx.m_userProperties.get("ExtNoOfConnections", &connections);
- require(ctx.m_userProperties.put("ExtNoOfConnections",++connections, true));
-
- char tmpLine1[MAX_LINE_LENGTH];
- BaseString::snprintf(tmpLine1, MAX_LINE_LENGTH, "Connection_%d", connections-1);
-
- /**
- * Section: EXTERNAL SYSTEM_<Ext System Name>
- */
- char extSystemPropName[MAX_LINE_LENGTH];
- strncpy(extSystemPropName, "EXTERNAL SYSTEM_", MAX_LINE_LENGTH);
- strncat(extSystemPropName, extSystemName, MAX_LINE_LENGTH);
- strncat(extSystemPropName, ":", MAX_LINE_LENGTH);
- strncat(extSystemPropName, tmpLine1, MAX_LINE_LENGTH);
-
- /**
- * Increase number of external connections for the system
- *
- * @todo Limitation: Only one external system is allowed
- */
- require(ctx.m_userProperties.put("ExtSystem", extSystemName, true));
-
- /**
- * Make sure section is stored in right place
- */
- strncpy(ctx.pname, extSystemPropName, MAX_LINE_LENGTH);
-
- /**
- * Since this is an external connection,
- * decrease number of internal connections
- */
- require(ctx.m_userProperties.get("NoOfConnections", &connections));
- require(ctx.m_userProperties.put("NoOfConnections", --connections, true));
- }
-
- return true;
-}
-
-/**
* Connection rule: Fix hostname
*
* Unless Hostname is not already specified, do steps:
@@ -3112,7 +2999,7 @@ fixPortNumber(InitConfigFileParser::Context & ctx, const char * data){
DBUG_ENTER("fixPortNumber");
- Uint32 id1= 0, id2= 0;
+ Uint32 id1, id2;
const char *hostName1;
const char *hostName2;
require(ctx.m_currentSection->get("NodeId1", &id1));
@@ -3122,17 +3009,46 @@ fixPortNumber(InitConfigFileParser::Context & ctx, const char * data){
DBUG_PRINT("info",("NodeId1=%d HostName1=\"%s\"",id1,hostName1));
DBUG_PRINT("info",("NodeId2=%d HostName2=\"%s\"",id2,hostName2));
- if (id1 > id2) {
- Uint32 tmp= id1;
- const char *tmp_name= hostName1;
- hostName1= hostName2;
- id1= id2;
- hostName2= tmp_name;
- id2= tmp;
- }
+ const Properties *node1, *node2;
+ require(ctx.m_config->get("Node", id1, &node1));
+ require(ctx.m_config->get("Node", id2, &node2));
- const Properties * node;
- require(ctx.m_config->get("Node", id1, &node));
+ const char *type1, *type2;
+ require(node1->get("Type", &type1));
+ require(node2->get("Type", &type2));
+
+ /* add NodeIdServer info */
+ {
+ Uint32 nodeIdServer = id1 < id2 ? id1 : id2;
+ if(strcmp(type1, API_TOKEN) == 0 || strcmp(type2, MGM_TOKEN) == 0)
+ nodeIdServer = id2;
+ else if(strcmp(type2, API_TOKEN) == 0 || strcmp(type1, MGM_TOKEN) == 0)
+ nodeIdServer = id1;
+ ctx.m_currentSection->put("NodeIdServer", nodeIdServer);
+
+ if (id2 == nodeIdServer) {
+ {
+ const char *tmp= hostName1;
+ hostName1= hostName2;
+ hostName2= tmp;
+ }
+ {
+ Uint32 tmp= id1;
+ id1= id2;
+ id2= tmp;
+ }
+ {
+ const Properties *tmp= node1;
+ node1= node2;
+ node2= tmp;
+ }
+ {
+ const char *tmp= type1;
+ type1= type2;
+ type2= tmp;
+ }
+ }
+ }
BaseString hostname(hostName1);
@@ -3143,21 +3059,13 @@ fixPortNumber(InitConfigFileParser::Context & ctx, const char * data){
}
Uint32 port= 0;
- const char * type1;
- const char * type2;
- const Properties * node2;
-
- node->get("Type", &type1);
- ctx.m_config->get("Node", id2, &node2);
- node2->get("Type", &type2);
-
if(strcmp(type1, MGM_TOKEN)==0)
- node->get("PortNumber",&port);
+ node1->get("PortNumber",&port);
else if(strcmp(type2, MGM_TOKEN)==0)
node2->get("PortNumber",&port);
if (!port &&
- !node->get("ServerPort", &port) &&
+ !node1->get("ServerPort", &port) &&
!ctx.m_userProperties.get("ServerPort_", id1, &port))
{
Uint32 base= 0;
@@ -3308,11 +3216,6 @@ checkConnectionConstraints(InitConfigFileParser::Context & ctx, const char *){
ctx.m_currentSection->get("NodeId1", &id1);
ctx.m_currentSection->get("NodeId2", &id2);
- // If external connection, just accept it
- if (ctx.m_currentSection->contains("System1") ||
- ctx.m_currentSection->contains("System2"))
- return true;
-
if(id1 == id2){
ctx.reportError("Illegal connection from node to itself"
" - [%s] starting at line: %d",
@@ -3345,12 +3248,10 @@ checkConnectionConstraints(InitConfigFileParser::Context & ctx, const char *){
* Report error if the following are true
* -# None of the nodes is of type DB
* -# Not both of them are MGMs
- * -# None of them contain a "SystemX" name
*/
if((strcmp(type1, DB_TOKEN) != 0 && strcmp(type2, DB_TOKEN) != 0) &&
- !(strcmp(type1, MGM_TOKEN) == 0 && strcmp(type2, MGM_TOKEN) == 0) &&
- !ctx.m_currentSection->contains("System1") &&
- !ctx.m_currentSection->contains("System2")){
+ !(strcmp(type1, MGM_TOKEN) == 0 && strcmp(type2, MGM_TOKEN) == 0))
+ {
ctx.reportError("Invalid connection between node %d (%s) and node %d (%s)"
" - [%s] starting at line: %d",
id1, type1, id2, type2,
@@ -3440,11 +3341,11 @@ fixDepricated(InitConfigFileParser::Context & ctx, const char * data){
if(strcmp(p->m_section, ctx.fname) == 0){
double mul = p->m_mul;
double add = p->m_add;
- if(strcmp(name, p->m_oldName) == 0){
+ if(strcasecmp(name, p->m_oldName) == 0){
if(!transform(ctx, tmp, name, p->m_newName, add, mul)){
return false;
}
- } else if(strcmp(name, p->m_newName) == 0) {
+ } else if(strcasecmp(name, p->m_newName) == 0) {
if(!transform(ctx, tmp, name, p->m_oldName, -add/mul,1.0/mul)){
return false;
}
@@ -3723,45 +3624,6 @@ static bool set_connection_priorities(Vector<ConfigInfo::ConfigRuleSection>&sect
DBUG_RETURN(true);
}
-static bool add_server_ports(Vector<ConfigInfo::ConfigRuleSection>&sections,
- struct InitConfigFileParser::Context &ctx,
- const char * rule_data)
-{
-#if 0
- Properties * props= ctx.m_config;
- Properties computers(true);
- Uint32 port_base = NDB_TCP_BASE_PORT;
-
- Uint32 nNodes;
- ctx.m_userProperties.get("NoOfNodes", &nNodes);
-
- for (Uint32 i= 0, n= 0; n < nNodes; i++){
- Properties * tmp;
- if(!props->get("Node", i, &tmp)) continue;
- n++;
-
- const char * type;
- if(!tmp->get("Type", &type)) continue;
-
- Uint32 port;
- if (tmp->get("ServerPort", &port)) continue;
-
- Uint32 computer;
- if (!tmp->get("ExecuteOnComputer", &computer)) continue;
-
- Uint32 adder= 0;
- computers.get("",computer, &adder);
-
- if (strcmp(type,DB_TOKEN) == 0) {
- adder++;
- tmp->put("ServerPort", port_base+adder);
- computers.put("",computer, adder);
- }
- }
-#endif
- return true;
-}
-
static bool
check_node_vs_replicas(Vector<ConfigInfo::ConfigRuleSection>&sections,
struct InitConfigFileParser::Context &ctx,
diff --git a/storage/ndb/src/mgmsrv/InitConfigFileParser.cpp b/storage/ndb/src/mgmsrv/InitConfigFileParser.cpp
index 94f07ab0ca1..f937daf8620 100644
--- a/storage/ndb/src/mgmsrv/InitConfigFileParser.cpp
+++ b/storage/ndb/src/mgmsrv/InitConfigFileParser.cpp
@@ -565,8 +565,12 @@ InitConfigFileParser::storeSection(Context& ctx){
}
}
}
- if(ctx.type == InitConfigFileParser::DefaultSection)
- require(ctx.m_defaults->put(ctx.pname, ctx.m_currentSection));
+ if(ctx.type == InitConfigFileParser::DefaultSection &&
+ !ctx.m_defaults->put(ctx.pname, ctx.m_currentSection))
+ {
+ ctx.reportError("Duplicate default section not allowed");
+ return false;
+ }
if(ctx.type == InitConfigFileParser::Section)
require(ctx.m_config->put(ctx.pname, ctx.m_currentSection));
delete ctx.m_currentSection; ctx.m_currentSection = NULL;
@@ -636,7 +640,7 @@ InitConfigFileParser::store_in_properties(Vector<struct my_option>& options,
value_int = *(Uint64*)options[i].value;
break;
case GET_STR:
- ctx.m_currentSection->put(options[i].name, (char*)options[i].value);
+ ctx.m_currentSection->put(options[i].name, *(char**)options[i].value);
continue;
default:
abort();
@@ -758,9 +762,6 @@ InitConfigFileParser::parse_mycnf()
Vector<struct my_option> options;
for(i = 0; i<ConfigInfo::m_NoOfParams; i++)
{
- if (strcmp(ConfigInfo::m_ParamInfo[i]._section, "DB") == 0 ||
- strcmp(ConfigInfo::m_ParamInfo[i]._section, "API") == 0 ||
- strcmp(ConfigInfo::m_ParamInfo[i]._section, "MGM") == 0)
{
struct my_option opt;
bzero(&opt, sizeof(opt));
@@ -851,6 +852,12 @@ InitConfigFileParser::parse_mycnf()
goto end;
if(!handle_mycnf_defaults(options, ctx, "MGM"))
goto end;
+ if(!handle_mycnf_defaults(options, ctx, "TCP"))
+ goto end;
+ if(!handle_mycnf_defaults(options, ctx, "SHM"))
+ goto end;
+ if(!handle_mycnf_defaults(options, ctx, "SCI"))
+ goto end;
{
struct sect { struct my_option* src; const char * name; } sections[] =
diff --git a/storage/ndb/src/mgmsrv/MgmtSrvr.cpp b/storage/ndb/src/mgmsrv/MgmtSrvr.cpp
index b6d091999dc..546110cc738 100644
--- a/storage/ndb/src/mgmsrv/MgmtSrvr.cpp
+++ b/storage/ndb/src/mgmsrv/MgmtSrvr.cpp
@@ -276,15 +276,13 @@ static ErrorItem errorTable[] =
{MgmtSrvr::NOT_POSSIBLE_TO_SEND_CONFIG_UPDATE_TO_PROCESS_TYPE,
"It is not possible to send an update of a configuration variable "
"to this kind of process."},
- {5026, "Node shutdown in progress" },
- {5027, "System shutdown in progress" },
- {5028, "Node shutdown would cause system crash" },
- {5029, "Only one shutdown at a time is possible via mgm server" },
- {5060, "Operation not allowed in single user mode." },
- {5061, "DB is not in single user mode." },
- {5062, "The specified node is not an API node." },
- {5063,
- "Cannot enter single user mode. DB nodes in inconsistent startlevel."},
+ {MgmtSrvr::NODE_SHUTDOWN_IN_PROGESS, "Node shutdown in progress" },
+ {MgmtSrvr::SYSTEM_SHUTDOWN_IN_PROGRESS, "System shutdown in progress" },
+ {MgmtSrvr::NODE_SHUTDOWN_WOULD_CAUSE_SYSTEM_CRASH,
+ "Node shutdown would cause system crash" },
+ {MgmtSrvr::NODE_NOT_API_NODE, "The specified node is not an API node." },
+ {MgmtSrvr::OPERATION_NOT_ALLOWED_START_STOP,
+ "Operation not allowed while nodes are starting or stopping."},
{MgmtSrvr::NO_CONTACT_WITH_DB_NODES, "No contact with database nodes" }
};
@@ -292,13 +290,13 @@ int MgmtSrvr::translateStopRef(Uint32 errCode)
{
switch(errCode){
case StopRef::NodeShutdownInProgress:
- return 5026;
+ return NODE_SHUTDOWN_IN_PROGESS;
break;
case StopRef::SystemShutdownInProgress:
- return 5027;
+ return SYSTEM_SHUTDOWN_IN_PROGRESS;
break;
case StopRef::NodeShutdownWouldCauseSystemCrash:
- return 5028;
+ return NODE_SHUTDOWN_WOULD_CAUSE_SYSTEM_CRASH;
break;
}
return 4999;
@@ -984,6 +982,18 @@ int MgmtSrvr::sendSTOP_REQ(NodeId nodeId,
int MgmtSrvr::stopNode(int nodeId, bool abort)
{
+ if (!abort)
+ {
+ NodeId nodeId = 0;
+ ClusterMgr::Node node;
+ while(getNextNodeId(&nodeId, NDB_MGM_NODE_TYPE_NDB))
+ {
+ node = theFacade->theClusterMgr->getNodeInfo(nodeId);
+ if((node.m_state.startLevel != NodeState::SL_STARTED) &&
+ (node.m_state.startLevel != NodeState::SL_NOTHING))
+ return OPERATION_NOT_ALLOWED_START_STOP;
+ }
+ }
NodeBitmask nodes;
return sendSTOP_REQ(nodeId,
nodes,
@@ -1022,7 +1032,7 @@ int MgmtSrvr::stop(int * stopCount, bool abort)
int MgmtSrvr::enterSingleUser(int * stopCount, Uint32 singleUserNodeId)
{
if (getNodeType(singleUserNodeId) != NDB_MGM_NODE_TYPE_API)
- return 5062;
+ return NODE_NOT_API_NODE;
NodeId nodeId = 0;
ClusterMgr::Node node;
while(getNextNodeId(&nodeId, NDB_MGM_NODE_TYPE_NDB))
@@ -1030,7 +1040,7 @@ int MgmtSrvr::enterSingleUser(int * stopCount, Uint32 singleUserNodeId)
node = theFacade->theClusterMgr->getNodeInfo(nodeId);
if((node.m_state.startLevel != NodeState::SL_STARTED) &&
(node.m_state.startLevel != NodeState::SL_NOTHING))
- return 5063;
+ return OPERATION_NOT_ALLOWED_START_STOP;
}
NodeBitmask nodes;
int ret = sendSTOP_REQ(0,
diff --git a/storage/ndb/src/mgmsrv/MgmtSrvr.hpp b/storage/ndb/src/mgmsrv/MgmtSrvr.hpp
index d61c0ce8db7..0e2ebad8188 100644
--- a/storage/ndb/src/mgmsrv/MgmtSrvr.hpp
+++ b/storage/ndb/src/mgmsrv/MgmtSrvr.hpp
@@ -174,10 +174,12 @@ public:
STATIC_CONST( NODE_SHUTDOWN_IN_PROGESS = 5026 );
STATIC_CONST( SYSTEM_SHUTDOWN_IN_PROGRESS = 5027 );
STATIC_CONST( NODE_SHUTDOWN_WOULD_CAUSE_SYSTEM_CRASH = 5028 );
- STATIC_CONST( NO_CONTACT_WITH_CLUSTER = 6666 );
- STATIC_CONST( OPERATION_IN_PROGRESS = 6667 );
-
+
STATIC_CONST( NO_CONTACT_WITH_DB_NODES = 5030 );
+
+ STATIC_CONST( NODE_NOT_API_NODE = 5062 );
+ STATIC_CONST( OPERATION_NOT_ALLOWED_START_STOP = 5063 );
+
/**
* This enum specifies the different signal loggig modes possible to set
* with the setSignalLoggingMode method.
diff --git a/storage/ndb/src/mgmsrv/Services.cpp b/storage/ndb/src/mgmsrv/Services.cpp
index 9d87e33b47f..ee24cf18941 100644
--- a/storage/ndb/src/mgmsrv/Services.cpp
+++ b/storage/ndb/src/mgmsrv/Services.cpp
@@ -25,7 +25,6 @@
#include <signaldata/SetLogLevelOrd.hpp>
#include <LogLevel.hpp>
#include <BaseString.hpp>
-#include <Base64.hpp>
#include <ConfigValues.hpp>
#include <mgmapi_configuration.hpp>
@@ -33,6 +32,8 @@
#include "Services.hpp"
#include "../mgmapi/ndb_logevent.hpp"
+#include <base64.h>
+
extern bool g_StopServer;
static const unsigned int MAX_READ_TIMEOUT = 1000 ;
@@ -581,17 +582,18 @@ MgmApiSession::getConfig_common(Parser_t::Context &,
cfg->pack(src);
NdbMutex_Unlock(m_mgmsrv.m_configMutex);
- BaseString str;
- int res = base64_encode(src, str);
+ char *tmp_str = (char *) malloc(base64_needed_encoded_length(src.length()));
+ int res = base64_encode(src.get_data(), src.length(), tmp_str);
m_output->println("get config reply");
m_output->println("result: Ok");
- m_output->println("Content-Length: %d", str.length());
+ m_output->println("Content-Length: %d", strlen(tmp_str));
m_output->println("Content-Type: ndbconfig/octet-stream");
m_output->println("Content-Transfer-Encoding: base64");
m_output->println("");
- m_output->println(str.c_str());
+ m_output->println(tmp_str);
+ free(tmp_str);
return;
}
@@ -1574,4 +1576,3 @@ MgmApiSession::report_event(Parser_t::Context &ctx,
template class MutexVector<int>;
template class Vector<ParserRow<MgmApiSession> const*>;
-template class Vector<BaseString>;
diff --git a/storage/ndb/src/ndbapi/TransporterFacade.cpp b/storage/ndb/src/ndbapi/TransporterFacade.cpp
index 1f7096e67bd..14d76b42285 100644
--- a/storage/ndb/src/ndbapi/TransporterFacade.cpp
+++ b/storage/ndb/src/ndbapi/TransporterFacade.cpp
@@ -64,13 +64,16 @@ TransporterFacade* TransporterFacade::theFacadeInstance = NULL;
*****************************************************************************/
void
-reportError(void * callbackObj, NodeId nodeId, TransporterError errorCode){
+reportError(void * callbackObj, NodeId nodeId,
+ TransporterError errorCode, const char *info)
+{
#ifdef REPORT_TRANSPORTER
- ndbout_c("REPORT_TRANSP: reportError (nodeId=%d, errorCode=%d)",
- (int)nodeId, (int)errorCode);
+ ndbout_c("REPORT_TRANSP: reportError (nodeId=%d, errorCode=%d) %s",
+ (int)nodeId, (int)errorCode, info ? info : "");
#endif
- if(errorCode & 0x8000) {
- ndbout_c("reportError (%d, %d)\n", (int)nodeId, (int)errorCode);
+ if(errorCode & TE_DO_DISCONNECT) {
+ ndbout_c("reportError (%d, %d) %s", (int)nodeId, (int)errorCode,
+ info ? info : "");
((TransporterFacade*)(callbackObj))->doDisconnect(nodeId);
}
}
diff --git a/storage/ndb/test/ndbapi/testBackup.cpp b/storage/ndb/test/ndbapi/testBackup.cpp
index 1ab348e735f..da3c52cf4d2 100644
--- a/storage/ndb/test/ndbapi/testBackup.cpp
+++ b/storage/ndb/test/ndbapi/testBackup.cpp
@@ -229,10 +229,13 @@ int runVerifyOne(NDBT_Context* ctx, NDBT_Step* step){
int result = NDBT_OK;
int count = 0;
- ndbout << *(const NDBT_Table*)ctx->getTab() << endl;
-
- UtilTransactions utilTrans(*ctx->getTab());
- HugoTransactions hugoTrans(*ctx->getTab());
+ const NdbDictionary::Table* tab =
+ GETNDB(step)->getDictionary()->getTable(ctx->getTab()->getName());
+ if(tab == 0)
+ return NDBT_FAILED;
+
+ UtilTransactions utilTrans(* tab);
+ HugoTransactions hugoTrans(* tab);
do{
diff --git a/storage/ndb/test/ndbapi/testOperations.cpp b/storage/ndb/test/ndbapi/testOperations.cpp
index 726f35b01fb..505b1620900 100644
--- a/storage/ndb/test/ndbapi/testOperations.cpp
+++ b/storage/ndb/test/ndbapi/testOperations.cpp
@@ -659,6 +659,9 @@ main(int argc, const char** argv){
for(Uint32 i = 0; i < 12; i++)
{
+ if(i == 6 || i == 8 || i == 10)
+ continue;
+
BaseString name("bug_9749");
name.appfmt("_%d", i);
NDBT_TestCaseImpl1 *pt = new NDBT_TestCaseImpl1(&ts,
diff --git a/storage/ndb/test/src/HugoCalculator.cpp b/storage/ndb/test/src/HugoCalculator.cpp
index 8e01f6442bb..d4d7ca2f95f 100644
--- a/storage/ndb/test/src/HugoCalculator.cpp
+++ b/storage/ndb/test/src/HugoCalculator.cpp
@@ -17,7 +17,6 @@
#include <ndb_global.h>
#include "HugoCalculator.hpp"
#include <NDBT.hpp>
-#include <Base64.hpp>
static
Uint32
diff --git a/storage/ndb/tools/ndb_condig.cpp b/storage/ndb/tools/ndb_condig.cpp
index 1b9a771f243..27ab6a182bb 100644
--- a/storage/ndb/tools/ndb_condig.cpp
+++ b/storage/ndb/tools/ndb_condig.cpp
@@ -33,7 +33,7 @@
static int g_verbose = 0;
static int try_reconnect = 3;
-static int g_nodes = 1;
+static int g_nodes, g_connections, g_section;
static const char * g_connectstring = 0;
static const char * g_query = 0;
@@ -70,13 +70,19 @@ static struct my_option my_long_options[] =
"Overides specifying entries in NDB_CONNECTSTRING and Ndb.cfg",
(gptr*) &g_connectstring, (gptr*) &g_connectstring,
0, GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0 },
+ { "ndb-shm", 256, "Print nodes",
+ (gptr*) &opt_ndb_shm, (gptr*) &opt_ndb_shm,
+ 0, GET_BOOL, NO_ARG, 0, 0, 0, 0, 0, 0},
{ "nodes", 256, "Print nodes",
(gptr*) &g_nodes, (gptr*) &g_nodes,
- 0, GET_BOOL, NO_ARG, 1, 0, 0, 0, 0, 0},
+ 0, GET_BOOL, NO_ARG, 0, 0, 0, 0, 0, 0},
+ { "connections", 256, "Print connections",
+ (gptr*) &g_connections, (gptr*) &g_connections,
+ 0, GET_BOOL, NO_ARG, 0, 0, 0, 0, 0, 0},
{ "query", 'q', "Query option(s)",
(gptr*) &g_query, (gptr*) &g_query,
0, GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0},
- { "host", 257, "Host",
+ { "host", 256, "Host",
(gptr*) &g_host, (gptr*) &g_host,
0, GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0},
{ "type", 258, "Type of node/connection",
@@ -155,6 +161,11 @@ struct NodeTypeApply : public Apply
virtual int apply(const Iter&);
};
+struct ConnectionTypeApply : public Apply
+{
+ virtual int apply(const Iter&);
+};
+
static int parse_query(Vector<Apply*>&, int &argc, char**& argv);
static int parse_where(Vector<Match*>&, int &argc, char**& argv);
static int eval(const Iter&, const Vector<Match*>&);
@@ -172,6 +183,17 @@ main(int argc, char** argv){
ndb_std_get_one_option)))
return -1;
+ if (g_nodes && g_connections)
+ {
+ fprintf(stderr,
+ "Only one option of --nodes and --connections allowed\n");
+ return -1;
+ }
+
+ g_section = CFG_SECTION_NODE; //default
+ if (g_connections)
+ g_section = CFG_SECTION_CONNECTION;
+
ndb_mgm_configuration * conf = 0;
if (g_config_file || g_mycnf)
@@ -202,7 +224,7 @@ main(int argc, char** argv){
exit(0);
}
- Iter iter(* conf, CFG_SECTION_NODE);
+ Iter iter(* conf, g_section);
bool prev= false;
iter.first();
for(iter.first(); iter.valid(); iter.next())
@@ -231,13 +253,32 @@ parse_query(Vector<Apply*>& select, int &argc, char**& argv)
for(unsigned i = 0; i<list.size(); i++)
{
const char * str= list[i].c_str();
- if(strcasecmp(str, "id") == 0 || strcasecmp(str, "nodeid") == 0)
- select.push_back(new Apply(CFG_NODE_ID));
- else if(strncasecmp(str, "host", 4) == 0)
- select.push_back(new Apply(CFG_NODE_HOST));
- else if(strcasecmp(str, "type") == 0)
- select.push_back(new NodeTypeApply());
- else if(g_nodes)
+ if(g_section == CFG_SECTION_NODE)
+ {
+ if(strcasecmp(str, "id") == 0 || strcasecmp(str, "nodeid") == 0)
+ {
+ select.push_back(new Apply(CFG_NODE_ID));
+ continue;
+ }
+ else if(strncasecmp(str, "host", 4) == 0)
+ {
+ select.push_back(new Apply(CFG_NODE_HOST));
+ continue;
+ }
+ else if(strcasecmp(str, "type") == 0)
+ {
+ select.push_back(new NodeTypeApply());
+ continue;
+ }
+ }
+ else if (g_section == CFG_SECTION_CONNECTION)
+ {
+ if(strcasecmp(str, "type") == 0)
+ {
+ select.push_back(new ConnectionTypeApply());
+ continue;
+ }
+ }
{
bool found = false;
for(int p = 0; p<ConfigInfo::m_NoOfParams; p++)
@@ -245,9 +286,15 @@ parse_query(Vector<Apply*>& select, int &argc, char**& argv)
if(0)ndbout_c("%s %s",
ConfigInfo::m_ParamInfo[p]._section,
ConfigInfo::m_ParamInfo[p]._fname);
- if(strcmp(ConfigInfo::m_ParamInfo[p]._section, "DB") == 0 ||
- strcmp(ConfigInfo::m_ParamInfo[p]._section, "API") == 0 ||
- strcmp(ConfigInfo::m_ParamInfo[p]._section, "MGM") == 0)
+ if(g_section == CFG_SECTION_CONNECTION &&
+ (strcmp(ConfigInfo::m_ParamInfo[p]._section, "TCP") == 0 ||
+ strcmp(ConfigInfo::m_ParamInfo[p]._section, "SCI") == 0 ||
+ strcmp(ConfigInfo::m_ParamInfo[p]._section, "SHM") == 0)
+ ||
+ g_section == CFG_SECTION_NODE &&
+ (strcmp(ConfigInfo::m_ParamInfo[p]._section, "DB") == 0 ||
+ strcmp(ConfigInfo::m_ParamInfo[p]._section, "API") == 0 ||
+ strcmp(ConfigInfo::m_ParamInfo[p]._section, "MGM") == 0))
{
if(strcasecmp(ConfigInfo::m_ParamInfo[p]._fname, str) == 0)
{
@@ -263,11 +310,6 @@ parse_query(Vector<Apply*>& select, int &argc, char**& argv)
return 1;
}
}
- else
- {
- fprintf(stderr, "Unknown query option: %s\n", str);
- return 1;
- }
}
}
return 0;
@@ -425,6 +467,31 @@ NodeTypeApply::apply(const Iter& iter)
return 0;
}
+int
+ConnectionTypeApply::apply(const Iter& iter)
+{
+ Uint32 val32;
+ if (iter.get(CFG_TYPE_OF_SECTION, &val32) == 0)
+ {
+ switch (val32)
+ {
+ case CONNECTION_TYPE_TCP:
+ printf("tcp");
+ break;
+ case CONNECTION_TYPE_SCI:
+ printf("sci");
+ break;
+ case CONNECTION_TYPE_SHM:
+ printf("shm");
+ break;
+ default:
+ printf("<unknown>");
+ break;
+ }
+ }
+ return 0;
+}
+
ndb_mgm_configuration*
fetch_configuration()
{