summaryrefslogtreecommitdiff
path: root/storage
diff options
context:
space:
mode:
authorunknown <pappa@c-4a09e253.1238-1-64736c10.cust.bredbandsbolaget.se>2005-08-25 13:11:38 -0400
committerunknown <pappa@c-4a09e253.1238-1-64736c10.cust.bredbandsbolaget.se>2005-08-25 13:11:38 -0400
commit5c0dc1ace8b803f799c328fae1c6d40c2b47f5ea (patch)
tree86faf87634c19937967b360a0dd1413fc9eb2879 /storage
parentda2ff990c7e7f0a8796f43513277b8a8322102ce (diff)
parent7887d8b808b4938e1d3673824afb4c4604018274 (diff)
downloadmariadb-git-5c0dc1ace8b803f799c328fae1c6d40c2b47f5ea.tar.gz
Merge mronstrom@bk-internal.mysql.com:/home/bk/mysql-5.0
into c-4a09e253.1238-1-64736c10.cust.bredbandsbolaget.se:/home/pappa/mysql-5.1 BitKeeper/deleted/.del-Grep.cpp~ad798e9ae519d667: Auto merged BitKeeper/deleted/.del-Grep.hpp~b05e3af6cfabe387: Auto merged BitKeeper/deleted/.del-GrepInit.cpp~df28ab3a892455fd: Auto merged BitKeeper/deleted/.del-Makefile.am~f73be89578d3b6cc: Auto merged BitKeeper/deleted/.del-Makefile~b293ae88e4394490: Auto merged BitKeeper/deleted/.del-Makefile~e0b7d67078f0fae0: Auto merged BitKeeper/deleted/.del-grep_systab_test.cpp~c7305578bec8cb62: Auto merged BitKeeper/etc/config: Auto merged config/ac-macros/ha_ndbcluster.m4: Auto merged include/my_global.h: Auto merged mysql-test/mysql-test-run.pl: Auto merged BitKeeper/deleted/.del-testGrep.cpp~2106eb0a6bf2a1b5: Auto merged mysql-test/r/alter_table.result: Auto merged mysql-test/r/grant.result: Auto merged mysql-test/r/ps_6bdb.result: Auto merged mysql-test/r/ps_7ndb.result: Auto merged mysys/Makefile.am: Auto merged scripts/make_win_src_distribution.sh: Auto merged sql/field.cc: Auto merged sql/ha_berkeley.cc: Auto merged sql/ha_berkeley.h: Auto merged sql/ha_heap.h: Auto merged sql/ha_innodb.cc: Auto merged sql/ha_innodb.h: Auto merged sql/ha_ndbcluster.cc: Auto merged sql/handler.cc: Auto merged sql/handler.h: Auto merged sql/item.cc: Auto merged sql/item_subselect.cc: Auto merged sql/lex.h: Auto merged sql/lock.cc: Auto merged sql/log_event.cc: Auto merged sql/mysqld.cc: Auto merged sql/set_var.cc: Auto merged sql/slave.cc: Auto merged sql/sp.cc: Auto merged sql/sql_acl.cc: Auto merged sql/sql_cache.cc: Auto merged sql/sql_class.h: Auto merged sql/sql_delete.cc: Auto merged sql/sql_handler.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_select.cc: Auto merged sql/sql_select.h: Auto merged sql/sql_show.cc: Auto merged sql/sql_table.cc: Auto merged sql/sql_update.cc: Auto merged sql/sql_yacc.yy: Auto merged sql/table.cc: Auto merged sql/table.h: Auto merged storage/heap/hp_delete.c: Auto merged storage/innobase/btr/btr0pcur.c: Auto merged storage/innobase/btr/btr0sea.c: Auto merged storage/innobase/include/read0read.h: Auto merged storage/innobase/include/srv0srv.h: Auto merged storage/innobase/include/trx0trx.h: Auto merged storage/innobase/include/univ.i: Auto merged storage/innobase/lock/lock0lock.c: Auto merged storage/innobase/read/read0read.c: Auto merged storage/innobase/row/row0ins.c: Auto merged storage/innobase/row/row0sel.c: Auto merged storage/innobase/row/row0umod.c: Auto merged storage/innobase/row/row0upd.c: Auto merged storage/innobase/srv/srv0srv.c: Auto merged storage/innobase/srv/srv0start.c: Auto merged storage/innobase/trx/trx0trx.c: Auto merged storage/myisam/ft_boolean_search.c: Auto merged storage/myisam/myisampack.c: Auto merged storage/myisammrg/myrg_static.c: Auto merged storage/ndb/include/kernel/AttributeDescriptor.hpp: Auto merged storage/ndb/include/kernel/BlockNumbers.h: Auto merged storage/ndb/include/kernel/GlobalSignalNumbers.h: Auto merged storage/ndb/include/kernel/kernel_types.h: Auto merged storage/ndb/include/kernel/signaldata/AlterTable.hpp: Auto merged storage/ndb/include/ndbapi/NdbDictionary.hpp: Auto merged storage/ndb/include/portlib/NdbTCP.h: Auto merged storage/ndb/src/common/debugger/BlockNames.cpp: Auto merged storage/ndb/src/common/logger/LogHandler.cpp: Auto merged storage/ndb/src/common/portlib/NdbTCP.cpp: Auto merged storage/ndb/src/common/portlib/win32/NdbTCP.c: Auto merged storage/ndb/src/common/transporter/TransporterRegistry.cpp: Auto merged storage/ndb/src/kernel/Makefile.am: Auto merged storage/ndb/src/kernel/SimBlockList.cpp: Auto merged storage/ndb/src/kernel/blocks/Makefile.am: Auto merged storage/ndb/src/kernel/blocks/cmvmi/Cmvmi.cpp: Auto merged storage/ndb/src/kernel/blocks/dbacc/Dbacc.hpp: Auto merged storage/ndb/src/kernel/blocks/dbacc/DbaccInit.cpp: Auto merged storage/ndb/src/kernel/blocks/dbacc/DbaccMain.cpp: Auto merged storage/ndb/src/kernel/blocks/dbdict/Dbdict.cpp: Auto merged storage/ndb/src/kernel/blocks/dbdict/Dbdict.hpp: Auto merged storage/ndb/src/kernel/blocks/dbdict/printSchemaFile.cpp: Auto merged storage/ndb/src/kernel/blocks/dbdih/DbdihMain.cpp: Auto merged storage/ndb/src/kernel/blocks/dblqh/Dblqh.hpp: Auto merged storage/ndb/src/kernel/blocks/dblqh/DblqhMain.cpp: Auto merged storage/ndb/src/kernel/blocks/dblqh/redoLogReader/redoLogFileReader.cpp: Auto merged storage/ndb/src/kernel/blocks/dbtc/Dbtc.hpp: 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/Qmgr.hpp: Auto merged storage/ndb/src/kernel/blocks/qmgr/QmgrInit.cpp: Auto merged storage/ndb/src/kernel/blocks/qmgr/QmgrMain.cpp: Auto merged storage/ndb/src/kernel/blocks/suma/Suma.cpp: Auto merged storage/ndb/src/kernel/vm/SimulatedBlock.cpp: Auto merged storage/ndb/src/kernel/vm/SimulatedBlock.hpp: Auto merged storage/ndb/src/mgmapi/mgmapi.cpp: Auto merged storage/ndb/src/mgmsrv/MgmtSrvr.cpp: Auto merged storage/ndb/src/ndbapi/DictCache.cpp: Auto merged storage/ndb/src/ndbapi/DictCache.hpp: Auto merged storage/ndb/src/ndbapi/NdbDictionaryImpl.cpp: Auto merged storage/ndb/src/ndbapi/TransporterFacade.cpp: Auto merged storage/ndb/tools/Makefile.am: 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 VC++Files/sql/mysqld.dsp: Manual 5.0 - 5.1 merge configure.in: Manual 5.0 - 5.1 merge sql/mysql_priv.h: Manual 5.0 - 5.1 merge sql/share/errmsg.txt: Manual 5.0 - 5.1 merge sql/sql_base.cc: Manual 5.0 - 5.1 merge sql/sql_prepare.cc: Manual 5.0 - 5.1 merge storage/ndb/src/common/util/version.c: Manual 5.0 - 5.1 merge storage/ndb/src/kernel/blocks/dblqh/Makefile.am: Manual 5.0 - 5.1 merge
Diffstat (limited to 'storage')
-rw-r--r--storage/heap/hp_delete.c2
-rw-r--r--storage/innobase/btr/btr0pcur.c2
-rw-r--r--storage/innobase/btr/btr0sea.c7
-rw-r--r--storage/innobase/include/read0read.h3
-rw-r--r--storage/innobase/include/srv0srv.h1
-rw-r--r--storage/innobase/include/trx0trx.h15
-rw-r--r--storage/innobase/include/univ.i2
-rw-r--r--storage/innobase/lock/lock0lock.c8
-rw-r--r--storage/innobase/read/read0read.c17
-rw-r--r--storage/innobase/row/row0ins.c6
-rw-r--r--storage/innobase/row/row0sel.c23
-rw-r--r--storage/innobase/row/row0umod.c2
-rw-r--r--storage/innobase/row/row0upd.c2
-rw-r--r--storage/innobase/srv/srv0srv.c3
-rw-r--r--storage/innobase/srv/srv0start.c3
-rw-r--r--storage/innobase/trx/trx0trx.c25
-rw-r--r--storage/myisam/ft_boolean_search.c1
-rw-r--r--storage/myisam/myisampack.c8
-rw-r--r--storage/ndb/include/kernel/AttributeDescriptor.hpp3
-rw-r--r--storage/ndb/include/kernel/BlockNumbers.h4
-rw-r--r--storage/ndb/include/kernel/GlobalSignalNumbers.h4
-rw-r--r--storage/ndb/include/kernel/kernel_types.h7
-rw-r--r--storage/ndb/include/kernel/signaldata/AlterTable.hpp25
-rw-r--r--storage/ndb/include/ndbapi/NdbDictionary.hpp5
-rw-r--r--storage/ndb/include/portlib/NdbTCP.h2
-rw-r--r--storage/ndb/src/common/debugger/BlockNames.cpp1
-rw-r--r--storage/ndb/src/common/logger/LogHandler.cpp2
-rw-r--r--storage/ndb/src/common/portlib/NdbTCP.cpp15
-rw-r--r--storage/ndb/src/common/portlib/win32/NdbTCP.c32
-rw-r--r--storage/ndb/src/common/transporter/TransporterRegistry.cpp8
-rw-r--r--storage/ndb/src/common/util/version.c9
-rw-r--r--storage/ndb/src/kernel/Makefile.am2
-rw-r--r--storage/ndb/src/kernel/SimBlockList.cpp6
-rw-r--r--storage/ndb/src/kernel/blocks/Makefile.am1
-rw-r--r--storage/ndb/src/kernel/blocks/cmvmi/Cmvmi.cpp1
-rw-r--r--storage/ndb/src/kernel/blocks/dbacc/Dbacc.hpp8
-rw-r--r--storage/ndb/src/kernel/blocks/dbacc/DbaccInit.cpp1
-rw-r--r--storage/ndb/src/kernel/blocks/dbacc/DbaccMain.cpp129
-rw-r--r--storage/ndb/src/kernel/blocks/dbdict/Dbdict.cpp157
-rw-r--r--storage/ndb/src/kernel/blocks/dbdict/Dbdict.hpp1
-rw-r--r--storage/ndb/src/kernel/blocks/dbdict/printSchemaFile.cpp3
-rw-r--r--storage/ndb/src/kernel/blocks/dbdih/DbdihMain.cpp2
-rw-r--r--storage/ndb/src/kernel/blocks/dblqh/Dblqh.hpp2
-rw-r--r--storage/ndb/src/kernel/blocks/dblqh/DblqhMain.cpp68
-rw-r--r--storage/ndb/src/kernel/blocks/dblqh/Makefile.am8
-rw-r--r--storage/ndb/src/kernel/blocks/dblqh/redoLogReader/Makefile9
-rw-r--r--storage/ndb/src/kernel/blocks/dblqh/redoLogReader/redoLogFileReader.cpp4
-rw-r--r--storage/ndb/src/kernel/blocks/dbtc/Dbtc.hpp8
-rw-r--r--storage/ndb/src/kernel/blocks/dbtc/DbtcMain.cpp149
-rw-r--r--storage/ndb/src/kernel/blocks/grep/Grep.cpp2010
-rw-r--r--storage/ndb/src/kernel/blocks/grep/Grep.hpp535
-rw-r--r--storage/ndb/src/kernel/blocks/grep/GrepInit.cpp164
-rw-r--r--storage/ndb/src/kernel/blocks/grep/Makefile.am23
-rw-r--r--storage/ndb/src/kernel/blocks/grep/systab_test/Makefile12
-rw-r--r--storage/ndb/src/kernel/blocks/grep/systab_test/grep_systab_test.cpp138
-rw-r--r--storage/ndb/src/kernel/blocks/ndbcntr/NdbcntrMain.cpp7
-rw-r--r--storage/ndb/src/kernel/blocks/qmgr/Qmgr.hpp1
-rw-r--r--storage/ndb/src/kernel/blocks/qmgr/QmgrInit.cpp3
-rw-r--r--storage/ndb/src/kernel/blocks/qmgr/QmgrMain.cpp38
-rw-r--r--storage/ndb/src/kernel/blocks/suma/Suma.cpp20
-rw-r--r--storage/ndb/src/kernel/vm/SimulatedBlock.cpp115
-rw-r--r--storage/ndb/src/kernel/vm/SimulatedBlock.hpp20
-rw-r--r--storage/ndb/src/mgmapi/mgmapi.cpp33
-rw-r--r--storage/ndb/src/mgmsrv/MgmtSrvr.cpp39
-rw-r--r--storage/ndb/src/ndbapi/DictCache.cpp72
-rw-r--r--storage/ndb/src/ndbapi/DictCache.hpp3
-rw-r--r--storage/ndb/src/ndbapi/NdbDictionaryImpl.cpp23
-rw-r--r--storage/ndb/src/ndbapi/TransporterFacade.cpp12
-rw-r--r--storage/ndb/test/ndbapi/testGrep.cpp540
69 files changed, 674 insertions, 3940 deletions
diff --git a/storage/heap/hp_delete.c b/storage/heap/hp_delete.c
index 5287533ae0a..2d94418a1bf 100644
--- a/storage/heap/hp_delete.c
+++ b/storage/heap/hp_delete.c
@@ -80,7 +80,7 @@ int hp_rb_delete_key(HP_INFO *info, register HP_KEYDEF *keyinfo,
custom_arg.search_flag= SEARCH_SAME;
old_allocated= keyinfo->rb_tree.allocated;
res= tree_delete(&keyinfo->rb_tree, info->recbuf, &custom_arg);
- info->s->index_length+= (keyinfo->rb_tree.allocated-old_allocated);
+ info->s->index_length-= (old_allocated - keyinfo->rb_tree.allocated);
return res;
}
diff --git a/storage/innobase/btr/btr0pcur.c b/storage/innobase/btr/btr0pcur.c
index cb398b4afab..5dbbca0b17d 100644
--- a/storage/innobase/btr/btr0pcur.c
+++ b/storage/innobase/btr/btr0pcur.c
@@ -210,7 +210,7 @@ btr_pcur_restore_position(
&& cursor->pos_state != BTR_PCUR_IS_POSITIONED)) {
ut_print_buf(stderr, (const byte*)cursor, sizeof(btr_pcur_t));
if (cursor->trx_if_known) {
- trx_print(stderr, cursor->trx_if_known);
+ trx_print(stderr, cursor->trx_if_known, 0);
}
ut_error;
diff --git a/storage/innobase/btr/btr0sea.c b/storage/innobase/btr/btr0sea.c
index f705fee4275..7a4e92a672a 100644
--- a/storage/innobase/btr/btr0sea.c
+++ b/storage/innobase/btr/btr0sea.c
@@ -964,6 +964,13 @@ btr_search_drop_page_hash_index(
heap = NULL;
offsets = NULL;
+ if (block->index == NULL) {
+
+ mem_analyze_corruption((byte*)block);
+
+ ut_a(block->index != NULL);
+ }
+
while (!page_rec_is_supremum(rec)) {
/* FIXME: in a mixed tree, not all records may have enough
ordering fields: */
diff --git a/storage/innobase/include/read0read.h b/storage/innobase/include/read0read.h
index b5edcefb544..7a91248cf7f 100644
--- a/storage/innobase/include/read0read.h
+++ b/storage/innobase/include/read0read.h
@@ -136,6 +136,9 @@ struct cursor_view_struct{
/* Memory heap for the cursor view */
read_view_t* read_view;
/* Consistent read view of the cursor*/
+ ulint n_mysql_tables_in_use;
+ /* number of Innobase tables used in the
+ processing of this cursor */
};
#ifndef UNIV_NONINL
diff --git a/storage/innobase/include/srv0srv.h b/storage/innobase/include/srv0srv.h
index 116ae7b6438..11347f430d4 100644
--- a/storage/innobase/include/srv0srv.h
+++ b/storage/innobase/include/srv0srv.h
@@ -94,6 +94,7 @@ extern ulint srv_max_dirty_pages_pct;
extern ulint srv_force_recovery;
extern ulong srv_thread_concurrency;
+extern ulong srv_commit_concurrency;
extern ulint srv_max_n_threads;
diff --git a/storage/innobase/include/trx0trx.h b/storage/innobase/include/trx0trx.h
index a3ef755348c..5dbf003594f 100644
--- a/storage/innobase/include/trx0trx.h
+++ b/storage/innobase/include/trx0trx.h
@@ -329,17 +329,20 @@ trx_commit_step(
/*============*/
/* out: query thread to run next, or NULL */
que_thr_t* thr); /* in: query thread */
+
/**************************************************************************
-Prints info about a transaction to the standard output. The caller must
-own the kernel mutex and must have called
-innobase_mysql_prepare_print_arbitrary_thd(), unless he knows that MySQL or
-InnoDB cannot meanwhile change the info printed here. */
+Prints info about a transaction to the given file. The caller must own the
+kernel mutex and must have called
+innobase_mysql_prepare_print_arbitrary_thd(), unless he knows that MySQL
+or InnoDB cannot meanwhile change the info printed here. */
void
trx_print(
/*======*/
- FILE* f, /* in: output stream */
- trx_t* trx); /* in: transaction */
+ FILE* f, /* in: output stream */
+ trx_t* trx, /* in: transaction */
+ uint max_query_len); /* in: max query length to print, or 0 to
+ use the default max length */
#ifndef UNIV_HOTBACKUP
/**************************************************************************
diff --git a/storage/innobase/include/univ.i b/storage/innobase/include/univ.i
index 132ac9e18c5..6849dcd9c51 100644
--- a/storage/innobase/include/univ.i
+++ b/storage/innobase/include/univ.i
@@ -244,7 +244,7 @@ contains the sum of the following flag and the locally stored len. */
#define UNIV_EXTERN_STORAGE_FIELD (UNIV_SQL_NULL - UNIV_PAGE_SIZE)
/* Some macros to improve branch prediction and reduce cache misses */
-#if defined(__GNUC__) && (__GNUC__ > 2)
+#if defined(__GNUC__) && (__GNUC__ > 2) && ! defined(__INTEL_COMPILER)
/* Tell the compiler that 'expr' probably evaluates to 'constant'. */
# define UNIV_EXPECT(expr,constant) __builtin_expect(expr, constant)
/* Tell the compiler that a pointer is likely to be NULL */
diff --git a/storage/innobase/lock/lock0lock.c b/storage/innobase/lock/lock0lock.c
index 280c4871ee9..1f222d71d6a 100644
--- a/storage/innobase/lock/lock0lock.c
+++ b/storage/innobase/lock/lock0lock.c
@@ -3297,7 +3297,7 @@ lock_deadlock_recursive(
fputs("\n*** (1) TRANSACTION:\n", ef);
- trx_print(ef, wait_lock->trx);
+ trx_print(ef, wait_lock->trx, 3000);
fputs(
"*** (1) WAITING FOR THIS LOCK TO BE GRANTED:\n", ef);
@@ -3310,7 +3310,7 @@ lock_deadlock_recursive(
fputs("*** (2) TRANSACTION:\n", ef);
- trx_print(ef, lock->trx);
+ trx_print(ef, lock->trx, 3000);
fputs("*** (2) HOLDS THE LOCK(S):\n", ef);
@@ -4207,7 +4207,7 @@ lock_print_info_all_transactions(
while (trx) {
if (trx->conc_state == TRX_NOT_STARTED) {
fputs("---", file);
- trx_print(file, trx);
+ trx_print(file, trx, 600);
}
trx = UT_LIST_GET_NEXT(mysql_trx_list, trx);
@@ -4239,7 +4239,7 @@ loop:
if (nth_lock == 0) {
fputs("---", file);
- trx_print(file, trx);
+ trx_print(file, trx, 600);
if (trx->read_view) {
fprintf(file,
diff --git a/storage/innobase/read/read0read.c b/storage/innobase/read/read0read.c
index 334f9a8a85a..06349c1fd39 100644
--- a/storage/innobase/read/read0read.c
+++ b/storage/innobase/read/read0read.c
@@ -286,6 +286,11 @@ read_cursor_view_create_for_mysql(
curview = (cursor_view_t*) mem_heap_alloc(heap, sizeof(cursor_view_t));
curview->heap = heap;
+ /* Drop cursor tables from consideration when evaluating the need of
+ auto-commit */
+ curview->n_mysql_tables_in_use = cr_trx->n_mysql_tables_in_use;
+ cr_trx->n_mysql_tables_in_use = 0;
+
mutex_enter(&kernel_mutex);
curview->read_view = read_view_create_low(
@@ -305,11 +310,13 @@ read_cursor_view_create_for_mysql(
n = 0;
trx = UT_LIST_GET_FIRST(trx_sys->trx_list);
- /* No active transaction should be visible, not even cr_trx !*/
+ /* No active transaction should be visible, except cr_trx.
+ This is quick fix for a bug 12456 and needs to be fixed when
+ semi-consistent high-granularity read view is implemented. */
while (trx) {
- if (trx->conc_state == TRX_ACTIVE ||
- trx->conc_state == TRX_PREPARED) {
+ if (trx != cr_trx && (trx->conc_state == TRX_ACTIVE ||
+ trx->conc_state == TRX_PREPARED)) {
read_view_set_nth_trx_id(view, n, trx->id);
@@ -360,6 +367,10 @@ read_cursor_view_close_for_mysql(
ut_a(curview->read_view);
ut_a(curview->heap);
+ /* Add cursor's tables to the global count of active tables that
+ belong to this transaction */
+ trx->n_mysql_tables_in_use += curview->n_mysql_tables_in_use;
+
mutex_enter(&kernel_mutex);
read_view_close(curview->read_view);
diff --git a/storage/innobase/row/row0ins.c b/storage/innobase/row/row0ins.c
index bce775c25d6..75d8117a73e 100644
--- a/storage/innobase/row/row0ins.c
+++ b/storage/innobase/row/row0ins.c
@@ -602,7 +602,7 @@ row_ins_foreign_report_err(
rewind(ef);
ut_print_timestamp(ef);
fputs(" Transaction:\n", ef);
- trx_print(ef, trx);
+ trx_print(ef, trx, 600);
fputs("Foreign key constraint fails for table ", ef);
ut_print_name(ef, trx, foreign->foreign_table_name);
@@ -653,7 +653,7 @@ row_ins_foreign_report_add_err(
rewind(ef);
ut_print_timestamp(ef);
fputs(" Transaction:\n", ef);
- trx_print(ef, trx);
+ trx_print(ef, trx, 600);
fputs("Foreign key constraint fails for table ", ef);
ut_print_name(ef, trx, foreign->foreign_table_name);
fputs(":\n", ef);
@@ -1228,7 +1228,7 @@ run_again:
rewind(ef);
ut_print_timestamp(ef);
fputs(" Transaction:\n", ef);
- trx_print(ef, trx);
+ trx_print(ef, trx, 600);
fputs("Foreign key constraint fails for table ", ef);
ut_print_name(ef, trx, foreign->foreign_table_name);
fputs(":\n", ef);
diff --git a/storage/innobase/row/row0sel.c b/storage/innobase/row/row0sel.c
index 15881cb8c5d..a77010d939b 100644
--- a/storage/innobase/row/row0sel.c
+++ b/storage/innobase/row/row0sel.c
@@ -2685,7 +2685,7 @@ row_sel_get_clust_rec_for_mysql(
"InnoDB: clust index record ", stderr);
rec_print(stderr, clust_rec, clust_index);
putc('\n', stderr);
- trx_print(stderr, trx);
+ trx_print(stderr, trx, 600);
fputs("\n"
"InnoDB: Submit a detailed bug report to http://bugs.mysql.com\n", stderr);
@@ -3101,12 +3101,6 @@ row_search_for_mysql(
"InnoDB: how you can resolve the problem.\n",
prebuilt->table->name);
- /* Restore a global read view back to a transaction. This
- forces MySQL always to set a cursor view before fetch from
- a cursor. */
-
- trx->read_view = trx->global_read_view;
-
return(DB_ERROR);
}
@@ -3130,12 +3124,17 @@ row_search_for_mysql(
be zero; in that case select_lock_type is set to LOCK_X in
::start_stmt. */
+/* August 19, 2005 by Heikki: temporarily disable this error print until the
+cursor lock count is done correctly. See bugs #12263 and #12456!
+
fputs(
"InnoDB: Error: MySQL is trying to perform a SELECT\n"
"InnoDB: but it has not locked any tables in ::external_lock()!\n",
stderr);
- trx_print(stderr, trx);
+ trx_print(stderr, trx, 600);
fputc('\n', stderr);
+*/
+
}
/* fprintf(stderr, "Match mode %lu\n search tuple ", (ulong) match_mode);
@@ -3461,7 +3460,7 @@ shortcut_fails_too_big_rec:
fputs(
"InnoDB: Error: MySQL is trying to perform a consistent read\n"
"InnoDB: but the read view is not assigned!\n", stderr);
- trx_print(stderr, trx);
+ trx_print(stderr, trx, 600);
fputc('\n', stderr);
ut_a(0);
}
@@ -4098,12 +4097,6 @@ normal_return:
}
func_exit:
- /* Restore a global read view back to a transaction. This
- forces MySQL always to set a cursor view before fetch from
- a cursor. */
-
- trx->read_view = trx->global_read_view;
-
trx->op_info = "";
if (UNIV_LIKELY_NULL(heap)) {
mem_heap_free(heap);
diff --git a/storage/innobase/row/row0umod.c b/storage/innobase/row/row0umod.c
index 0225a9faec5..f906027033f 100644
--- a/storage/innobase/row/row0umod.c
+++ b/storage/innobase/row/row0umod.c
@@ -431,7 +431,7 @@ row_undo_mod_del_unmark_sec_and_undo_update(
"InnoDB: record ", stderr);
rec_print(stderr, btr_pcur_get_rec(&pcur), index);
putc('\n', stderr);
- trx_print(stderr, trx);
+ trx_print(stderr, trx, 0);
fputs("\n"
"InnoDB: Submit a detailed bug report to http://bugs.mysql.com\n", stderr);
} else {
diff --git a/storage/innobase/row/row0upd.c b/storage/innobase/row/row0upd.c
index 514fb6bd577..4f44dbeae67 100644
--- a/storage/innobase/row/row0upd.c
+++ b/storage/innobase/row/row0upd.c
@@ -1279,7 +1279,7 @@ row_upd_sec_index_entry(
rec_print(stderr, rec, index);
putc('\n', stderr);
- trx_print(stderr, trx);
+ trx_print(stderr, trx, 0);
fputs("\n"
"InnoDB: Submit a detailed bug report to http://bugs.mysql.com\n", stderr);
diff --git a/storage/innobase/srv/srv0srv.c b/storage/innobase/srv/srv0srv.c
index dc85750f0be..c585536baee 100644
--- a/storage/innobase/srv/srv0srv.c
+++ b/storage/innobase/srv/srv0srv.c
@@ -261,6 +261,7 @@ Value 10 should be good if there are less than 4 processors + 4 disks in the
computer. Bigger computers need bigger values. */
ulong srv_thread_concurrency = SRV_CONCURRENCY_THRESHOLD;
+ulong srv_commit_concurrency = 0;
os_fast_mutex_t srv_conc_mutex; /* this mutex protects srv_conc data
structures */
@@ -999,7 +1000,7 @@ retry:
fputs(
" InnoDB: Error: trying to declare trx to enter InnoDB, but\n"
"InnoDB: it already is declared.\n", stderr);
- trx_print(stderr, trx);
+ trx_print(stderr, trx, 0);
putc('\n', stderr);
os_fast_mutex_unlock(&srv_conc_mutex);
diff --git a/storage/innobase/srv/srv0start.c b/storage/innobase/srv/srv0start.c
index ffe4ba08ee9..325b0a109cf 100644
--- a/storage/innobase/srv/srv0start.c
+++ b/storage/innobase/srv/srv0start.c
@@ -1054,7 +1054,8 @@ innobase_start_or_create_for_mysql(void)
fprintf(stderr,
"InnoDB: Error: You have specified innodb_buffer_pool_awe_mem_mb\n"
-"InnoDB: in my.cnf, but AWE can only be used in Windows 2000 and later.\n");
+"InnoDB: in my.cnf, but AWE can only be used in Windows 2000 and later.\n"
+"InnoDB: To use AWE, InnoDB must be compiled with __WIN2000__ defined.\n");
return(DB_ERROR);
}
diff --git a/storage/innobase/trx/trx0trx.c b/storage/innobase/trx/trx0trx.c
index 1681bed9af2..078befb81d2 100644
--- a/storage/innobase/trx/trx0trx.c
+++ b/storage/innobase/trx/trx0trx.c
@@ -30,8 +30,9 @@ Created 3/26/1996 Heikki Tuuri
copy MUST be equal to the one in mysql/sql/ha_innodb.cc ! */
void innobase_mysql_print_thd(
- FILE* f,
- void* thd);
+ FILE* f,
+ void* thd,
+ uint max_query_len);
/* Dummy session used currently in MySQL interface */
sess_t* trx_dummy_sess = NULL;
@@ -262,7 +263,7 @@ trx_free(
fputs(
" InnoDB: Error: Freeing a trx which is declared to be processing\n"
"InnoDB: inside InnoDB.\n", stderr);
- trx_print(stderr, trx);
+ trx_print(stderr, trx, 600);
putc('\n', stderr);
}
@@ -277,7 +278,7 @@ trx_free(
(ulong)trx->n_mysql_tables_in_use,
(ulong)trx->mysql_n_tables_locked);
- trx_print(stderr, trx);
+ trx_print(stderr, trx, 600);
ut_print_buf(stderr, (byte*)trx, sizeof(trx_t));
}
@@ -1651,16 +1652,18 @@ trx_mark_sql_stat_end(
}
/**************************************************************************
-Prints info about a transaction to the standard output. The caller must
-own the kernel mutex and must have called
-innobase_mysql_prepare_print_arbitrary_thd(), unless he knows that MySQL or
-InnoDB cannot meanwhile change the info printed here. */
+Prints info about a transaction to the given file. The caller must own the
+kernel mutex and must have called
+innobase_mysql_prepare_print_arbitrary_thd(), unless he knows that MySQL
+or InnoDB cannot meanwhile change the info printed here. */
void
trx_print(
/*======*/
- FILE* f, /* in: output stream */
- trx_t* trx) /* in: transaction */
+ FILE* f, /* in: output stream */
+ trx_t* trx, /* in: transaction */
+ uint max_query_len) /* in: max query length to print, or 0 to
+ use the default max length */
{
ibool newline;
@@ -1755,7 +1758,7 @@ trx_print(
}
if (trx->mysql_thd != NULL) {
- innobase_mysql_print_thd(f, trx->mysql_thd);
+ innobase_mysql_print_thd(f, trx->mysql_thd, max_query_len);
}
}
diff --git a/storage/myisam/ft_boolean_search.c b/storage/myisam/ft_boolean_search.c
index 34c3fe138a3..078853bad19 100644
--- a/storage/myisam/ft_boolean_search.c
+++ b/storage/myisam/ft_boolean_search.c
@@ -249,6 +249,7 @@ static int _ft2_search(FTB *ftb, FTB_WORD *ftbw, my_bool init_search)
MI_INFO *info=ftb->info;
uint off, extra=HA_FT_WLEN+info->s->base.rec_reflength;
byte *lastkey_buf=ftbw->word+ftbw->off;
+ LINT_INIT(off);
LINT_INIT(off);
if (ftbw->flags & FTB_FLAG_TRUNC)
diff --git a/storage/myisam/myisampack.c b/storage/myisam/myisampack.c
index ba48cbf1b62..b3937ab9607 100644
--- a/storage/myisam/myisampack.c
+++ b/storage/myisam/myisampack.c
@@ -695,14 +695,22 @@ static int compress(PACK_MRG_INFO *mrg,char *result_table)
else
error=my_rename(new_name,org_name,MYF(MY_WME));
if (!error)
+ {
VOID(my_copystat(temp_name,org_name,MYF(MY_COPYTIME)));
+ if (tmp_dir[0])
+ VOID(my_delete(new_name,MYF(MY_WME)));
+ }
}
}
else
{
if (tmp_dir[0])
+ {
error=my_copy(new_name,org_name,
MYF(MY_WME | MY_HOLD_ORIGINAL_MODES | MY_COPYTIME));
+ if (!error)
+ VOID(my_delete(new_name,MYF(MY_WME)));
+ }
else
error=my_redel(org_name,new_name,MYF(MY_WME | MY_COPYTIME));
}
diff --git a/storage/ndb/include/kernel/AttributeDescriptor.hpp b/storage/ndb/include/kernel/AttributeDescriptor.hpp
index af28e777213..2fe7c9f0973 100644
--- a/storage/ndb/include/kernel/AttributeDescriptor.hpp
+++ b/storage/ndb/include/kernel/AttributeDescriptor.hpp
@@ -23,7 +23,8 @@ class AttributeDescriptor {
friend class Dbacc;
friend class Dbtup;
friend class Dbtux;
-
+ friend class SimulatedBlock;
+
private:
static void setType(Uint32 &, Uint32 type);
static void setSize(Uint32 &, Uint32 size);
diff --git a/storage/ndb/include/kernel/BlockNumbers.h b/storage/ndb/include/kernel/BlockNumbers.h
index cb3cc697eee..49b5842ac4e 100644
--- a/storage/ndb/include/kernel/BlockNumbers.h
+++ b/storage/ndb/include/kernel/BlockNumbers.h
@@ -44,8 +44,7 @@
#define TRIX 0xFF
#define DBUTIL 0x100
#define SUMA 0x101
-#define GREP 0x102
-#define DBTUX 0x103
+#define DBTUX 0x102
const BlockReference BACKUP_REF = numberToRef(BACKUP, 0);
const BlockReference DBTC_REF = numberToRef(DBTC, 0);
@@ -61,7 +60,6 @@ const BlockReference CMVMI_REF = numberToRef(CMVMI, 0);
const BlockReference TRIX_REF = numberToRef(TRIX, 0);
const BlockReference DBUTIL_REF = numberToRef(DBUTIL, 0);
const BlockReference SUMA_REF = numberToRef(SUMA, 0);
-const BlockReference GREP_REF = numberToRef(GREP, 0);
const BlockReference DBTUX_REF = numberToRef(DBTUX, 0);
const BlockNumber MIN_BLOCK_NO = BACKUP;
diff --git a/storage/ndb/include/kernel/GlobalSignalNumbers.h b/storage/ndb/include/kernel/GlobalSignalNumbers.h
index cc016b1f3e5..adaa33b09d8 100644
--- a/storage/ndb/include/kernel/GlobalSignalNumbers.h
+++ b/storage/ndb/include/kernel/GlobalSignalNumbers.h
@@ -777,8 +777,8 @@ extern const GlobalSignalNumber NO_OF_SIGNAL_NAMES;
/**
* Grep signals
*/
-#define GSN_GREP_SUB_CREATE_REQ 606
-#define GSN_GREP_SUB_CREATE_REF 607
+#define GSN_ALTER_TABLE_REP 606
+#define GSN_API_BROADCAST_REP 607
#define GSN_GREP_SUB_CREATE_CONF 608
#define GSN_GREP_CREATE_REQ 609
#define GSN_GREP_CREATE_REF 610
diff --git a/storage/ndb/include/kernel/kernel_types.h b/storage/ndb/include/kernel/kernel_types.h
index b176d20798c..e16e61471e7 100644
--- a/storage/ndb/include/kernel/kernel_types.h
+++ b/storage/ndb/include/kernel/kernel_types.h
@@ -36,6 +36,13 @@ enum Operation_t {
#endif
};
+inline
+Uint32
+table_version_major(Uint32 ver)
+{
+ return ver & 0x00FFFFFF;
+}
+
#endif
diff --git a/storage/ndb/include/kernel/signaldata/AlterTable.hpp b/storage/ndb/include/kernel/signaldata/AlterTable.hpp
index 173a9acf9ed..16c9eb204c9 100644
--- a/storage/ndb/include/kernel/signaldata/AlterTable.hpp
+++ b/storage/ndb/include/kernel/signaldata/AlterTable.hpp
@@ -129,7 +129,8 @@ public:
InvalidPrimaryKeySize = 739,
NullablePrimaryKey = 740,
UnsupportedChange = 741,
- BackupInProgress = 762
+ BackupInProgress = 762,
+ IncompatibleVersions = 763
};
private:
@@ -177,4 +178,26 @@ private:
Uint32 tableVersion;
};
+/**
+ * Inform API about change of table definition
+ */
+struct AlterTableRep
+{
+ friend bool printALTER_TABLE_REP(FILE*, const Uint32*, Uint32, Uint16);
+
+ STATIC_CONST( SignalLength = 3 );
+
+ enum Change_type
+ {
+ CT_ALTERED = 0x1,
+ CT_DROPPED = 0x2
+ };
+
+ Uint32 tableId;
+ Uint32 tableVersion;
+ Uint32 changeType;
+
+ SECTION( TABLE_NAME = 0 );
+};
+
#endif
diff --git a/storage/ndb/include/ndbapi/NdbDictionary.hpp b/storage/ndb/include/ndbapi/NdbDictionary.hpp
index f37d71e3481..870af671959 100644
--- a/storage/ndb/include/ndbapi/NdbDictionary.hpp
+++ b/storage/ndb/include/ndbapi/NdbDictionary.hpp
@@ -78,9 +78,10 @@ public:
///< changes to take effect
Retrieved, ///< The object exist and has been read
///< into main memory from NDB Kernel
- Invalid ///< The object has been invalidated
+ Invalid, ///< The object has been invalidated
///< and should not be used
-
+ Altered ///< Table has been altered in NDB kernel
+ ///< but is still valid for usage
};
/**
diff --git a/storage/ndb/include/portlib/NdbTCP.h b/storage/ndb/include/portlib/NdbTCP.h
index 308a3833ffd..9ed5b5e7f96 100644
--- a/storage/ndb/include/portlib/NdbTCP.h
+++ b/storage/ndb/include/portlib/NdbTCP.h
@@ -95,6 +95,8 @@ int Ndb_getInAddr(struct in_addr * dst, const char *address);
int NDB_CLOSE_SOCKET(int fd);
#endif
+int Ndb_check_socket_hup(NDB_SOCKET_TYPE sock);
+
#ifdef __cplusplus
}
#endif
diff --git a/storage/ndb/src/common/debugger/BlockNames.cpp b/storage/ndb/src/common/debugger/BlockNames.cpp
index 44650b84c5c..0c61b6327ef 100644
--- a/storage/ndb/src/common/debugger/BlockNames.cpp
+++ b/storage/ndb/src/common/debugger/BlockNames.cpp
@@ -32,7 +32,6 @@ const BlockName BlockNames[] = {
{ "BACKUP", BACKUP },
{ "DBUTIL", DBUTIL },
{ "SUMA", SUMA },
- { "GREP", GREP },
{ "DBTUX", DBTUX }
};
diff --git a/storage/ndb/src/common/logger/LogHandler.cpp b/storage/ndb/src/common/logger/LogHandler.cpp
index a9d4512112f..521bd346fd3 100644
--- a/storage/ndb/src/common/logger/LogHandler.cpp
+++ b/storage/ndb/src/common/logger/LogHandler.cpp
@@ -58,7 +58,7 @@ LogHandler::append(const char* pCategory, Logger::LoggerLevel level,
}
else // repeated message
{
- if (now < m_last_log_time+m_max_repeat_frequency)
+ if (now < (time_t) (m_last_log_time+m_max_repeat_frequency))
{
m_count_repeated_messages++;
m_now= now;
diff --git a/storage/ndb/src/common/portlib/NdbTCP.cpp b/storage/ndb/src/common/portlib/NdbTCP.cpp
index c7b9d33c5f6..768292ac7c0 100644
--- a/storage/ndb/src/common/portlib/NdbTCP.cpp
+++ b/storage/ndb/src/common/portlib/NdbTCP.cpp
@@ -83,3 +83,18 @@ Ndb_getInAddr(struct in_addr * dst, const char *address) {
return -1;
}
#endif
+
+int Ndb_check_socket_hup(NDB_SOCKET_TYPE sock)
+{
+ struct pollfd pfd[1];
+ int r;
+
+ pfd[0].fd= sock;
+ pfd[0].events= POLLHUP | POLLIN | POLLOUT | POLLNVAL;
+ pfd[0].revents= 0;
+ r= poll(pfd,1,0);
+ if(pfd[0].revents & (POLLHUP|POLLERR))
+ return 1;
+
+ return 0;
+}
diff --git a/storage/ndb/src/common/portlib/win32/NdbTCP.c b/storage/ndb/src/common/portlib/win32/NdbTCP.c
index b936cd2db6c..a14cd4409eb 100644
--- a/storage/ndb/src/common/portlib/win32/NdbTCP.c
+++ b/storage/ndb/src/common/portlib/win32/NdbTCP.c
@@ -37,3 +37,35 @@ Ndb_getInAddr(struct in_addr * dst, const char *address)
return -1;
}
+int Ndb_check_socket_hup(NDB_SOCKET_TYPE sock)
+{
+ fd_set readfds, writefds, errorfds;
+ struct timeval tv= {0,0};
+ int s_err;
+ int s_err_size= sizeof(s_err);
+
+ FD_ZERO(&readfds);
+ FD_ZERO(&writefds);
+ FD_ZERO(&errorfds);
+
+ FD_SET(sock, &readfds);
+ FD_SET(sock, &writefds);
+ FD_SET(sock, &errorfds);
+
+ if(select(1, &readfds, &writefds, &errorfds, &t)==SOCKET_ERROR)
+ return 1;
+
+ if(FD_ISSET(sock,&errorfds))
+ return 1;
+
+ s_err=0;
+ if (getsockopt(sock, SOL_SOCKET, SO_ERROR, (char*) &s_err, &s_err_size) != 0)
+ return(1);
+
+ if (s_err)
+ { /* getsockopt could succeed */
+ return(1); /* but return an error... */
+ }
+
+ return 0;
+}
diff --git a/storage/ndb/src/common/transporter/TransporterRegistry.cpp b/storage/ndb/src/common/transporter/TransporterRegistry.cpp
index 05cf9cdf16f..23ab799094f 100644
--- a/storage/ndb/src/common/transporter/TransporterRegistry.cpp
+++ b/storage/ndb/src/common/transporter/TransporterRegistry.cpp
@@ -1311,11 +1311,17 @@ TransporterRegistry::start_clients_thread()
if (server_port)
t->set_s_port(server_port);
}
- else
+ else if(ndb_mgm_is_connected(m_mgm_handle))
{
ndbout_c("Failed to get dynamic port to connect to: %d", res);
ndb_mgm_disconnect(m_mgm_handle);
}
+ else
+ {
+ ndbout_c("Management server closed connection early. "
+ "It is probably being shut down (or has crashed). "
+ "We will retry the connection.");
+ }
}
/** else
* We will not be able to get a new port unless
diff --git a/storage/ndb/src/common/util/version.c b/storage/ndb/src/common/util/version.c
index e87a342d7b1..e1ff204e91b 100644
--- a/storage/ndb/src/common/util/version.c
+++ b/storage/ndb/src/common/util/version.c
@@ -93,9 +93,10 @@ void ndbSetOwnVersion() {}
#ifndef TEST_VERSION
struct NdbUpGradeCompatible ndbCompatibleTable_full[] = {
{ MAKE_VERSION(5,1,NDB_VERSION_BUILD), MAKE_VERSION(5,1,0), UG_Range},
- { MAKE_VERSION(5,0,8), MAKE_VERSION(5,0,3), UG_Range},
- { MAKE_VERSION(5,0,3), MAKE_VERSION(5,0,2), UG_Exact },
- { MAKE_VERSION(4,1,12), MAKE_VERSION(4,1,10), UG_Range },
+ { MAKE_VERSION(5,0,NDB_VERSION_BUILD), MAKE_VERSION(5,0,12), UG_Range},
+ { MAKE_VERSION(5,0,11), MAKE_VERSION(5,0,2), UG_Range},
+ { MAKE_VERSION(4,1,NDB_VERSION_BUILD), MAKE_VERSION(4,1,15), UG_Range },
+ { MAKE_VERSION(4,1,14), MAKE_VERSION(4,1,10), UG_Range },
{ MAKE_VERSION(4,1,10), MAKE_VERSION(4,1,9), UG_Exact },
{ MAKE_VERSION(4,1,9), MAKE_VERSION(4,1,8), UG_Exact },
{ MAKE_VERSION(3,5,2), MAKE_VERSION(3,5,1), UG_Exact },
@@ -103,7 +104,9 @@ struct NdbUpGradeCompatible ndbCompatibleTable_full[] = {
};
struct NdbUpGradeCompatible ndbCompatibleTable_upgrade[] = {
+ { MAKE_VERSION(5,0,12), MAKE_VERSION(5,0,11), UG_Exact },
{ MAKE_VERSION(5,0,2), MAKE_VERSION(4,1,8), UG_Exact },
+ { MAKE_VERSION(4,1,15), MAKE_VERSION(4,1,14), UG_Exact },
{ MAKE_VERSION(3,5,4), MAKE_VERSION(3,5,3), UG_Exact },
{ 0, 0, UG_Null }
};
diff --git a/storage/ndb/src/kernel/Makefile.am b/storage/ndb/src/kernel/Makefile.am
index 6e3664f0997..9f8331ecf81 100644
--- a/storage/ndb/src/kernel/Makefile.am
+++ b/storage/ndb/src/kernel/Makefile.am
@@ -23,7 +23,6 @@ INCLUDES += \
-Iblocks/backup \
-Iblocks/dbutil \
-Iblocks/suma \
- -Iblocks/grep \
-Iblocks/dbtux
LDADD += \
@@ -41,7 +40,6 @@ LDADD += \
blocks/backup/libbackup.a \
blocks/dbutil/libdbutil.a \
blocks/suma/libsuma.a \
- blocks/grep/libgrep.a \
blocks/dbtux/libdbtux.a \
vm/libkernel.a \
error/liberror.a \
diff --git a/storage/ndb/src/kernel/SimBlockList.cpp b/storage/ndb/src/kernel/SimBlockList.cpp
index bf3958cf137..6029fc7e225 100644
--- a/storage/ndb/src/kernel/SimBlockList.cpp
+++ b/storage/ndb/src/kernel/SimBlockList.cpp
@@ -30,7 +30,6 @@
#include <Backup.hpp>
#include <DbUtil.hpp>
#include <Suma.hpp>
-#include <Grep.hpp>
#include <Dbtux.hpp>
#include <NdbEnv.h>
@@ -97,13 +96,14 @@ SimBlockList::load(const Configuration & conf){
theList[11] = NEW_BLOCK(Backup)(conf);
theList[12] = NEW_BLOCK(DbUtil)(conf);
theList[13] = NEW_BLOCK(Suma)(conf);
- theList[14] = NEW_BLOCK(Grep)(conf);
+ theList[14] = 0; //NEW_BLOCK(Grep)(conf);
theList[15] = NEW_BLOCK(Dbtux)(conf);
// Metadata common part shared by block instances
ptrMetaDataCommon = new MetaData::Common(*dbdict, *dbdih);
for (int i = 0; i < noOfBlocks; i++)
- theList[i]->setMetaDataCommon(ptrMetaDataCommon);
+ if(theList[i])
+ theList[i]->setMetaDataCommon(ptrMetaDataCommon);
}
void
diff --git a/storage/ndb/src/kernel/blocks/Makefile.am b/storage/ndb/src/kernel/blocks/Makefile.am
index 7ee90e6239f..8addf257003 100644
--- a/storage/ndb/src/kernel/blocks/Makefile.am
+++ b/storage/ndb/src/kernel/blocks/Makefile.am
@@ -13,7 +13,6 @@ SUBDIRS = \
backup \
dbutil \
suma \
- grep \
dbtux
windoze-dsp:
diff --git a/storage/ndb/src/kernel/blocks/cmvmi/Cmvmi.cpp b/storage/ndb/src/kernel/blocks/cmvmi/Cmvmi.cpp
index c313abc28eb..6f6aee6a7f7 100644
--- a/storage/ndb/src/kernel/blocks/cmvmi/Cmvmi.cpp
+++ b/storage/ndb/src/kernel/blocks/cmvmi/Cmvmi.cpp
@@ -988,7 +988,6 @@ Cmvmi::execDUMP_STATE_ORD(Signal* signal)
sendSignal(BACKUP_REF, GSN_DUMP_STATE_ORD, signal, signal->length(), JBB);
sendSignal(DBUTIL_REF, GSN_DUMP_STATE_ORD, signal, signal->length(), JBB);
sendSignal(SUMA_REF, GSN_DUMP_STATE_ORD, signal, signal->length(), JBB);
- sendSignal(GREP_REF, GSN_DUMP_STATE_ORD, signal, signal->length(), JBB);
sendSignal(TRIX_REF, GSN_DUMP_STATE_ORD, signal, signal->length(), JBB);
sendSignal(DBTUX_REF, GSN_DUMP_STATE_ORD, signal, signal->length(), JBB);
diff --git a/storage/ndb/src/kernel/blocks/dbacc/Dbacc.hpp b/storage/ndb/src/kernel/blocks/dbacc/Dbacc.hpp
index aa1056e5570..8d9c9bda892 100644
--- a/storage/ndb/src/kernel/blocks/dbacc/Dbacc.hpp
+++ b/storage/ndb/src/kernel/blocks/dbacc/Dbacc.hpp
@@ -851,13 +851,6 @@ struct Tabrec {
Uint32 fragptrholder[MAX_FRAG_PER_NODE];
Uint32 tabUserPtr;
BlockReference tabUserRef;
-
- Uint8 noOfKeyAttr;
- Uint8 hasCharAttr;
- struct KeyAttr {
- Uint32 attributeDescriptor;
- CHARSET_INFO* charsetInfo;
- } keyAttr[MAX_ATTRIBUTES_IN_INDEX];
};
typedef Ptr<Tabrec> TabrecPtr;
@@ -903,7 +896,6 @@ private:
void execACCKEYREQ(Signal* signal);
void execACCSEIZEREQ(Signal* signal);
void execACCFRAGREQ(Signal* signal);
- void execTC_SCHVERREQ(Signal* signal);
void execACC_SRREQ(Signal* signal);
void execNEXT_SCANREQ(Signal* signal);
void execACC_ABORTREQ(Signal* signal);
diff --git a/storage/ndb/src/kernel/blocks/dbacc/DbaccInit.cpp b/storage/ndb/src/kernel/blocks/dbacc/DbaccInit.cpp
index ccc65ccf9fa..e735e3a372f 100644
--- a/storage/ndb/src/kernel/blocks/dbacc/DbaccInit.cpp
+++ b/storage/ndb/src/kernel/blocks/dbacc/DbaccInit.cpp
@@ -179,7 +179,6 @@ Dbacc::Dbacc(const class Configuration & conf):
addRecSignal(GSN_ACCKEYREQ, &Dbacc::execACCKEYREQ);
addRecSignal(GSN_ACCSEIZEREQ, &Dbacc::execACCSEIZEREQ);
addRecSignal(GSN_ACCFRAGREQ, &Dbacc::execACCFRAGREQ);
- addRecSignal(GSN_TC_SCHVERREQ, &Dbacc::execTC_SCHVERREQ);
addRecSignal(GSN_ACC_SRREQ, &Dbacc::execACC_SRREQ);
addRecSignal(GSN_NEXT_SCANREQ, &Dbacc::execNEXT_SCANREQ);
addRecSignal(GSN_ACC_ABORTREQ, &Dbacc::execACC_ABORTREQ);
diff --git a/storage/ndb/src/kernel/blocks/dbacc/DbaccMain.cpp b/storage/ndb/src/kernel/blocks/dbacc/DbaccMain.cpp
index 1a49e95d28c..1f070127936 100644
--- a/storage/ndb/src/kernel/blocks/dbacc/DbaccMain.cpp
+++ b/storage/ndb/src/kernel/blocks/dbacc/DbaccMain.cpp
@@ -28,7 +28,8 @@
#include <signaldata/FsRemoveReq.hpp>
#include <signaldata/DropTab.hpp>
#include <signaldata/DumpStateOrd.hpp>
-#include <SectionReader.hpp>
+#include <KeyDescriptor.hpp>
+
// TO_DO_RONM is a label for comments on what needs to be improved in future versions
// when more time is given.
@@ -1037,12 +1038,6 @@ void Dbacc::initialiseTableRec(Signal* signal)
tabptr.p->fragholder[i] = RNIL;
tabptr.p->fragptrholder[i] = RNIL;
}//for
- tabptr.p->noOfKeyAttr = 0;
- tabptr.p->hasCharAttr = 0;
- for (Uint32 k = 0; k < MAX_ATTRIBUTES_IN_INDEX; k++) {
- tabptr.p->keyAttr[k].attributeDescriptor = 0;
- tabptr.p->keyAttr[k].charsetInfo = 0;
- }
}//for
}//Dbacc::initialiseTableRec()
@@ -1172,8 +1167,8 @@ void Dbacc::execACCFRAGREQ(Signal* signal)
Uint32 userPtr = req->userPtr;
BlockReference retRef = req->userRef;
rootfragrecptr.p->rootState = ACTIVEROOT;
- AccFragConf * const conf = (AccFragConf*)&signal->theData[0];
+ AccFragConf * const conf = (AccFragConf*)&signal->theData[0];
conf->userPtr = userPtr;
conf->rootFragPtr = rootfragrecptr.i;
conf->fragId[0] = rootfragrecptr.p->fragmentid[0];
@@ -1197,65 +1192,6 @@ void Dbacc::addFragRefuse(Signal* signal, Uint32 errorCode)
return;
}//Dbacc::addFragRefuseEarly()
-void
-Dbacc::execTC_SCHVERREQ(Signal* signal)
-{
- jamEntry();
- if (! assembleFragments(signal)) {
- jam();
- return;
- }
- tabptr.i = signal->theData[0];
- ptrCheckGuard(tabptr, ctablesize, tabrec);
- Uint32 noOfKeyAttr = signal->theData[6];
- ndbrequire(noOfKeyAttr <= MAX_ATTRIBUTES_IN_INDEX);
- Uint32 hasCharAttr = 0;
-
- SegmentedSectionPtr s0Ptr;
- signal->getSection(s0Ptr, 0);
- SectionReader r0(s0Ptr, getSectionSegmentPool());
- Uint32 i = 0;
- while (i < noOfKeyAttr) {
- jam();
- Uint32 attributeDescriptor = ~0;
- Uint32 csNumber = ~0;
- if (! r0.getWord(&attributeDescriptor) ||
- ! r0.getWord(&csNumber)) {
- jam();
- break;
- }
- CHARSET_INFO* cs = 0;
- if (csNumber != 0) {
- cs = all_charsets[csNumber];
- ndbrequire(cs != 0);
- hasCharAttr = 1;
- }
- tabptr.p->keyAttr[i].attributeDescriptor = attributeDescriptor;
- tabptr.p->keyAttr[i].charsetInfo = cs;
- i++;
- }
- ndbrequire(i == noOfKeyAttr);
- releaseSections(signal);
-
- tabptr.p->noOfKeyAttr = noOfKeyAttr;
- tabptr.p->hasCharAttr = hasCharAttr;
-
- // copy char attr flag to each fragment
- for (Uint32 i1 = 0; i1 < MAX_FRAG_PER_NODE; i1++) {
- jam();
- if (tabptr.p->fragptrholder[i1] != RNIL) {
- rootfragrecptr.i = tabptr.p->fragptrholder[i1];
- ptrCheckGuard(rootfragrecptr, crootfragmentsize, rootfragmentrec);
- for (Uint32 i2 = 0; i2 < 2; i2++) {
- fragrecptr.i = rootfragrecptr.p->fragmentptr[i2];
- ptrCheckGuard(fragrecptr, cfragmentsize, fragmentrec);
- fragrecptr.p->hasCharAttr = hasCharAttr;
- }
- }
- }
-
- // no reply to DICT
-}
void
Dbacc::execDROP_TAB_REQ(Signal* signal){
@@ -1841,55 +1777,14 @@ void Dbacc::execACCKEYREQ(Signal* signal)
void
Dbacc::xfrmKeyData(Signal* signal)
{
- tabptr.i = fragrecptr.p->myTableId;
- ptrCheckGuard(tabptr, ctablesize, tabrec);
-
- Uint32 dst[1024 * MAX_XFRM_MULTIPLY];
- Uint32 dstSize = (sizeof(dst) >> 2);
+ Uint32 table = fragrecptr.p->myTableId;
+ Uint32 dst[MAX_KEY_SIZE_IN_WORDS * MAX_XFRM_MULTIPLY];
+ Uint32 keyPartLen[MAX_ATTRIBUTES_IN_INDEX];
Uint32* src = &signal->theData[7];
- const Uint32 noOfKeyAttr = tabptr.p->noOfKeyAttr;
- Uint32 dstPos = 0;
- Uint32 srcPos = 0;
- Uint32 i = 0;
-
- while (i < noOfKeyAttr) {
- const Tabrec::KeyAttr& keyAttr = tabptr.p->keyAttr[i];
-
- Uint32 srcBytes = AttributeDescriptor::getSizeInBytes(keyAttr.attributeDescriptor);
- Uint32 srcWords = (srcBytes + 3) / 4;
- Uint32 dstWords = ~0;
- uchar* dstPtr = (uchar*)&dst[dstPos];
- const uchar* srcPtr = (const uchar*)&src[srcPos];
- CHARSET_INFO* cs = keyAttr.charsetInfo;
-
- if (cs == 0) {
- jam();
- memcpy(dstPtr, srcPtr, srcWords << 2);
- dstWords = srcWords;
- } else {
- jam();
- Uint32 typeId = AttributeDescriptor::getType(keyAttr.attributeDescriptor);
- Uint32 lb, len;
- bool ok = NdbSqlUtil::get_var_length(typeId, srcPtr, srcBytes, lb, len);
- ndbrequire(ok);
- Uint32 xmul = cs->strxfrm_multiply;
- if (xmul == 0)
- xmul = 1;
- // see comment in DbtcMain.cpp
- Uint32 dstLen = xmul * (srcBytes - lb);
- ndbrequire(dstLen <= ((dstSize - dstPos) << 2));
- int n = NdbSqlUtil::strnxfrm_bug7284(cs, dstPtr, dstLen, srcPtr + lb, len);
- ndbrequire(n != -1);
- while ((n & 3) != 0)
- dstPtr[n++] = 0;
- dstWords = (n >> 2);
- }
- dstPos += dstWords;
- srcPos += srcWords;
- i++;
- }
- memcpy(src, dst, dstPos << 2);
- operationRecPtr.p->xfrmtupkeylen = dstPos;
+ Uint32 len = xfrm_key(table, src, dst, sizeof(dst) >> 2, keyPartLen);
+ ndbrequire(len); // 0 means error
+ memcpy(src, dst, len << 2);
+ operationRecPtr.p->xfrmtupkeylen = len;
}
void Dbacc::accIsLockedLab(Signal* signal)
@@ -8024,6 +7919,10 @@ void Dbacc::initFragAdd(Signal* signal,
Uint32 Tmp2 = regFragPtr.p->maxloadfactor - regFragPtr.p->minloadfactor;
Tmp2 = Tmp1 * Tmp2;
regFragPtr.p->slackCheck = Tmp2;
+
+ Uint32 hasCharAttr = g_key_descriptor_pool.getPtr(req->tableId)->hasCharAttr;
+ regFragPtr.p->hasCharAttr = hasCharAttr;
+
}//Dbacc::initFragAdd()
void Dbacc::initFragGeneral(FragmentrecPtr regFragPtr)
diff --git a/storage/ndb/src/kernel/blocks/dbdict/Dbdict.cpp b/storage/ndb/src/kernel/blocks/dbdict/Dbdict.cpp
index 3b1fddef00e..0a33966ef73 100644
--- a/storage/ndb/src/kernel/blocks/dbdict/Dbdict.cpp
+++ b/storage/ndb/src/kernel/blocks/dbdict/Dbdict.cpp
@@ -27,6 +27,7 @@
#include <SectionReader.hpp>
#include <SimpleProperties.hpp>
#include <AttributeHeader.hpp>
+#include <KeyDescriptor.hpp>
#include <signaldata/DictSchemaInfo.hpp>
#include <signaldata/DictTabInfo.hpp>
#include <signaldata/DropTabFile.hpp>
@@ -77,6 +78,7 @@
#include <signaldata/CreateFragmentation.hpp>
#include <signaldata/CreateTab.hpp>
#include <NdbSleep.h>
+#include <signaldata/ApiBroadcast.hpp>
#define ZNOT_FOUND 626
#define ZALREADYEXIST 630
@@ -91,6 +93,27 @@
#define DIV(x,y) (((x)+(y)-1)/(y))
#include <ndb_version.h>
+static
+Uint32
+alter_table_inc_schema_version(Uint32 old)
+{
+ return (old & 0x00FFFFFF) + ((old + 0x1000000) & 0xFF000000);
+}
+
+static
+Uint32
+alter_table_dec_schema_version(Uint32 old)
+{
+ return (old & 0x00FFFFFF) + ((old - 0x1000000) & 0xFF000000);
+}
+
+static
+Uint32
+create_table_inc_schema_version(Uint32 old)
+{
+ return (old + 0x00000001) & 0x00FFFFFF;
+}
+
/* **************************************************************** */
/* ---------------------------------------------------------------- */
/* MODULE: GENERAL MODULE -------------------------------- */
@@ -603,7 +626,7 @@ void Dbdict::openTableFile(Signal* signal,
jam();
fsOpenReq->fileFlags = FsOpenReq::OM_READONLY;
}//if
- ndbrequire(tablePtr.p->tableVersion < ZNIL);
+
fsOpenReq->fileNumber[3] = 0; // Initialise before byte changes
FsOpenReq::setVersion(fsOpenReq->fileNumber, 1);
FsOpenReq::setSuffix(fsOpenReq->fileNumber, FsOpenReq::S_TABLELIST);
@@ -793,7 +816,7 @@ Dbdict::updateSchemaState(Signal* signal, Uint32 tableId,
case SchemaFile::ADD_STARTED:
jam();
ok = true;
- ndbrequire((oldVersion + 1) == newVersion);
+ ndbrequire(create_table_inc_schema_version(oldVersion) == newVersion);
ndbrequire(oldState == SchemaFile::INIT ||
oldState == SchemaFile::DROP_TABLE_COMMITTED);
break;
@@ -806,7 +829,7 @@ Dbdict::updateSchemaState(Signal* signal, Uint32 tableId,
case SchemaFile::ALTER_TABLE_COMMITTED:
jam();
ok = true;
- ndbrequire((oldVersion + 1) == newVersion);
+ ndbrequire(alter_table_inc_schema_version(oldVersion) == newVersion);
ndbrequire(oldState == SchemaFile::TABLE_ADD_COMMITTED ||
oldState == SchemaFile::ALTER_TABLE_COMMITTED);
break;
@@ -1730,6 +1753,7 @@ void Dbdict::execREAD_CONFIG_REQ(Signal* signal)
c_schemaPageRecordArray.setSize(2 * NDB_SF_MAX_PAGES);
c_tableRecordPool.setSize(tablerecSize);
c_tableRecordHash.setSize(tablerecSize);
+ g_key_descriptor_pool.setSize(tablerecSize);
c_triggerRecordPool.setSize(c_maxNoOfTriggers);
c_triggerRecordHash.setSize(c_maxNoOfTriggers);
c_opRecordPool.setSize(256); // XXX need config params
@@ -3014,6 +3038,21 @@ Dbdict::execBACKUP_FRAGMENT_REQ(Signal* signal)
}
}
+bool
+Dbdict::check_ndb_versions() const
+{
+ Uint32 node = 0;
+ Uint32 version = getNodeInfo(getOwnNodeId()).m_version;
+ while((node = c_aliveNodes.find(node + 1)) != BitmaskImpl::NotFound)
+ {
+ if(getNodeInfo(node).m_version != version)
+ {
+ return false;
+ }
+ }
+ return true;
+}
+
void
Dbdict::execALTER_TABLE_REQ(Signal* signal)
{
@@ -3050,6 +3089,13 @@ Dbdict::execALTER_TABLE_REQ(Signal* signal)
alterTableRef(signal, req, AlterTableRef::Busy);
return;
}
+
+ if (!check_ndb_versions())
+ {
+ jam();
+ alterTableRef(signal, req, AlterTableRef::IncompatibleVersions);
+ return;
+ }
const TableRecord::TabState tabState = tablePtr.p->tabState;
bool ok = false;
@@ -3200,7 +3246,7 @@ Dbdict::alterTable_backup_mutex_locked(Signal* signal,
lreq->clientData = alterTabPtr.p->m_senderData;
lreq->changeMask = alterTabPtr.p->m_changeMask;
lreq->tableId = tablePtr.p->tableId;
- lreq->tableVersion = tablePtr.p->tableVersion + 1;
+ lreq->tableVersion = alter_table_inc_schema_version(tablePtr.p->tableVersion);
lreq->gci = tablePtr.p->gciTableCreated;
lreq->requestType = AlterTabReq::AlterTablePrepare;
@@ -3280,6 +3326,14 @@ Dbdict::execALTER_TAB_REQ(Signal * signal)
alterTabRef(signal, req, AlterTableRef::Busy);
return;
}
+
+ if (!check_ndb_versions())
+ {
+ jam();
+ alterTabRef(signal, req, AlterTableRef::IncompatibleVersions);
+ return;
+ }
+
alterTabPtr.p->m_alterTableId = tableId;
alterTabPtr.p->m_coordinatorRef = senderRef;
@@ -3322,7 +3376,7 @@ Dbdict::execALTER_TAB_REQ(Signal * signal)
}
ndbrequire(ok);
- if(tablePtr.p->tableVersion + 1 != tableVersion){
+ if(alter_table_inc_schema_version(tablePtr.p->tableVersion) != tableVersion){
jam();
alterTabRef(signal, req, AlterTableRef::InvalidTableVersion);
return;
@@ -3807,7 +3861,7 @@ void Dbdict::revertAlterTable(Signal * signal,
// Restore name
strcpy(tablePtr.p->tableName, alterTabPtrP->previousTableName);
// Revert schema version
- tablePtr.p->tableVersion = tablePtr.p->tableVersion - 1;
+ tablePtr.p->tableVersion = alter_table_dec_schema_version(tablePtr.p->tableVersion);
// Put it back
#ifdef VM_TRACE
ndbrequire(!c_tableRecordHash.find(tmp, * tablePtr.p));
@@ -3867,6 +3921,27 @@ Dbdict::alterTab_writeTableConf(Signal* signal,
conf->requestType = AlterTabReq::AlterTableCommit;
sendSignal(coordinatorRef, GSN_ALTER_TAB_CONF, signal,
AlterTabConf::SignalLength, JBB);
+
+
+ {
+ ApiBroadcastRep* api= (ApiBroadcastRep*)signal->getDataPtrSend();
+ api->gsn = GSN_ALTER_TABLE_REP;
+ api->minVersion = MAKE_VERSION(4,1,15);
+
+ AlterTableRep* rep = (AlterTableRep*)api->theData;
+ rep->tableId = tabPtr.p->tableId;
+ rep->tableVersion = alter_table_dec_schema_version(tabPtr.p->tableVersion);
+ rep->changeType = AlterTableRep::CT_ALTERED;
+
+ LinearSectionPtr ptr[3];
+ ptr[0].p = (Uint32*)alterTabPtr.p->previousTableName;
+ ptr[0].sz = (sizeof(alterTabPtr.p->previousTableName) + 3) >> 2;
+
+ sendSignal(QMGR_REF, GSN_API_BROADCAST_REP, signal,
+ ApiBroadcastRep::SignalLength + AlterTableRep::SignalLength,
+ JBB, ptr,1);
+ }
+
if(coordinatorRef != reference()) {
jam();
// Release resources
@@ -3918,7 +3993,7 @@ Dbdict::execCREATE_FRAGMENTATION_CONF(Signal* signal){
XSchemaFile * xsf = &c_schemaFile[c_schemaRecord.schemaPage != 0];
SchemaFile::TableEntry * tabEntry = getTableEntry(xsf, tabPtr.i);
- tabPtr.p->tableVersion = tabEntry->m_tableVersion + 1;
+ tabPtr.p->tableVersion = create_table_inc_schema_version(tabEntry->m_tableVersion);
/**
* Pack
@@ -3947,7 +4022,7 @@ Dbdict::execCREATE_FRAGMENTATION_CONF(Signal* signal){
req->gci = 0;
req->tableId = tabPtr.i;
- req->tableVersion = tabEntry->m_tableVersion + 1;
+ req->tableVersion = create_table_inc_schema_version(tabEntry->m_tableVersion);
sendFragmentedSignal(rg, GSN_CREATE_TAB_REQ, signal,
CreateTabReq::SignalLength, JBB);
@@ -4409,6 +4484,44 @@ 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
@@ -4603,31 +4716,11 @@ Dbdict::execTAB_COMMITCONF(Signal* signal){
signal->theData[4] = (Uint32)tabPtr.p->tableType;
signal->theData[5] = createTabPtr.p->key;
signal->theData[6] = (Uint32)tabPtr.p->noOfPrimkey;
-
- Uint32 buf[2 * MAX_ATTRIBUTES_IN_INDEX];
- Uint32 sz = 0;
- Uint32 tAttr = tabPtr.p->firstAttribute;
- while (tAttr != RNIL) {
- jam();
- AttributeRecord* aRec = c_attributeRecordPool.getPtr(tAttr);
- if (aRec->tupleKey) {
- buf[sz++] = aRec->attributeDescriptor;
- buf[sz++] = (aRec->extPrecision >> 16); // charset number
- }
- tAttr = aRec->nextAttrInTable;
- }
- ndbrequire((int)sz == 2 * tabPtr.p->noOfPrimkey);
-
- LinearSectionPtr lsPtr[3];
- lsPtr[0].p = buf;
- lsPtr[0].sz = sz;
- // note: ACC does not reply
- if (tabPtr.p->isTable() || tabPtr.p->isHashIndex())
- sendSignal(DBACC_REF, GSN_TC_SCHVERREQ, signal, 7, JBB, lsPtr, 1);
- sendSignal(DBTC_REF, GSN_TC_SCHVERREQ, signal, 7, JBB, lsPtr, 1);
+
+ sendSignal(DBTC_REF, GSN_TC_SCHVERREQ, signal, 7, JBB);
return;
}
-
+
ndbrequire(false);
}
@@ -12312,3 +12405,5 @@ Dbdict::getMetaAttribute(MetaData::Attribute& attr, const MetaData::Table& table
new (&attr) MetaData::Attribute(*attrPtr.p);
return 0;
}
+
+CArray<KeyDescriptor> g_key_descriptor_pool;
diff --git a/storage/ndb/src/kernel/blocks/dbdict/Dbdict.hpp b/storage/ndb/src/kernel/blocks/dbdict/Dbdict.hpp
index 45f43e5ad78..b7f6fe03eb1 100644
--- a/storage/ndb/src/kernel/blocks/dbdict/Dbdict.hpp
+++ b/storage/ndb/src/kernel/blocks/dbdict/Dbdict.hpp
@@ -591,6 +591,7 @@ private:
void execALTER_TAB_REQ(Signal* signal);
void execALTER_TAB_REF(Signal* signal);
void execALTER_TAB_CONF(Signal* signal);
+ bool check_ndb_versions() const;
/*
* 2.4 COMMON STORED VARIABLES
diff --git a/storage/ndb/src/kernel/blocks/dbdict/printSchemaFile.cpp b/storage/ndb/src/kernel/blocks/dbdict/printSchemaFile.cpp
index b9b144cd977..9858744a61d 100644
--- a/storage/ndb/src/kernel/blocks/dbdict/printSchemaFile.cpp
+++ b/storage/ndb/src/kernel/blocks/dbdict/printSchemaFile.cpp
@@ -85,7 +85,8 @@ print_old(const char * filename, const SchemaFile * sf)
te.m_tableState != SchemaFile::DROP_TABLE_COMMITTED)) {
ndbout << "Table " << i << ":"
<< " State = " << te.m_tableState
- << " version = " << te.m_tableVersion
+ << " version = " << table_version_major(te.m_tableVersion) <<
+ << "(" << table_version_minor(te.m_tableVersion) << ")"
<< " type = " << te.m_tableType
<< " noOfPages = " << te.m_noOfPages
<< " gcp: " << te.m_gcp << endl;
diff --git a/storage/ndb/src/kernel/blocks/dbdih/DbdihMain.cpp b/storage/ndb/src/kernel/blocks/dbdih/DbdihMain.cpp
index a22e2c28cd7..f6bec853a63 100644
--- a/storage/ndb/src/kernel/blocks/dbdih/DbdihMain.cpp
+++ b/storage/ndb/src/kernel/blocks/dbdih/DbdihMain.cpp
@@ -1886,8 +1886,6 @@ void Dbdih::execINCL_NODECONF(Signal* signal)
// Suma will not send response to this for now, later...
sendSignal(SUMA_REF, GSN_INCL_NODEREQ, signal, 2, JBB);
- // Grep will not send response to this for now, later...
- sendSignal(GREP_REF, GSN_INCL_NODEREQ, signal, 2, JBB);
return;
}//if
if (TstartNode_or_blockref == numberToRef(BACKUP, getOwnNodeId())){
diff --git a/storage/ndb/src/kernel/blocks/dblqh/Dblqh.hpp b/storage/ndb/src/kernel/blocks/dblqh/Dblqh.hpp
index 5328f42ba83..95f510a5a60 100644
--- a/storage/ndb/src/kernel/blocks/dblqh/Dblqh.hpp
+++ b/storage/ndb/src/kernel/blocks/dblqh/Dblqh.hpp
@@ -2233,7 +2233,7 @@ private:
void LQHKEY_abort(Signal* signal, int errortype);
void LQHKEY_error(Signal* signal, int errortype);
void nextRecordCopy(Signal* signal);
- void calculateHash(Signal* signal);
+ Uint32 calculateHash(Uint32 tableId, const Uint32* src);
void continueAfterCheckLcpStopBlocked(Signal* signal);
void checkLcpStopBlockedLab(Signal* signal);
void sendCommittedTc(Signal* signal, BlockReference atcBlockref);
diff --git a/storage/ndb/src/kernel/blocks/dblqh/DblqhMain.cpp b/storage/ndb/src/kernel/blocks/dblqh/DblqhMain.cpp
index cb31b77221e..502fd91b87b 100644
--- a/storage/ndb/src/kernel/blocks/dblqh/DblqhMain.cpp
+++ b/storage/ndb/src/kernel/blocks/dblqh/DblqhMain.cpp
@@ -55,6 +55,7 @@
#include <signaldata/AlterTab.hpp>
#include <signaldata/LCP.hpp>
+#include <KeyDescriptor.hpp>
// Use DEBUG to print messages that should be
// seen only when we debug the product
@@ -3522,7 +3523,8 @@ void Dblqh::execLQHKEYREQ(Signal* signal)
LQHKEY_abort(signal, 4);
return;
}
- if(tabptr.p->schemaVersion != schemaVersion){
+ if(table_version_major(tabptr.p->schemaVersion) !=
+ table_version_major(schemaVersion)){
LQHKEY_abort(signal, 5);
return;
}
@@ -4461,7 +4463,7 @@ void Dblqh::packLqhkeyreqLab(Signal* signal)
lqhKeyReq->requestInfo = Treqinfo;
lqhKeyReq->tcBlockref = sig4;
- sig0 = regTcPtr->tableref + (regTcPtr->schemaVersion << 16);
+ sig0 = regTcPtr->tableref + ((regTcPtr->schemaVersion << 16) & 0xFFFF0000);
sig1 = regTcPtr->fragmentid + (regTcPtr->nodeAfterNext[0] << 16);
sig2 = regTcPtr->transid[0];
sig3 = regTcPtr->transid[1];
@@ -9012,44 +9014,17 @@ void Dblqh::sendScanFragConf(Signal* signal, Uint32 scanCompleted)
/* FRAGMENT TO A NEW REPLICA OF THE FRAGMENT. IT DOES ALSO SHUT DOWN ALL */
/* CONNECTIONS TO THE FAILED NODE. */
/*---------------------------------------------------------------------------*/
-void Dblqh::calculateHash(Signal* signal)
-{
- DatabufPtr locDatabufptr;
- UintR Ti;
- UintR Tdata0;
- UintR Tdata1;
- UintR Tdata2;
- UintR Tdata3;
- UintR* Tdata32;
- Uint64 Tdata[512];
-
- Tdata32 = (UintR*)&Tdata[0];
-
- Tdata0 = tcConnectptr.p->tupkeyData[0];
- Tdata1 = tcConnectptr.p->tupkeyData[1];
- Tdata2 = tcConnectptr.p->tupkeyData[2];
- Tdata3 = tcConnectptr.p->tupkeyData[3];
- Tdata32[0] = Tdata0;
- Tdata32[1] = Tdata1;
- Tdata32[2] = Tdata2;
- Tdata32[3] = Tdata3;
- locDatabufptr.i = tcConnectptr.p->firstTupkeybuf;
- Ti = 4;
- while (locDatabufptr.i != RNIL) {
- ptrCheckGuard(locDatabufptr, cdatabufFileSize, databuf);
- Tdata0 = locDatabufptr.p->data[0];
- Tdata1 = locDatabufptr.p->data[1];
- Tdata2 = locDatabufptr.p->data[2];
- Tdata3 = locDatabufptr.p->data[3];
- Tdata32[Ti ] = Tdata0;
- Tdata32[Ti + 1] = Tdata1;
- Tdata32[Ti + 2] = Tdata2;
- Tdata32[Ti + 3] = Tdata3;
- locDatabufptr.i = locDatabufptr.p->nextDatabuf;
- Ti += 4;
- }//while
- tcConnectptr.p->hashValue =
- md5_hash((Uint64*)&Tdata32[0], (UintR)tcConnectptr.p->primKeyLen);
+Uint32
+Dblqh::calculateHash(Uint32 tableId, const Uint32* src)
+{
+ jam();
+ Uint64 Tmp[(MAX_KEY_SIZE_IN_WORDS*MAX_XFRM_MULTIPLY) >> 1];
+ Uint32 keyPartLen[MAX_ATTRIBUTES_IN_INDEX];
+ Uint32 keyLen = xfrm_key(tableId, src, (Uint32*)Tmp, sizeof(Tmp) >> 2,
+ keyPartLen);
+ ndbrequire(keyLen);
+
+ return md5_hash(Tmp, keyLen);
}//Dblqh::calculateHash()
/* *************************************** */
@@ -9383,7 +9358,7 @@ void Dblqh::copyTupkeyConfLab(Signal* signal)
const TupKeyConf * const tupKeyConf = (TupKeyConf *)signal->getDataPtr();
UintR readLength = tupKeyConf->readLength;
-
+ Uint32 tableId = tcConnectptr.p->tableref;
scanptr.i = tcConnectptr.p->tcScanRec;
c_scanRecordPool.getPtr(scanptr);
ScanRecord* scanP = scanptr.p;
@@ -9410,7 +9385,14 @@ void Dblqh::copyTupkeyConfLab(Signal* signal)
Uint32 len= tcConnectptr.p->primKeyLen = readPrimaryKeys(scanP, tcConP, tmp);
// Calculate hash (no need to linearies key)
- tcConnectptr.p->hashValue = md5_hash((Uint64*)tmp, len);
+ if (g_key_descriptor_pool.getPtr(tableId)->hasCharAttr)
+ {
+ tcConnectptr.p->hashValue = calculateHash(tableId, tmp);
+ }
+ else
+ {
+ tcConnectptr.p->hashValue = md5_hash((Uint64*)tmp, len);
+ }
// Move into databuffer to make packLqhkeyreqLab happy
memcpy(tcConP->tupkeyData, tmp, 4*4);
@@ -15922,7 +15904,7 @@ Uint32 Dblqh::checkIfExecLog(Signal* signal)
tabptr.i = tcConnectptr.p->tableref;
ptrCheckGuard(tabptr, ctabrecFileSize, tablerec);
if (getFragmentrec(signal, tcConnectptr.p->fragmentid) &&
- (tabptr.p->schemaVersion == tcConnectptr.p->schemaVersion)) {
+ (table_version_major(tabptr.p->schemaVersion) == table_version_major(tcConnectptr.p->schemaVersion))) {
if (fragptr.p->execSrStatus != Fragrecord::IDLE) {
if (fragptr.p->execSrNoReplicas > logPartPtr.p->execSrExecuteIndex) {
ndbrequire((fragptr.p->execSrNoReplicas - 1) < 4);
diff --git a/storage/ndb/src/kernel/blocks/dblqh/Makefile.am b/storage/ndb/src/kernel/blocks/dblqh/Makefile.am
index 4807a8ec5d0..51cc12feb06 100644
--- a/storage/ndb/src/kernel/blocks/dblqh/Makefile.am
+++ b/storage/ndb/src/kernel/blocks/dblqh/Makefile.am
@@ -1,12 +1,16 @@
-#SUBDIRS = redoLogReader
-
noinst_LIBRARIES = libdblqh.a
+EXTRA_PROGRAMS = ndbd_redo_log_reader
libdblqh_a_SOURCES = DblqhInit.cpp DblqhMain.cpp
+ndbd_redo_log_reader_SOURCES = redoLogReader/records.cpp redoLogReader/redoLogFileReader.cpp
include $(top_srcdir)/storage/ndb/config/common.mk.am
include $(top_srcdir)/storage/ndb/config/type_kernel.mk.am
+LDADD += \
+ $(top_builddir)/storage/ndb/src/common/util/libgeneral.la \
+ $(top_builddir)/storage/ndb/src/common/portlib/libportlib.la
+
# Don't update the files from bitkeeper
%::SCCS/s.%
diff --git a/storage/ndb/src/kernel/blocks/dblqh/redoLogReader/Makefile b/storage/ndb/src/kernel/blocks/dblqh/redoLogReader/Makefile
deleted file mode 100644
index a89b648de77..00000000000
--- a/storage/ndb/src/kernel/blocks/dblqh/redoLogReader/Makefile
+++ /dev/null
@@ -1,9 +0,0 @@
-include .defs.mk
-
-BIN_TARGET := redoLogFileReader
-
-SOURCES := records.cpp redoLogFileReader.cpp
-
-TYPE := util
-
-include $(NDB_TOP)/Epilogue.mk
diff --git a/storage/ndb/src/kernel/blocks/dblqh/redoLogReader/redoLogFileReader.cpp b/storage/ndb/src/kernel/blocks/dblqh/redoLogReader/redoLogFileReader.cpp
index 540df7b507e..67e59c48ea6 100644
--- a/storage/ndb/src/kernel/blocks/dblqh/redoLogReader/redoLogFileReader.cpp
+++ b/storage/ndb/src/kernel/blocks/dblqh/redoLogReader/redoLogFileReader.cpp
@@ -40,7 +40,7 @@ Uint32 readFromFile(FILE * f, Uint32 *toPtr, Uint32 sizeInWords);
void readArguments(int argc, const char** argv);
void doExit();
-FILE * f;
+FILE * f= 0;
char fileName[256];
bool thePrintFlag = true;
bool theCheckFlag = true;
@@ -458,7 +458,7 @@ void readArguments(int argc, const char** argv)
void doExit() {
ndbout << "Error in redoLogReader(). Exiting!" << endl;
- fclose(f);
+ if (f) fclose(f);
delete [] redoLogPage;
exit(RETURN_ERROR);
}
diff --git a/storage/ndb/src/kernel/blocks/dbtc/Dbtc.hpp b/storage/ndb/src/kernel/blocks/dbtc/Dbtc.hpp
index 79b6cec6d44..c6d72135fc5 100644
--- a/storage/ndb/src/kernel/blocks/dbtc/Dbtc.hpp
+++ b/storage/ndb/src/kernel/blocks/dbtc/Dbtc.hpp
@@ -969,13 +969,9 @@ public:
Uint8 hasCharAttr;
Uint8 noOfDistrKeys;
- struct KeyAttr {
- Uint32 attributeDescriptor;
- CHARSET_INFO* charsetInfo;
- } keyAttr[MAX_ATTRIBUTES_IN_INDEX];
-
bool checkTable(Uint32 schemaVersion) const {
- return enabled && !dropping && (schemaVersion == currentSchemaVersion);
+ return enabled && !dropping &&
+ (table_version_major(schemaVersion) == table_version_major(currentSchemaVersion));
}
Uint32 getErrorCode(Uint32 schemaVersion) const;
diff --git a/storage/ndb/src/kernel/blocks/dbtc/DbtcMain.cpp b/storage/ndb/src/kernel/blocks/dbtc/DbtcMain.cpp
index f307f0576bf..8c32c87e05e 100644
--- a/storage/ndb/src/kernel/blocks/dbtc/DbtcMain.cpp
+++ b/storage/ndb/src/kernel/blocks/dbtc/DbtcMain.cpp
@@ -66,6 +66,7 @@
#include <signaldata/DictTabInfo.hpp>
#include <AttributeDescriptor.hpp>
#include <SectionReader.hpp>
+#include <KeyDescriptor.hpp>
#include <NdbOut.hpp>
#include <DebuggerNames.hpp>
@@ -329,42 +330,16 @@ void Dbtc::execTC_SCHVERREQ(Signal* signal)
BlockReference retPtr = signal->theData[5];
Uint32 noOfKeyAttr = signal->theData[6];
ndbrequire(noOfKeyAttr <= MAX_ATTRIBUTES_IN_INDEX);
- Uint32 hasCharAttr = 0;
- Uint32 noOfDistrKeys = 0;
- SegmentedSectionPtr s0Ptr;
- signal->getSection(s0Ptr, 0);
- SectionReader r0(s0Ptr, getSectionSegmentPool());
- Uint32 i = 0;
- while (i < noOfKeyAttr) {
- jam();
- Uint32 attributeDescriptor = ~0;
- Uint32 csNumber = ~0;
- if (! r0.getWord(&attributeDescriptor) ||
- ! r0.getWord(&csNumber)) {
- jam();
- break;
- }
- CHARSET_INFO* cs = 0;
- if (csNumber != 0) {
- cs = all_charsets[csNumber];
- ndbrequire(cs != 0);
- hasCharAttr = 1;
- }
-
- noOfDistrKeys += AttributeDescriptor::getDKey(attributeDescriptor);
- tabptr.p->keyAttr[i].attributeDescriptor = attributeDescriptor;
- tabptr.p->keyAttr[i].charsetInfo = cs;
- i++;
- }
- ndbrequire(i == noOfKeyAttr);
- releaseSections(signal);
+
+ const KeyDescriptor* desc = g_key_descriptor_pool.getPtr(tabptr.i);
+ ndbrequire(noOfKeyAttr == desc->noOfKeyAttr);
ndbrequire(tabptr.p->enabled == false);
tabptr.p->enabled = true;
tabptr.p->dropping = false;
- tabptr.p->noOfKeyAttr = noOfKeyAttr;
- tabptr.p->hasCharAttr = hasCharAttr;
- tabptr.p->noOfDistrKeys = noOfDistrKeys;
+ tabptr.p->noOfKeyAttr = desc->noOfKeyAttr;
+ tabptr.p->hasCharAttr = desc->hasCharAttr;
+ tabptr.p->noOfDistrKeys = desc->noOfDistrKeys;
signal->theData[0] = tabptr.i;
signal->theData[1] = retPtr;
@@ -2323,113 +2298,37 @@ Dbtc::handle_special_hash(Uint32 dstHash[4], Uint32* src, Uint32 srcLen,
Uint32 tabPtrI,
bool distr)
{
- Uint64 Tmp[MAX_KEY_SIZE_IN_WORDS * 4 * MAX_XFRM_MULTIPLY];
- const Uint32 dstSize = sizeof(Tmp) / 4;
+ Uint64 Tmp[MAX_KEY_SIZE_IN_WORDS * MAX_XFRM_MULTIPLY];
const TableRecord* tabPtrP = &tableRecord[tabPtrI];
- const Uint32 noOfKeyAttr = tabPtrP->noOfKeyAttr;
- Uint32 noOfDistrKeys = tabPtrP->noOfDistrKeys;
const bool hasCharAttr = tabPtrP->hasCharAttr;
+ const bool hasDistKeys = tabPtrP->noOfDistrKeys > 0;
Uint32 *dst = (Uint32*)Tmp;
Uint32 dstPos = 0;
- Uint32 srcPos = 0;
Uint32 keyPartLen[MAX_ATTRIBUTES_IN_INDEX];
- if(hasCharAttr){
- Uint32 i = 0;
- while (i < noOfKeyAttr) {
- const TableRecord::KeyAttr& keyAttr = tabPtrP->keyAttr[i];
-
- Uint32 srcBytes =
- AttributeDescriptor::getSizeInBytes(keyAttr.attributeDescriptor);
- Uint32 srcWords = (srcBytes + 3) / 4;
- Uint32 dstWords = ~0;
- uchar* dstPtr = (uchar*)&dst[dstPos];
- const uchar* srcPtr = (const uchar*)&src[srcPos];
- CHARSET_INFO* cs = keyAttr.charsetInfo;
-
- if (cs == NULL) {
- jam();
- memcpy(dstPtr, srcPtr, srcWords << 2);
- dstWords = srcWords;
- } else {
- jam();
- Uint32 typeId =
- AttributeDescriptor::getType(keyAttr.attributeDescriptor);
- Uint32 lb, len;
- bool ok = NdbSqlUtil::get_var_length(typeId, srcPtr, srcBytes, lb, len);
- ndbrequire(ok);
- Uint32 xmul = cs->strxfrm_multiply;
- if (xmul == 0)
- xmul = 1;
- /*
- * Varchar is really Char. End spaces do not matter. To get
- * same hash we blank-pad to maximum length via strnxfrm.
- * TODO use MySQL charset-aware hash function instead
- */
- Uint32 dstLen = xmul * (srcBytes - lb);
- ndbrequire(dstLen <= ((dstSize - dstPos) << 2));
- int n = NdbSqlUtil::strnxfrm_bug7284(cs, dstPtr, dstLen, srcPtr + lb, len);
- ndbrequire(n != -1);
- while ((n & 3) != 0) {
- dstPtr[n++] = 0;
- }
- dstWords = (n >> 2);
- }
- dstPos += dstWords;
- srcPos += srcWords;
- keyPartLen[i++] = dstWords;
- }
+ Uint32 * keyPartLenPtr;
+ if(hasCharAttr)
+ {
+ keyPartLenPtr = keyPartLen;
+ dstPos = xfrm_key(tabPtrI, src, dst, sizeof(Tmp) >> 2, keyPartLenPtr);
+ ndbrequire(dstPos);
}
else
{
dst = src;
dstPos = srcLen;
+ keyPartLenPtr = 0;
}
md5_hash(dstHash, (Uint64*)dst, dstPos);
- if(distr && noOfDistrKeys)
+ if(distr && hasDistKeys)
{
jam();
- src = dst;
- dstPos = 0;
- Uint32 i = 0;
- if(hasCharAttr)
- {
- while (i < noOfKeyAttr && noOfDistrKeys)
- {
- const TableRecord::KeyAttr& keyAttr = tabPtrP->keyAttr[i];
- Uint32 len = keyPartLen[i];
- if(AttributeDescriptor::getDKey(keyAttr.attributeDescriptor))
- {
- noOfDistrKeys--;
- memmove(dst+dstPos, src, len << 2);
- dstPos += len;
- }
- src += len;
- i++;
- }
- }
- else
- {
- while (i < noOfKeyAttr && noOfDistrKeys)
- {
- const TableRecord::KeyAttr& keyAttr = tabPtrP->keyAttr[i];
- Uint32 len =
- AttributeDescriptor::getSizeInBytes(keyAttr.attributeDescriptor);
- len = (len + 3) / 4;
- if(AttributeDescriptor::getDKey(keyAttr.attributeDescriptor))
- {
- noOfDistrKeys--;
- memmove(dst+dstPos, src, len << 2);
- dstPos += len;
- }
- src += len;
- i++;
- }
- }
+
Uint32 tmp[4];
- md5_hash(tmp, (Uint64*)dst, dstPos);
+ Uint32 len = create_distr_key(tabPtrI, dst, keyPartLenPtr);
+ md5_hash(tmp, (Uint64*)dst, len);
dstHash[1] = tmp[1];
}
return true; // success
@@ -3347,7 +3246,7 @@ void Dbtc::sendlqhkeyreq(Signal* signal,
lqhKeyReq->tcBlockref = sig4;
lqhKeyReq->savePointId = sig5;
- sig0 = regCachePtr->tableref + (regCachePtr->schemaVersion << 16);
+ sig0 = regCachePtr->tableref + ((regCachePtr->schemaVersion << 16) & 0xFFFF0000);
sig1 = regCachePtr->fragmentid + (regTcPtr->tcNodedata[1] << 16);
sig2 = regApiPtr->transid[0];
sig3 = regApiPtr->transid[1];
@@ -10204,10 +10103,6 @@ void Dbtc::initTable(Signal* signal)
tabptr.p->noOfKeyAttr = 0;
tabptr.p->hasCharAttr = 0;
tabptr.p->noOfDistrKeys = 0;
- for (unsigned k = 0; k < MAX_ATTRIBUTES_IN_INDEX; k++) {
- tabptr.p->keyAttr[k].attributeDescriptor = 0;
- tabptr.p->keyAttr[k].charsetInfo = 0;
- }
}//for
}//Dbtc::initTable()
@@ -13137,7 +13032,7 @@ Dbtc::TableRecord::getErrorCode(Uint32 schemaVersion) const {
return ZNO_SUCH_TABLE;
if(dropping)
return ZDROP_TABLE_IN_PROGRESS;
- if(schemaVersion != currentSchemaVersion)
+ if(table_version_major(schemaVersion) != table_version_major(currentSchemaVersion))
return ZWRONG_SCHEMA_VERSION_ERROR;
ErrorReporter::handleAssert("Dbtc::TableRecord::getErrorCode",
__FILE__, __LINE__);
diff --git a/storage/ndb/src/kernel/blocks/grep/Grep.cpp b/storage/ndb/src/kernel/blocks/grep/Grep.cpp
deleted file mode 100644
index 0527c5415ab..00000000000
--- a/storage/ndb/src/kernel/blocks/grep/Grep.cpp
+++ /dev/null
@@ -1,2010 +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 "Grep.hpp"
-#include <ndb_version.h>
-
-#include <NdbTCP.h>
-#include <Bitmask.hpp>
-
-#include <signaldata/NodeFailRep.hpp>
-#include <signaldata/ReadNodesConf.hpp>
-#include <signaldata/CheckNodeGroups.hpp>
-#include <signaldata/GrepImpl.hpp>
-#include <signaldata/RepImpl.hpp>
-#include <signaldata/EventReport.hpp>
-#include <signaldata/DictTabInfo.hpp>
-#include <signaldata/GetTabInfo.hpp>
-#include <signaldata/WaitGCP.hpp>
-#include <GrepEvent.hpp>
-#include <AttributeHeader.hpp>
-
-#define CONTINUEB_DELAY 500
-#define SSREPBLOCKNO 2
-#define PSREPBLOCKNO 2
-
-//#define DEBUG_GREP
-//#define DEBUG_GREP_SUBSCRIPTION
-//#define DEBUG_GREP_TRANSFER
-//#define DEBUG_GREP_APPLY
-//#define DEBUG_GREP_DELETE
-
-/**************************************************************************
- * ------------------------------------------------------------------------
- * MODULE: STARTUP of GREP Block, etc
- * ------------------------------------------------------------------------
- **************************************************************************/
-static Uint32 g_TypeOfStart = NodeState::ST_ILLEGAL_TYPE;
-void
-Grep::getNodeGroupMembers(Signal* signal) {
- jam();
- /**
- * Ask DIH for nodeGroupMembers
- */
- CheckNodeGroups * sd = (CheckNodeGroups*)signal->getDataPtrSend();
- sd->blockRef = reference();
- sd->requestType =
- CheckNodeGroups::Direct |
- CheckNodeGroups::GetNodeGroupMembers;
- sd->nodeId = getOwnNodeId();
- EXECUTE_DIRECT(DBDIH, GSN_CHECKNODEGROUPSREQ, signal,
- CheckNodeGroups::SignalLength);
- jamEntry();
-
- c_nodeGroup = sd->output;
- c_noNodesInGroup = 0;
- for (int i = 0; i < MAX_NDB_NODES; i++) {
- if (sd->mask.get(i)) {
- if (i == getOwnNodeId()) c_idInNodeGroup = c_noNodesInGroup;
- c_nodesInGroup[c_noNodesInGroup] = i;
- c_noNodesInGroup++;
- }
- }
- ndbrequire(c_noNodesInGroup > 0); // at least 1 node in the nodegroup
-
-#ifdef NODEFAIL_DEBUG
- for (Uint32 i = 0; i < c_noNodesInGroup; i++) {
- ndbout_c ("Grep: NodeGroup %u, me %u, me in group %u, member[%u] %u",
- c_nodeGroup, getOwnNodeId(), c_idInNodeGroup,
- i, c_nodesInGroup[i]);
- }
-#endif
-}
-
-
-void
-Grep::execSTTOR(Signal* signal)
-{
- jamEntry();
- const Uint32 startphase = signal->theData[1];
- const Uint32 typeOfStart = signal->theData[7];
- if (startphase == 3)
- {
- jam();
- signal->theData[0] = reference();
- g_TypeOfStart = typeOfStart;
- sendSignal(NDBCNTR_REF, GSN_READ_NODESREQ, signal, 1, JBB);
- return;
- }
- if(startphase == 5) {
- jam();
- /**
- * we don't want any log/meta records comming to use
- * until we are done with the recovery.
- */
- if (g_TypeOfStart == NodeState::ST_NODE_RESTART) {
- jam();
- pspart.m_recoveryMode = true;
- getNodeGroupMembers(signal);
- for (Uint32 i = 0; i < c_noNodesInGroup; i++) {
- Uint32 ref =numberToRef(GREP, c_nodesInGroup[i]);
- if (ref != reference())
- sendSignal(ref, GSN_GREP_START_ME, signal,
- 1 /*SumaStartMe::SignalLength*/, JBB);
- }
- } else pspart.m_recoveryMode = false;
-
- }
-
- if(startphase == 7) {
- jam();
- if (g_TypeOfStart == NodeState::ST_NODE_RESTART) {
- pspart.m_recoveryMode = false;
- }
- }
-
- sendSTTORRY(signal);
-}
-
-
-void
-Grep::PSPart::execSTART_ME(Signal* signal)
-{
- jamEntry();
- GrepStartMe * me =(GrepStartMe*)signal->getDataPtr();
- BlockReference ref = me->senderRef;
- GrepAddSubReq* const addReq = (GrepAddSubReq *)signal->getDataPtr();
-
-
- SubscriptionPtr subPtr;
- c_subscriptions.first(c_subPtr);
- for(; !c_subPtr.isNull(); c_subscriptions.next(c_subPtr)) {
- jam();
- subPtr.i = c_subPtr.curr.i;
- subPtr.p = c_subscriptions.getPtr(subPtr.i);
- addReq->subscriptionId = subPtr.p->m_subscriptionId;
- addReq->subscriptionKey = subPtr.p->m_subscriptionKey;
- addReq->subscriberData = subPtr.p->m_subscriberData;
- addReq->subscriptionType = subPtr.p->m_subscriptionType;
- addReq->senderRef = subPtr.p->m_coordinatorRef;
- addReq->subscriberRef =subPtr.p->m_subscriberRef;
-
- sendSignal(ref,
- GSN_GREP_ADD_SUB_REQ,
- signal,
- GrepAddSubReq::SignalLength,
- JBB);
- }
-
- addReq->subscriptionId = 0;
- addReq->subscriptionKey = 0;
- addReq->subscriberData = 0;
- addReq->subscriptionType = 0;
- addReq->senderRef = 0;
- addReq->subscriberRef = 0;
-
- sendSignal(ref,
- GSN_GREP_ADD_SUB_REQ,
- signal,
- GrepAddSubReq::SignalLength,
- JBB);
-}
-
-void
-Grep::PSPart::execGREP_ADD_SUB_REQ(Signal* signal)
-{
- jamEntry();
- GrepAddSubReq * const grepReq = (GrepAddSubReq *)signal->getDataPtr();
- const Uint32 subId = grepReq->subscriptionId;
- const Uint32 subKey = grepReq->subscriptionKey;
- const Uint32 subData = grepReq->subscriberData;
- const Uint32 subType = grepReq->subscriptionType;
- const Uint32 coordinatorRef = grepReq->senderRef;
-
- /**
- * this is ref to the REP node for this subscription.
- */
- const Uint32 subRef = grepReq->subscriberRef;
-
- if(subId!=0 && subKey!=0) {
- jam();
- SubscriptionPtr subPtr;
- ndbrequire( c_subscriptionPool.seize(subPtr));
- subPtr.p->m_coordinatorRef = coordinatorRef;
- subPtr.p->m_subscriptionId = subId;
- subPtr.p->m_subscriptionKey = subKey;
- subPtr.p->m_subscriberRef = subRef;
- subPtr.p->m_subscriberData = subData;
- subPtr.p->m_subscriptionType = subType;
-
- c_subscriptions.add(subPtr);
- }
- else {
- jam();
- GrepAddSubConf * conf = (GrepAddSubConf *)grepReq;
- conf->noOfSub =
- c_subscriptionPool.getSize()-c_subscriptionPool.getNoOfFree();
- sendSignal(signal->getSendersBlockRef(),
- GSN_GREP_ADD_SUB_CONF,
- signal,
- GrepAddSubConf::SignalLength,
- JBB);
- }
-}
-
-void
-Grep::PSPart::execGREP_ADD_SUB_REF(Signal* signal)
-{
- /**
- * @todo fix error stuff
- */
-}
-
-void
-Grep::PSPart::execGREP_ADD_SUB_CONF(Signal* signal)
-{
- jamEntry();
- GrepAddSubConf* const conf = (GrepAddSubConf *)signal->getDataPtr();
- Uint32 noOfSubscriptions = conf->noOfSub;
- Uint32 noOfRestoredSubscriptions =
- c_subscriptionPool.getSize()-c_subscriptionPool.getNoOfFree();
- if(noOfSubscriptions!=noOfRestoredSubscriptions) {
- jam();
- /**
- *@todo send ref signal
- */
- ndbrequire(false);
- }
-}
-
-void
-Grep::execREAD_NODESCONF(Signal* signal)
-{
- jamEntry();
- ReadNodesConf * conf = (ReadNodesConf *)signal->getDataPtr();
-
-#if 0
- ndbout_c("Grep: Recd READ_NODESCONF");
-#endif
-
- /******************************
- * Check which REP nodes exist
- ******************************/
- Uint32 i;
- for (i = 1; i < MAX_NODES; i++)
- {
- jam();
-#if 0
- ndbout_c("Grep: Found node %d of type %d", i, getNodeInfo(i).getType());
-#endif
- if (getNodeInfo(i).getType() == NodeInfo::REP)
- {
- jam();
- /**
- * @todo This should work for more than ONE rep node!
- */
- pscoord.m_repRef = numberToRef(PSREPBLOCKNO, i);
- pspart.m_repRef = numberToRef(PSREPBLOCKNO, i);
-#if 0
- ndbout_c("Grep: REP node %d detected", i);
-#endif
- }
- }
-
- /*****************************
- * Check which DB nodes exist
- *****************************/
- m_aliveNodes.clear();
-
- Uint32 count = 0;
- for(i = 0; i<MAX_NDB_NODES; i++)
- {
- if (NodeBitmask::get(conf->allNodes, i))
- {
- jam();
- count++;
-
- NodePtr node;
- ndbrequire(m_nodes.seize(node));
-
- node.p->nodeId = i;
- if (NodeBitmask::get(conf->inactiveNodes, i))
- {
- node.p->alive = 0;
- }
- else
- {
- node.p->alive = 1;
- m_aliveNodes.set(i);
- }
- }
- }
- m_masterNodeId = conf->masterNodeId;
- ndbrequire(count == conf->noOfNodes);
- sendSTTORRY(signal);
-}
-
-void
-Grep::sendSTTORRY(Signal* signal)
-{
- signal->theData[0] = 0;
- signal->theData[3] = 1;
- signal->theData[4] = 3;
- signal->theData[5] = 5;
- signal->theData[6] = 7;
- signal->theData[7] = 255; // No more start phases from missra
- sendSignal(NDBCNTR_REF, GSN_STTORRY, signal, 8, JBB);
-}
-
-void
-Grep::execNDB_STTOR(Signal* signal)
-{
- jamEntry();
-}
-
-void
-Grep::execDUMP_STATE_ORD(Signal* signal)
-{
- jamEntry();
- //Uint32 tCase = signal->theData[0];
-
-#if 0
- if(sscoord.m_repRef == 0)
- {
- ndbout << "Grep: Recd DUMP signal but has no connection with REP node"
- << endl;
- return;
- }
-#endif
-
- /*
- switch (tCase)
- {
- case 8100: sscoord.grepReq(signal, GrepReq::START_SUBSCR); break;
- case 8102: sscoord.grepReq(signal, GrepReq::START_METALOG); break;
- case 8104: sscoord.grepReq(signal, GrepReq::START_METASCAN); break;
- case 8106: sscoord.grepReq(signal, GrepReq::START_DATALOG); break;
- case 8108: sscoord.grepReq(signal, GrepReq::START_DATASCAN); break;
- case 8110: sscoord.grepReq(signal, GrepReq::STOP_SUBSCR); break;
- case 8500: sscoord.grepReq(signal, GrepReq::REMOVE_BUFFERS); break;
- case 8300: sscoord.grepReq(signal, GrepReq::SLOWSTOP); break;
- case 8400: sscoord.grepReq(signal, GrepReq::FASTSTOP); break;
- case 8600: sscoord.grepReq(signal, GrepReq::CREATE_SUBSCR); break;
- case 8700: sscoord.dropTable(signal,(Uint32)signal->theData[1]);break;
- default: break;
- }
- */
-}
-
-/**
- * Signal received when REP node has failed
- */
-void
-Grep::execAPI_FAILREQ(Signal* signal)
-{
- jamEntry();
- //Uint32 failedApiNode = signal->theData[0];
- //BlockReference retRef = signal->theData[1];
-
- /**
- * @todo We should probably do something smart if the
- * PS REP node fails???? /Lars
- */
-
-#if 0
- ndbout_c("Grep: API_FAILREQ received for API node %d.", failedApiNode);
-#endif
-
- /**
- * @note This signal received is NOT allowed to send any CONF
- * signal, since this would screw up TC/DICT to API
- * "connections".
- */
-}
-
-/**************************************************************************
- * ------------------------------------------------------------------------
- * MODULE: GREP Control
- * ------------------------------------------------------------------------
- **************************************************************************/
-void
-Grep::execGREP_REQ(Signal* signal)
-{
- jamEntry();
-
- //GrepReq * req = (GrepReq *)signal->getDataPtr();
-
- /**
- * @todo Fix so that request is redirected to REP Server
- * Obsolete?
- * Was: sscoord.grepReq(signal, req->request);
- */
- ndbout_c("Warning! REP commands can only be executed at REP SERVER prompt!");
-}
-
-
-/**************************************************************************
- * ------------------------------------------------------------------------
- * MODULE: NODE STATE HANDLING
- * ------------------------------------------------------------------------
- **************************************************************************/
-void
-Grep::execNODE_FAILREP(Signal* signal)
-{
- jamEntry();
- NodeFailRep * rep = (NodeFailRep*)signal->getDataPtr();
- bool changed = false;
-
- NodePtr nodePtr;
- for(m_nodes.first(nodePtr); nodePtr.i != RNIL; m_nodes.next(nodePtr))
- {
- jam();
- if (NodeBitmask::get(rep->theNodes, nodePtr.p->nodeId))
- {
- jam();
-
- if (nodePtr.p->alive)
- {
- jam();
- ndbassert(m_aliveNodes.get(nodePtr.p->nodeId));
- changed = true;
- }
- else
- {
- ndbassert(!m_aliveNodes.get(nodePtr.p->nodeId));
- }
-
- nodePtr.p->alive = 0;
- m_aliveNodes.clear(nodePtr.p->nodeId);
- }
- }
-
-
- /**
- * Problem: Fix a node failure running a protocol
- *
- * 1. Coordinator node of a protocol dies
- * - Elect a new coordinator
- * - send ref to user
- *
- * 2. Non-coordinator dies.
- * - make coordinator aware of this
- * so that coordinator does not wait for
- * conf from faulty node
- * - node recovery will restore the non-coordinator.
- *
- */
-}
-
-void
-Grep::execINCL_NODEREQ(Signal* signal)
-{
- jamEntry();
-
- //const Uint32 senderRef = signal->theData[0];
- const Uint32 inclNode = signal->theData[1];
-
- NodePtr node;
- for(m_nodes.first(node); node.i != RNIL; m_nodes.next(node))
- {
- jam();
- const Uint32 nodeId = node.p->nodeId;
- if (inclNode == nodeId) {
- jam();
-
- ndbrequire(node.p->alive == 0);
- ndbassert(!m_aliveNodes.get(nodeId));
-
- node.p->alive = 1;
- m_aliveNodes.set(nodeId);
-
- break;
- }
- }
-
- /**
- * @todo: if we include this DIH's got to be prepared, later if needed...
- */
-#if 0
- signal->theData[0] = reference();
-
- sendSignal(senderRef, GSN_INCL_NODECONF, signal, 1, JBB);
-#endif
-}
-
-
-/**
- * Helper methods
- */
-void
-Grep::PSCoord::prepareOperationRec(SubCoordinatorPtr subPtr,
- BlockReference subscriber,
- Uint32 subId,
- Uint32 subKey,
- Uint32 request)
-{
- subPtr.p->m_coordinatorRef = reference();
- subPtr.p->m_subscriberRef = subscriber;
- subPtr.p->m_subscriberData = subPtr.i;
- subPtr.p->m_subscriptionId = subId;
- subPtr.p->m_subscriptionKey = subKey;
- subPtr.p->m_outstandingRequest = request;
-}
-
-
-/**************************************************************************
- * ------------------------------------------------------------------------
- * MODULE: CREATE SUBSCRIPTION ID
- * ------------------------------------------------------------------------
- *
- * Requests SUMA to create a unique subscription id
- **************************************************************************/
-
-void
-Grep::PSCoord::execGREP_CREATE_SUBID_REQ(Signal* signal)
-{
- jamEntry();
-
- CreateSubscriptionIdReq * req =
- (CreateSubscriptionIdReq*)signal->getDataPtr();
- BlockReference ref = signal->getSendersBlockRef();
-
- SubCoordinatorPtr subPtr;
- if( !c_subCoordinatorPool.seize(subPtr)) {
- jam();
- SubCoordinator sub;
- sub.m_subscriberRef = ref;
- sub.m_subscriptionId = 0;
- sub.m_subscriptionKey = 0;
- sendRefToSS(signal, sub, GrepError::SUBSCRIPTION_ID_NOMEM );
- return;
- }
- prepareOperationRec(subPtr,
- ref,
- 0,0,
- GSN_CREATE_SUBID_REQ);
-
-
- ndbout_c("SUBID_REQ Ref %d",ref);
- req->senderData=subPtr.p->m_subscriberData;
-
- sendSignal(SUMA_REF, GSN_CREATE_SUBID_REQ, signal,
- SubCreateReq::SignalLength, JBB);
-
-#if 1 //def DEBUG_GREP_SUBSCRIPTION
- ndbout_c("Grep::PSCoord: Sent CREATE_SUBID_REQ to SUMA");
-#endif
-}
-
-void
-Grep::PSCoord::execCREATE_SUBID_CONF(Signal* signal)
-{
- jamEntry();
- CreateSubscriptionIdConf const * conf =
- (CreateSubscriptionIdConf *)signal->getDataPtr();
- Uint32 subId = conf->subscriptionId;
- Uint32 subKey = conf->subscriptionKey;
- Uint32 subData = conf->subscriberData;
-
-#if 1 //def DEBUG_GREP_SUBSCRIPTION
- ndbout_c("Grep::PSCoord: Recd GREP_SUBID_CONF (subId:%d, subKey:%d)",
- subId, subKey);
-#endif
-
- SubCoordinatorPtr subPtr;
- c_subCoordinatorPool.getPtr(subPtr, subData);
- BlockReference repRef = subPtr.p->m_subscriberRef;
-
- { // Check that id/key is unique
- SubCoordinator key;
- SubCoordinatorPtr tmp;
- key.m_subscriptionId = subId;
- key.m_subscriptionKey = subKey;
- if(c_runningSubscriptions.find(tmp, key)){
- jam();
- SubCoordinator sub;
- sub.m_subscriberRef=repRef;
- sub.m_subscriptionId = subId;
- sub.m_subscriptionKey = subKey;
- sendRefToSS(signal,sub, GrepError::SUBSCRIPTION_ID_NOT_UNIQUE );
- return;
- }
- }
-
- sendSignal(subPtr.p->m_subscriberRef, GSN_GREP_CREATE_SUBID_CONF, signal,
- CreateSubscriptionIdConf::SignalLength, JBB);
- c_subCoordinatorPool.release(subData);
-
- m_grep->sendEventRep(signal,
- NDB_LE_GrepSubscriptionInfo,
- GrepEvent::GrepPS_CreateSubIdConf,
- subId,
- subKey,
- (Uint32)GrepError::GE_NO_ERROR);
-}
-
-void
-Grep::PSCoord::execCREATE_SUBID_REF(Signal* signal) {
- jamEntry();
- CreateSubscriptionIdRef const * ref =
- (CreateSubscriptionIdRef *)signal->getDataPtr();
- Uint32 subData = ref->subscriberData;
- GrepError::GE_Code err;
-
- Uint32 sendersBlockRef = signal->getSendersBlockRef();
- if(sendersBlockRef == SUMA_REF)
- {
- jam();
- err = GrepError::SUBSCRIPTION_ID_SUMA_FAILED_CREATE;
- } else {
- jam();
- ndbrequire(false); /* Added since errorcode err unhandled
- * TODO: fix correct errorcode
- */
- err= GrepError::GE_NO_ERROR; // remove compiler warning
- }
-
- SubCoordinatorPtr subPtr;
- c_runningSubscriptions.getPtr(subPtr, subData);
- BlockReference repref = subPtr.p->m_subscriberRef;
-
- SubCoordinator sub;
- sub.m_subscriberRef = repref;
- sub.m_subscriptionId = 0;
- sub.m_subscriptionKey = 0;
- sendRefToSS(signal,sub, err);
-
-}
-
-
-/**************************************************************************
- * ------------------------------------------------------------------------
- * MODULE: CREATE SUBSCRIPTION
- * ------------------------------------------------------------------------
- *
- * Creates a subscription for every GREP to its local SUMA.
- * GREP node that executes createSubscription becomes the GREP Coord.
- **************************************************************************/
-
-/**
- * Request to create a subscription (sent from SS)
- */
-void
-Grep::PSCoord::execGREP_SUB_CREATE_REQ(Signal* signal)
-{
- jamEntry();
- GrepSubCreateReq const * grepReq = (GrepSubCreateReq *)signal->getDataPtr();
- Uint32 subId = grepReq->subscriptionId;
- Uint32 subKey = grepReq->subscriptionKey;
- Uint32 subType = grepReq->subscriptionType;
- BlockReference rep = signal->getSendersBlockRef();
-
- GrepCreateReq * req =(GrepCreateReq*)grepReq;
-
- SubCoordinatorPtr subPtr;
-
- if( !c_subCoordinatorPool.seize(subPtr)) {
- jam();
- SubCoordinator sub;
- sub.m_subscriberRef = rep;
- sub.m_subscriptionId = 0;
- sub.m_subscriptionKey = 0;
- sub.m_outstandingRequest = GSN_GREP_CREATE_REQ;
- sendRefToSS(signal, sub, GrepError::NOSPACE_IN_POOL);
- return;
- }
- prepareOperationRec(subPtr,
- numberToRef(PSREPBLOCKNO, refToNode(rep)), subId, subKey,
- GSN_GREP_CREATE_REQ);
-
- /* Get the payload of the signal.
- */
- SegmentedSectionPtr selectedTablesPtr;
- if(subType == SubCreateReq::SelectiveTableSnapshot) {
- jam();
- ndbrequire(signal->getNoOfSections()==1);
- signal->getSection(selectedTablesPtr,0);
- signal->header.m_noOfSections = 0;
- }
- /**
- * Prepare the signal to be sent to Grep participatns
- */
- subPtr.p->m_subscriptionType = subType;
- req->senderRef = reference();
- req->subscriberRef = numberToRef(PSREPBLOCKNO, refToNode(rep));
- req->subscriberData = subPtr.p->m_subscriberData;
- req->subscriptionId = subId;
- req->subscriptionKey = subKey;
- req->subscriptionType = subType;
-
- /*add payload if it is a selectivetablesnap*/
- if(subType == SubCreateReq::SelectiveTableSnapshot) {
- jam();
- signal->setSection(selectedTablesPtr, 0);
- }
-
- /******************************
- * Send to all PS participants
- ******************************/
- NodeReceiverGroup rg(GREP, m_grep->m_aliveNodes);
- subPtr.p->m_outstandingParticipants = rg;
- sendSignal(rg,
- GSN_GREP_CREATE_REQ, signal,
- GrepCreateReq::SignalLength, JBB);
-
-
-#ifdef DEBUG_GREP_SUBSCRIPTION
- ndbout_c("Grep::PSCoord: Sent GREP_CREATE_REQ "
- "(subId:%d, subKey:%d, subData:%d, subType:%d) to parts",
- subId, subKey, subPtr.p->m_subscriberData, subType);
-#endif
-}
-
-void
-Grep::PSPart::execGREP_CREATE_REQ(Signal* signal)
-{
- jamEntry();
- GrepCreateReq * const grepReq = (GrepCreateReq *)signal->getDataPtr();
- const Uint32 subId = grepReq->subscriptionId;
- const Uint32 subKey = grepReq->subscriptionKey;
- const Uint32 subData = grepReq->subscriberData;
- const Uint32 subType = grepReq->subscriptionType;
- const Uint32 coordinatorRef = grepReq->senderRef;
- const Uint32 subRef = grepReq->subscriberRef; //this is ref to the
- //REP node for this
- //subscription.
-
- SubscriptionPtr subPtr;
- ndbrequire( c_subscriptionPool.seize(subPtr));
- subPtr.p->m_coordinatorRef = coordinatorRef;
- subPtr.p->m_subscriptionId = subId;
- subPtr.p->m_subscriptionKey = subKey;
- subPtr.p->m_subscriberRef = subRef;
- subPtr.p->m_subscriberData = subPtr.i;
- subPtr.p->m_subscriptionType = subType;
- subPtr.p->m_outstandingRequest = GSN_GREP_CREATE_REQ;
- subPtr.p->m_operationPtrI = subData;
-
- c_subscriptions.add(subPtr);
-
- SegmentedSectionPtr selectedTablesPtr;
- if(subType == SubCreateReq::SelectiveTableSnapshot) {
- jam();
- ndbrequire(signal->getNoOfSections()==1);
- signal->getSection(selectedTablesPtr,0);// SubCreateReq::TABLE_LIST);
- signal->header.m_noOfSections = 0;
- }
-
- /**
- * Prepare signal to be sent to SUMA
- */
- SubCreateReq * sumaReq = (SubCreateReq *)grepReq;
- sumaReq->subscriberRef = GREP_REF;
- sumaReq->subscriberData = subPtr.p->m_subscriberData;
- sumaReq->subscriptionId = subPtr.p->m_subscriptionId;
- sumaReq->subscriptionKey = subPtr.p->m_subscriptionKey;
- sumaReq->subscriptionType = subPtr.p->m_subscriptionType;
- /*add payload if it is a selectivetablesnap*/
- if(subType == SubCreateReq::SelectiveTableSnapshot) {
- jam();
- signal->setSection(selectedTablesPtr, 0);
- }
- sendSignal(SUMA_REF,
- GSN_SUB_CREATE_REQ,
- signal,
- SubCreateReq::SignalLength,
- JBB);
-}
-
-void
-Grep::PSPart::execSUB_CREATE_CONF(Signal* signal)
-{
- jamEntry();
-
- SubCreateConf * const conf = (SubCreateConf *)signal->getDataPtr();
- Uint32 subData = conf->subscriberData;
-
- SubscriptionPtr subPtr;
- c_subscriptions.getPtr(subPtr, subData);
- /**
- @todo check why this can fuck up -johan
-
- ndbrequire(subPtr.p->m_subscriptionId == conf->subscriptionId);
- ndbrequire(subPtr.p->m_subscriptionKey == conf->subscriptionKey);
- */
-#ifdef DEBUG_GREP_SUBSCRIPTION
- ndbout_c("Grep::PSPart: Recd SUB_CREATE_CONF "
- "(subId:%d, subKey:%d) from SUMA",
- conf->subscriptionId, conf->subscriptionKey);
-#endif
-
- /*********************
- * Send conf to coord
- *********************/
- GrepCreateConf * grepConf = (GrepCreateConf*)conf;
- grepConf->senderNodeId = getOwnNodeId();
- grepConf->senderData = subPtr.p->m_operationPtrI;
- sendSignal(subPtr.p->m_coordinatorRef, GSN_GREP_CREATE_CONF, signal,
- GrepCreateConf::SignalLength, JBB);
- subPtr.p->m_outstandingRequest = 0;
-}
-
-/**
- * Handle errors that either occured in:
- * 1) PSPart
- * or
- * 2) propagated from local SUMA
- */
-void
-Grep::PSPart::execSUB_CREATE_REF(Signal* signal)
-{
- jamEntry();
- SubCreateRef * const ref = (SubCreateRef *)signal->getDataPtr();
- Uint32 subData = ref->subscriberData;
- GrepError::GE_Code err = (GrepError::GE_Code)ref->err;
- SubscriptionPtr subPtr;
- c_subscriptions.getPtr(subPtr, subData);
- sendRefToPSCoord(signal, *subPtr.p, err /*error*/);
- subPtr.p->m_outstandingRequest = 0;
-}
-
-void
-Grep::PSCoord::execGREP_CREATE_CONF(Signal* signal)
-{
- jamEntry();
- GrepCreateConf const * conf = (GrepCreateConf *)signal->getDataPtr();
- Uint32 subData = conf->senderData;
- Uint32 nodeId = conf->senderNodeId;
-
- SubCoordinatorPtr subPtr;
- c_subCoordinatorPool.getPtr(subPtr, subData);
-
- ndbrequire(subPtr.p->m_outstandingRequest == GSN_GREP_CREATE_REQ);
-
- subPtr.p->m_outstandingParticipants.clearWaitingFor(nodeId);
-
- if(!subPtr.p->m_outstandingParticipants.done()) return;
- /********************************
- * All participants have CONF:ed
- ********************************/
- Uint32 subId = subPtr.p->m_subscriptionId;
- Uint32 subKey = subPtr.p->m_subscriptionKey;
-
- GrepSubCreateConf * grepConf = (GrepSubCreateConf *)signal->getDataPtr();
- grepConf->subscriptionId = subId;
- grepConf->subscriptionKey = subKey;
- sendSignal(subPtr.p->m_subscriberRef, GSN_GREP_SUB_CREATE_CONF, signal,
- GrepSubCreateConf::SignalLength, JBB);
-
- /**
- * Send event report
- */
- m_grep->sendEventRep(signal,
- NDB_LE_GrepSubscriptionInfo,
- GrepEvent::GrepPS_SubCreateConf,
- subId,
- subKey,
- (Uint32)GrepError::GE_NO_ERROR);
-
- c_subCoordinatorPool.release(subPtr);
-
-}
-
-/**
- * Handle errors that either occured in:
- * 1) PSCoord
- * or
- * 2) propagated from PSPart
- */
-void
-Grep::PSCoord::execGREP_CREATE_REF(Signal* signal)
-{
- jamEntry();
- GrepCreateRef * const ref = (GrepCreateRef *)signal->getDataPtr();
- Uint32 subData = ref->senderData;
- Uint32 err = ref->err;
- SubCoordinatorPtr subPtr;
- c_runningSubscriptions.getPtr(subPtr, subData);
-
- sendRefToSS(signal, *subPtr.p, (GrepError::GE_Code)err /*error*/);
-}
-
-
-/**************************************************************************
- * ------------------------------------------------------------------------
- * MODULE: START SUBSCRIPTION
- * ------------------------------------------------------------------------
- *
- * Starts a subscription at SUMA.
- * Each participant starts its own subscription.
- **************************************************************************/
-
-/**
- * Request to start subscription (Sent from SS)
- */
-void
-Grep::PSCoord::execGREP_SUB_START_REQ(Signal* signal)
-{
- jamEntry();
- GrepSubStartReq * const subReq = (GrepSubStartReq *)signal->getDataPtr();
- SubscriptionData::Part part = (SubscriptionData::Part) subReq->part;
- Uint32 subId = subReq->subscriptionId;
- Uint32 subKey = subReq->subscriptionKey;
- BlockReference rep = signal->getSendersBlockRef();
-
- SubCoordinatorPtr subPtr;
-
- if(!c_subCoordinatorPool.seize(subPtr)) {
- jam();
- SubCoordinator sub;
- sub.m_subscriberRef = rep;
- sub.m_subscriptionId = 0;
- sub.m_subscriptionKey = 0;
- sub.m_outstandingRequest = GSN_GREP_START_REQ;
- sendRefToSS(signal, sub, GrepError::NOSPACE_IN_POOL);
- return;
- }
-
- prepareOperationRec(subPtr,
- numberToRef(PSREPBLOCKNO, refToNode(rep)),
- subId, subKey,
- GSN_GREP_START_REQ);
-
- GrepStartReq * const req = (GrepStartReq *) subReq;
- req->part = (Uint32) part;
- req->subscriptionId = subPtr.p->m_subscriptionId;
- req->subscriptionKey = subPtr.p->m_subscriptionKey;
- req->senderData = subPtr.p->m_subscriberData;
-
- /***************************
- * Send to all participants
- ***************************/
- NodeReceiverGroup rg(GREP, m_grep->m_aliveNodes);
- subPtr.p->m_outstandingParticipants = rg;
- sendSignal(rg,
- GSN_GREP_START_REQ,
- signal,
- GrepStartReq::SignalLength, JBB);
-
-#ifdef DEBUG_GREP_SUBSCRIPTION
- ndbout_c("Grep::PSCoord: Sent GREP_START_REQ "
- "(subId:%d, subKey:%d, senderData:%d, part:%d) to all participants",
- req->subscriptionId, req->subscriptionKey, req->senderData, part);
-#endif
-}
-
-
-void
-Grep::PSPart::execGREP_START_REQ(Signal* signal)
-{
- jamEntry();
- GrepStartReq * const grepReq = (GrepStartReq *) signal->getDataPtr();
- SubscriptionData::Part part = (SubscriptionData::Part)grepReq->part;
- Uint32 subId = grepReq->subscriptionId;
- Uint32 subKey = grepReq->subscriptionKey;
- Uint32 operationPtrI = grepReq->senderData;
-
- Subscription key;
- key.m_subscriptionId = subId;
- key.m_subscriptionKey = subKey;
- SubscriptionPtr subPtr;
- ndbrequire(c_subscriptions.find(subPtr, key));;
- subPtr.p->m_outstandingRequest = GSN_GREP_START_REQ;
- subPtr.p->m_operationPtrI = operationPtrI;
- /**
- * send SUB_START_REQ to local SUMA
- */
- SubStartReq * sumaReq = (SubStartReq *) grepReq;
- sumaReq->subscriptionId = subId;
- sumaReq->subscriptionKey = subKey;
- sumaReq->subscriberData = subPtr.i;
- sumaReq->part = (Uint32) part;
-
- sendSignal(SUMA_REF, GSN_SUB_START_REQ, signal,
- SubStartReq::SignalLength, JBB);
-#ifdef DEBUG_GREP_SUBSCRIPTION
- ndbout_c("Grep::PSPart: Sent SUB_START_REQ (subId:%d, subKey:%d, part:%d)",
- subId, subKey, (Uint32)part);
-#endif
-}
-
-
-void
-Grep::PSPart::execSUB_START_CONF(Signal* signal)
-{
- jamEntry();
-
- SubStartConf * const conf = (SubStartConf *) signal->getDataPtr();
- SubscriptionData::Part part = (SubscriptionData::Part)conf->part;
- Uint32 subId = conf->subscriptionId;
- Uint32 subKey = conf->subscriptionKey;
- Uint32 subData = conf->subscriberData;
- Uint32 firstGCI = conf->firstGCI;
-#ifdef DEBUG_GREP_SUBSCRIPTION
- ndbout_c("Grep::PSPart: Recd SUB_START_CONF "
- "(subId:%d, subKey:%d, subData:%d)",
- subId, subKey, subData);
-#endif
-
- SubscriptionPtr subPtr;
- c_subscriptions.getPtr(subPtr, subData);
- ndbrequire(subPtr.p->m_subscriptionId == subId);
- ndbrequire(subPtr.p->m_subscriptionKey == subKey);
-
- GrepStartConf * grepConf = (GrepStartConf *)conf;
- grepConf->senderData = subPtr.p->m_operationPtrI;
- grepConf->part = (Uint32) part;
- grepConf->subscriptionKey = subKey;
- grepConf->subscriptionId = subId;
- grepConf->firstGCI = firstGCI;
- grepConf->senderNodeId = getOwnNodeId();
- sendSignal(subPtr.p->m_coordinatorRef, GSN_GREP_START_CONF, signal,
- GrepStartConf::SignalLength, JBB);
- subPtr.p->m_outstandingRequest = 0;
-
-#ifdef DEBUG_GREP_SUBSCRIPTION
- ndbout_c("Grep::PSPart: Sent GREP_START_CONF "
- "(subId:%d, subKey:%d, subData:%d, part:%d)",
- subId, subKey, subData, part);
-#endif
-}
-
-
-/**
- * Handle errors that either occured in:
- * 1) PSPart
- * or
- * 2) propagated from local SUMA
- *
- * Propagates REF signal to PSCoord
- */
-void
-Grep::PSPart::execSUB_START_REF(Signal* signal)
-{
- SubStartRef * const ref = (SubStartRef *)signal->getDataPtr();
- Uint32 subData = ref->subscriberData;
- GrepError::GE_Code err = (GrepError::GE_Code)ref->err;
- SubscriptionData::Part part = (SubscriptionData::Part)ref->part;
- SubscriptionPtr subPtr;
- c_subscriptions.getPtr(subPtr, subData);
- sendRefToPSCoord(signal, *subPtr.p, err /*error*/, part);
- subPtr.p->m_outstandingRequest = 0;
-}
-
-
-/**
- * Logging has started... (says PS Participant)
- */
-void
-Grep::PSCoord::execGREP_START_CONF(Signal* signal)
-{
- jamEntry();
-
- GrepStartConf * const conf = (GrepStartConf *) signal->getDataPtr();
- Uint32 subData = conf->senderData;
- SubscriptionData::Part part = (SubscriptionData::Part)conf->part;
- Uint32 subId = conf->subscriptionId;
- Uint32 subKey = conf->subscriptionKey;
- Uint32 firstGCI = conf->firstGCI;
-
- SubCoordinatorPtr subPtr;
- c_subCoordinatorPool.getPtr(subPtr, subData);
- ndbrequire(subPtr.p->m_outstandingRequest == GSN_GREP_START_REQ);
-
- subPtr.p->m_outstandingParticipants.clearWaitingFor(conf->senderNodeId);
-
- if(!subPtr.p->m_outstandingParticipants.done()) return;
- jam();
-
- /*************************
- * All participants ready
- *************************/
- GrepSubStartConf * grepConf = (GrepSubStartConf *) conf;
- grepConf->part = part;
- grepConf->subscriptionId = subId;
- grepConf->subscriptionKey = subKey;
- grepConf->firstGCI = firstGCI;
-
- bool ok = false;
- switch(part) {
- case SubscriptionData::MetaData:
- ok = true;
- sendSignal(subPtr.p->m_subscriberRef, GSN_GREP_SUB_START_CONF, signal,
- GrepSubStartConf::SignalLength, JBB);
-
- /**
- * Send event report
- */
- m_grep->sendEventRep(signal,
- NDB_LE_GrepSubscriptionInfo,
- GrepEvent::GrepPS_SubStartMetaConf,
- subId, subKey,
- (Uint32)GrepError::GE_NO_ERROR);
-
- c_subCoordinatorPool.release(subPtr);
- break;
- case SubscriptionData::TableData:
- ok = true;
- sendSignal(subPtr.p->m_subscriberRef, GSN_GREP_SUB_START_CONF, signal,
- GrepSubStartConf::SignalLength, JBB);
-
- /**
- * Send event report
- */
- m_grep->sendEventRep(signal,
- NDB_LE_GrepSubscriptionInfo,
- GrepEvent::GrepPS_SubStartDataConf,
- subId, subKey,
- (Uint32)GrepError::GE_NO_ERROR);
-
-
- c_subCoordinatorPool.release(subPtr);
- break;
- }
- ndbrequire(ok);
-
-#ifdef DEBUG_GREP_SUBSCRIPTION
- ndbout_c("Grep::PSCoord: Recd SUB_START_CONF (subId:%d, subKey:%d, part:%d) "
- "from all slaves",
- subId, subKey, (Uint32)part);
-#endif
-}
-
-/**
- * Handle errors that either occured in:
- * 1) PSCoord
- * or
- * 2) propagated from PSPart
- */
-void
-Grep::PSCoord::execGREP_START_REF(Signal* signal)
-{
- jamEntry();
- GrepStartRef * const ref = (GrepStartRef *)signal->getDataPtr();
- Uint32 subData = ref->senderData;
- GrepError::GE_Code err = (GrepError::GE_Code)ref->err;
- SubscriptionData::Part part = (SubscriptionData::Part)ref->part;
-
- SubCoordinatorPtr subPtr;
- c_runningSubscriptions.getPtr(subPtr, subData);
- sendRefToSS(signal, *subPtr.p, err /*error*/, part);
-}
-
-/**************************************************************************
- * ------------------------------------------------------------------------
- * MODULE: REMOVE SUBSCRIPTION
- * ------------------------------------------------------------------------
- *
- * Remove a subscription at SUMA.
- * Each participant removes its own subscription.
- * We start by deleting the subscription inside the requestor
- * since, we don't know if nodes (REP nodes or DB nodes)
- * have disconnected after we sent out this and
- * if we dont delete the sub in the requestor now,
- * we won't be able to create a new subscription
- **************************************************************************/
-
-/**
- * Request to abort subscription (Sent from SS)
- */
-void
-Grep::PSCoord::execGREP_SUB_REMOVE_REQ(Signal* signal)
-{
- jamEntry();
- GrepSubRemoveReq * const subReq = (GrepSubRemoveReq *)signal->getDataPtr();
- Uint32 subId = subReq->subscriptionId;
- Uint32 subKey = subReq->subscriptionKey;
- BlockReference rep = signal->getSendersBlockRef();
-
- SubCoordinatorPtr subPtr;
- if( !c_subCoordinatorPool.seize(subPtr)) {
- jam();
- SubCoordinator sub;
- sub.m_subscriberRef = rep;
- sub.m_subscriptionId = 0;
- sub.m_subscriptionKey = 0;
- sub.m_outstandingRequest = GSN_GREP_REMOVE_REQ;
- sendRefToSS(signal, sub, GrepError::NOSPACE_IN_POOL);
- return;
- }
-
-
- prepareOperationRec(subPtr,
- numberToRef(PSREPBLOCKNO, refToNode(rep)),
- subId, subKey,
- GSN_GREP_REMOVE_REQ);
-
- c_runningSubscriptions.add(subPtr);
-
- GrepRemoveReq * req = (GrepRemoveReq *) subReq;
- req->subscriptionId = subPtr.p->m_subscriptionId;
- req->subscriptionKey = subPtr.p->m_subscriptionKey;
- req->senderData = subPtr.p->m_subscriberData;
- req->senderRef = subPtr.p->m_coordinatorRef;
-
- /***************************
- * Send to all participants
- ***************************/
- NodeReceiverGroup rg(GREP, m_grep->m_aliveNodes);
- subPtr.p->m_outstandingParticipants = rg;
- sendSignal(rg,
- GSN_GREP_REMOVE_REQ, signal,
- GrepRemoveReq::SignalLength, JBB);
-}
-
-
-void
-Grep::PSPart::execGREP_REMOVE_REQ(Signal* signal)
-{
- jamEntry();
- GrepRemoveReq * const grepReq = (GrepRemoveReq *) signal->getDataPtr();
- Uint32 subId = grepReq->subscriptionId;
- Uint32 subKey = grepReq->subscriptionKey;
- Uint32 subData = grepReq->senderData;
- Uint32 coordinator = grepReq->senderRef;
-
- Subscription key;
- key.m_subscriptionId = subId;
- key.m_subscriptionKey = subKey;
- SubscriptionPtr subPtr;
-
- if(!c_subscriptions.find(subPtr, key))
- {
- /**
- * The subscription was not found, so it must be deleted.
- * Send CONF back, since it does not exist (thus, it is removed)
- */
- GrepRemoveConf * grepConf = (GrepRemoveConf *)grepReq;
- grepConf->subscriptionKey = subKey;
- grepConf->subscriptionId = subId;
- grepConf->senderData = subData;
- grepConf->senderNodeId = getOwnNodeId();
- sendSignal(coordinator, GSN_GREP_REMOVE_CONF, signal,
- GrepRemoveConf::SignalLength, JBB);
- return;
- }
-
- subPtr.p->m_operationPtrI = subData;
- subPtr.p->m_coordinatorRef = coordinator;
- subPtr.p->m_outstandingRequest = GSN_GREP_REMOVE_REQ;
-
- /**
- * send SUB_REMOVE_REQ to local SUMA
- */
- SubRemoveReq * sumaReq = (SubRemoveReq *) grepReq;
- sumaReq->subscriptionId = subId;
- sumaReq->subscriptionKey = subKey;
- sumaReq->senderData = subPtr.i;
- sendSignal(SUMA_REF, GSN_SUB_REMOVE_REQ, signal,
- SubStartReq::SignalLength, JBB);
-}
-
-
-/**
- * SUB_REMOVE_CONF (from local SUMA)
- */
-void
-Grep::PSPart::execSUB_REMOVE_CONF(Signal* signal)
-{
- jamEntry();
- SubRemoveConf * const conf = (SubRemoveConf *) signal->getDataPtr();
- Uint32 subId = conf->subscriptionId;
- Uint32 subKey = conf->subscriptionKey;
- Uint32 subData = conf->subscriberData;
-
- SubscriptionPtr subPtr;
- c_subscriptions.getPtr(subPtr, subData);
- ndbrequire(subPtr.p->m_subscriptionId == subId);
- ndbrequire(subPtr.p->m_subscriptionKey == subKey);
- subPtr.p->m_outstandingRequest = 0;
- GrepRemoveConf * grepConf = (GrepRemoveConf *)conf;
- grepConf->subscriptionKey = subKey;
- grepConf->subscriptionId = subId;
- grepConf->senderData = subPtr.p->m_operationPtrI;
- grepConf->senderNodeId = getOwnNodeId();
- sendSignal(subPtr.p->m_coordinatorRef, GSN_GREP_REMOVE_CONF, signal,
- GrepRemoveConf::SignalLength, JBB);
- c_subscriptions.release(subPtr);
-
-}
-
-
-/**
- * SUB_REMOVE_CONF (from local SUMA)
- */
-void
-Grep::PSPart::execSUB_REMOVE_REF(Signal* signal)
-{
- jamEntry();
- SubRemoveRef * const ref = (SubRemoveRef *)signal->getDataPtr();
- Uint32 subData = ref->subscriberData;
- /* GrepError::GE_Code err = (GrepError::GE_Code)ref->err;*/
- SubscriptionPtr subPtr;
- c_subscriptions.getPtr(subPtr, subData);
-
- //sendSubRemoveRef_PSCoord(signal, *subPtr.p, err /*error*/);
-}
-
-
-/**
- * Aborting has been carried out (says Participants)
- */
-void
-Grep::PSCoord::execGREP_REMOVE_CONF(Signal* signal)
-{
- jamEntry();
- GrepRemoveConf * const conf = (GrepRemoveConf *) signal->getDataPtr();
- Uint32 subId = conf->subscriptionId;
- Uint32 subKey = conf->subscriptionKey;
- Uint32 senderNodeId = conf->senderNodeId;
- Uint32 subData = conf->senderData;
- SubCoordinatorPtr subPtr;
- c_subCoordinatorPool.getPtr(subPtr, subData);
-
- ndbrequire(subPtr.p->m_outstandingRequest == GSN_GREP_REMOVE_REQ);
-
- subPtr.p->m_outstandingParticipants.clearWaitingFor(senderNodeId);
-
- if(!subPtr.p->m_outstandingParticipants.done()) {
- jam();
- return;
- }
- jam();
-
- /*************************
- * All participants ready
- *************************/
-
- m_grep->sendEventRep(signal,
- NDB_LE_GrepSubscriptionInfo,
- GrepEvent::GrepPS_SubRemoveConf,
- subId, subKey,
- GrepError::GE_NO_ERROR);
-
- GrepSubRemoveConf * grepConf = (GrepSubRemoveConf *) conf;
- grepConf->subscriptionId = subId;
- grepConf->subscriptionKey = subKey;
- sendSignal(subPtr.p->m_subscriberRef, GSN_GREP_SUB_REMOVE_CONF, signal,
- GrepSubRemoveConf::SignalLength, JBB);
-
- c_subCoordinatorPool.release(subPtr);
-}
-
-
-
-void
-Grep::PSCoord::execGREP_REMOVE_REF(Signal* signal)
-{
- jamEntry();
- GrepRemoveRef * const ref = (GrepRemoveRef *)signal->getDataPtr();
- Uint32 subData = ref->senderData;
- Uint32 err = ref->err;
- SubCoordinatorPtr subPtr;
-
- /**
- * Get the operationrecord matching subdata and remove it. Subsequent
- * execGREP_REMOVE_REF will simply be ignored at this stage.
- */
- for( c_runningSubscriptions.first(c_subPtr);
- !c_subPtr.isNull(); c_runningSubscriptions.next(c_subPtr)) {
- jam();
- subPtr.i = c_subPtr.curr.i;
- subPtr.p = c_runningSubscriptions.getPtr(subPtr.i);
- if(subData == subPtr.i)
- {
- sendRefToSS(signal, *subPtr.p, (GrepError::GE_Code)err /*error*/);
- c_runningSubscriptions.release(subPtr);
- return;
- }
- }
- return;
-}
-
-
-/**************************************************************************
- * ------------------------------------------------------------------------
- * MODULE: LOG RECORDS (COMING IN FROM LOCAL SUMA)
- * ------------------------------------------------------------------------
- *
- * After the subscription is started, we get log records from SUMA.
- * Both table data and meta data log records are received.
- *
- * TODO:
- * @todo Changes in meta data is currently not
- * allowed during global replication
- **************************************************************************/
-
-void
-Grep::PSPart::execSUB_META_DATA(Signal* signal)
-{
- jamEntry();
- if(m_recoveryMode) {
- jam();
- return;
- }
- /**
- * METASCAN and METALOG
- */
- SubMetaData * data = (SubMetaData *) signal->getDataPtrSend();
- SubscriptionPtr subPtr;
- c_subscriptions.getPtr(subPtr, data->subscriberData);
-
- /***************************
- * Forward data to REP node
- ***************************/
- sendSignal(subPtr.p->m_subscriberRef, GSN_SUB_META_DATA, signal,
- SubMetaData::SignalLength, JBB);
-#ifdef DEBUG_GREP_SUBSCRIPTION
- ndbout_c("Grep::PSPart: Sent SUB_META_DATA to REP "
- "(TableId: %d, SenderData: %d, GCI: %d)",
- data->tableId, data->senderData, data->gci);
-#endif
-}
-
-/**
- * Receive table data from SUMA and dispatches it to REP node.
- */
-void
-Grep::PSPart::execSUB_TABLE_DATA(Signal* signal)
-{
- jamEntry();
- if(m_recoveryMode) {
- jam();
- return;
- }
- ndbrequire(m_repRef!=0);
-
- if(!assembleFragments(signal)) { jam(); return; }
-
- /**
- * Check if it is SCAN or LOG data that has arrived
- */
- if(signal->getNoOfSections() == 2)
- {
- jam();
- /**
- * DATASCAN - Not marked with GCI, so mark with latest seen GCI
- */
- if(m_firstScanGCI == 1 && m_lastScanGCI == 0) {
- m_firstScanGCI = m_latestSeenGCI;
- m_lastScanGCI = m_latestSeenGCI;
- }
- SubTableData * data = (SubTableData*)signal->getDataPtrSend();
- Uint32 subData = data->senderData;
- data->gci = m_latestSeenGCI;
- data->logType = SubTableData::SCAN;
-
- SubscriptionPtr subPtr;
- c_subscriptions.getPtr(subPtr, subData);
- sendSignal(subPtr.p->m_subscriberRef, GSN_SUB_TABLE_DATA, signal,
- SubTableData::SignalLength, JBB);
-#ifdef DEBUG_GREP
- ndbout_c("Grep::PSPart: Sent SUB_TABLE_DATA (Scan, GCI: %d)",
- data->gci);
-#endif
- }
- else
- {
- jam();
- /**
- * DATALOG (TRIGGER) - Already marked with GCI
- */
- SubTableData * data = (SubTableData*)signal->getDataPtrSend();
- data->logType = SubTableData::LOG;
- Uint32 subData = data->senderData;
- if (data->gci > m_latestSeenGCI) m_latestSeenGCI = data->gci;
-
- // Reformat to sections and send to replication node.
- LinearSectionPtr ptr[3];
- ptr[0].p = signal->theData + 25;
- ptr[0].sz = data->noOfAttributes;
- ptr[1].p = signal->theData + 25 + MAX_ATTRIBUTES_IN_TABLE;
- ptr[1].sz = data->dataSize;
-
- SubscriptionPtr subPtr;
- c_subscriptions.getPtr(subPtr, subData);
- sendSignal(subPtr.p->m_subscriberRef, GSN_SUB_TABLE_DATA,
- signal, SubTableData::SignalLength, JBB, ptr, 2);
-#ifdef DEBUG_GREP
- ndbout_c("Grep::PSPart: Sent SUB_TABLE_DATA (Log, GCI: %d)",
- data->gci);
-#endif
- }
-}
-
-
-/**************************************************************************
- * ------------------------------------------------------------------------
- * MODULE: START SYNCHRONIZATION
- * ------------------------------------------------------------------------
- *
- *
- **************************************************************************/
-
-/**
- * Request to start sync (from Rep SS)
- */
-void
-Grep::PSCoord::execGREP_SUB_SYNC_REQ(Signal* signal)
-{
- jamEntry();
- GrepSubSyncReq * const subReq = (GrepSubSyncReq*)signal->getDataPtr();
- SubscriptionData::Part part = (SubscriptionData::Part) subReq->part;
- Uint32 subId = subReq->subscriptionId;
- Uint32 subKey = subReq->subscriptionKey;
- BlockReference rep = signal->getSendersBlockRef();
-
- SubCoordinatorPtr subPtr;
- if( !c_subCoordinatorPool.seize(subPtr)) {
- jam();
- SubCoordinator sub;
- sub.m_subscriberRef = rep;
- sub.m_subscriptionId = 0;
- sub.m_subscriptionKey = 0;
- sub.m_outstandingRequest = GSN_GREP_SYNC_REQ;
- sendRefToSS(signal, sub, GrepError::NOSPACE_IN_POOL);
- return;
- }
-
- prepareOperationRec(subPtr,
- numberToRef(PSREPBLOCKNO, refToNode(rep)),
- subId, subKey,
- GSN_GREP_SYNC_REQ);
-
- GrepSyncReq * req = (GrepSyncReq *)subReq;
- req->subscriptionId = subPtr.p->m_subscriptionId;
- req->subscriptionKey = subPtr.p->m_subscriptionKey;
- req->senderData = subPtr.p->m_subscriberData;
- req->part = (Uint32)part;
-
- /***************************
- * Send to all participants
- ***************************/
- NodeReceiverGroup rg(GREP, m_grep->m_aliveNodes);
- subPtr.p->m_outstandingParticipants = rg;
- sendSignal(rg,
- GSN_GREP_SYNC_REQ, signal, GrepSyncReq::SignalLength, JBB);
-}
-
-
-/**
- * Sync req from Grep::PSCoord to PS particpant
- */
-void
-Grep::PSPart::execGREP_SYNC_REQ(Signal* signal)
-{
- jamEntry();
-
- GrepSyncReq * const grepReq = (GrepSyncReq *) signal->getDataPtr();
- Uint32 part = grepReq->part;
- Uint32 subId = grepReq->subscriptionId;
- Uint32 subKey = grepReq->subscriptionKey;
- Uint32 subData = grepReq->senderData;
-
- Subscription key;
- key.m_subscriptionId = subId;
- key.m_subscriptionKey = subKey;
- SubscriptionPtr subPtr;
- ndbrequire(c_subscriptions.find(subPtr, key));
- subPtr.p->m_operationPtrI = subData;
- subPtr.p->m_outstandingRequest = GSN_GREP_SYNC_REQ;
- /**********************************
- * Send SUB_SYNC_REQ to local SUMA
- **********************************/
- SubSyncReq * sumaReq = (SubSyncReq *)grepReq;
- sumaReq->subscriptionId = subId;
- sumaReq->subscriptionKey = subKey;
- sumaReq->subscriberData = subPtr.i;
- sumaReq->part = part;
- sendSignal(SUMA_REF, GSN_SUB_SYNC_REQ, signal,
- SubSyncReq::SignalLength, JBB);
-}
-
-
-/**
- * SYNC conf from SUMA
- */
-void
-Grep::PSPart::execSUB_SYNC_CONF(Signal* signal)
-{
- jamEntry();
-
- SubSyncConf * const conf = (SubSyncConf *) signal->getDataPtr();
- Uint32 part = conf->part;
- Uint32 subId = conf->subscriptionId;
- Uint32 subKey = conf->subscriptionKey;
- Uint32 subData = conf->subscriberData;
-
- SubscriptionPtr subPtr;
- c_subscriptions.getPtr(subPtr, subData);
-
- ndbrequire(subPtr.p->m_subscriptionId == subId);
- ndbrequire(subPtr.p->m_subscriptionKey == subKey);
-
- GrepSyncConf * grepConf = (GrepSyncConf *)conf;
- grepConf->senderNodeId = getOwnNodeId();
- grepConf->part = part;
- grepConf->firstGCI = m_firstScanGCI;
- grepConf->lastGCI = m_lastScanGCI;
- grepConf->subscriptionId = subId;
- grepConf->subscriptionKey = subKey;
- grepConf->senderData = subPtr.p->m_operationPtrI;
- sendSignal(subPtr.p->m_coordinatorRef, GSN_GREP_SYNC_CONF, signal,
- GrepSyncConf::SignalLength, JBB);
-
- m_firstScanGCI = 1;
- m_lastScanGCI = 0;
- subPtr.p->m_outstandingRequest = 0;
-}
-
-/**
- * Handle errors that either occured in:
- * 1) PSPart
- * or
- * 2) propagated from local SUMA
- *
- * Propagates REF signal to PSCoord
- */
-void
-Grep::PSPart::execSUB_SYNC_REF(Signal* signal) {
- jamEntry();
- SubSyncRef * const ref = (SubSyncRef *)signal->getDataPtr();
- Uint32 subData = ref->subscriberData;
- GrepError::GE_Code err = (GrepError::GE_Code)ref->err;
- SubscriptionData::Part part = (SubscriptionData::Part)ref->part;
-
- SubscriptionPtr subPtr;
- c_subscriptions.getPtr(subPtr, subData);
- sendRefToPSCoord(signal, *subPtr.p, err /*error*/ ,part);
- subPtr.p->m_outstandingRequest = 0;
-}
-
-/**
- * Syncing has started... (says PS Participant)
- */
-void
-Grep::PSCoord::execGREP_SYNC_CONF(Signal* signal)
-{
- jamEntry();
-
- GrepSyncConf const * conf = (GrepSyncConf *)signal->getDataPtr();
- Uint32 part = conf->part;
- Uint32 firstGCI = conf->firstGCI;
- Uint32 lastGCI = conf->lastGCI;
- Uint32 subId = conf->subscriptionId;
- Uint32 subKey = conf->subscriptionKey;
- Uint32 subData = conf->senderData;
-
- SubCoordinatorPtr subPtr;
- c_subCoordinatorPool.getPtr(subPtr, subData);
- ndbrequire(subPtr.p->m_outstandingRequest == GSN_GREP_SYNC_REQ);
-
- subPtr.p->m_outstandingParticipants.clearWaitingFor(conf->senderNodeId);
- if(!subPtr.p->m_outstandingParticipants.done()) return;
-
- /**
- * Send event
- */
- GrepEvent::Subscription event;
- if(part == SubscriptionData::MetaData)
- event = GrepEvent::GrepPS_SubSyncMetaConf;
- else
- event = GrepEvent::GrepPS_SubSyncDataConf;
-
- /* @todo Johan: Add firstGCI here. /Lars */
- m_grep->sendEventRep(signal, NDB_LE_GrepSubscriptionInfo,
- event, subId, subKey,
- (Uint32)GrepError::GE_NO_ERROR,
- lastGCI);
-
- /*************************
- * All participants ready
- *************************/
- GrepSubSyncConf * grepConf = (GrepSubSyncConf *)conf;
- grepConf->part = part;
- grepConf->firstGCI = firstGCI;
- grepConf->lastGCI = lastGCI;
- grepConf->subscriptionId = subId;
- grepConf->subscriptionKey = subKey;
-
- sendSignal(subPtr.p->m_subscriberRef, GSN_GREP_SUB_SYNC_CONF, signal,
- GrepSubSyncConf::SignalLength, JBB);
- c_subCoordinatorPool.release(subPtr);
-}
-
-/**
- * Handle errors that either occured in:
- * 1) PSCoord
- * or
- * 2) propagated from PSPart
- */
-void
-Grep::PSCoord::execGREP_SYNC_REF(Signal* signal) {
- jamEntry();
- GrepSyncRef * const ref = (GrepSyncRef *)signal->getDataPtr();
- Uint32 subData = ref->senderData;
- SubscriptionData::Part part = (SubscriptionData::Part)ref->part;
- GrepError::GE_Code err = (GrepError::GE_Code)ref->err;
- SubCoordinatorPtr subPtr;
- c_runningSubscriptions.getPtr(subPtr, subData);
- sendRefToSS(signal, *subPtr.p, err /*error*/, part);
-}
-
-
-
-void
-Grep::PSCoord::sendRefToSS(Signal * signal,
- SubCoordinator sub,
- GrepError::GE_Code err,
- SubscriptionData::Part part) {
- /**
-
- GrepCreateRef * ref = (GrepCreateRef*)signal->getDataPtrSend();
- ref->senderData = sub.m_subscriberData;
- ref->subscriptionId = sub.m_subscriptionId;
- ref->subscriptionKey = sub.m_subscriptionKey;
- ref->err = err;
- sendSignal(sub.m_coordinatorRef, GSN_GREP_CREATE_REF, signal,
- GrepCreateRef::SignalLength, JBB);
-*/
-
- jam();
- GrepEvent::Subscription event;
- switch(sub.m_outstandingRequest) {
- case GSN_GREP_CREATE_SUBID_REQ:
- {
- jam();
- CreateSubscriptionIdRef * ref =
- (CreateSubscriptionIdRef*)signal->getDataPtrSend();
- ref->err = (Uint32)err;
- ref->subscriptionId = sub.m_subscriptionId;
- ref->subscriptionKey = sub.m_subscriptionKey;
- sendSignal(sub.m_subscriberRef,
- GSN_GREP_CREATE_SUBID_REF,
- signal,
- CreateSubscriptionIdRef::SignalLength,
- JBB);
- event = GrepEvent::GrepPS_CreateSubIdRef;
- }
- break;
- case GSN_GREP_CREATE_REQ:
- {
- jam();
- GrepSubCreateRef * ref = (GrepSubCreateRef*)signal->getDataPtrSend();
- ref->err = (Uint32)err;
- ref->subscriptionId = sub.m_subscriptionId;
- ref->subscriptionKey = sub.m_subscriptionKey;
- sendSignal(sub.m_subscriberRef, GSN_GREP_SUB_CREATE_REF, signal,
- GrepSubCreateRef::SignalLength, JBB);
- event = GrepEvent::GrepPS_SubCreateRef;
- }
- break;
- case GSN_GREP_SYNC_REQ:
- {
- jam();
- GrepSubSyncRef * ref = (GrepSubSyncRef*)signal->getDataPtrSend();
- ref->err = (Uint32)err;
- ref->subscriptionId = sub.m_subscriptionId;
- ref->subscriptionKey = sub.m_subscriptionKey;
- ref->part = (SubscriptionData::Part) part;
- sendSignal(sub.m_subscriberRef,
- GSN_GREP_SUB_SYNC_REF,
- signal,
- GrepSubSyncRef::SignalLength,
- JBB);
- if(part == SubscriptionData::MetaData)
- event = GrepEvent::GrepPS_SubSyncMetaRef;
- else
- event = GrepEvent::GrepPS_SubSyncDataRef;
- }
- break;
- case GSN_GREP_START_REQ:
- {
- jam();
- GrepSubStartRef * ref = (GrepSubStartRef*)signal->getDataPtrSend();
- ref->err = (Uint32)err;
- ref->subscriptionId = sub.m_subscriptionId;
- ref->subscriptionKey = sub.m_subscriptionKey;
-
- sendSignal(sub.m_subscriberRef, GSN_GREP_SUB_START_REF,
- signal, GrepSubStartRef::SignalLength, JBB);
- if(part == SubscriptionData::MetaData)
- event = GrepEvent::GrepPS_SubStartMetaRef;
- else
- event = GrepEvent::GrepPS_SubStartDataRef;
- /**
- * Send event report
- */
- m_grep->sendEventRep(signal,
- NDB_LE_GrepSubscriptionAlert,
- event,
- sub.m_subscriptionId,
- sub.m_subscriptionKey,
- (Uint32)err);
- }
- break;
- case GSN_GREP_REMOVE_REQ:
- {
- jam();
- GrepSubRemoveRef * ref = (GrepSubRemoveRef*)signal->getDataPtrSend();
- ref->subscriptionId = sub.m_subscriptionId;
- ref->subscriptionKey = sub.m_subscriptionKey;
- ref->err = (Uint32)err;
-
- sendSignal(sub.m_subscriberRef,
- GSN_GREP_SUB_REMOVE_REF,
- signal,
- GrepSubRemoveRef::SignalLength,
- JBB);
-
- event = GrepEvent::GrepPS_SubRemoveRef;
- }
- break;
- default:
- ndbrequire(false);
- event= GrepEvent::Rep_Disconnect; // remove compiler warning
- }
- /**
- * Finally, send an event.
- */
- m_grep->sendEventRep(signal,
- NDB_LE_GrepSubscriptionAlert,
- event,
- sub.m_subscriptionId,
- sub.m_subscriptionKey,
- err);
-
-}
-
-
-void
-Grep::PSPart::sendRefToPSCoord(Signal * signal,
- Subscription sub,
- GrepError::GE_Code err,
- SubscriptionData::Part part) {
-
- jam();
- GrepEvent::Subscription event;
- switch(sub.m_outstandingRequest) {
-
- case GSN_GREP_CREATE_REQ:
- {
- GrepCreateRef * ref = (GrepCreateRef*)signal->getDataPtrSend();
- ref->senderData = sub.m_subscriberData;
- ref->subscriptionId = sub.m_subscriptionId;
- ref->subscriptionKey = sub.m_subscriptionKey;
- ref->err = err;
- sendSignal(sub.m_coordinatorRef, GSN_GREP_CREATE_REF, signal,
- GrepCreateRef::SignalLength, JBB);
-
- event = GrepEvent::GrepPS_SubCreateRef;
- }
- break;
- case GSN_GREP_SYNC_REQ:
- {
- GrepSyncRef * ref = (GrepSyncRef*)signal->getDataPtrSend();
- ref->senderData = sub.m_subscriberData;
- ref->subscriptionId = sub.m_subscriptionId;
- ref->subscriptionKey = sub.m_subscriptionKey;
- ref->part = part;
- ref->err = err;
- sendSignal(sub.m_coordinatorRef,
- GSN_GREP_SYNC_REF, signal,
- GrepSyncRef::SignalLength, JBB);
- if(part == SubscriptionData::MetaData)
- event = GrepEvent::GrepPS_SubSyncMetaRef;
- else
- event = GrepEvent::GrepPS_SubSyncDataRef;
- }
- break;
- case GSN_GREP_START_REQ:
- {
- jam();
- GrepStartRef * ref = (GrepStartRef*)signal->getDataPtrSend();
- ref->senderData = sub.m_subscriberData;
- ref->subscriptionId = sub.m_subscriptionId;
- ref->subscriptionKey = sub.m_subscriptionKey;
- ref->part = (Uint32) part;
- ref->err = err;
- sendSignal(sub.m_coordinatorRef, GSN_GREP_START_REF, signal,
- GrepStartRef::SignalLength, JBB);
- if(part == SubscriptionData::MetaData)
- event = GrepEvent::GrepPS_SubStartMetaRef;
- else
- event = GrepEvent::GrepPS_SubStartDataRef;
- }
- break;
-
- case GSN_GREP_REMOVE_REQ:
- {
- jamEntry();
- GrepRemoveRef * ref = (GrepRemoveRef*)signal->getDataPtrSend();
- ref->senderData = sub.m_operationPtrI;
- ref->subscriptionId = sub.m_subscriptionId;
- ref->subscriptionKey = sub.m_subscriptionKey;
- ref->err = err;
- sendSignal(sub.m_coordinatorRef, GSN_GREP_REMOVE_REF, signal,
- GrepCreateRef::SignalLength, JBB);
-
- }
- break;
- default:
- ndbrequire(false);
- event= GrepEvent::Rep_Disconnect; // remove compiler warning
- }
-
- /**
- * Finally, send an event.
- */
- m_grep->sendEventRep(signal,
- NDB_LE_GrepSubscriptionAlert,
- event,
- sub.m_subscriptionId,
- sub.m_subscriptionKey,
- err);
-
-}
-
-/**************************************************************************
- * ------------------------------------------------------------------------
- * MODULE: GREP PS Coordinator GCP
- * ------------------------------------------------------------------------
- *
- *
- **************************************************************************/
-
-void
-Grep::PSPart::execSUB_GCP_COMPLETE_REP(Signal* signal)
-{
- jamEntry();
- if(m_recoveryMode) {
- jam();
- return;
- }
- SubGcpCompleteRep * rep = (SubGcpCompleteRep *)signal->getDataPtrSend();
- rep->senderRef = reference();
-
- if (rep->gci > m_latestSeenGCI) m_latestSeenGCI = rep->gci;
- SubscriptionPtr subPtr;
- c_subscriptions.first(c_subPtr);
- for(; !c_subPtr.isNull(); c_subscriptions.next(c_subPtr)) {
-
- subPtr.i = c_subPtr.curr.i;
- subPtr.p = c_subscriptions.getPtr(subPtr.i);
- sendSignal(subPtr.p->m_subscriberRef, GSN_SUB_GCP_COMPLETE_REP, signal,
- SubGcpCompleteRep::SignalLength, JBB);
- }
-
-#ifdef DEBUG_GREP
- ndbout_c("Grep::PSPart: Recd SUB_GCP_COMPLETE_REP "
- "(GCI: %d, nodeId: %d) from SUMA",
- rep->gci, refToNode(rep->senderRef));
-#endif
-}
-
-
-void
-Grep::PSPart::execSUB_SYNC_CONTINUE_REQ(Signal* signal)
-{
- jamEntry();
- SubSyncContinueReq * const req = (SubSyncContinueReq*)signal->getDataPtr();
- Uint32 subData = req->subscriberData;
-
- SubscriptionPtr subPtr;
- c_subscriptions.getPtr(subPtr,subData);
-
- /**
- * @todo Figure out how to control how much data we can receive?
- */
- SubSyncContinueConf * conf = (SubSyncContinueConf*)req;
- conf->subscriptionId = subPtr.p->m_subscriptionId;
- conf->subscriptionKey = subPtr.p->m_subscriptionKey;
- sendSignal(SUMA_REF, GSN_SUB_SYNC_CONTINUE_CONF, signal,
- SubSyncContinueConf::SignalLength, JBB);
-}
-
-void
-Grep::sendEventRep(Signal * signal,
- Ndb_logevent_type type,
- GrepEvent::Subscription event,
- Uint32 subId,
- Uint32 subKey,
- Uint32 err,
- Uint32 other) {
- jam();
- signal->theData[0] = type;
- signal->theData[1] = event;
- signal->theData[2] = subId;
- signal->theData[3] = subKey;
- signal->theData[4] = err;
-
- if(other==0)
- sendSignal(CMVMI_REF, GSN_EVENT_REP, signal, 5 ,JBB);
- else {
- signal->theData[5] = other;
- sendSignal(CMVMI_REF, GSN_EVENT_REP, signal, 6 ,JBB);
- }
-}
diff --git a/storage/ndb/src/kernel/blocks/grep/Grep.hpp b/storage/ndb/src/kernel/blocks/grep/Grep.hpp
deleted file mode 100644
index a14143294e1..00000000000
--- a/storage/ndb/src/kernel/blocks/grep/Grep.hpp
+++ /dev/null
@@ -1,535 +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 GREP_HPP
-#define GREP_HPP
-
-#include <ndb_limits.h>
-#include <SimulatedBlock.hpp>
-
-#include <NodeBitmask.hpp>
-#include <SignalCounter.hpp>
-#include <SLList.hpp>
-
-#include <DLList.hpp>
-
-#include <GrepError.hpp>
-#include <GrepEvent.hpp>
-
-#include <signaldata/EventReport.hpp>
-#include <signaldata/SumaImpl.hpp>
-
-
-/**
- * Module in block (Should be placed elsewhere)
- */
-class BlockComponent {
-public:
- BlockComponent(SimulatedBlock *);
- BlockReference reference() { return m_sb->reference(); };
- BlockNumber number() { return m_sb->number(); };
-
- void sendSignal(NodeReceiverGroup rg,
- GlobalSignalNumber gsn,
- Signal* signal,
- Uint32 length,
- JobBufferLevel jbuf ) const {
- m_sb->sendSignal(rg, gsn, signal, length, jbuf);
- }
-
- void sendSignal(BlockReference ref,
- GlobalSignalNumber gsn,
- Signal* signal,
- Uint32 length,
- JobBufferLevel jbuf ) const {
- m_sb->sendSignal(ref, gsn, signal, length, jbuf);
- }
-
- void sendSignal(BlockReference ref,
- GlobalSignalNumber gsn,
- Signal* signal,
- Uint32 length,
- JobBufferLevel jbuf,
- LinearSectionPtr ptr[3],
- Uint32 noOfSections) const {
- m_sb->sendSignal(ref, gsn, signal, length, jbuf, ptr, noOfSections);
- }
-
- void sendSignalWithDelay(BlockReference ref,
- GlobalSignalNumber gsn,
- Signal* signal,
- Uint32 delayInMilliSeconds,
- Uint32 length) const {
-
- m_sb->sendSignalWithDelay(ref, gsn, signal, delayInMilliSeconds, length);
- }
-
- NodeId getOwnNodeId() const {
- return m_sb->getOwnNodeId();
- }
-
- bool assembleFragments(Signal * signal) {
- return m_sb->assembleFragments(signal);
- }
-
- void progError(int line, int err_code, const char* extra) {
- m_sb->progError(line, err_code, extra);
- }
-
-private:
- SimulatedBlock * m_sb;
-};
-
-
-
-/**
- * Participant of GREP Protocols (not necessarily a protocol coordinator)
- *
- * This object is only used on primary system
- */
-#if 0
-class GrepParticipant : public SimulatedBlock
-{
-protected:
- GrepParticipant(const Configuration & conf);
- virtual ~GrepParticipant();
- BLOCK_DEFINES(GrepParticipant);
-
-protected:
- /***************************************************************************
- * SUMA Signal Interface
- ***************************************************************************/
- void execSUB_CREATE_CONF(Signal*);
- void execSUB_STARTCONF(Signal*);
- void execSUB_REMOVE_CONF(Signal*);
-
- void execSUB_META_DATA(Signal*);
- void execSUB_TABLE_DATA(Signal*);
-
- void execSUB_SYNC_CONF(Signal*);
-
- void execSUB_GCP_COMPLETE_REP(Signal*);
- void execSUB_SYNC_CONTINUE_REQ(Signal*);
-
- /***************************************************************************
- * GREP Coordinator Signal Interface
- ***************************************************************************/
- void execGREP_CREATE_REQ(Signal*);
- void execGREP_START_REQ(Signal*);
- void execGREP_SYNC_REQ(Signal*);
- void execGREP_REMOVE_REQ(Signal*);
-
-
-protected:
- BlockReference m_repRef; ///< Replication node (only one rep node per grep)
-
-private:
- BlockReference m_coordinator;
- Uint32 m_latestSeenGCI;
-};
-#endif
-
-
-/**
- * GREP Coordinator
- */
-class Grep : public SimulatedBlock //GrepParticipant
-{
- BLOCK_DEFINES(Grep);
-
-public:
- Grep(const Configuration & conf);
- virtual ~Grep();
-
-private:
- /***************************************************************************
- * General Signal Recivers
- ***************************************************************************/
- void execSTTOR(Signal*);
- void sendSTTORRY(Signal*);
- void execNDB_STTOR(Signal*);
- void execDUMP_STATE_ORD(Signal*);
- void execREAD_NODESCONF(Signal*);
- void execNODE_FAILREP(Signal*);
- void execINCL_NODEREQ(Signal*);
- void execGREP_REQ(Signal*);
- void execAPI_FAILREQ(Signal*);
- /**
- * Forwarded to PSCoord
- */
- //CONF
- void fwdGREP_CREATE_CONF(Signal* s) {
- pscoord.execGREP_CREATE_CONF(s); };
- void fwdGREP_START_CONF(Signal* s) {
- pscoord.execGREP_START_CONF(s); };
- void fwdGREP_SYNC_CONF(Signal* s) {
- pscoord.execGREP_SYNC_CONF(s); };
- void fwdGREP_REMOVE_CONF(Signal* s) {
- pscoord.execGREP_REMOVE_CONF(s); };
- void fwdCREATE_SUBID_CONF(Signal* s) {
- pscoord.execCREATE_SUBID_CONF(s); };
-
- //REF
-
- void fwdGREP_CREATE_REF(Signal* s) {
- pscoord.execGREP_CREATE_REF(s); };
- void fwdGREP_START_REF(Signal* s) {
- pscoord.execGREP_START_REF(s); };
- void fwdGREP_SYNC_REF(Signal* s) {
- pscoord.execGREP_SYNC_REF(s); };
-
- void fwdGREP_REMOVE_REF(Signal* s) {
- pscoord.execGREP_REMOVE_REF(s); };
-
- void fwdCREATE_SUBID_REF(Signal* s) {
- pscoord.execCREATE_SUBID_REF(s); };
-
- //REQ
- void fwdGREP_SUB_CREATE_REQ(Signal* s) {
- pscoord.execGREP_SUB_CREATE_REQ(s); };
- void fwdGREP_SUB_START_REQ(Signal* s) {
- pscoord.execGREP_SUB_START_REQ(s); };
- void fwdGREP_SUB_SYNC_REQ(Signal* s) {
- pscoord.execGREP_SUB_SYNC_REQ(s); };
- void fwdGREP_SUB_REMOVE_REQ(Signal* s) {
- pscoord.execGREP_SUB_REMOVE_REQ(s); };
- void fwdGREP_CREATE_SUBID_REQ(Signal* s) {
- pscoord.execGREP_CREATE_SUBID_REQ(s); };
-
- /**
- * Forwarded to PSPart
- */
-
- void fwdSTART_ME(Signal* s){
- pspart.execSTART_ME(s);
- };
- void fwdGREP_ADD_SUB_REQ(Signal* s){
- pspart.execGREP_ADD_SUB_REQ(s);
- };
- void fwdGREP_ADD_SUB_REF(Signal* s){
- pspart.execGREP_ADD_SUB_REF(s);
- };
- void fwdGREP_ADD_SUB_CONF(Signal* s){
- pspart.execGREP_ADD_SUB_CONF(s);
- };
-
- //CONF
- void fwdSUB_CREATE_CONF(Signal* s) {
- pspart.execSUB_CREATE_CONF(s); };
- void fwdSUB_START_CONF(Signal* s) {
- pspart.execSUB_START_CONF(s); };
- void fwdSUB_REMOVE_CONF(Signal* s) {
- pspart.execSUB_REMOVE_CONF(s); };
- void fwdSUB_SYNC_CONF(Signal* s) {
- pspart.execSUB_SYNC_CONF(s); };
-
- //REF
-
- void fwdSUB_CREATE_REF(Signal* s) {
- pspart.execSUB_CREATE_REF(s); };
- void fwdSUB_START_REF(Signal* s) {
- pspart.execSUB_START_REF(s); };
- void fwdSUB_REMOVE_REF(Signal* s) {
- pspart.execSUB_REMOVE_REF(s); };
- void fwdSUB_SYNC_REF(Signal* s) {
- pspart.execSUB_SYNC_REF(s); };
-
- //REQ
- void fwdSUB_SYNC_CONTINUE_REQ(Signal* s) {
- pspart.execSUB_SYNC_CONTINUE_REQ(s); };
- void fwdGREP_CREATE_REQ(Signal* s) {
- pspart.execGREP_CREATE_REQ(s); };
- void fwdGREP_START_REQ(Signal* s) {
- pspart.execGREP_START_REQ(s); };
- void fwdGREP_SYNC_REQ(Signal* s) {
- pspart.execGREP_SYNC_REQ(s); };
- void fwdGREP_REMOVE_REQ(Signal* s) {
- pspart.execGREP_REMOVE_REQ(s); };
-
- void fwdSUB_META_DATA(Signal* s) {
- pspart.execSUB_META_DATA(s); };
- void fwdSUB_TABLE_DATA(Signal* s) {
- pspart.execSUB_TABLE_DATA(s); };
-
- void fwdSUB_GCP_COMPLETE_REP(Signal* s) {
- pspart.execSUB_GCP_COMPLETE_REP(s); };
-
- void sendEventRep(Signal * signal,
- Ndb_logevent_type type,
- GrepEvent::Subscription event,
- Uint32 subId,
- Uint32 subKey,
- Uint32 err,
- Uint32 gci=0);
-
- void getNodeGroupMembers(Signal* signal);
-
-
- /***************************************************************************
- * Block Data
- ***************************************************************************/
- struct Node {
- Uint32 nodeId;
- Uint32 alive;
- Uint32 nextList;
- union { Uint32 prevList; Uint32 nextPool; };
- };
- typedef Ptr<Node> NodePtr;
-
- NodeId m_masterNodeId;
- SLList<Node> m_nodes;
- NdbNodeBitmask m_aliveNodes;
- ArrayPool<Node> m_nodePool;
-
- /**
- * for all Suma's to keep track of other Suma's in Node group
- */
- Uint32 c_nodeGroup;
- Uint32 c_noNodesInGroup;
- Uint32 c_idInNodeGroup;
- NodeId c_nodesInGroup[4];
-
-
-public:
- /***************************************************************************
- * GREP PS Coordinator
- ***************************************************************************/
- class PSCoord : public BlockComponent {
-
- private:
-
- struct SubCoordinator {
- Uint32 m_subscriberRef;
- Uint32 m_subscriberData;
- Uint32 m_coordinatorRef;
- Uint32 m_subscriptionId;
- Uint32 m_subscriptionKey;
- Uint32 m_subscriptionType;
- NdbNodeBitmask m_participants;
- Uint32 m_outstandingRequest;
- SignalCounter m_outstandingParticipants;
-
- Uint32 nextHash;
- union { Uint32 prevHash; Uint32 nextPool; };
-
- Uint32 hashValue() const {
- return m_subscriptionId + m_subscriptionKey;
- }
-
- bool equal(const SubCoordinator & s) const {
- return
- m_subscriptionId == s.m_subscriptionId &&
- m_subscriptionKey == s.m_subscriptionKey;
- }
-
- };
-
- typedef Ptr<SubCoordinator> SubCoordinatorPtr;
- ArrayPool<SubCoordinator> c_subCoordinatorPool;
- DLHashTable<SubCoordinator>::Iterator c_subPtr;
- DLHashTable<SubCoordinator> c_runningSubscriptions;
-
- void prepareOperationRec(SubCoordinatorPtr ptr,
- BlockReference subscriber,
- Uint32 subId,
- Uint32 subKey,
- Uint32 request);
-
- public:
- PSCoord(class Grep *);
-
- void execGREP_CREATE_CONF(Signal*);
- void execGREP_START_CONF(Signal*);
- void execGREP_SYNC_CONF(Signal*);
- void execGREP_REMOVE_CONF(Signal*);
-
- void execGREP_CREATE_REF(Signal*);
- void execGREP_START_REF(Signal*);
- void execGREP_SYNC_REF(Signal*);
- void execGREP_REMOVE_REF(Signal*);
-
-
- void execCREATE_SUBID_CONF(Signal*); //comes from SUMA
- void execGREP_CREATE_SUBID_REQ(Signal*);
-
- void execGREP_SUB_CREATE_REQ(Signal*);
- void execGREP_SUB_START_REQ(Signal*);
- void execGREP_SUB_SYNC_REQ(Signal*);
- void execGREP_SUB_REMOVE_REQ(Signal*);
-
-
-
- void execCREATE_SUBID_REF(Signal*);
-
-
-
- void sendCreateSubIdRef_SS(Signal * signal,
- Uint32 subId,
- Uint32 subKey,
- BlockReference to,
- GrepError::GE_Code err);
-
-
- void sendSubRemoveRef_SS(Signal * signal,
- SubCoordinator sub,
- GrepError::GE_Code err);
-
- void sendRefToSS(Signal * signal,
- SubCoordinator sub,
- GrepError::GE_Code err,
- SubscriptionData::Part part = (SubscriptionData::Part)0);
-
- void setRepRef(BlockReference rr) { m_repRef = rr; };
- //void setAliveNodes(NdbNodeBitmask an) { m_aliveNodes = an; };
-
- BlockReference m_repRef; ///< Rep node (only one rep node per grep)
- // NdbNodeBitmask m_aliveNodes;
-
- Uint32 m_outstandingRequest;
- SignalCounter m_outstandingParticipants;
-
- Grep * m_grep;
- } pscoord;
- friend class PSCoord;
-
- /***************************************************************************
- * GREP PS Participant
- ***************************************************************************
- * Participant of GREP Protocols (not necessarily a protocol coordinator)
- *
- * This object is only used on primary system
- ***************************************************************************/
- class PSPart: public BlockComponent
- {
- //protected:
- //GrepParticipant(const Configuration & conf);
- //virtual ~GrepParticipant();
- //BLOCK_DEFINES(GrepParticipant);
-
- struct Subscription {
- Uint32 m_subscriberRef;
- Uint32 m_subscriberData;
- Uint32 m_subscriptionId;
- Uint32 m_subscriptionKey;
- Uint32 m_subscriptionType;
- Uint32 m_coordinatorRef;
- Uint32 m_outstandingRequest;
- Uint32 m_operationPtrI;
- Uint32 nextHash;
- union { Uint32 prevHash; Uint32 nextPool; };
-
- Uint32 hashValue() const {
- return m_subscriptionId + m_subscriptionKey;
- }
-
- bool equal(const Subscription & s) const {
- return
- m_subscriptionId == s.m_subscriptionId &&
- m_subscriptionKey == s.m_subscriptionKey;
- }
-
- };
- typedef Ptr<Subscription> SubscriptionPtr;
-
- DLHashTable<Subscription> c_subscriptions;
- DLHashTable<Subscription>::Iterator c_subPtr;
- ArrayPool<Subscription> c_subscriptionPool;
-
- public:
- PSPart(class Grep *);
-
-
- //protected:
- /*************************************************************************
- * SUMA Signal Interface
- *************************************************************************/
- void execSUB_CREATE_CONF(Signal*);
- void execSUB_START_CONF(Signal*);
- void execSUB_SYNC_CONF(Signal*);
- void execSUB_REMOVE_CONF(Signal*);
-
- void execSUB_CREATE_REF(Signal*);
- void execSUB_START_REF(Signal*);
- void execSUB_SYNC_REF(Signal*);
- void execSUB_REMOVE_REF(Signal*);
-
-
- void execSUB_META_DATA(Signal*);
- void execSUB_TABLE_DATA(Signal*);
-
-
- void execSUB_GCP_COMPLETE_REP(Signal*);
- void execSUB_SYNC_CONTINUE_REQ(Signal*);
-
- /*************************************************************************
- * GREP Coordinator Signal Interface
- *************************************************************************/
- void execGREP_CREATE_REQ(Signal*);
- void execGREP_START_REQ(Signal*);
- void execGREP_SYNC_REQ(Signal*);
- void execGREP_REMOVE_REQ(Signal*);
-
- /**
- * NR/NF signals
- */
- void execSTART_ME(Signal *);
- void execGREP_ADD_SUB_REQ(Signal *);
- void execGREP_ADD_SUB_REF(Signal *);
- void execGREP_ADD_SUB_CONF(Signal *);
-
- /*************************************************************************
- * GREP Coordinator error handling interface
- *************************************************************************/
-
- void sendRefToPSCoord(Signal * signal,
- Subscription sub,
- GrepError::GE_Code err,
- SubscriptionData::Part part = (SubscriptionData::Part)0);
-
- //protected:
- BlockReference m_repRef; ///< Replication node
- ///< (only one rep node per grep)
- bool m_recoveryMode;
-
- private:
- BlockReference m_coordinator;
- Uint32 m_firstScanGCI;
- Uint32 m_lastScanGCI;
- Uint32 m_latestSeenGCI;
- Grep * m_grep;
- } pspart;
- friend class PSPart;
-
- /***************************************************************************
- * AddRecSignal Stuff (should maybe be gerneralized)
- ***************************************************************************/
- typedef void (Grep::* ExecSignalLocal1) (Signal* signal);
- typedef void (Grep::PSCoord::* ExecSignalLocal2) (Signal* signal);
- typedef void (Grep::PSPart::* ExecSignalLocal4) (Signal* signal);
-};
-
-
-/*************************************************************************
- * Requestor
- *
- * The following methods are callbacks (registered functions)
- * for the Requestor. The Requestor calls these when it needs
- * something to be done.
- *************************************************************************/
-void startSubscription(void * cbObj, Signal*, int type);
-void scanSubscription(void * cbObj, Signal*, int type);
-
-#endif
diff --git a/storage/ndb/src/kernel/blocks/grep/GrepInit.cpp b/storage/ndb/src/kernel/blocks/grep/GrepInit.cpp
deleted file mode 100644
index d764fb1f473..00000000000
--- a/storage/ndb/src/kernel/blocks/grep/GrepInit.cpp
+++ /dev/null
@@ -1,164 +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 "Grep.hpp"
-#include <Properties.hpp>
-#include <Configuration.hpp>
-
-/*****************************************************************************
- * Grep Participant
- *****************************************************************************/
-#if 0
-GrepParticipant::GrepParticipant(const Configuration & conf) :
- SimulatedBlock(GREP, conf)
-{
- BLOCK_CONSTRUCTOR(Grep);
- //m_repRef = 0;
- m_latestSeenGCI = 0;
-}
-
-GrepParticipant::~GrepParticipant()
-{
-}
-
-BLOCK_FUNCTIONS(GrepParticipant);
-#endif
-
-/*****************************************************************************
- * Grep Coordinator
- *****************************************************************************/
-Grep::Grep(const Configuration & conf) :
- // GrepParticipant(conf),
- SimulatedBlock(GREP, conf),
- m_nodes(m_nodePool),
- pscoord(this),
- pspart(this)
-{
- m_nodePool.setSize(MAX_NDB_NODES);
- m_masterNodeId = getOwnNodeId();
-
- /***************************************************************************
- * General Signals
- ***************************************************************************/
- addRecSignal(GSN_STTOR, &Grep::execSTTOR);
- addRecSignal(GSN_NDB_STTOR, &Grep::execNDB_STTOR);
- addRecSignal(GSN_DUMP_STATE_ORD, &Grep::execDUMP_STATE_ORD);
- addRecSignal(GSN_READ_NODESCONF, &Grep::execREAD_NODESCONF);
- addRecSignal(GSN_NODE_FAILREP, &Grep::execNODE_FAILREP);
- addRecSignal(GSN_INCL_NODEREQ, &Grep::execINCL_NODEREQ);
-
- addRecSignal(GSN_GREP_REQ, &Grep::execGREP_REQ);
- addRecSignal(GSN_API_FAILREQ, &Grep::execAPI_FAILREQ);
-
-
- /***************************************************************************
- * Grep::PSCoord Signal Interface
- ***************************************************************************/
- /**
- * From Grep::PSPart
- */
- addRecSignal(GSN_GREP_CREATE_CONF, &Grep::fwdGREP_CREATE_CONF);
- addRecSignal(GSN_GREP_START_CONF, &Grep::fwdGREP_START_CONF);
- addRecSignal(GSN_GREP_SYNC_CONF, &Grep::fwdGREP_SYNC_CONF);
- addRecSignal(GSN_GREP_REMOVE_CONF, &Grep::fwdGREP_REMOVE_CONF);
-
- addRecSignal(GSN_GREP_CREATE_REF, &Grep::fwdGREP_CREATE_REF);
- addRecSignal(GSN_GREP_START_REF, &Grep::fwdGREP_START_REF);
- addRecSignal(GSN_GREP_REMOVE_REF, &Grep::fwdGREP_REMOVE_REF);
-
- /**
- * From Grep::SSCoord to Grep::PSCoord
- */
- addRecSignal(GSN_GREP_SUB_START_REQ, &Grep::fwdGREP_SUB_START_REQ);
- addRecSignal(GSN_GREP_SUB_CREATE_REQ, &Grep::fwdGREP_SUB_CREATE_REQ);
- addRecSignal(GSN_GREP_SUB_SYNC_REQ, &Grep::fwdGREP_SUB_SYNC_REQ);
- addRecSignal(GSN_GREP_SUB_REMOVE_REQ, &Grep::fwdGREP_SUB_REMOVE_REQ);
- addRecSignal(GSN_GREP_CREATE_SUBID_REQ, &Grep::fwdGREP_CREATE_SUBID_REQ);
-
- /****************************************************************************
- * PSPart
- ***************************************************************************/
- /**
- * From SUMA to GREP PS Participant. If suma is not a coodinator
- */
- addRecSignal(GSN_SUB_START_CONF, &Grep::fwdSUB_START_CONF);
- addRecSignal(GSN_SUB_CREATE_CONF, &Grep::fwdSUB_CREATE_CONF);
- addRecSignal(GSN_SUB_SYNC_CONF, &Grep::fwdSUB_SYNC_CONF);
- addRecSignal(GSN_SUB_REMOVE_CONF, &Grep::fwdSUB_REMOVE_CONF);
- addRecSignal(GSN_SUB_CREATE_REF, &Grep::fwdSUB_CREATE_REF);
- addRecSignal(GSN_SUB_START_REF, &Grep::fwdSUB_START_REF);
- addRecSignal(GSN_SUB_SYNC_REF, &Grep::fwdSUB_SYNC_REF);
- addRecSignal(GSN_SUB_REMOVE_REF, &Grep::fwdSUB_REMOVE_REF);
-
- addRecSignal(GSN_SUB_SYNC_CONTINUE_REQ,
- &Grep::fwdSUB_SYNC_CONTINUE_REQ);
-
- /**
- * From Suma to Grep::PSPart. Data signals.
- */
- addRecSignal(GSN_SUB_META_DATA, &Grep::fwdSUB_META_DATA);
- addRecSignal(GSN_SUB_TABLE_DATA, &Grep::fwdSUB_TABLE_DATA);
- addRecSignal(GSN_SUB_GCP_COMPLETE_REP, &Grep::fwdSUB_GCP_COMPLETE_REP);
-
- /**
- * From Grep::PSCoord to Grep::PSPart
- */
- addRecSignal(GSN_GREP_CREATE_REQ, &Grep::fwdGREP_CREATE_REQ);
- addRecSignal(GSN_GREP_START_REQ, &Grep::fwdGREP_START_REQ);
- addRecSignal(GSN_GREP_REMOVE_REQ, &Grep::fwdGREP_REMOVE_REQ);
- addRecSignal(GSN_GREP_SYNC_REQ, &Grep::fwdGREP_SYNC_REQ);
- addRecSignal(GSN_CREATE_SUBID_CONF, &Grep::fwdCREATE_SUBID_CONF);
- addRecSignal(GSN_GREP_START_ME, &Grep::fwdSTART_ME);
- addRecSignal(GSN_GREP_ADD_SUB_REQ, &Grep::fwdGREP_ADD_SUB_REQ);
- addRecSignal(GSN_GREP_ADD_SUB_REF, &Grep::fwdGREP_ADD_SUB_REF);
- addRecSignal(GSN_GREP_ADD_SUB_CONF, &Grep::fwdGREP_ADD_SUB_CONF);
-}
-
-Grep::~Grep()
-{
-}
-
-BLOCK_FUNCTIONS(Grep)
-
-Grep::PSPart::PSPart(Grep * sb) :
- BlockComponent(sb),
- c_subscriptions(c_subscriptionPool)
-{
- m_grep = sb;
-
- m_firstScanGCI = 1; // Empty interval = [1,0]
- m_lastScanGCI = 0;
-
- m_latestSeenGCI = 0;
-
- c_subscriptions.setSize(10);
- c_subscriptionPool.setSize(10);
-}
-
-Grep::PSCoord::PSCoord(Grep * sb) :
- BlockComponent(sb),
- c_runningSubscriptions(c_subCoordinatorPool)
-{
- m_grep = sb;
- c_runningSubscriptions.setSize(10);
- c_subCoordinatorPool.setSize(2);
-}
-
-//BLOCK_FUNCTIONS(Grep::PSCoord);
-
-BlockComponent::BlockComponent(SimulatedBlock * sb) {
- m_sb = sb;
-}
diff --git a/storage/ndb/src/kernel/blocks/grep/Makefile.am b/storage/ndb/src/kernel/blocks/grep/Makefile.am
deleted file mode 100644
index 92d75d002a5..00000000000
--- a/storage/ndb/src/kernel/blocks/grep/Makefile.am
+++ /dev/null
@@ -1,23 +0,0 @@
-noinst_LIBRARIES = libgrep.a
-
-libgrep_a_SOURCES = Grep.cpp GrepInit.cpp
-
-include $(top_srcdir)/storage/ndb/config/common.mk.am
-include $(top_srcdir)/storage/ndb/config/type_kernel.mk.am
-
-# Don't update the files from bitkeeper
-%::SCCS/s.%
-
-windoze-dsp: libgrep.dsp
-
-libgrep.dsp: Makefile \
- $(top_srcdir)/storage/ndb/config/win-lib.am \
- $(top_srcdir)/storage/ndb/config/win-name \
- $(top_srcdir)/storage/ndb/config/win-includes \
- $(top_srcdir)/storage/ndb/config/win-sources \
- $(top_srcdir)/storage/ndb/config/win-libraries
- cat $(top_srcdir)/storage/ndb/config/win-lib.am > $@
- @$(top_srcdir)/storage/ndb/config/win-name $@ $(noinst_LIBRARIES)
- @$(top_srcdir)/storage/ndb/config/win-includes $@ $(INCLUDES)
- @$(top_srcdir)/storage/ndb/config/win-sources $@ $(libgrep_a_SOURCES)
- @$(top_srcdir)/storage/ndb/config/win-libraries $@ LIB $(LDADD)
diff --git a/storage/ndb/src/kernel/blocks/grep/systab_test/Makefile b/storage/ndb/src/kernel/blocks/grep/systab_test/Makefile
deleted file mode 100644
index bd69e0f3799..00000000000
--- a/storage/ndb/src/kernel/blocks/grep/systab_test/Makefile
+++ /dev/null
@@ -1,12 +0,0 @@
-include .defs.mk
-
-TYPE := kernel
-
-BIN_TARGET := grep_systab_test
-BIN_TARGET_ARCHIVES := portlib general
-
-CCFLAGS_LOC += -I..
-
-SOURCES = ../GrepSystemTable.cpp grep_systab_test.cpp
-
-include $(NDB_TOP)/Epilogue.mk
diff --git a/storage/ndb/src/kernel/blocks/grep/systab_test/grep_systab_test.cpp b/storage/ndb/src/kernel/blocks/grep/systab_test/grep_systab_test.cpp
deleted file mode 100644
index e3a77af4e4e..00000000000
--- a/storage/ndb/src/kernel/blocks/grep/systab_test/grep_systab_test.cpp
+++ /dev/null
@@ -1,138 +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 */
-
-/**
- * Unit Test for GrepSystemTable
- */
-
-#include "../GrepSystemTable.hpp"
-#include <SimulatedBlock.hpp>
-
-#define EXEC(X) ( ndbout << endl, ndbout_c(#X), X )
-
-int
-main () {
- GrepSystemTable st;
-
- Uint32 f, l;
-
- ndbout_c("*************************************");
- ndbout_c("* GrepSystemTable Unit Test Program *");
- ndbout_c("*************************************");
-
- ndbout_c("--------------------------------------------------------");
- ndbout_c("Test 1: Clear");
- ndbout_c("--------------------------------------------------------");
-
- EXEC(st.set(GrepSystemTable::PS, 22, 26));
- st.print();
- st.require(GrepSystemTable::PS, 22, 26);
-
- EXEC(st.clear(GrepSystemTable::PS, 20, 24));
- st.print();
- st.require(GrepSystemTable::PS, 25, 26);
-
- EXEC(st.clear(GrepSystemTable::PS, 0, 100));
- st.print();
- st.require(GrepSystemTable::PS, 1, 0);
-
- EXEC(st.set(GrepSystemTable::PS, 22, 26));
- st.print();
- st.require(GrepSystemTable::PS, 22, 26);
-
- EXEC(st.clear(GrepSystemTable::PS, 24, 28));
- st.print();
- st.require(GrepSystemTable::PS, 22, 23);
-
- EXEC(st.clear(GrepSystemTable::PS, 0, 100));
- st.print();
- st.require(GrepSystemTable::PS, 1, 0);
-
- EXEC(st.set(GrepSystemTable::PS, 22, 26));
- st.print();
- st.require(GrepSystemTable::PS, 22, 26);
-
- EXEC(st.clear(GrepSystemTable::PS, 24, 26));
- st.print();
- st.require(GrepSystemTable::PS, 22, 23);
-
- EXEC(st.clear(GrepSystemTable::PS, 0, 100));
- st.print();
- st.require(GrepSystemTable::PS, 1, 0);
-
- EXEC(st.set(GrepSystemTable::PS, 22, 26));
- st.print();
- st.require(GrepSystemTable::PS, 22, 26);
-
- EXEC(st.clear(GrepSystemTable::PS, 22, 24));
- st.print();
- st.require(GrepSystemTable::PS, 25, 26);
-
- ndbout_c("--------------------------------------------------------");
- ndbout_c("Test 2: PS --> SSreq");
- ndbout_c("--------------------------------------------------------");
-
- EXEC(st.set(GrepSystemTable::PS, 22, 26));
- st.print();
- st.require(GrepSystemTable::PS, 22, 26);
- st.require(GrepSystemTable::SSReq, 1, 0);
-
- if (!EXEC(st.copy(GrepSystemTable::PS, GrepSystemTable::SSReq, 3, &f, &l)))
- ndbout_c("%s:%d: Illegal copy!", __FILE__, __FILE__);
- ndbout_c("f=%d, l=%d", f, l);
- st.print();
- st.require(GrepSystemTable::PS, 22, 26);
- st.require(GrepSystemTable::SSReq, 22, 24);
-
- EXEC(st.clear(GrepSystemTable::PS, 22, 22));
- st.print();
- st.require(GrepSystemTable::PS, 23, 26);
- st.require(GrepSystemTable::SSReq, 22, 24);
-
- if (!EXEC(st.copy(GrepSystemTable::PS, GrepSystemTable::SSReq, 2, &f, &l)))
- ndbout_c("%s:%d: Illegal copy!", __FILE__, __LINE__);
- ndbout_c("f=%d, l=%d", f, l);
- st.print();
- st.require(GrepSystemTable::PS, 23, 26);
- st.require(GrepSystemTable::SSReq, 22, 26);
-
- st.set(GrepSystemTable::SS, 7, 9);
- st.set(GrepSystemTable::InsReq, 7, 9);
- if (EXEC(st.movable(GrepSystemTable::SS, GrepSystemTable::InsReq)))
- ndbout_c("%s:%d: Illegal move!", __FILE__, __LINE__);
- st.print();
- st.require(GrepSystemTable::SS, 7, 9);
- st.require(GrepSystemTable::InsReq, 7, 9);
-
- EXEC(st.intervalMinus(7, 9, 7, 7, &f, &l));
- ndbout_c("f=%d, l=%d", f, l);
-
- st.clear(GrepSystemTable::InsReq, 8, 9);
- st.require(GrepSystemTable::SS, 7, 9);
- st.require(GrepSystemTable::InsReq, 7, 7);
- if (EXEC(st.movable(GrepSystemTable::SS, GrepSystemTable::InsReq)) != 2)
- ndbout_c("%s:%d: Illegal move!", __FILE__, __LINE__);
- st.print();
-
- EXEC(st.copy(GrepSystemTable::SS, GrepSystemTable::InsReq, &f));
- st.print();
- st.require(GrepSystemTable::SS, 7, 9);
- st.require(GrepSystemTable::InsReq, 7, 8);
-
- ndbout_c("--------------------------------------------------------");
- ndbout_c("Test completed");
- ndbout_c("--------------------------------------------------------");
-}
diff --git a/storage/ndb/src/kernel/blocks/ndbcntr/NdbcntrMain.cpp b/storage/ndb/src/kernel/blocks/ndbcntr/NdbcntrMain.cpp
index 524a40697bf..c837321a52d 100644
--- a/storage/ndb/src/kernel/blocks/ndbcntr/NdbcntrMain.cpp
+++ b/storage/ndb/src/kernel/blocks/ndbcntr/NdbcntrMain.cpp
@@ -76,7 +76,6 @@ static BlockInfo ALL_BLOCKS[] = {
{ BACKUP_REF, 1 , 10000, 10999 },
{ DBUTIL_REF, 1 , 11000, 11999 },
{ SUMA_REF, 1 , 13000, 13999 },
- { GREP_REF, 1 , 0, 0 },
{ DBTUX_REF, 1 , 12000, 12999 }
};
@@ -1453,9 +1452,6 @@ void Ndbcntr::execNODE_FAILREP(Signal* signal)
sendSignal(SUMA_REF, GSN_NODE_FAILREP, signal,
NodeFailRep::SignalLength, JBB);
- sendSignal(GREP_REF, GSN_NODE_FAILREP, signal,
- NodeFailRep::SignalLength, JBB);
-
Uint32 nodeId = 0;
while(!allFailed.isclear()){
nodeId = allFailed.find(nodeId + 1);
@@ -2377,7 +2373,6 @@ void Ndbcntr::execREAD_CONFIG_CONF(Signal* signal){
void Ndbcntr::execSTART_ORD(Signal* signal){
jamEntry();
- ndbrequire(NO_OF_BLOCKS == ALL_BLOCKS_SZ);
c_missra.execSTART_ORD(signal);
}
@@ -2452,7 +2447,7 @@ void Ndbcntr::Missra::sendNextREAD_CONFIG_REQ(Signal* signal){
* Finished...
*/
currentStartPhase = 0;
- for(Uint32 i = 0; i<NO_OF_BLOCKS; i++){
+ for(Uint32 i = 0; i<ALL_BLOCKS_SZ; i++){
if(ALL_BLOCKS[i].NextSP < currentStartPhase)
currentStartPhase = ALL_BLOCKS[i].NextSP;
}
diff --git a/storage/ndb/src/kernel/blocks/qmgr/Qmgr.hpp b/storage/ndb/src/kernel/blocks/qmgr/Qmgr.hpp
index 2f4fcd21460..f84fae02fc4 100644
--- a/storage/ndb/src/kernel/blocks/qmgr/Qmgr.hpp
+++ b/storage/ndb/src/kernel/blocks/qmgr/Qmgr.hpp
@@ -219,6 +219,7 @@ private:
void execAPI_VERSION_REQ(Signal* signal);
+ void execAPI_BROADCAST_REP(Signal* signal);
// Arbitration signals
void execARBIT_CFG(Signal* signal);
diff --git a/storage/ndb/src/kernel/blocks/qmgr/QmgrInit.cpp b/storage/ndb/src/kernel/blocks/qmgr/QmgrInit.cpp
index ecaeadff47a..4061455092d 100644
--- a/storage/ndb/src/kernel/blocks/qmgr/QmgrInit.cpp
+++ b/storage/ndb/src/kernel/blocks/qmgr/QmgrInit.cpp
@@ -83,7 +83,8 @@ Qmgr::Qmgr(const class Configuration & conf)
addRecSignal(GSN_API_FAILCONF, &Qmgr::execAPI_FAILCONF);
addRecSignal(GSN_READ_NODESREQ, &Qmgr::execREAD_NODESREQ);
addRecSignal(GSN_SET_VAR_REQ, &Qmgr::execSET_VAR_REQ);
-
+ addRecSignal(GSN_API_BROADCAST_REP, &Qmgr::execAPI_BROADCAST_REP);
+
// Arbitration signals
addRecSignal(GSN_ARBIT_PREPREQ, &Qmgr::execARBIT_PREPREQ);
addRecSignal(GSN_ARBIT_PREPCONF, &Qmgr::execARBIT_PREPCONF);
diff --git a/storage/ndb/src/kernel/blocks/qmgr/QmgrMain.cpp b/storage/ndb/src/kernel/blocks/qmgr/QmgrMain.cpp
index d062f5afb7e..7052e0da98a 100644
--- a/storage/ndb/src/kernel/blocks/qmgr/QmgrMain.cpp
+++ b/storage/ndb/src/kernel/blocks/qmgr/QmgrMain.cpp
@@ -34,6 +34,7 @@
#include <signaldata/BlockCommitOrd.hpp>
#include <signaldata/FailRep.hpp>
#include <signaldata/DisconnectRep.hpp>
+#include <signaldata/ApiBroadcast.hpp>
#include <ndb_version.h>
@@ -1703,16 +1704,6 @@ void Qmgr::sendApiFailReq(Signal* signal, Uint16 failedNodeNo)
sendSignal(DBDICT_REF, GSN_API_FAILREQ, signal, 2, JBA);
sendSignal(SUMA_REF, GSN_API_FAILREQ, signal, 2, JBA);
- /**
- * GREP also need the information that an API node
- * (actually a REP node) has failed.
- *
- * GREP does however NOT send a CONF on this signal, i.e.
- * the API_FAILREQ signal to GREP is like a REP signal
- * (i.e. without any confirmation).
- */
- sendSignal(GREP_REF, GSN_API_FAILREQ, signal, 2, JBA);
-
/**-------------------------------------------------------------------------
* THE OTHER NODE WAS AN API NODE. THE COMMUNICATION LINK IS ALREADY
* BROKEN AND THUS NO ACTION IS NEEDED TO BREAK THE CONNECTION.
@@ -3926,3 +3917,30 @@ void Qmgr::execSET_VAR_REQ(Signal* signal)
}// switch
#endif
}//execSET_VAR_REQ()
+
+void
+Qmgr::execAPI_BROADCAST_REP(Signal* signal)
+{
+ jamEntry();
+ ApiBroadcastRep api= *(const ApiBroadcastRep*)signal->getDataPtr();
+
+ Uint32 len = signal->getLength() - ApiBroadcastRep::SignalLength;
+ memmove(signal->theData, signal->theData+ApiBroadcastRep::SignalLength,
+ 4*len);
+
+ NodeBitmask mask;
+ NodeRecPtr nodePtr;
+ for (nodePtr.i = 1; nodePtr.i < MAX_NODES; nodePtr.i++)
+ {
+ jam();
+ ptrAss(nodePtr, nodeRec);
+ if (nodePtr.p->phase == ZAPI_ACTIVE &&
+ getNodeInfo(nodePtr.i).m_version >= api.minVersion)
+ {
+ mask.set(nodePtr.i);
+ }
+ }
+
+ NodeReceiverGroup rg(API_CLUSTERMGR, mask);
+ sendSignal(rg, api.gsn, signal, len, JBB); // forward sections
+}
diff --git a/storage/ndb/src/kernel/blocks/suma/Suma.cpp b/storage/ndb/src/kernel/blocks/suma/Suma.cpp
index ed54505b729..c4225ad2a4c 100644
--- a/storage/ndb/src/kernel/blocks/suma/Suma.cpp
+++ b/storage/ndb/src/kernel/blocks/suma/Suma.cpp
@@ -2185,7 +2185,8 @@ SumaParticipant::execSUB_START_REQ(Signal* signal){
case SubCreateReq::DatabaseSnapshot:
case SubCreateReq::SelectiveTableSnapshot:
jam();
- subbPtr.p->m_subscriberRef = GREP_REF;
+ ndbrequire(false);
+ //subbPtr.p->m_subscriberRef = GREP_REF;
subbPtr.p->m_subscriberData = subPtr.p->m_subscriberData;
break;
case SubCreateReq::SingleTableScan:
@@ -3018,16 +3019,6 @@ SumaParticipant::execSUB_GCP_COMPLETE_REP(Signal* signal){
c_lastCompleteGCI = gci;
/**
- * always send SUB_GCP_COMPLETE_REP to Grep (so
- * Lars can do funky stuff calculating intervals,
- * even before the subscription is started
- */
- rep->senderRef = reference();
- rep->senderData = 0; //ignored in grep
- EXECUTE_DIRECT(refToBlock(GREP_REF), GSN_SUB_GCP_COMPLETE_REP, signal,
- SubGcpCompleteRep::SignalLength);
-
- /**
* Signal to subscriber(s)
*/
@@ -3051,13 +3042,6 @@ SumaParticipant::execSUB_GCP_COMPLETE_REP(Signal* signal){
ndbout_c("GSN_SUB_GCP_COMPLETE_REP to %s:",
getBlockName(refToBlock(ref)));
#else
- /**
- * Ignore sending to GREP (since we sent earlier)
- */
- if (ref == GREP_REF) {
- jam();
- continue;
- }
CRASH_INSERTION(13018);
diff --git a/storage/ndb/src/kernel/vm/SimulatedBlock.cpp b/storage/ndb/src/kernel/vm/SimulatedBlock.cpp
index 35c0781a24d..ef9f2c3c716 100644
--- a/storage/ndb/src/kernel/vm/SimulatedBlock.cpp
+++ b/storage/ndb/src/kernel/vm/SimulatedBlock.cpp
@@ -1802,3 +1802,118 @@ SimulatedBlock::init_globals_list(void ** tmp, size_t cnt){
}
#endif
+
+#include "KeyDescriptor.hpp"
+
+Uint32
+SimulatedBlock::xfrm_key(Uint32 tab, const Uint32* src,
+ Uint32 *dst, Uint32 dstSize,
+ Uint32 keyPartLen[MAX_ATTRIBUTES_IN_INDEX]) const
+{
+ const KeyDescriptor * desc = g_key_descriptor_pool.getPtr(tab);
+ const Uint32 noOfKeyAttr = desc->noOfKeyAttr;
+
+ Uint32 i = 0;
+ Uint32 srcPos = 0;
+ Uint32 dstPos = 0;
+ while (i < noOfKeyAttr)
+ {
+ const KeyDescriptor::KeyAttr& keyAttr = desc->keyAttr[i];
+
+ Uint32 srcBytes =
+ AttributeDescriptor::getSizeInBytes(keyAttr.attributeDescriptor);
+ Uint32 srcWords = (srcBytes + 3) / 4;
+ Uint32 dstWords = ~0;
+ uchar* dstPtr = (uchar*)&dst[dstPos];
+ const uchar* srcPtr = (const uchar*)&src[srcPos];
+ CHARSET_INFO* cs = keyAttr.charsetInfo;
+
+ if (cs == NULL)
+ {
+ jam();
+ memcpy(dstPtr, srcPtr, srcWords << 2);
+ dstWords = srcWords;
+ }
+ else
+ {
+ jam();
+ Uint32 typeId =
+ AttributeDescriptor::getType(keyAttr.attributeDescriptor);
+ Uint32 lb, len;
+ bool ok = NdbSqlUtil::get_var_length(typeId, srcPtr, srcBytes, lb, len);
+ ndbrequire(ok);
+ Uint32 xmul = cs->strxfrm_multiply;
+ if (xmul == 0)
+ xmul = 1;
+ /*
+ * Varchar is really Char. End spaces do not matter. To get
+ * same hash we blank-pad to maximum length via strnxfrm.
+ * TODO use MySQL charset-aware hash function instead
+ */
+ Uint32 dstLen = xmul * (srcBytes - lb);
+ ndbrequire(dstLen <= ((dstSize - dstPos) << 2));
+ int n = NdbSqlUtil::strnxfrm_bug7284(cs, dstPtr, dstLen, srcPtr + lb, len);
+ ndbrequire(n != -1);
+ while ((n & 3) != 0)
+ {
+ dstPtr[n++] = 0;
+ }
+ dstWords = (n >> 2);
+ }
+ dstPos += dstWords;
+ srcPos += srcWords;
+ keyPartLen[i++] = dstWords;
+ }
+
+ return dstPos;
+}
+
+Uint32
+SimulatedBlock::create_distr_key(Uint32 tableId,
+ Uint32 *data,
+ const Uint32
+ keyPartLen[MAX_ATTRIBUTES_IN_INDEX]) const
+{
+ const KeyDescriptor* desc = g_key_descriptor_pool.getPtr(tableId);
+ const Uint32 noOfKeyAttr = desc->noOfKeyAttr;
+ Uint32 noOfDistrKeys = desc->noOfDistrKeys;
+
+ Uint32 *src = data;
+ Uint32 *dst = data;
+ Uint32 i = 0;
+ Uint32 dstPos = 0;
+
+ if(keyPartLen)
+ {
+ while (i < noOfKeyAttr && noOfDistrKeys)
+ {
+ Uint32 attr = desc->keyAttr[i].attributeDescriptor;
+ Uint32 len = keyPartLen[i];
+ if(AttributeDescriptor::getDKey(attr))
+ {
+ noOfDistrKeys--;
+ memmove(dst+dstPos, src, len << 2);
+ dstPos += len;
+ }
+ src += len;
+ i++;
+ }
+ }
+ else
+ {
+ while (i < noOfKeyAttr && noOfDistrKeys)
+ {
+ Uint32 attr = desc->keyAttr[i].attributeDescriptor;
+ Uint32 len = AttributeDescriptor::getSizeInWords(attr);
+ if(AttributeDescriptor::getDKey(attr))
+ {
+ noOfDistrKeys--;
+ memmove(dst+dstPos, src, len << 2);
+ dstPos += len;
+ }
+ src += len;
+ i++;
+ }
+ }
+ return dstPos;
+}
diff --git a/storage/ndb/src/kernel/vm/SimulatedBlock.hpp b/storage/ndb/src/kernel/vm/SimulatedBlock.hpp
index 787d14ca5cb..50c85a0b274 100644
--- a/storage/ndb/src/kernel/vm/SimulatedBlock.hpp
+++ b/storage/ndb/src/kernel/vm/SimulatedBlock.hpp
@@ -20,11 +20,13 @@
#include <NdbTick.h>
#include <kernel_types.h>
#include <ndb_version.h>
+#include <ndb_limits.h>
#include "VMSignal.hpp"
#include <RefConvert.hpp>
#include <BlockNumbers.h>
#include <GlobalSignalNumbers.h>
+
#include "pc.hpp"
#include <NodeInfo.hpp>
#include <NodeState.hpp>
@@ -385,6 +387,24 @@ protected:
*/
const NodeInfo & getNodeInfo(NodeId nodeId) const;
NodeInfo & setNodeInfo(NodeId);
+
+ /**********************
+ * Xfrm stuff
+ */
+
+ /**
+ * @return length
+ */
+ Uint32 xfrm_key(Uint32 tab, const Uint32* src,
+ Uint32 *dst, Uint32 dstLen,
+ Uint32 keyPartLen[MAX_ATTRIBUTES_IN_INDEX]) const;
+
+ /**
+ *
+ */
+ Uint32 create_distr_key(Uint32 tableId,
+ Uint32 *data,
+ const Uint32 keyPaLen[MAX_ATTRIBUTES_IN_INDEX])const;
private:
NewVARIABLE* NewVarRef; /* New Base Address Table for block */
diff --git a/storage/ndb/src/mgmapi/mgmapi.cpp b/storage/ndb/src/mgmapi/mgmapi.cpp
index 1cfc46ae078..c10eb073855 100644
--- a/storage/ndb/src/mgmapi/mgmapi.cpp
+++ b/storage/ndb/src/mgmapi/mgmapi.cpp
@@ -335,15 +335,21 @@ ndb_mgm_call(NdbMgmHandle handle, const ParserRow<ParserDummy> *command_reply,
const Properties* p = parser.parse(ctx, session);
if (p == NULL){
- /**
- * Print some info about why the parser returns NULL
- */
- fprintf(handle->errstream,
- "Error in mgm protocol parser. cmd: >%s< status: %d curr: %d\n",
- cmd, (Uint32)ctx.m_status, ctx.m_currentToken);
- DBUG_PRINT("info",("ctx.status: %d, ctx.m_currentToken: %s",
- ctx.m_status, ctx.m_currentToken));
- }
+ if(!ndb_mgm_is_connected(handle)) {
+ return NULL;
+ }
+ else
+ {
+ /**
+ * Print some info about why the parser returns NULL
+ */
+ fprintf(handle->errstream,
+ "Error in mgm protocol parser. cmd: >%s< status: %d curr: %d\n",
+ cmd, (Uint32)ctx.m_status, ctx.m_currentToken);
+ DBUG_PRINT("info",("ctx.status: %d, ctx.m_currentToken: %s",
+ ctx.m_status, ctx.m_currentToken));
+ }
+ }
#ifdef MGMAPI_LOG
else {
/**
@@ -363,6 +369,15 @@ int ndb_mgm_is_connected(NdbMgmHandle handle)
{
if(!handle)
return 0;
+
+ if(handle->connected)
+ {
+ if(Ndb_check_socket_hup(handle->socket))
+ {
+ handle->connected= 0;
+ NDB_CLOSE_SOCKET(handle->socket);
+ }
+ }
return handle->connected;
}
diff --git a/storage/ndb/src/mgmsrv/MgmtSrvr.cpp b/storage/ndb/src/mgmsrv/MgmtSrvr.cpp
index 51356cb75b1..14d4f768c86 100644
--- a/storage/ndb/src/mgmsrv/MgmtSrvr.cpp
+++ b/storage/ndb/src/mgmsrv/MgmtSrvr.cpp
@@ -2581,44 +2581,7 @@ MgmtSrvr::backupCallback(BackupEvent & event)
int
MgmtSrvr::repCommand(Uint32* repReqId, Uint32 request, bool waitCompleted)
{
- bool next;
- NodeId nodeId = 0;
-
- while((next = getNextNodeId(&nodeId, NDB_MGM_NODE_TYPE_NDB)) == true &&
- theFacade->get_node_alive(nodeId) == false);
-
- if(!next){
- return NO_CONTACT_WITH_DB_NODES;
- }
-
- NdbApiSignal* signal = getSignal();
- if (signal == NULL) {
- return COULD_NOT_ALLOCATE_MEMORY;
- }
-
- GrepReq* req = CAST_PTR(GrepReq, signal->getDataPtrSend());
- signal->set(TestOrd::TraceAPI, GREP, GSN_GREP_REQ, GrepReq::SignalLength);
- req->senderRef = _ownReference;
- req->request = request;
-
- int result;
- if (waitCompleted)
- result = sendRecSignal(nodeId, NO_WAIT, signal, true);
- else
- result = sendRecSignal(nodeId, NO_WAIT, signal, true);
- if (result == -1) {
- return SEND_OR_RECEIVE_FAILED;
- }
-
- /**
- * @todo
- * Maybe add that we should receive a confirmation that the
- * request was received ok.
- * Then we should give the user the correct repReqId.
- */
-
- *repReqId = 4711;
-
+ abort();
return 0;
}
diff --git a/storage/ndb/src/ndbapi/DictCache.cpp b/storage/ndb/src/ndbapi/DictCache.cpp
index 3d14df908a0..57d9b361522 100644
--- a/storage/ndb/src/ndbapi/DictCache.cpp
+++ b/storage/ndb/src/ndbapi/DictCache.cpp
@@ -21,6 +21,9 @@
#include <NdbCondition.h>
#include <NdbSleep.h>
+static NdbTableImpl f_invalid_table;
+static NdbTableImpl f_altered_table;
+
Ndb_local_table_info *
Ndb_local_table_info::create(NdbTableImpl *table_impl, Uint32 sz)
{
@@ -203,21 +206,41 @@ GlobalDictCache::put(const char * name, NdbTableImpl * tab)
TableVersion & ver = vers->back();
if(ver.m_status != RETREIVING ||
- ver.m_impl != 0 ||
+ !(ver.m_impl == 0 ||
+ ver.m_impl == &f_invalid_table || ver.m_impl == &f_altered_table) ||
ver.m_version != 0 ||
ver.m_refCount == 0){
abort();
}
- if(tab == 0){
+ if(tab == 0)
+ {
DBUG_PRINT("info", ("No table found in db"));
vers->erase(sz - 1);
- } else {
+ }
+ else if (ver.m_impl == 0) {
ver.m_impl = tab;
ver.m_version = tab->m_version;
ver.m_status = OK;
+ }
+ else if (ver.m_impl == &f_invalid_table)
+ {
+ ver.m_impl = tab;
+ ver.m_version = tab->m_version;
+ ver.m_status = DROPPED;
+ ver.m_impl->m_status = NdbDictionary::Object::Invalid;
+ }
+ else if(ver.m_impl == &f_altered_table)
+ {
+ ver.m_impl = tab;
+ ver.m_version = tab->m_version;
+ ver.m_status = DROPPED;
+ ver.m_impl->m_status = NdbDictionary::Object::Altered;
+ }
+ else
+ {
+ abort();
}
-
NdbCondition_Broadcast(m_waitForTableCondition);
DBUG_RETURN(tab);
}
@@ -325,4 +348,45 @@ GlobalDictCache::release(NdbTableImpl * tab)
abort();
}
+void
+GlobalDictCache::alter_table_rep(const char * name,
+ Uint32 tableId,
+ Uint32 tableVersion,
+ bool altered)
+{
+ const Uint32 len = strlen(name);
+ Vector<TableVersion> * vers =
+ m_tableHash.getData(name, len);
+
+ if(vers == 0)
+ {
+ return;
+ }
+
+ const Uint32 sz = vers->size();
+ if(sz == 0)
+ {
+ return;
+ }
+
+ for(Uint32 i = 0; i < sz; i++)
+ {
+ TableVersion & ver = (* vers)[i];
+ if(ver.m_version == tableVersion && ver.m_impl &&
+ ver.m_impl->m_tableId == tableId)
+ {
+ ver.m_status = DROPPED;
+ ver.m_impl->m_status = altered ?
+ NdbDictionary::Object::Altered : NdbDictionary::Object::Invalid;
+ return;
+ }
+
+ if(i == sz - 1 && ver.m_status == RETREIVING)
+ {
+ ver.m_impl = altered ? &f_altered_table : &f_invalid_table;
+ return;
+ }
+ }
+}
+
template class Vector<GlobalDictCache::TableVersion>;
diff --git a/storage/ndb/src/ndbapi/DictCache.hpp b/storage/ndb/src/ndbapi/DictCache.hpp
index d9bf810a685..2df6a139542 100644
--- a/storage/ndb/src/ndbapi/DictCache.hpp
+++ b/storage/ndb/src/ndbapi/DictCache.hpp
@@ -68,6 +68,9 @@ public:
NdbTableImpl* put(const char * name, NdbTableImpl *);
void drop(NdbTableImpl *);
void release(NdbTableImpl *);
+
+ void alter_table_rep(const char * name,
+ Uint32 tableId, Uint32 tableVersion, bool altered);
public:
enum Status {
OK = 0,
diff --git a/storage/ndb/src/ndbapi/NdbDictionaryImpl.cpp b/storage/ndb/src/ndbapi/NdbDictionaryImpl.cpp
index 582f4baaef4..529ba09207b 100644
--- a/storage/ndb/src/ndbapi/NdbDictionaryImpl.cpp
+++ b/storage/ndb/src/ndbapi/NdbDictionaryImpl.cpp
@@ -1564,25 +1564,22 @@ int NdbDictionaryImpl::alterTable(NdbTableImpl &impl)
const char * originalInternalName = internalName.c_str();
DBUG_ENTER("NdbDictionaryImpl::alterTable");
- if(!get_local_table_info(internalName, false)){
- m_error.code= 709;
+ Ndb_local_table_info * local = 0;
+ if((local= get_local_table_info(originalInternalName, false)) == 0)
+ {
+ m_error.code = 709;
DBUG_RETURN(-1);
}
+
// Alter the table
int ret = m_receiver.alterTable(m_ndb, impl);
if(ret == 0){
// Remove cached information and let it be refreshed at next access
- if (m_localHash.get(originalInternalName) != NULL) {
- m_localHash.drop(originalInternalName);
- m_globalHash->lock();
- NdbTableImpl * cachedImpl = m_globalHash->get(originalInternalName);
- // If in local cache it must be in global
- if (!cachedImpl)
- abort();
- cachedImpl->m_status = NdbDictionary::Object::Invalid;
- m_globalHash->drop(cachedImpl);
- m_globalHash->unlock();
- }
+ m_globalHash->lock();
+ local->m_table_impl->m_status = NdbDictionary::Object::Invalid;
+ m_globalHash->drop(local->m_table_impl);
+ m_globalHash->unlock();
+ m_localHash.drop(originalInternalName);
}
DBUG_RETURN(ret);
}
diff --git a/storage/ndb/src/ndbapi/TransporterFacade.cpp b/storage/ndb/src/ndbapi/TransporterFacade.cpp
index 20d2b11c0ac..638eae15c24 100644
--- a/storage/ndb/src/ndbapi/TransporterFacade.cpp
+++ b/storage/ndb/src/ndbapi/TransporterFacade.cpp
@@ -35,6 +35,7 @@
#include <ndb_version.h>
#include <SignalLoggerManager.hpp>
#include <kernel/ndb_limits.h>
+#include <signaldata/AlterTable.hpp>
//#define REPORT_TRANSPORTER
//#define API_TRACE;
@@ -309,6 +310,17 @@ execute(void * callbackObj, SignalHeader * const header,
theFacade->theArbitMgr->doStop(theData);
break;
+ case GSN_ALTER_TABLE_REP:
+ {
+ const AlterTableRep* rep = (const AlterTableRep*)theData;
+ theFacade->m_globalDictCache.lock();
+ theFacade->m_globalDictCache.
+ alter_table_rep((const char*)ptr[0].p,
+ rep->tableId,
+ rep->tableVersion,
+ rep->changeType == AlterTableRep::CT_ALTERED);
+ theFacade->m_globalDictCache.unlock();
+ }
default:
break;
diff --git a/storage/ndb/test/ndbapi/testGrep.cpp b/storage/ndb/test/ndbapi/testGrep.cpp
deleted file mode 100644
index 713aefbeafa..00000000000
--- a/storage/ndb/test/ndbapi/testGrep.cpp
+++ /dev/null
@@ -1,540 +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 <NDBT.hpp>
-#include <NDBT_Test.hpp>
-#include <HugoTransactions.hpp>
-#include <UtilTransactions.hpp>
-#include <NdbGrep.hpp>
-
-
-#define CHECK(b) if (!(b)) { \
- g_err << "ERR: "<< step->getName() \
- << " failed on line " << __LINE__ << endl; \
- result = NDBT_FAILED; \
- continue; }
-
-
-int runLoadTable(NDBT_Context* ctx, NDBT_Step* step){
-
- int records = ctx->getNumRecords();
- HugoTransactions hugoTrans(*ctx->getTab());
- if (hugoTrans.loadTable(GETNDB(step), records) != 0){
- return NDBT_FAILED;
- }
- return NDBT_OK;
-}
-
-int runPkUpdate(NDBT_Context* ctx, NDBT_Step* step){
- int loops = ctx->getNumLoops();
- int records = ctx->getNumRecords();
- int batchSize = ctx->getProperty("BatchSize", 1);
- int i = 0;
- HugoTransactions hugoTrans(*ctx->getTab());
- while (i<loops) {
- g_info << "|- " << i << ": ";
- if (hugoTrans.pkUpdateRecords(GETNDB(step), records, batchSize) != 0){
- g_info << endl;
- return NDBT_FAILED;
- }
- i++;
- }
- g_info << endl;
- return NDBT_OK;
-}
-
-int runRestartInitial(NDBT_Context* ctx, NDBT_Step* step){
- NdbRestarter restarter;
-
- Ndb* pNdb = GETNDB(step);
-
- const NdbDictionary::Table *tab = ctx->getTab();
- pNdb->getDictionary()->dropTable(tab->getName());
-
- if (restarter.restartAll(true) != 0)
- return NDBT_FAILED;
-
- return NDBT_OK;
-}
-
-int runRestarter(NDBT_Context* ctx, NDBT_Step* step){
- int result = NDBT_OK;
- int loops = ctx->getNumLoops();
- NdbRestarter restarter;
- int i = 0;
- int lastId = 0;
-
- if (restarter.getNumDbNodes() < 2){
- ctx->stopTest();
- return NDBT_OK;
- }
-
- if(restarter.waitClusterStarted(60) != 0){
- g_err << "Cluster failed to start" << endl;
- return NDBT_FAILED;
- }
-
- loops *= restarter.getNumDbNodes();
- while(i<loops && result != NDBT_FAILED && !ctx->isTestStopped()){
-
- int id = lastId % restarter.getNumDbNodes();
- int nodeId = restarter.getDbNodeId(id);
- ndbout << "Restart node " << nodeId << endl;
- if(restarter.restartOneDbNode(nodeId) != 0){
- g_err << "Failed to restartNextDbNode" << endl;
- result = NDBT_FAILED;
- break;
- }
-
- if(restarter.waitClusterStarted(60) != 0){
- g_err << "Cluster failed to start" << endl;
- result = NDBT_FAILED;
- break;
- }
-
- NdbSleep_SecSleep(1);
-
- lastId++;
- i++;
- }
-
- ctx->stopTest();
-
- return result;
-}
-
-int runCheckAllNodesStarted(NDBT_Context* ctx, NDBT_Step* step){
- NdbRestarter restarter;
-
- if(restarter.waitClusterStarted(1) != 0){
- g_err << "All nodes was not started " << endl;
- return NDBT_FAILED;
- }
-
- return NDBT_OK;
-}
-
-
-bool testMaster = true;
-bool testSlave = false;
-
-int setMaster(NDBT_Context* ctx, NDBT_Step* step){
- testMaster = true;
- testSlave = false;
- return NDBT_OK;
-}
-int setMasterAsSlave(NDBT_Context* ctx, NDBT_Step* step){
- testMaster = true;
- testSlave = true;
- return NDBT_OK;
-}
-int setSlave(NDBT_Context* ctx, NDBT_Step* step){
- testMaster = false;
- testSlave = true;
- return NDBT_OK;
-}
-
-int runAbort(NDBT_Context* ctx, NDBT_Step* step){
-
-
- NdbGrep grep(GETNDB(step)->getNodeId()+1);
- NdbRestarter restarter;
-
- if (restarter.getNumDbNodes() < 2){
- ctx->stopTest();
- return NDBT_OK;
- }
-
- if(restarter.waitClusterStarted(60) != 0){
- g_err << "Cluster failed to start" << endl;
- return NDBT_FAILED;
- }
-
- if (testMaster) {
- if (testSlave) {
- if (grep.NFMasterAsSlave(restarter) == -1){
- return NDBT_FAILED;
- }
- } else {
- if (grep.NFMaster(restarter) == -1){
- return NDBT_FAILED;
- }
- }
- } else {
- if (grep.NFSlave(restarter) == -1){
- return NDBT_FAILED;
- }
- }
-
- return NDBT_OK;
-}
-
-int runFail(NDBT_Context* ctx, NDBT_Step* step){
- NdbGrep grep(GETNDB(step)->getNodeId()+1);
-
- NdbRestarter restarter;
-
- if (restarter.getNumDbNodes() < 2){
- ctx->stopTest();
- return NDBT_OK;
- }
-
- if(restarter.waitClusterStarted(60) != 0){
- g_err << "Cluster failed to start" << endl;
- return NDBT_FAILED;
- }
-
- if (testMaster) {
- if (testSlave) {
- if (grep.FailMasterAsSlave(restarter) == -1){
- return NDBT_FAILED;
- }
- } else {
- if (grep.FailMaster(restarter) == -1){
- return NDBT_FAILED;
- }
- }
- } else {
- if (grep.FailSlave(restarter) == -1){
- return NDBT_FAILED;
- }
- }
-
- return NDBT_OK;
-}
-
-int runGrepBasic(NDBT_Context* ctx, NDBT_Step* step){
- NdbGrep grep(GETNDB(step)->getNodeId()+1);
- unsigned grepId = 0;
-
- if (grep.start() == -1){
- return NDBT_FAILED;
- }
- ndbout << "Started grep " << grepId << endl;
- ctx->setProperty("GrepId", grepId);
-
- return NDBT_OK;
-}
-
-
-
-
-int runVerifyBasic(NDBT_Context* ctx, NDBT_Step* step){
- NdbGrep grep(GETNDB(step)->getNodeId()+1, ctx->getRemoteMgm());
- ndbout_c("no of nodes %d" ,grep.getNumDbNodes());
- int result;
- if ((result = grep.verify(ctx)) == -1){
- return NDBT_FAILED;
- }
- return result;
-}
-
-
-
-int runClearTable(NDBT_Context* ctx, NDBT_Step* step){
- int records = ctx->getNumRecords();
-
- UtilTransactions utilTrans(*ctx->getTab());
- if (utilTrans.clearTable2(GETNDB(step), records) != 0){
- return NDBT_FAILED;
- }
- return NDBT_OK;
-}
-
-#include "bank/Bank.hpp"
-
-int runCreateBank(NDBT_Context* ctx, NDBT_Step* step){
- Bank bank;
- int overWriteExisting = true;
- if (bank.createAndLoadBank(overWriteExisting) != NDBT_OK)
- return NDBT_FAILED;
- return NDBT_OK;
-}
-
-int runBankTimer(NDBT_Context* ctx, NDBT_Step* step){
- Bank bank;
- int wait = 30; // Max seconds between each "day"
- int yield = 1; // Loops before bank returns
-
- while (ctx->isTestStopped() == false) {
- bank.performIncreaseTime(wait, yield);
- }
- return NDBT_OK;
-}
-
-int runBankTransactions(NDBT_Context* ctx, NDBT_Step* step){
- Bank bank;
- int wait = 10; // Max ms between each transaction
- int yield = 100; // Loops before bank returns
-
- while (ctx->isTestStopped() == false) {
- bank.performTransactions(wait, yield);
- }
- return NDBT_OK;
-}
-
-int runBankGL(NDBT_Context* ctx, NDBT_Step* step){
- Bank bank;
- int yield = 20; // Loops before bank returns
- int result = NDBT_OK;
-
- while (ctx->isTestStopped() == false) {
- if (bank.performMakeGLs(yield) != NDBT_OK){
- ndbout << "bank.performMakeGLs FAILED" << endl;
- result = NDBT_FAILED;
- }
- }
- return NDBT_OK;
-}
-
-int runBankSum(NDBT_Context* ctx, NDBT_Step* step){
- Bank bank;
- int wait = 2000; // Max ms between each sum of accounts
- int yield = 1; // Loops before bank returns
- int result = NDBT_OK;
-
- while (ctx->isTestStopped() == false) {
- if (bank.performSumAccounts(wait, yield) != NDBT_OK){
- ndbout << "bank.performSumAccounts FAILED" << endl;
- result = NDBT_FAILED;
- }
- }
- return result ;
-}
-
-int runDropBank(NDBT_Context* ctx, NDBT_Step* step){
- Bank bank;
- if (bank.dropBank() != NDBT_OK)
- return NDBT_FAILED;
- return NDBT_OK;
-}
-
-int runGrepBank(NDBT_Context* ctx, NDBT_Step* step){
- int loops = ctx->getNumLoops();
- int l = 0;
- int maxSleep = 30; // Max seconds between each grep
- Ndb* pNdb = GETNDB(step);
- NdbGrep grep(GETNDB(step)->getNodeId()+1);
- unsigned minGrepId = ~0;
- unsigned maxGrepId = 0;
- unsigned grepId = 0;
- int result = NDBT_OK;
-
- while (l < loops && result != NDBT_FAILED){
-
- if (pNdb->waitUntilReady() != 0){
- result = NDBT_FAILED;
- continue;
- }
-
- // Sleep for a while
- NdbSleep_SecSleep(maxSleep);
-
- // Perform grep
- if (grep.start() != 0){
- ndbout << "grep.start failed" << endl;
- result = NDBT_FAILED;
- continue;
- }
- ndbout << "Started grep " << grepId << endl;
-
- // Remember min and max grepid
- if (grepId < minGrepId)
- minGrepId = grepId;
-
- if (grepId > maxGrepId)
- maxGrepId = grepId;
-
- ndbout << " maxGrepId = " << maxGrepId
- << ", minGrepId = " << minGrepId << endl;
- ctx->setProperty("MinGrepId", minGrepId);
- ctx->setProperty("MaxGrepId", maxGrepId);
-
- l++;
- }
-
- ctx->stopTest();
-
- return result;
-}
-/*
-int runRestoreBankAndVerify(NDBT_Context* ctx, NDBT_Step* step){
- NdbRestarter restarter;
- NdbGrep grep(GETNDB(step)->getNodeId()+1);
- unsigned minGrepId = ctx->getProperty("MinGrepId");
- unsigned maxGrepId = ctx->getProperty("MaxGrepId");
- unsigned grepId = minGrepId;
- int result = NDBT_OK;
- int errSumAccounts = 0;
- int errValidateGL = 0;
-
- ndbout << " maxGrepId = " << maxGrepId << endl;
- ndbout << " minGrepId = " << minGrepId << endl;
-
- while (grepId <= maxGrepId){
-
- // TEMPORARY FIX
- // To erase all tables from cache(s)
- // To be removed, maybe replaced by ndb.invalidate();
- {
- Bank bank;
-
- if (bank.dropBank() != NDBT_OK){
- result = NDBT_FAILED;
- break;
- }
- }
- // END TEMPORARY FIX
-
- ndbout << "Performing initial restart" << endl;
- if (restarter.restartAll(true) != 0)
- return NDBT_FAILED;
-
- if (restarter.waitClusterStarted() != 0)
- return NDBT_FAILED;
-
- ndbout << "Restoring grep " << grepId << endl;
- if (grep.restore(grepId) == -1){
- return NDBT_FAILED;
- }
- ndbout << "Grep " << grepId << " restored" << endl;
-
- // Let bank verify
- Bank bank;
-
- int wait = 0;
- int yield = 1;
- if (bank.performSumAccounts(wait, yield) != 0){
- ndbout << "bank.performSumAccounts FAILED" << endl;
- ndbout << " grepId = " << grepId << endl << endl;
- result = NDBT_FAILED;
- errSumAccounts++;
- }
-
- if (bank.performValidateAllGLs() != 0){
- ndbout << "bank.performValidateAllGLs FAILED" << endl;
- ndbout << " grepId = " << grepId << endl << endl;
- result = NDBT_FAILED;
- errValidateGL++;
- }
-
- grepId++;
- }
-
- if (result != NDBT_OK){
- ndbout << "Verification of grep failed" << endl
- << " errValidateGL="<<errValidateGL<<endl
- << " errSumAccounts="<<errSumAccounts<<endl << endl;
- }
-
- return result;
-}
-*/
-
-NDBT_TESTSUITE(testGrep);
-TESTCASE("GrepBasic",
- "Test that Global Replication works on one table \n"
- "1. Load table\n"
- "2. Grep\n"
- "3. Restart -i\n"
- "4. Restore\n"
- "5. Verify count and content of table\n"){
- INITIALIZER(runLoadTable);
- VERIFIER(runVerifyBasic);
- FINALIZER(runClearTable);
-
-}
-
-TESTCASE("GrepNodeRestart",
- "Test that Global Replication works on one table \n"
- "1. Load table\n"
- "2. Grep\n"
- "3. Restart -i\n"
- "4. Restore\n"
- "5. Verify count and content of table\n"){
- INITIALIZER(runLoadTable);
- STEP(runPkUpdate);
- STEP(runRestarter);
- VERIFIER(runVerifyBasic);
- FINALIZER(runClearTable);
-}
-
-
-TESTCASE("GrepBank",
- "Test that grep and restore works during transaction load\n"
- " by backing up the bank"
- "1. Create bank\n"
- "2a. Start bank and let it run\n"
- "2b. Perform loop number of greps of the bank\n"
- " when greps are finished tell bank to close\n"
- "3. Restart ndb -i and reload each grep\n"
- " let bank verify that the grep is consistent\n"
- "4. Drop bank\n"){
- INITIALIZER(runCreateBank);
- STEP(runBankTimer);
- STEP(runBankTransactions);
- STEP(runBankGL);
- // TODO STEP(runBankSum);
- STEP(runGrepBank);
- // VERIFIER(runRestoreBankAndVerify);
- // FINALIZER(runDropBank);
-
-}
-
-TESTCASE("NFMaster",
- "Test that grep behaves during node failiure\n"){
- INITIALIZER(setMaster);
- STEP(runAbort);
-
-}
-TESTCASE("NFMasterAsSlave",
- "Test that grep behaves during node failiure\n"){
- INITIALIZER(setMasterAsSlave);
- STEP(runAbort);
-
-}
-TESTCASE("NFSlave",
- "Test that grep behaves during node failiure\n"){
- INITIALIZER(setSlave);
- STEP(runAbort);
-
-}
-TESTCASE("FailMaster",
- "Test that grep behaves during node failiure\n"){
- INITIALIZER(setMaster);
- STEP(runFail);
-
-}
-TESTCASE("FailMasterAsSlave",
- "Test that grep behaves during node failiure\n"){
- INITIALIZER(setMasterAsSlave);
- STEP(runFail);
-
-}
-TESTCASE("FailSlave",
- "Test that grep behaves during node failiure\n"){
- INITIALIZER(setSlave);
- STEP(runFail);
-
-}
-NDBT_TESTSUITE_END(testGrep);
-
-int main(int argc, const char** argv){
- ndb_init();
- return testGrep.execute(argc, argv);
-}
-
-