Merge mskold@bk-internal.mysql.com:/home/bk/mysql-5.1-ndb
into mysql.com:/windows/Linux_space/MySQL/mysql-5.1-new-ndb sql/ha_ndbcluster.cc: Auto merged storage/ndb/include/ndbapi/Ndb.hpp: Auto merged
This commit is contained in:
commit
d168b042a9
@ -25,6 +25,7 @@
|
|||||||
#ifdef WITH_NDBCLUSTER_STORAGE_ENGINE
|
#ifdef WITH_NDBCLUSTER_STORAGE_ENGINE
|
||||||
#include "../storage/ndb/src/ndbapi/ndberror.c"
|
#include "../storage/ndb/src/ndbapi/ndberror.c"
|
||||||
#include "../storage/ndb/src/kernel/error/ndbd_exit_codes.c"
|
#include "../storage/ndb/src/kernel/error/ndbd_exit_codes.c"
|
||||||
|
#include "../storage/ndb/include/mgmapi/mgmapi_error.h"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
static my_bool verbose, print_all_codes;
|
static my_bool verbose, print_all_codes;
|
||||||
@ -32,6 +33,20 @@ static my_bool verbose, print_all_codes;
|
|||||||
#ifdef WITH_NDBCLUSTER_STORAGE_ENGINE
|
#ifdef WITH_NDBCLUSTER_STORAGE_ENGINE
|
||||||
static my_bool ndb_code;
|
static my_bool ndb_code;
|
||||||
static char ndb_string[1024];
|
static char ndb_string[1024];
|
||||||
|
int mgmapi_error_string(int err_no, char *str, int size)
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
for (i= 0; i < ndb_mgm_noOfErrorMsgs; i++)
|
||||||
|
{
|
||||||
|
if (ndb_mgm_error_msgs[i].code == err_no)
|
||||||
|
{
|
||||||
|
my_snprintf(str, size-1, "%s", ndb_mgm_error_msgs[i].msg);
|
||||||
|
str[size-1]= '\0';
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
static struct my_option my_long_options[] =
|
static struct my_option my_long_options[] =
|
||||||
@ -238,8 +253,9 @@ int main(int argc,char *argv[])
|
|||||||
#ifdef WITH_NDBCLUSTER_STORAGE_ENGINE
|
#ifdef WITH_NDBCLUSTER_STORAGE_ENGINE
|
||||||
if (ndb_code)
|
if (ndb_code)
|
||||||
{
|
{
|
||||||
if ((ndb_error_string(code, ndb_string, sizeof(ndb_string)) < 0) &&
|
if ((ndb_error_string(code, ndb_string, sizeof(ndb_string)) < 0) &&
|
||||||
(ndbd_exit_string(code, ndb_string, sizeof(ndb_string)) < 0))
|
(ndbd_exit_string(code, ndb_string, sizeof(ndb_string)) < 0) &&
|
||||||
|
(mgmapi_error_string(code, ndb_string, sizeof(ndb_string)) < 0))
|
||||||
{
|
{
|
||||||
msg= 0;
|
msg= 0;
|
||||||
}
|
}
|
||||||
|
@ -10,7 +10,8 @@ DataDir= CHOOSE_FILESYSTEM
|
|||||||
MaxNoOfOrderedIndexes= CHOOSE_MaxNoOfOrderedIndexes
|
MaxNoOfOrderedIndexes= CHOOSE_MaxNoOfOrderedIndexes
|
||||||
MaxNoOfAttributes= CHOOSE_MaxNoOfAttributes
|
MaxNoOfAttributes= CHOOSE_MaxNoOfAttributes
|
||||||
TimeBetweenGlobalCheckpoints= 500
|
TimeBetweenGlobalCheckpoints= 500
|
||||||
NoOfFragmentLogFiles= 3
|
NoOfFragmentLogFiles= 8
|
||||||
|
FragmentLogFileSize= 6M
|
||||||
DiskPageBufferMemory= CHOOSE_DiskPageBufferMemory
|
DiskPageBufferMemory= CHOOSE_DiskPageBufferMemory
|
||||||
|
|
||||||
#
|
#
|
||||||
|
@ -10,8 +10,10 @@ DataDir= CHOOSE_FILESYSTEM
|
|||||||
MaxNoOfOrderedIndexes= CHOOSE_MaxNoOfOrderedIndexes
|
MaxNoOfOrderedIndexes= CHOOSE_MaxNoOfOrderedIndexes
|
||||||
MaxNoOfAttributes= CHOOSE_MaxNoOfAttributes
|
MaxNoOfAttributes= CHOOSE_MaxNoOfAttributes
|
||||||
TimeBetweenGlobalCheckpoints= 500
|
TimeBetweenGlobalCheckpoints= 500
|
||||||
NoOfFragmentLogFiles= 3
|
NoOfFragmentLogFiles= 4
|
||||||
|
FragmentLogFileSize=12M
|
||||||
DiskPageBufferMemory= CHOOSE_DiskPageBufferMemory
|
DiskPageBufferMemory= CHOOSE_DiskPageBufferMemory
|
||||||
|
ODirect= 1
|
||||||
# the following parametes just function as a small regression
|
# the following parametes just function as a small regression
|
||||||
# test that the parameter exists
|
# test that the parameter exists
|
||||||
InitialNoOfOpenFiles= 27
|
InitialNoOfOpenFiles= 27
|
||||||
|
64
mysql-test/r/ndb_backup_print.result
Normal file
64
mysql-test/r/ndb_backup_print.result
Normal file
@ -0,0 +1,64 @@
|
|||||||
|
use test;
|
||||||
|
drop table if exists t1,t2,t3,t4,t5,t6,t7,t8,t9,t10;
|
||||||
|
Connected to Management Server at: :
|
||||||
|
Waiting for completed, this may take several minutes
|
||||||
|
Backup started from node
|
||||||
|
Backup started from node completed
|
||||||
|
StartGCP: StopGCP:
|
||||||
|
#Records: #LogRecords:
|
||||||
|
Data: bytes Log: bytes
|
||||||
|
create table t1
|
||||||
|
(pk int key
|
||||||
|
,a1 BIT(1), a2 BIT(5), a3 BIT(33), a4 BIT(63), a5 BIT(64)
|
||||||
|
,b1 TINYINT, b2 TINYINT UNSIGNED
|
||||||
|
,c1 SMALLINT, c2 SMALLINT UNSIGNED
|
||||||
|
,d1 INT, d2 INT UNSIGNED
|
||||||
|
,e1 BIGINT, e2 BIGINT UNSIGNED
|
||||||
|
,f1 CHAR(1) BINARY, f2 CHAR(32) BINARY, f3 CHAR(255) BINARY
|
||||||
|
,g1 VARCHAR(32) BINARY, g2 VARCHAR(255) BINARY, g3 VARCHAR(1000) BINARY
|
||||||
|
,h1 BINARY(1), h2 BINARY(8), h3 BINARY(255)
|
||||||
|
,i1 VARBINARY(32), i2 VARBINARY(255), i3 VARBINARY(1000)
|
||||||
|
) engine ndb;
|
||||||
|
insert into t1 values
|
||||||
|
(1
|
||||||
|
,0x1, 0x17, 0x789a, 0x789abcde, 0xfedc0001
|
||||||
|
,127, 255
|
||||||
|
,32767, 65535
|
||||||
|
,2147483647, 4294967295
|
||||||
|
,9223372036854775807, 18446744073709551615
|
||||||
|
,'1','12345678901234567890123456789012','123456789'
|
||||||
|
,'1','12345678901234567890123456789012','123456789'
|
||||||
|
,0x12,0x123456789abcdef0, 0x012345
|
||||||
|
,0x12,0x123456789abcdef0, 0x00123450
|
||||||
|
);
|
||||||
|
insert into t1 values
|
||||||
|
(2
|
||||||
|
,0, 0, 0, 0, 0
|
||||||
|
,-128, 0
|
||||||
|
,-32768, 0
|
||||||
|
,-2147483648, 0
|
||||||
|
,-9223372036854775808, 0
|
||||||
|
,'','',''
|
||||||
|
,'','',''
|
||||||
|
,0x0,0x0,0x0
|
||||||
|
,0x0,0x0,0x0
|
||||||
|
);
|
||||||
|
insert into t1 values
|
||||||
|
(3
|
||||||
|
,NULL,NULL,NULL,NULL,NULL
|
||||||
|
,NULL,NULL
|
||||||
|
,NULL,NULL
|
||||||
|
,NULL,NULL
|
||||||
|
,NULL,NULL
|
||||||
|
,NULL,NULL,NULL
|
||||||
|
,NULL,NULL,NULL
|
||||||
|
,NULL,NULL,NULL
|
||||||
|
,NULL,NULL,NULL
|
||||||
|
);
|
||||||
|
Connected to Management Server at: :
|
||||||
|
Waiting for completed, this may take several minutes
|
||||||
|
Backup started from node
|
||||||
|
Backup started from node completed
|
||||||
|
StartGCP: StopGCP:
|
||||||
|
#Records: #LogRecords:
|
||||||
|
Data: bytes Log: bytes
|
@ -6,6 +6,34 @@ attr1 INT NOT NULL,
|
|||||||
attr2 INT,
|
attr2 INT,
|
||||||
attr3 VARCHAR(10)
|
attr3 VARCHAR(10)
|
||||||
) ENGINE=ndbcluster;
|
) ENGINE=ndbcluster;
|
||||||
|
drop table t1;
|
||||||
|
SHOW GLOBAL STATUS LIKE 'ndb%';
|
||||||
|
Variable_name Value
|
||||||
|
Ndb_cluster_node_id #
|
||||||
|
Ndb_config_from_host #
|
||||||
|
Ndb_config_from_port #
|
||||||
|
Ndb_number_of_data_nodes #
|
||||||
|
SHOW GLOBAL VARIABLES LIKE 'ndb%';
|
||||||
|
Variable_name Value
|
||||||
|
ndb_autoincrement_prefetch_sz #
|
||||||
|
ndb_cache_check_time #
|
||||||
|
ndb_connectstring #
|
||||||
|
ndb_extra_logging #
|
||||||
|
ndb_force_send #
|
||||||
|
ndb_index_stat_cache_entries #
|
||||||
|
ndb_index_stat_enable #
|
||||||
|
ndb_index_stat_update_freq #
|
||||||
|
ndb_report_thresh_binlog_epoch_slip #
|
||||||
|
ndb_report_thresh_binlog_mem_usage #
|
||||||
|
ndb_use_copying_alter_table #
|
||||||
|
ndb_use_exact_count #
|
||||||
|
ndb_use_transactions #
|
||||||
|
CREATE TABLE t1 (
|
||||||
|
pk1 INT NOT NULL PRIMARY KEY,
|
||||||
|
attr1 INT NOT NULL,
|
||||||
|
attr2 INT,
|
||||||
|
attr3 VARCHAR(10)
|
||||||
|
) ENGINE=ndbcluster;
|
||||||
SHOW INDEX FROM t1;
|
SHOW INDEX FROM t1;
|
||||||
Table Non_unique Key_name Seq_in_index Column_name Collation Cardinality Sub_part Packed Null Index_type Comment
|
Table Non_unique Key_name Seq_in_index Column_name Collation Cardinality Sub_part Packed Null Index_type Comment
|
||||||
t1 0 PRIMARY 1 pk1 A 0 NULL NULL BTREE
|
t1 0 PRIMARY 1 pk1 A 0 NULL NULL BTREE
|
||||||
|
@ -18,7 +18,7 @@ CREATE TABLE `t2_c` (
|
|||||||
PRIMARY KEY (`capgotod`),
|
PRIMARY KEY (`capgotod`),
|
||||||
KEY `i quadaddsvr` (`gotod`)
|
KEY `i quadaddsvr` (`gotod`)
|
||||||
) ENGINE=ndbcluster DEFAULT CHARSET=latin1;
|
) ENGINE=ndbcluster DEFAULT CHARSET=latin1;
|
||||||
INSERT INTO `t2_c` VALUES (500,4,'','q3.net','addavp:MK_CASELECTOR=1','postorod rattoaa'),(2,1,'4','','addavp:MK_BRANDTAD=345','REDS Brandtad'),(3,2,'4','q3.net','execorder','fixedRatediPO REDS'),(1,1,'3','','addavp:MK_BRANDTAD=123','TEST Brandtad'),(6,5,'','told.q3.net','addavp:MK_BRANDTAD=123','Brandtad Toldzone'),(4,3,'3','q3.net','addavp:MK_POOLHINT=2','ratedi PO TEST');
|
INSERT INTO `t2_c` VALUES (500,4,'','q3.net','addavp:MK_CASELECTOR=1','postorod rattoaa'),(2,1,'4','','addavp:MK_BRANDTAD=345','REDS Brandtad'),(3,2,'4','q3.net','execorder','fixedRatediPO REDS'),(1,1,'3','','addavp:MK_BRANDTAD=123','TEST Brandtad'),(6,5,'','told.q3.net','addavp:MK_BRANDTAD=123','Brandtad Toldzone'),(4,3,'3','q3.net','addavp:MK_POOLHINT=2','ratedi PO TEST'),(5,0,'',NULL,NULL,'');
|
||||||
CREATE TABLE `t3_c` (
|
CREATE TABLE `t3_c` (
|
||||||
`CapGoaledatta` smallint(5) unsigned NOT NULL default '0',
|
`CapGoaledatta` smallint(5) unsigned NOT NULL default '0',
|
||||||
`capgotod` smallint(5) unsigned NOT NULL default '0',
|
`capgotod` smallint(5) unsigned NOT NULL default '0',
|
||||||
@ -154,15 +154,15 @@ count(*)
|
|||||||
5
|
5
|
||||||
select count(*) from t2;
|
select count(*) from t2;
|
||||||
count(*)
|
count(*)
|
||||||
6
|
7
|
||||||
select count(*) from t2_c;
|
select count(*) from t2_c;
|
||||||
count(*)
|
count(*)
|
||||||
6
|
7
|
||||||
select count(*)
|
select count(*)
|
||||||
from (select * from t2 union
|
from (select * from t2 union
|
||||||
select * from t2_c) a;
|
select * from t2_c) a;
|
||||||
count(*)
|
count(*)
|
||||||
6
|
7
|
||||||
select count(*) from t3;
|
select count(*) from t3;
|
||||||
count(*)
|
count(*)
|
||||||
4
|
4
|
||||||
@ -286,15 +286,15 @@ count(*)
|
|||||||
5
|
5
|
||||||
select count(*) from t2;
|
select count(*) from t2;
|
||||||
count(*)
|
count(*)
|
||||||
6
|
7
|
||||||
select count(*) from t2_c;
|
select count(*) from t2_c;
|
||||||
count(*)
|
count(*)
|
||||||
6
|
7
|
||||||
select count(*)
|
select count(*)
|
||||||
from (select * from t2 union
|
from (select * from t2 union
|
||||||
select * from t2_c) a;
|
select * from t2_c) a;
|
||||||
count(*)
|
count(*)
|
||||||
6
|
7
|
||||||
select count(*) from t3;
|
select count(*) from t3;
|
||||||
count(*)
|
count(*)
|
||||||
4
|
4
|
||||||
@ -386,15 +386,15 @@ count(*)
|
|||||||
5
|
5
|
||||||
select count(*) from t2;
|
select count(*) from t2;
|
||||||
count(*)
|
count(*)
|
||||||
6
|
7
|
||||||
select count(*) from t2_c;
|
select count(*) from t2_c;
|
||||||
count(*)
|
count(*)
|
||||||
6
|
7
|
||||||
select count(*)
|
select count(*)
|
||||||
from (select * from t2 union
|
from (select * from t2 union
|
||||||
select * from t2_c) a;
|
select * from t2_c) a;
|
||||||
count(*)
|
count(*)
|
||||||
6
|
7
|
||||||
select count(*) from t3;
|
select count(*) from t3;
|
||||||
count(*)
|
count(*)
|
||||||
4
|
4
|
||||||
|
@ -39,5 +39,5 @@ synchronization : Bug#24529 Test 'synchronization' fails on Mac pushb
|
|||||||
|
|
||||||
#rpl_ndb_dd_advance : Bug#25913 rpl_ndb_dd_advance fails randomly
|
#rpl_ndb_dd_advance : Bug#25913 rpl_ndb_dd_advance fails randomly
|
||||||
|
|
||||||
rpl_ndb_stm_innodb : Bug#26783
|
|
||||||
ndb_partition_error2 : HF is not sure if the test can work as internded on all the platforms
|
ndb_partition_error2 : HF is not sure if the test can work as internded on all the platforms
|
||||||
|
mysql_upgrade : Bug#28560 test links to /usr/local/mysql/lib libraries, causes non-determinism and failures on ABI breakage
|
||||||
|
66
mysql-test/t/ndb_backup_print.test
Normal file
66
mysql-test/t/ndb_backup_print.test
Normal file
@ -0,0 +1,66 @@
|
|||||||
|
-- source include/have_ndb.inc
|
||||||
|
-- source include/ndb_default_cluster.inc
|
||||||
|
-- source include/not_embedded.inc
|
||||||
|
|
||||||
|
--disable_warnings
|
||||||
|
use test;
|
||||||
|
drop table if exists t1,t2,t3,t4,t5,t6,t7,t8,t9,t10;
|
||||||
|
--enable_warnings
|
||||||
|
|
||||||
|
#NO.1 test output of backup
|
||||||
|
--exec $NDB_TOOLS_DIR/../src/mgmclient/ndb_mgm -e "start backup" |sed -e 's/[0-9]//g' |sed -e 's/localhost//g' |sed -e 's/\.\.\.*//g'
|
||||||
|
|
||||||
|
create table t1
|
||||||
|
(pk int key
|
||||||
|
,a1 BIT(1), a2 BIT(5), a3 BIT(33), a4 BIT(63), a5 BIT(64)
|
||||||
|
,b1 TINYINT, b2 TINYINT UNSIGNED
|
||||||
|
,c1 SMALLINT, c2 SMALLINT UNSIGNED
|
||||||
|
,d1 INT, d2 INT UNSIGNED
|
||||||
|
,e1 BIGINT, e2 BIGINT UNSIGNED
|
||||||
|
,f1 CHAR(1) BINARY, f2 CHAR(32) BINARY, f3 CHAR(255) BINARY
|
||||||
|
,g1 VARCHAR(32) BINARY, g2 VARCHAR(255) BINARY, g3 VARCHAR(1000) BINARY
|
||||||
|
,h1 BINARY(1), h2 BINARY(8), h3 BINARY(255)
|
||||||
|
,i1 VARBINARY(32), i2 VARBINARY(255), i3 VARBINARY(1000)
|
||||||
|
) engine ndb;
|
||||||
|
|
||||||
|
insert into t1 values
|
||||||
|
(1
|
||||||
|
,0x1, 0x17, 0x789a, 0x789abcde, 0xfedc0001
|
||||||
|
,127, 255
|
||||||
|
,32767, 65535
|
||||||
|
,2147483647, 4294967295
|
||||||
|
,9223372036854775807, 18446744073709551615
|
||||||
|
,'1','12345678901234567890123456789012','123456789'
|
||||||
|
,'1','12345678901234567890123456789012','123456789'
|
||||||
|
,0x12,0x123456789abcdef0, 0x012345
|
||||||
|
,0x12,0x123456789abcdef0, 0x00123450
|
||||||
|
);
|
||||||
|
|
||||||
|
insert into t1 values
|
||||||
|
(2
|
||||||
|
,0, 0, 0, 0, 0
|
||||||
|
,-128, 0
|
||||||
|
,-32768, 0
|
||||||
|
,-2147483648, 0
|
||||||
|
,-9223372036854775808, 0
|
||||||
|
,'','',''
|
||||||
|
,'','',''
|
||||||
|
,0x0,0x0,0x0
|
||||||
|
,0x0,0x0,0x0
|
||||||
|
);
|
||||||
|
|
||||||
|
insert into t1 values
|
||||||
|
(3
|
||||||
|
,NULL,NULL,NULL,NULL,NULL
|
||||||
|
,NULL,NULL
|
||||||
|
,NULL,NULL
|
||||||
|
,NULL,NULL
|
||||||
|
,NULL,NULL
|
||||||
|
,NULL,NULL,NULL
|
||||||
|
,NULL,NULL,NULL
|
||||||
|
,NULL,NULL,NULL
|
||||||
|
,NULL,NULL,NULL
|
||||||
|
);
|
||||||
|
|
||||||
|
#NO.2 test output of backup after some simple SQL operations
|
||||||
|
--exec $NDB_TOOLS_DIR/../src/mgmclient/ndb_mgm -e "start backup" |sed -e 's/[0-9]//g' |sed -e 's/localhost//g' |sed -e 's/\.\.\.*//g'
|
@ -6,22 +6,30 @@ DROP TABLE IF EXISTS t1,t2,t3,t4,t5,t6,t7;
|
|||||||
drop database if exists mysqltest;
|
drop database if exists mysqltest;
|
||||||
--enable_warnings
|
--enable_warnings
|
||||||
|
|
||||||
## workaround for bug#16445
|
# workaround for bug#16445
|
||||||
## remove to reproduce bug and run tests from ndb start
|
# remove to reproduce bug and run tests from ndb start
|
||||||
## and with ndb_autodiscover disabled. Fails on Linux 50 % of the times
|
# and with ndb_autodiscover disabled. Fails on Linux 50 % of the times
|
||||||
#CREATE TABLE t1 (
|
CREATE TABLE t1 (
|
||||||
# pk1 INT NOT NULL PRIMARY KEY,
|
pk1 INT NOT NULL PRIMARY KEY,
|
||||||
# attr1 INT NOT NULL,
|
attr1 INT NOT NULL,
|
||||||
# attr2 INT,
|
attr2 INT,
|
||||||
# attr3 VARCHAR(10)
|
attr3 VARCHAR(10)
|
||||||
#) ENGINE=ndbcluster;
|
) ENGINE=ndbcluster;
|
||||||
#drop table t1;
|
drop table t1;
|
||||||
|
|
||||||
#
|
#
|
||||||
# Basic test to show that the NDB
|
# Basic test to show that the NDB
|
||||||
# table handler is working
|
# table handler is working
|
||||||
#
|
#
|
||||||
|
|
||||||
|
#
|
||||||
|
# Show status and variables
|
||||||
|
#
|
||||||
|
--replace_column 2 #
|
||||||
|
SHOW GLOBAL STATUS LIKE 'ndb%';
|
||||||
|
--replace_column 2 #
|
||||||
|
SHOW GLOBAL VARIABLES LIKE 'ndb%';
|
||||||
|
|
||||||
#
|
#
|
||||||
# Create a normal table with primary key
|
# Create a normal table with primary key
|
||||||
#
|
#
|
||||||
|
@ -33,7 +33,7 @@ CREATE TABLE `t2_c` (
|
|||||||
PRIMARY KEY (`capgotod`),
|
PRIMARY KEY (`capgotod`),
|
||||||
KEY `i quadaddsvr` (`gotod`)
|
KEY `i quadaddsvr` (`gotod`)
|
||||||
) ENGINE=ndbcluster DEFAULT CHARSET=latin1;
|
) ENGINE=ndbcluster DEFAULT CHARSET=latin1;
|
||||||
INSERT INTO `t2_c` VALUES (500,4,'','q3.net','addavp:MK_CASELECTOR=1','postorod rattoaa'),(2,1,'4','','addavp:MK_BRANDTAD=345','REDS Brandtad'),(3,2,'4','q3.net','execorder','fixedRatediPO REDS'),(1,1,'3','','addavp:MK_BRANDTAD=123','TEST Brandtad'),(6,5,'','told.q3.net','addavp:MK_BRANDTAD=123','Brandtad Toldzone'),(4,3,'3','q3.net','addavp:MK_POOLHINT=2','ratedi PO TEST');
|
INSERT INTO `t2_c` VALUES (500,4,'','q3.net','addavp:MK_CASELECTOR=1','postorod rattoaa'),(2,1,'4','','addavp:MK_BRANDTAD=345','REDS Brandtad'),(3,2,'4','q3.net','execorder','fixedRatediPO REDS'),(1,1,'3','','addavp:MK_BRANDTAD=123','TEST Brandtad'),(6,5,'','told.q3.net','addavp:MK_BRANDTAD=123','Brandtad Toldzone'),(4,3,'3','q3.net','addavp:MK_POOLHINT=2','ratedi PO TEST'),(5,0,'',NULL,NULL,'');
|
||||||
|
|
||||||
# Added ROW_FORMAT=FIXED to use below to see that setting is preserved
|
# Added ROW_FORMAT=FIXED to use below to see that setting is preserved
|
||||||
# by restore
|
# by restore
|
||||||
|
@ -4248,8 +4248,6 @@ THR_LOCK_DATA **ha_ndbcluster::store_lock(THD *thd,
|
|||||||
extern MASTER_INFO *active_mi;
|
extern MASTER_INFO *active_mi;
|
||||||
static int ndbcluster_update_apply_status(THD *thd, int do_update)
|
static int ndbcluster_update_apply_status(THD *thd, int do_update)
|
||||||
{
|
{
|
||||||
return 0;
|
|
||||||
|
|
||||||
Thd_ndb *thd_ndb= get_thd_ndb(thd);
|
Thd_ndb *thd_ndb= get_thd_ndb(thd);
|
||||||
Ndb *ndb= thd_ndb->ndb;
|
Ndb *ndb= thd_ndb->ndb;
|
||||||
NDBDICT *dict= ndb->getDictionary();
|
NDBDICT *dict= ndb->getDictionary();
|
||||||
|
163
storage/ndb/MAINTAINERS
Normal file
163
storage/ndb/MAINTAINERS
Normal file
@ -0,0 +1,163 @@
|
|||||||
|
MySQL Cluster MAINTAINERS
|
||||||
|
-------------------------
|
||||||
|
|
||||||
|
This is a list of knowledgable people in parts of the NDB code.
|
||||||
|
|
||||||
|
In changing that area of code, you probably want to talk to the
|
||||||
|
people who know a lot about it to look over the patch.
|
||||||
|
|
||||||
|
When sending patches and queries, always CC the mailing list.
|
||||||
|
|
||||||
|
If no list specified, assume internals@lists.mysql.com
|
||||||
|
|
||||||
|
P: Person
|
||||||
|
M: Mail
|
||||||
|
L: Mailing list
|
||||||
|
W: Web page with status/info
|
||||||
|
C: Comment
|
||||||
|
SRC: Source directory (relative to this directory)
|
||||||
|
T: SCM tree type and location
|
||||||
|
S: Status, one of:
|
||||||
|
|
||||||
|
Supported: Somebody is paid to maintain this.
|
||||||
|
Maintained: Not their primary job, but maintained.
|
||||||
|
Orphan: No current obvious maintainer.
|
||||||
|
Obsolete: Replaced by something else.
|
||||||
|
|
||||||
|
-------------------------------------------------------------
|
||||||
|
|
||||||
|
Binlog Injector
|
||||||
|
SRC: ha_ndbcluster_binlog.cc
|
||||||
|
C: see also row based replication
|
||||||
|
P: Stewart Smith
|
||||||
|
M: stewart@mysql.com
|
||||||
|
C: Original author
|
||||||
|
P: Tomas Ulin
|
||||||
|
M: tomas@mysql.com
|
||||||
|
C: Lots of updates
|
||||||
|
P: Martin Skold
|
||||||
|
M: martin@mysql.com
|
||||||
|
C: Metadata ops
|
||||||
|
S: Supported
|
||||||
|
|
||||||
|
BLOBs
|
||||||
|
SRC: ha_ndbcluster.cc
|
||||||
|
SRC: src/ndbapi/NdbBlob*
|
||||||
|
P: Pekka
|
||||||
|
M: pekka@mysql.com
|
||||||
|
S: Supported
|
||||||
|
|
||||||
|
cpcd/cpcc
|
||||||
|
SRC: src/cw/cpcd
|
||||||
|
SRC: src/cw/cpcc
|
||||||
|
C: Maintained only as part of autotest
|
||||||
|
P: Jonas Orland
|
||||||
|
M: jonas@mysql.com
|
||||||
|
S: Maintained
|
||||||
|
|
||||||
|
cpcc-win32
|
||||||
|
SRC: src/cw/cpcc-win32
|
||||||
|
S: Obsolete
|
||||||
|
|
||||||
|
Handler
|
||||||
|
SRC: ha_ndbcluster.cc
|
||||||
|
P: Martin Skold
|
||||||
|
M: martin@mysql.com
|
||||||
|
S: Supported
|
||||||
|
|
||||||
|
Management Server
|
||||||
|
SRC: src/mgmsrv/
|
||||||
|
P: Stewart Smith
|
||||||
|
M: stewart@mysql.com
|
||||||
|
S: Supported
|
||||||
|
|
||||||
|
Management Client
|
||||||
|
SRC: src/mgmclient/
|
||||||
|
P: Stewart Smith
|
||||||
|
M: stewart@mysql.com
|
||||||
|
S: Supported
|
||||||
|
|
||||||
|
Management API
|
||||||
|
SRC: src/mgmapi/
|
||||||
|
P: Stewart Smith
|
||||||
|
M: stewart@mysql.com
|
||||||
|
S: Supported
|
||||||
|
|
||||||
|
NDB API Examples
|
||||||
|
SRC: ndbapi-examples/
|
||||||
|
P: Tomas Ulin
|
||||||
|
M: tomas@mysql.com
|
||||||
|
C: Originally by Lars
|
||||||
|
P: Lars Thalmann
|
||||||
|
M: lars@mysql.com
|
||||||
|
S: Maintained
|
||||||
|
|
||||||
|
NDB API NdbRecord Examples
|
||||||
|
SRC: ndbapi-examples/
|
||||||
|
P: Kristian Nielsen
|
||||||
|
M: knielsen@mysql.com
|
||||||
|
S: Maintained
|
||||||
|
|
||||||
|
tsman
|
||||||
|
C: Disk Data (Table Space MANager)
|
||||||
|
SRC: src/kernel/blocks/tsman.cpp
|
||||||
|
SRC: src/kernel/blocks/tsman.hpp
|
||||||
|
P: Jonas Oreland
|
||||||
|
M: jonas@mysql.com
|
||||||
|
S: Supported
|
||||||
|
|
||||||
|
lgman
|
||||||
|
C: Disk Data (LoG MANager)
|
||||||
|
SRC: src/kernel/blocks/lgman.cpp
|
||||||
|
SRC: src/kernel/blocks/lgman.hpp
|
||||||
|
P: Jonas Oreland
|
||||||
|
M: jonas@mysql.com
|
||||||
|
S: Supported
|
||||||
|
|
||||||
|
pgman
|
||||||
|
C: Disk Data (PaGe MANager)
|
||||||
|
SRC: src/kernel/blocks/lgman.cpp
|
||||||
|
SRC: src/kernel/blocks/lgman.hpp
|
||||||
|
P: Jonas Oreland
|
||||||
|
M: jonas@mysql.com
|
||||||
|
S: Supported
|
||||||
|
|
||||||
|
SUMA
|
||||||
|
C: SUbscription MAnager
|
||||||
|
C: Used for replication
|
||||||
|
SRC: src/kernel/blocks/suma/
|
||||||
|
P: Tomas Ulin
|
||||||
|
P: tomas@mysql.com
|
||||||
|
P: Jonas Oreland
|
||||||
|
P: jonas@mysql.com
|
||||||
|
S: Supported
|
||||||
|
|
||||||
|
TRIX
|
||||||
|
C: TRiggers and IndeXs (but only online Index build)
|
||||||
|
SRC: src/kernel/blocks/trix
|
||||||
|
P: Martin Skold
|
||||||
|
P: mskold@mysql.com
|
||||||
|
S: Supported
|
||||||
|
|
||||||
|
QMGR
|
||||||
|
C: Cluster (with a Q) ManaGeR
|
||||||
|
C: Heartbeats etc
|
||||||
|
SRC: src/kernel/blocks/qmgr
|
||||||
|
S: Supported
|
||||||
|
|
||||||
|
NDBFS
|
||||||
|
C: NDB FileSystem
|
||||||
|
C: File System abstraction
|
||||||
|
SRC: src/kernel/blocks/ndbfs
|
||||||
|
S: Supported
|
||||||
|
|
||||||
|
TRIX
|
||||||
|
C: TRiggers and IndeXs (but only online Index build)
|
||||||
|
SRC: src/kernel/blocks/trix
|
||||||
|
S: Supported
|
||||||
|
|
||||||
|
TRIX
|
||||||
|
C: TRiggers and IndeXs (but only online Index build)
|
||||||
|
SRC: src/kernel/blocks/trix
|
||||||
|
S: Supported
|
||||||
|
|
@ -45,6 +45,7 @@ ndbapi/ndberror.h
|
|||||||
|
|
||||||
mgmapiinclude_HEADERS = \
|
mgmapiinclude_HEADERS = \
|
||||||
mgmapi/mgmapi.h \
|
mgmapi/mgmapi.h \
|
||||||
|
mgmapi/mgmapi_error.h \
|
||||||
mgmapi/mgmapi_debug.h \
|
mgmapi/mgmapi_debug.h \
|
||||||
mgmapi/mgmapi_config_parameters.h \
|
mgmapi/mgmapi_config_parameters.h \
|
||||||
mgmapi/mgmapi_config_parameters_debug.h \
|
mgmapi/mgmapi_config_parameters_debug.h \
|
||||||
|
@ -173,5 +173,5 @@ private:
|
|||||||
STATIC_CONST(MAX_TEXT_LENGTH = 256);
|
STATIC_CONST(MAX_TEXT_LENGTH = 256);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
extern void getRestartAction(Uint32 action, BaseString &str);
|
||||||
#endif
|
#endif
|
||||||
|
@ -18,6 +18,7 @@
|
|||||||
|
|
||||||
#include "mgmapi_config_parameters.h"
|
#include "mgmapi_config_parameters.h"
|
||||||
#include "ndb_logevent.h"
|
#include "ndb_logevent.h"
|
||||||
|
#include "mgmapi_error.h"
|
||||||
|
|
||||||
#define MGM_LOGLEVELS CFG_MAX_LOGLEVEL - CFG_MIN_LOGLEVEL + 1
|
#define MGM_LOGLEVELS CFG_MAX_LOGLEVEL - CFG_MIN_LOGLEVEL + 1
|
||||||
#define NDB_MGM_MAX_LOGLEVEL 15
|
#define NDB_MGM_MAX_LOGLEVEL 15
|
||||||
@ -211,105 +212,6 @@ extern "C" {
|
|||||||
#endif
|
#endif
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
|
||||||
* Error codes
|
|
||||||
*/
|
|
||||||
enum ndb_mgm_error {
|
|
||||||
/** Not an error */
|
|
||||||
NDB_MGM_NO_ERROR = 0,
|
|
||||||
|
|
||||||
/* Request for service errors */
|
|
||||||
/** Supplied connectstring is illegal */
|
|
||||||
NDB_MGM_ILLEGAL_CONNECT_STRING = 1001,
|
|
||||||
/** Supplied NdbMgmHandle is illegal */
|
|
||||||
NDB_MGM_ILLEGAL_SERVER_HANDLE = 1005,
|
|
||||||
/** Illegal reply from server */
|
|
||||||
NDB_MGM_ILLEGAL_SERVER_REPLY = 1006,
|
|
||||||
/** Illegal number of nodes */
|
|
||||||
NDB_MGM_ILLEGAL_NUMBER_OF_NODES = 1007,
|
|
||||||
/** Illegal node status */
|
|
||||||
NDB_MGM_ILLEGAL_NODE_STATUS = 1008,
|
|
||||||
/** Memory allocation error */
|
|
||||||
NDB_MGM_OUT_OF_MEMORY = 1009,
|
|
||||||
/** Management server not connected */
|
|
||||||
NDB_MGM_SERVER_NOT_CONNECTED = 1010,
|
|
||||||
/** Could not connect to socker */
|
|
||||||
NDB_MGM_COULD_NOT_CONNECT_TO_SOCKET = 1011,
|
|
||||||
/** Could not bind local address */
|
|
||||||
NDB_MGM_BIND_ADDRESS = 1012,
|
|
||||||
|
|
||||||
/* Alloc node id failures */
|
|
||||||
/** Generic error, retry may succeed */
|
|
||||||
NDB_MGM_ALLOCID_ERROR = 1101,
|
|
||||||
/** Non retriable error */
|
|
||||||
NDB_MGM_ALLOCID_CONFIG_MISMATCH = 1102,
|
|
||||||
|
|
||||||
/* Service errors - Start/Stop Node or System */
|
|
||||||
/** Start failed */
|
|
||||||
NDB_MGM_START_FAILED = 2001,
|
|
||||||
/** Stop failed */
|
|
||||||
NDB_MGM_STOP_FAILED = 2002,
|
|
||||||
/** Restart failed */
|
|
||||||
NDB_MGM_RESTART_FAILED = 2003,
|
|
||||||
|
|
||||||
/* Service errors - Backup */
|
|
||||||
/** Unable to start backup */
|
|
||||||
NDB_MGM_COULD_NOT_START_BACKUP = 3001,
|
|
||||||
/** Unable to abort backup */
|
|
||||||
NDB_MGM_COULD_NOT_ABORT_BACKUP = 3002,
|
|
||||||
|
|
||||||
/* Service errors - Single User Mode */
|
|
||||||
/** Unable to enter single user mode */
|
|
||||||
NDB_MGM_COULD_NOT_ENTER_SINGLE_USER_MODE = 4001,
|
|
||||||
/** Unable to exit single user mode */
|
|
||||||
NDB_MGM_COULD_NOT_EXIT_SINGLE_USER_MODE = 4002,
|
|
||||||
|
|
||||||
/* Usage errors */
|
|
||||||
/** Usage error */
|
|
||||||
NDB_MGM_USAGE_ERROR = 5001
|
|
||||||
};
|
|
||||||
|
|
||||||
#ifndef DOXYGEN_SHOULD_SKIP_INTERNAL
|
|
||||||
struct Ndb_Mgm_Error_Msg {
|
|
||||||
enum ndb_mgm_error code;
|
|
||||||
const char * msg;
|
|
||||||
};
|
|
||||||
const struct Ndb_Mgm_Error_Msg ndb_mgm_error_msgs[] = {
|
|
||||||
{ NDB_MGM_NO_ERROR, "No error" },
|
|
||||||
|
|
||||||
/* Request for service errors */
|
|
||||||
{ NDB_MGM_ILLEGAL_CONNECT_STRING, "Illegal connect string" },
|
|
||||||
{ NDB_MGM_ILLEGAL_SERVER_HANDLE, "Illegal server handle" },
|
|
||||||
{ NDB_MGM_ILLEGAL_SERVER_REPLY, "Illegal reply from server" },
|
|
||||||
{ NDB_MGM_ILLEGAL_NUMBER_OF_NODES, "Illegal number of nodes" },
|
|
||||||
{ NDB_MGM_ILLEGAL_NODE_STATUS, "Illegal node status" },
|
|
||||||
{ NDB_MGM_OUT_OF_MEMORY, "Out of memory" },
|
|
||||||
{ NDB_MGM_SERVER_NOT_CONNECTED, "Management server not connected" },
|
|
||||||
{ NDB_MGM_COULD_NOT_CONNECT_TO_SOCKET, "Could not connect to socket" },
|
|
||||||
|
|
||||||
/* Service errors - Start/Stop Node or System */
|
|
||||||
{ NDB_MGM_START_FAILED, "Start failed" },
|
|
||||||
{ NDB_MGM_STOP_FAILED, "Stop failed" },
|
|
||||||
{ NDB_MGM_RESTART_FAILED, "Restart failed" },
|
|
||||||
|
|
||||||
/* Service errors - Backup */
|
|
||||||
{ NDB_MGM_COULD_NOT_START_BACKUP, "Could not start backup" },
|
|
||||||
{ NDB_MGM_COULD_NOT_ABORT_BACKUP, "Could not abort backup" },
|
|
||||||
|
|
||||||
/* Service errors - Single User Mode */
|
|
||||||
{ NDB_MGM_COULD_NOT_ENTER_SINGLE_USER_MODE,
|
|
||||||
"Could not enter single user mode" },
|
|
||||||
{ NDB_MGM_COULD_NOT_EXIT_SINGLE_USER_MODE,
|
|
||||||
"Could not exit single user mode" },
|
|
||||||
|
|
||||||
/* Usage errors */
|
|
||||||
{ NDB_MGM_USAGE_ERROR,
|
|
||||||
"Usage error" }
|
|
||||||
};
|
|
||||||
const int ndb_mgm_noOfErrorMsgs =
|
|
||||||
sizeof(ndb_mgm_error_msgs)/sizeof(struct Ndb_Mgm_Error_Msg);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Status of a node in the cluster.
|
* Status of a node in the cluster.
|
||||||
*
|
*
|
||||||
|
@ -64,6 +64,7 @@
|
|||||||
|
|
||||||
#define CFG_DB_FILESYSTEM_PATH 125
|
#define CFG_DB_FILESYSTEM_PATH 125
|
||||||
#define CFG_DB_NO_REDOLOG_FILES 126
|
#define CFG_DB_NO_REDOLOG_FILES 126
|
||||||
|
#define CFG_DB_REDOLOG_FILE_SIZE 140
|
||||||
|
|
||||||
#define CFG_DB_LCP_DISC_PAGES_TUP 127
|
#define CFG_DB_LCP_DISC_PAGES_TUP 127
|
||||||
#define CFG_DB_LCP_DISC_PAGES_TUP_SR 128
|
#define CFG_DB_LCP_DISC_PAGES_TUP_SR 128
|
||||||
@ -81,6 +82,8 @@
|
|||||||
#define CFG_DB_BACKUP_WRITE_SIZE 136
|
#define CFG_DB_BACKUP_WRITE_SIZE 136
|
||||||
#define CFG_DB_BACKUP_MAX_WRITE_SIZE 139
|
#define CFG_DB_BACKUP_MAX_WRITE_SIZE 139
|
||||||
|
|
||||||
|
#define CFG_DB_WATCHDOG_INTERVAL_INITIAL 141
|
||||||
|
|
||||||
#define CFG_LOG_DESTINATION 147
|
#define CFG_LOG_DESTINATION 147
|
||||||
|
|
||||||
#define CFG_DB_DISCLESS 148
|
#define CFG_DB_DISCLESS 148
|
||||||
@ -113,6 +116,10 @@
|
|||||||
|
|
||||||
#define CFG_DB_MEMREPORT_FREQUENCY 166
|
#define CFG_DB_MEMREPORT_FREQUENCY 166
|
||||||
|
|
||||||
|
#define CFG_DB_O_DIRECT 168
|
||||||
|
|
||||||
|
#define CFG_DB_MAX_ALLOCATE 169
|
||||||
|
|
||||||
#define CFG_DB_SGA 198 /* super pool mem */
|
#define CFG_DB_SGA 198 /* super pool mem */
|
||||||
#define CFG_DB_DATA_MEM_2 199 /* used in special build in 5.1 */
|
#define CFG_DB_DATA_MEM_2 199 /* used in special build in 5.1 */
|
||||||
|
|
||||||
|
121
storage/ndb/include/mgmapi/mgmapi_error.h
Normal file
121
storage/ndb/include/mgmapi/mgmapi_error.h
Normal file
@ -0,0 +1,121 @@
|
|||||||
|
/* 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; version 2 of the License.
|
||||||
|
|
||||||
|
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 MGMAPI_ERROR_H
|
||||||
|
#define MGMAPI_ERROR_H
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
/**
|
||||||
|
* Error codes
|
||||||
|
*/
|
||||||
|
enum ndb_mgm_error {
|
||||||
|
/** Not an error */
|
||||||
|
NDB_MGM_NO_ERROR = 0,
|
||||||
|
|
||||||
|
/* Request for service errors */
|
||||||
|
/** Supplied connectstring is illegal */
|
||||||
|
NDB_MGM_ILLEGAL_CONNECT_STRING = 1001,
|
||||||
|
/** Supplied NdbMgmHandle is illegal */
|
||||||
|
NDB_MGM_ILLEGAL_SERVER_HANDLE = 1005,
|
||||||
|
/** Illegal reply from server */
|
||||||
|
NDB_MGM_ILLEGAL_SERVER_REPLY = 1006,
|
||||||
|
/** Illegal number of nodes */
|
||||||
|
NDB_MGM_ILLEGAL_NUMBER_OF_NODES = 1007,
|
||||||
|
/** Illegal node status */
|
||||||
|
NDB_MGM_ILLEGAL_NODE_STATUS = 1008,
|
||||||
|
/** Memory allocation error */
|
||||||
|
NDB_MGM_OUT_OF_MEMORY = 1009,
|
||||||
|
/** Management server not connected */
|
||||||
|
NDB_MGM_SERVER_NOT_CONNECTED = 1010,
|
||||||
|
/** Could not connect to socker */
|
||||||
|
NDB_MGM_COULD_NOT_CONNECT_TO_SOCKET = 1011,
|
||||||
|
/** Could not bind local address */
|
||||||
|
NDB_MGM_BIND_ADDRESS = 1012,
|
||||||
|
|
||||||
|
/* Alloc node id failures */
|
||||||
|
/** Generic error, retry may succeed */
|
||||||
|
NDB_MGM_ALLOCID_ERROR = 1101,
|
||||||
|
/** Non retriable error */
|
||||||
|
NDB_MGM_ALLOCID_CONFIG_MISMATCH = 1102,
|
||||||
|
|
||||||
|
/* Service errors - Start/Stop Node or System */
|
||||||
|
/** Start failed */
|
||||||
|
NDB_MGM_START_FAILED = 2001,
|
||||||
|
/** Stop failed */
|
||||||
|
NDB_MGM_STOP_FAILED = 2002,
|
||||||
|
/** Restart failed */
|
||||||
|
NDB_MGM_RESTART_FAILED = 2003,
|
||||||
|
|
||||||
|
/* Service errors - Backup */
|
||||||
|
/** Unable to start backup */
|
||||||
|
NDB_MGM_COULD_NOT_START_BACKUP = 3001,
|
||||||
|
/** Unable to abort backup */
|
||||||
|
NDB_MGM_COULD_NOT_ABORT_BACKUP = 3002,
|
||||||
|
|
||||||
|
/* Service errors - Single User Mode */
|
||||||
|
/** Unable to enter single user mode */
|
||||||
|
NDB_MGM_COULD_NOT_ENTER_SINGLE_USER_MODE = 4001,
|
||||||
|
/** Unable to exit single user mode */
|
||||||
|
NDB_MGM_COULD_NOT_EXIT_SINGLE_USER_MODE = 4002,
|
||||||
|
|
||||||
|
/* Usage errors */
|
||||||
|
/** Usage error */
|
||||||
|
NDB_MGM_USAGE_ERROR = 5001
|
||||||
|
};
|
||||||
|
struct Ndb_Mgm_Error_Msg {
|
||||||
|
enum ndb_mgm_error code;
|
||||||
|
const char * msg;
|
||||||
|
};
|
||||||
|
const struct Ndb_Mgm_Error_Msg ndb_mgm_error_msgs[] = {
|
||||||
|
{ NDB_MGM_NO_ERROR, "No error" },
|
||||||
|
|
||||||
|
/* Request for service errors */
|
||||||
|
{ NDB_MGM_ILLEGAL_CONNECT_STRING, "Illegal connect string" },
|
||||||
|
{ NDB_MGM_ILLEGAL_SERVER_HANDLE, "Illegal server handle" },
|
||||||
|
{ NDB_MGM_ILLEGAL_SERVER_REPLY, "Illegal reply from server" },
|
||||||
|
{ NDB_MGM_ILLEGAL_NUMBER_OF_NODES, "Illegal number of nodes" },
|
||||||
|
{ NDB_MGM_ILLEGAL_NODE_STATUS, "Illegal node status" },
|
||||||
|
{ NDB_MGM_OUT_OF_MEMORY, "Out of memory" },
|
||||||
|
{ NDB_MGM_SERVER_NOT_CONNECTED, "Management server not connected" },
|
||||||
|
{ NDB_MGM_COULD_NOT_CONNECT_TO_SOCKET, "Could not connect to socket" },
|
||||||
|
|
||||||
|
/* Service errors - Start/Stop Node or System */
|
||||||
|
{ NDB_MGM_START_FAILED, "Start failed" },
|
||||||
|
{ NDB_MGM_STOP_FAILED, "Stop failed" },
|
||||||
|
{ NDB_MGM_RESTART_FAILED, "Restart failed" },
|
||||||
|
|
||||||
|
/* Service errors - Backup */
|
||||||
|
{ NDB_MGM_COULD_NOT_START_BACKUP, "Could not start backup" },
|
||||||
|
{ NDB_MGM_COULD_NOT_ABORT_BACKUP, "Could not abort backup" },
|
||||||
|
|
||||||
|
/* Service errors - Single User Mode */
|
||||||
|
{ NDB_MGM_COULD_NOT_ENTER_SINGLE_USER_MODE,
|
||||||
|
"Could not enter single user mode" },
|
||||||
|
{ NDB_MGM_COULD_NOT_EXIT_SINGLE_USER_MODE,
|
||||||
|
"Could not exit single user mode" },
|
||||||
|
|
||||||
|
/* Usage errors */
|
||||||
|
{ NDB_MGM_USAGE_ERROR,
|
||||||
|
"Usage error" }
|
||||||
|
};
|
||||||
|
const int ndb_mgm_noOfErrorMsgs =
|
||||||
|
sizeof(ndb_mgm_error_msgs)/sizeof(struct Ndb_Mgm_Error_Msg);
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif
|
@ -144,4 +144,6 @@ extern "C" {
|
|||||||
#define MAX(x,y) (((x)>(y))?(x):(y))
|
#define MAX(x,y) (((x)>(y))?(x):(y))
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#define NDB_O_DIRECT_WRITE_ALIGNMENT 512
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
@ -1055,6 +1055,7 @@ class Ndb
|
|||||||
friend class NdbDictInterface;
|
friend class NdbDictInterface;
|
||||||
friend class NdbBlob;
|
friend class NdbBlob;
|
||||||
friend class NdbImpl;
|
friend class NdbImpl;
|
||||||
|
friend class Ndb_internal;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
@ -1042,6 +1042,13 @@ protected:
|
|||||||
*/
|
*/
|
||||||
Int8 m_abortOption;
|
Int8 m_abortOption;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* For blob impl, option to not propagate error to trans level.
|
||||||
|
* Could be AO_IgnoreError variant if we want it public.
|
||||||
|
* Ignored unless AO_IgnoreError is also set.
|
||||||
|
*/
|
||||||
|
Int8 m_noErrorPropagation;
|
||||||
|
|
||||||
friend struct Ndb_free_list_t<NdbOperation>;
|
friend struct Ndb_free_list_t<NdbOperation>;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -37,9 +37,6 @@ NDB_TICKS NdbTick_CurrentMillisecond(void);
|
|||||||
*/
|
*/
|
||||||
int NdbTick_CurrentMicrosecond(NDB_TICKS * secs, Uint32 * micros);
|
int NdbTick_CurrentMicrosecond(NDB_TICKS * secs, Uint32 * micros);
|
||||||
|
|
||||||
/*#define TIME_MEASUREMENT*/
|
|
||||||
#ifdef TIME_MEASUREMENT
|
|
||||||
|
|
||||||
struct MicroSecondTimer {
|
struct MicroSecondTimer {
|
||||||
NDB_TICKS seconds;
|
NDB_TICKS seconds;
|
||||||
NDB_TICKS micro_seconds;
|
NDB_TICKS micro_seconds;
|
||||||
@ -54,7 +51,6 @@ struct MicroSecondTimer {
|
|||||||
NDB_TICKS NdbTick_getMicrosPassed(struct MicroSecondTimer start,
|
NDB_TICKS NdbTick_getMicrosPassed(struct MicroSecondTimer start,
|
||||||
struct MicroSecondTimer stop);
|
struct MicroSecondTimer stop);
|
||||||
int NdbTick_getMicroTimer(struct MicroSecondTimer* time_now);
|
int NdbTick_getMicroTimer(struct MicroSecondTimer* time_now);
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
TARGET = mgmapi_logevent
|
TARGET = mgmapi_logevent
|
||||||
SRCS = $(TARGET).cpp
|
SRCS = main.cpp
|
||||||
OBJS = $(TARGET).o
|
OBJS = main.o
|
||||||
CXX = g++
|
CXX = g++
|
||||||
CFLAGS = -c -Wall -fno-rtti -fno-exceptions
|
CFLAGS = -c -Wall -fno-rtti -fno-exceptions
|
||||||
CXXFLAGS =
|
CXXFLAGS =
|
||||||
@ -17,7 +17,7 @@ SYS_LIB =
|
|||||||
$(TARGET): $(OBJS)
|
$(TARGET): $(OBJS)
|
||||||
$(CXX) $(CXXFLAGS) $(LFLAGS) $(LIB_DIR) $(OBJS) -lndbclient -lmysqlclient_r -lmysys -lmystrings -lz $(SYS_LIB) -o $(TARGET)
|
$(CXX) $(CXXFLAGS) $(LFLAGS) $(LIB_DIR) $(OBJS) -lndbclient -lmysqlclient_r -lmysys -lmystrings -lz $(SYS_LIB) -o $(TARGET)
|
||||||
|
|
||||||
$(TARGET).o: $(SRCS)
|
$(OBJS): $(SRCS)
|
||||||
$(CXX) $(CFLAGS) -I$(TOP_SRCDIR)/include -I$(INCLUDE_DIR) -I$(INCLUDE_DIR)/mgmapi -I$(INCLUDE_DIR)/ndbapi $(SRCS)
|
$(CXX) $(CFLAGS) -I$(TOP_SRCDIR)/include -I$(INCLUDE_DIR) -I$(INCLUDE_DIR)/mgmapi -I$(INCLUDE_DIR)/ndbapi $(SRCS)
|
||||||
|
|
||||||
clean:
|
clean:
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
TARGET = mgmapi_logevent2
|
TARGET = mgmapi_logevent2
|
||||||
SRCS = $(TARGET).cpp
|
SRCS = main.cpp
|
||||||
OBJS = $(TARGET).o
|
OBJS = main.o
|
||||||
CXX = g++
|
CXX = g++
|
||||||
CFLAGS = -c -Wall -fno-rtti -fno-exceptions
|
CFLAGS = -c -Wall -fno-rtti -fno-exceptions
|
||||||
CXXFLAGS =
|
CXXFLAGS =
|
||||||
@ -17,7 +17,7 @@ SYS_LIB =
|
|||||||
$(TARGET): $(OBJS)
|
$(TARGET): $(OBJS)
|
||||||
$(CXX) $(CXXFLAGS) $(LFLAGS) $(LIB_DIR) $(OBJS) -lndbclient -lmysqlclient_r -lmysys -lmystrings -lz $(SYS_LIB) -o $(TARGET)
|
$(CXX) $(CXXFLAGS) $(LFLAGS) $(LIB_DIR) $(OBJS) -lndbclient -lmysqlclient_r -lmysys -lmystrings -lz $(SYS_LIB) -o $(TARGET)
|
||||||
|
|
||||||
$(TARGET).o: $(SRCS)
|
$(OBJS): $(SRCS)
|
||||||
$(CXX) $(CFLAGS) -I$(TOP_SRCDIR)/include -I$(INCLUDE_DIR) -I$(INCLUDE_DIR)/mgmapi -I$(INCLUDE_DIR)/ndbapi $(SRCS)
|
$(CXX) $(CFLAGS) -I$(TOP_SRCDIR)/include -I$(INCLUDE_DIR) -I$(INCLUDE_DIR)/mgmapi -I$(INCLUDE_DIR)/ndbapi $(SRCS)
|
||||||
|
|
||||||
clean:
|
clean:
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
TARGET = ndbapi_simple_dual
|
TARGET = ndbapi_simple_dual
|
||||||
SRCS = $(TARGET).cpp
|
SRCS = main.cpp
|
||||||
OBJS = $(TARGET).o
|
OBJS = main.o
|
||||||
CXX = g++
|
CXX = g++
|
||||||
CFLAGS = -c -Wall -fno-rtti -fno-exceptions
|
CFLAGS = -c -Wall -fno-rtti -fno-exceptions
|
||||||
CXXFLAGS =
|
CXXFLAGS =
|
||||||
@ -17,7 +17,7 @@ SYS_LIB =
|
|||||||
$(TARGET): $(OBJS)
|
$(TARGET): $(OBJS)
|
||||||
$(CXX) $(CXXFLAGS) $(LFLAGS) $(LIB_DIR) $(OBJS) -lndbclient -lmysqlclient_r -lmysys -lmystrings -lz $(SYS_LIB) -o $(TARGET)
|
$(CXX) $(CXXFLAGS) $(LFLAGS) $(LIB_DIR) $(OBJS) -lndbclient -lmysqlclient_r -lmysys -lmystrings -lz $(SYS_LIB) -o $(TARGET)
|
||||||
|
|
||||||
$(TARGET).o: $(SRCS)
|
$(OBJS): $(SRCS)
|
||||||
$(CXX) $(CFLAGS) -I$(TOP_SRCDIR)/include -I$(INCLUDE_DIR) -I$(INCLUDE_DIR)/ndbapi $(SRCS)
|
$(CXX) $(CFLAGS) -I$(TOP_SRCDIR)/include -I$(INCLUDE_DIR) -I$(INCLUDE_DIR)/ndbapi $(SRCS)
|
||||||
|
|
||||||
clean:
|
clean:
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
TARGET = ndbapi_simple_index
|
TARGET = ndbapi_simple_index
|
||||||
SRCS = $(TARGET).cpp
|
SRCS = main.cpp
|
||||||
OBJS = $(TARGET).o
|
OBJS = main.o
|
||||||
CXX = g++
|
CXX = g++
|
||||||
CFLAGS = -c -Wall -fno-rtti -fno-exceptions
|
CFLAGS = -c -Wall -fno-rtti -fno-exceptions
|
||||||
CXXFLAGS =
|
CXXFLAGS =
|
||||||
@ -17,7 +17,7 @@ SYS_LIB =
|
|||||||
$(TARGET): $(OBJS)
|
$(TARGET): $(OBJS)
|
||||||
$(CXX) $(CXXFLAGS) $(LFLAGS) $(LIB_DIR) $(OBJS) -lndbclient -lmysqlclient_r -lmysys -lmystrings -lz $(SYS_LIB) -o $(TARGET)
|
$(CXX) $(CXXFLAGS) $(LFLAGS) $(LIB_DIR) $(OBJS) -lndbclient -lmysqlclient_r -lmysys -lmystrings -lz $(SYS_LIB) -o $(TARGET)
|
||||||
|
|
||||||
$(TARGET).o: $(SRCS)
|
$(OBJS): $(SRCS)
|
||||||
$(CXX) $(CFLAGS) -I$(INCLUDE_DIR)/include -I$(INCLUDE_DIR)/storage/ndb/include -I$(INCLUDE_DIR)/storage/ndb/include/ndbapi $(SRCS)
|
$(CXX) $(CFLAGS) -I$(INCLUDE_DIR)/include -I$(INCLUDE_DIR)/storage/ndb/include -I$(INCLUDE_DIR)/storage/ndb/include/ndbapi $(SRCS)
|
||||||
|
|
||||||
clean:
|
clean:
|
||||||
|
@ -15,7 +15,7 @@
|
|||||||
|
|
||||||
|
|
||||||
#include <ndb_global.h>
|
#include <ndb_global.h>
|
||||||
#include "NdbTick.h"
|
#include <NdbTick.h>
|
||||||
|
|
||||||
#define NANOSEC_PER_SEC 1000000000
|
#define NANOSEC_PER_SEC 1000000000
|
||||||
#define MICROSEC_PER_SEC 1000000
|
#define MICROSEC_PER_SEC 1000000
|
||||||
@ -71,7 +71,6 @@ NdbTick_CurrentMicrosecond(NDB_TICKS * secs, Uint32 * micros){
|
|||||||
}
|
}
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
#ifdef TIME_MEASUREMENT
|
|
||||||
int
|
int
|
||||||
NdbTick_getMicroTimer(struct MicroSecondTimer* input_timer)
|
NdbTick_getMicroTimer(struct MicroSecondTimer* input_timer)
|
||||||
{
|
{
|
||||||
@ -102,4 +101,3 @@ NdbTick_getMicrosPassed(struct MicroSecondTimer start,
|
|||||||
}
|
}
|
||||||
return ret_value;
|
return ret_value;
|
||||||
}
|
}
|
||||||
#endif
|
|
||||||
|
@ -818,6 +818,7 @@ TransporterRegistry::performReceive()
|
|||||||
{
|
{
|
||||||
Uint32 * ptr;
|
Uint32 * ptr;
|
||||||
Uint32 sz = t->getReceiveData(&ptr);
|
Uint32 sz = t->getReceiveData(&ptr);
|
||||||
|
transporter_recv_from(callbackObj, nodeId);
|
||||||
Uint32 szUsed = unpack(ptr, sz, nodeId, ioStates[nodeId]);
|
Uint32 szUsed = unpack(ptr, sz, nodeId, ioStates[nodeId]);
|
||||||
t->updateReceiveDataPtr(szUsed);
|
t->updateReceiveDataPtr(szUsed);
|
||||||
}
|
}
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
Next QMGR 1
|
Next QMGR 1
|
||||||
Next NDBCNTR 1001
|
Next NDBCNTR 1002
|
||||||
Next NDBFS 2000
|
Next NDBFS 2000
|
||||||
Next DBACC 3002
|
Next DBACC 3002
|
||||||
Next DBTUP 4029
|
Next DBTUP 4029
|
||||||
@ -523,3 +523,4 @@ Dbtup:
|
|||||||
NDBCNTR:
|
NDBCNTR:
|
||||||
|
|
||||||
1000: Crash insertion on SystemError::CopyFragRef
|
1000: Crash insertion on SystemError::CopyFragRef
|
||||||
|
1001: Delay sending NODE_FAILREP (to own node), until error is cleared
|
||||||
|
@ -448,6 +448,41 @@ Backup::execDUMP_STATE_ORD(Signal* signal)
|
|||||||
filePtr.p->m_flags);
|
filePtr.p->m_flags);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
ndbout_c("m_curr_disk_write_speed: %u m_words_written_this_period: %u m_overflow_disk_write: %u",
|
||||||
|
m_curr_disk_write_speed, m_words_written_this_period, m_overflow_disk_write);
|
||||||
|
ndbout_c("m_reset_delay_used: %u m_reset_disk_speed_time: %llu",
|
||||||
|
m_reset_delay_used, (Uint64)m_reset_disk_speed_time);
|
||||||
|
for(c_backups.first(ptr); ptr.i != RNIL; c_backups.next(ptr))
|
||||||
|
{
|
||||||
|
ndbout_c("BackupRecord %u: BackupId: %u MasterRef: %x ClientRef: %x",
|
||||||
|
ptr.i, ptr.p->backupId, ptr.p->masterRef, ptr.p->clientRef);
|
||||||
|
ndbout_c(" State: %u", ptr.p->slaveState.getState());
|
||||||
|
ndbout_c(" noOfByte: %llu noOfRecords: %llu",
|
||||||
|
ptr.p->noOfBytes, ptr.p->noOfRecords);
|
||||||
|
ndbout_c(" noOfLogBytes: %llu noOfLogRecords: %llu",
|
||||||
|
ptr.p->noOfLogBytes, ptr.p->noOfLogRecords);
|
||||||
|
ndbout_c(" errorCode: %u", ptr.p->errorCode);
|
||||||
|
BackupFilePtr filePtr;
|
||||||
|
for(ptr.p->files.first(filePtr); filePtr.i != RNIL;
|
||||||
|
ptr.p->files.next(filePtr))
|
||||||
|
{
|
||||||
|
ndbout_c(" file %u: type: %u flags: H'%x tableId: %u fragmentId: %u",
|
||||||
|
filePtr.i, filePtr.p->fileType, filePtr.p->m_flags,
|
||||||
|
filePtr.p->tableId, filePtr.p->fragmentNo);
|
||||||
|
}
|
||||||
|
if (ptr.p->slaveState.getState() == SCANNING && ptr.p->dataFilePtr != RNIL)
|
||||||
|
{
|
||||||
|
c_backupFilePool.getPtr(filePtr, ptr.p->dataFilePtr);
|
||||||
|
OperationRecord & op = filePtr.p->operation;
|
||||||
|
Uint32 *tmp = NULL;
|
||||||
|
Uint32 sz = 0;
|
||||||
|
bool eof = FALSE;
|
||||||
|
bool ready = op.dataBuffer.getReadPtr(&tmp, &sz, &eof);
|
||||||
|
ndbout_c("ready: %s eof: %s", ready ? "TRUE" : "FALSE", eof ? "TRUE" : "FALSE");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
if(signal->theData[0] == 24){
|
if(signal->theData[0] == 24){
|
||||||
/**
|
/**
|
||||||
@ -2771,6 +2806,8 @@ Backup::openFiles(Signal* signal, BackupRecordPtr ptr)
|
|||||||
c_backupFilePool.getPtr(filePtr, ptr.p->dataFilePtr);
|
c_backupFilePool.getPtr(filePtr, ptr.p->dataFilePtr);
|
||||||
filePtr.p->m_flags |= BackupFile::BF_OPENING;
|
filePtr.p->m_flags |= BackupFile::BF_OPENING;
|
||||||
|
|
||||||
|
if (c_defaults.m_o_direct)
|
||||||
|
req->fileFlags |= FsOpenReq::OM_DIRECT;
|
||||||
req->userPointer = filePtr.i;
|
req->userPointer = filePtr.i;
|
||||||
FsOpenReq::setVersion(req->fileNumber, 2);
|
FsOpenReq::setVersion(req->fileNumber, 2);
|
||||||
FsOpenReq::setSuffix(req->fileNumber, FsOpenReq::S_DATA);
|
FsOpenReq::setSuffix(req->fileNumber, FsOpenReq::S_DATA);
|
||||||
@ -3745,12 +3782,31 @@ Backup::OperationRecord::newFragment(Uint32 tableId, Uint32 fragNo)
|
|||||||
}
|
}
|
||||||
|
|
||||||
bool
|
bool
|
||||||
Backup::OperationRecord::fragComplete(Uint32 tableId, Uint32 fragNo)
|
Backup::OperationRecord::fragComplete(Uint32 tableId, Uint32 fragNo, bool fill_record)
|
||||||
{
|
{
|
||||||
Uint32 * tmp;
|
Uint32 * tmp;
|
||||||
const Uint32 footSz = sizeof(BackupFormat::DataFile::FragmentFooter) >> 2;
|
const Uint32 footSz = sizeof(BackupFormat::DataFile::FragmentFooter) >> 2;
|
||||||
|
Uint32 sz = footSz + 1;
|
||||||
|
|
||||||
if(dataBuffer.getWritePtr(&tmp, footSz + 1)) {
|
if (fill_record)
|
||||||
|
{
|
||||||
|
Uint32 * new_tmp;
|
||||||
|
if (!dataBuffer.getWritePtr(&tmp, sz))
|
||||||
|
return false;
|
||||||
|
new_tmp = tmp + sz;
|
||||||
|
|
||||||
|
if ((UintPtr)new_tmp & (sizeof(Page32)-1))
|
||||||
|
{
|
||||||
|
/* padding is needed to get full write */
|
||||||
|
new_tmp += 2 /* to fit empty header minimum 2 words*/;
|
||||||
|
new_tmp = (Uint32 *)(((UintPtr)new_tmp + sizeof(Page32)-1) &
|
||||||
|
~(UintPtr)(sizeof(Page32)-1));
|
||||||
|
/* new write sz */
|
||||||
|
sz = new_tmp - tmp;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if(dataBuffer.getWritePtr(&tmp, sz)) {
|
||||||
jam();
|
jam();
|
||||||
* tmp = 0; // Finish record stream
|
* tmp = 0; // Finish record stream
|
||||||
tmp++;
|
tmp++;
|
||||||
@ -3762,7 +3818,17 @@ Backup::OperationRecord::fragComplete(Uint32 tableId, Uint32 fragNo)
|
|||||||
foot->FragmentNo = htonl(fragNo);
|
foot->FragmentNo = htonl(fragNo);
|
||||||
foot->NoOfRecords = htonl(noOfRecords);
|
foot->NoOfRecords = htonl(noOfRecords);
|
||||||
foot->Checksum = htonl(0);
|
foot->Checksum = htonl(0);
|
||||||
dataBuffer.updateWritePtr(footSz + 1);
|
|
||||||
|
if (sz != footSz + 1)
|
||||||
|
{
|
||||||
|
tmp += footSz;
|
||||||
|
memset(tmp, 0, (sz - footSz - 1) * 4);
|
||||||
|
*tmp = htonl(BackupFormat::EMPTY_ENTRY);
|
||||||
|
tmp++;
|
||||||
|
*tmp = htonl(sz - footSz - 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
dataBuffer.updateWritePtr(sz);
|
||||||
return true;
|
return true;
|
||||||
}//if
|
}//if
|
||||||
return false;
|
return false;
|
||||||
@ -3864,8 +3930,13 @@ Backup::fragmentCompleted(Signal* signal, BackupFilePtr filePtr)
|
|||||||
return;
|
return;
|
||||||
}//if
|
}//if
|
||||||
|
|
||||||
|
BackupRecordPtr ptr LINT_SET_PTR;
|
||||||
|
c_backupPool.getPtr(ptr, filePtr.p->backupPtr);
|
||||||
|
|
||||||
OperationRecord & op = filePtr.p->operation;
|
OperationRecord & op = filePtr.p->operation;
|
||||||
if(!op.fragComplete(filePtr.p->tableId, filePtr.p->fragmentNo)) {
|
if(!op.fragComplete(filePtr.p->tableId, filePtr.p->fragmentNo,
|
||||||
|
c_defaults.m_o_direct))
|
||||||
|
{
|
||||||
jam();
|
jam();
|
||||||
signal->theData[0] = BackupContinueB::BUFFER_FULL_FRAG_COMPLETE;
|
signal->theData[0] = BackupContinueB::BUFFER_FULL_FRAG_COMPLETE;
|
||||||
signal->theData[1] = filePtr.i;
|
signal->theData[1] = filePtr.i;
|
||||||
@ -3875,9 +3946,6 @@ Backup::fragmentCompleted(Signal* signal, BackupFilePtr filePtr)
|
|||||||
|
|
||||||
filePtr.p->m_flags &= ~(Uint32)BackupFile::BF_SCAN_THREAD;
|
filePtr.p->m_flags &= ~(Uint32)BackupFile::BF_SCAN_THREAD;
|
||||||
|
|
||||||
BackupRecordPtr ptr LINT_SET_PTR;
|
|
||||||
c_backupPool.getPtr(ptr, filePtr.p->backupPtr);
|
|
||||||
|
|
||||||
if (ptr.p->is_lcp())
|
if (ptr.p->is_lcp())
|
||||||
{
|
{
|
||||||
ptr.p->slaveState.setState(STOPPING);
|
ptr.p->slaveState.setState(STOPPING);
|
||||||
@ -4914,6 +4982,8 @@ Backup::lcp_open_file(Signal* signal, BackupRecordPtr ptr)
|
|||||||
FsOpenReq::OM_CREATE |
|
FsOpenReq::OM_CREATE |
|
||||||
FsOpenReq::OM_APPEND |
|
FsOpenReq::OM_APPEND |
|
||||||
FsOpenReq::OM_AUTOSYNC;
|
FsOpenReq::OM_AUTOSYNC;
|
||||||
|
if (c_defaults.m_o_direct)
|
||||||
|
req->fileFlags |= FsOpenReq::OM_DIRECT;
|
||||||
FsOpenReq::v2_setCount(req->fileNumber, 0xFFFFFFFF);
|
FsOpenReq::v2_setCount(req->fileNumber, 0xFFFFFFFF);
|
||||||
req->auto_sync_size = c_defaults.m_disk_synch_size;
|
req->auto_sync_size = c_defaults.m_disk_synch_size;
|
||||||
|
|
||||||
|
@ -240,7 +240,7 @@ public:
|
|||||||
* Once per fragment
|
* Once per fragment
|
||||||
*/
|
*/
|
||||||
bool newFragment(Uint32 tableId, Uint32 fragNo);
|
bool newFragment(Uint32 tableId, Uint32 fragNo);
|
||||||
bool fragComplete(Uint32 tableId, Uint32 fragNo);
|
bool fragComplete(Uint32 tableId, Uint32 fragNo, bool fill_record);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Once per scan frag (next) req/conf
|
* Once per scan frag (next) req/conf
|
||||||
@ -534,6 +534,7 @@ public:
|
|||||||
Uint32 m_disk_write_speed;
|
Uint32 m_disk_write_speed;
|
||||||
Uint32 m_disk_synch_size;
|
Uint32 m_disk_synch_size;
|
||||||
Uint32 m_diskless;
|
Uint32 m_diskless;
|
||||||
|
Uint32 m_o_direct;
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -32,7 +32,8 @@ struct BackupFormat {
|
|||||||
TABLE_LIST = 4,
|
TABLE_LIST = 4,
|
||||||
TABLE_DESCRIPTION = 5,
|
TABLE_DESCRIPTION = 5,
|
||||||
GCP_ENTRY = 6,
|
GCP_ENTRY = 6,
|
||||||
FRAGMENT_INFO = 7
|
FRAGMENT_INFO = 7,
|
||||||
|
EMPTY_ENTRY = 8
|
||||||
};
|
};
|
||||||
|
|
||||||
struct FileHeader {
|
struct FileHeader {
|
||||||
@ -93,6 +94,13 @@ struct BackupFormat {
|
|||||||
Uint32 NoOfRecords;
|
Uint32 NoOfRecords;
|
||||||
Uint32 Checksum;
|
Uint32 Checksum;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/* optional padding for O_DIRECT */
|
||||||
|
struct EmptyEntry {
|
||||||
|
Uint32 SectionType;
|
||||||
|
Uint32 SectionLength;
|
||||||
|
/* not used data */
|
||||||
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -148,10 +148,13 @@ Backup::execREAD_CONFIG_REQ(Signal* signal)
|
|||||||
c_defaults.m_disk_write_speed = 10 * (1024 * 1024);
|
c_defaults.m_disk_write_speed = 10 * (1024 * 1024);
|
||||||
c_defaults.m_disk_write_speed_sr = 100 * (1024 * 1024);
|
c_defaults.m_disk_write_speed_sr = 100 * (1024 * 1024);
|
||||||
c_defaults.m_disk_synch_size = 4 * (1024 * 1024);
|
c_defaults.m_disk_synch_size = 4 * (1024 * 1024);
|
||||||
|
c_defaults.m_o_direct = true;
|
||||||
|
|
||||||
Uint32 noBackups = 0, noTables = 0, noAttribs = 0, noFrags = 0;
|
Uint32 noBackups = 0, noTables = 0, noAttribs = 0, noFrags = 0;
|
||||||
ndbrequire(!ndb_mgm_get_int_parameter(p, CFG_DB_DISCLESS,
|
ndbrequire(!ndb_mgm_get_int_parameter(p, CFG_DB_DISCLESS,
|
||||||
&c_defaults.m_diskless));
|
&c_defaults.m_diskless));
|
||||||
|
ndb_mgm_get_int_parameter(p, CFG_DB_O_DIRECT,
|
||||||
|
&c_defaults.m_o_direct);
|
||||||
ndb_mgm_get_int_parameter(p, CFG_DB_CHECKPOINT_SPEED_SR,
|
ndb_mgm_get_int_parameter(p, CFG_DB_CHECKPOINT_SPEED_SR,
|
||||||
&c_defaults.m_disk_write_speed_sr);
|
&c_defaults.m_disk_write_speed_sr);
|
||||||
ndb_mgm_get_int_parameter(p, CFG_DB_CHECKPOINT_SPEED,
|
ndb_mgm_get_int_parameter(p, CFG_DB_CHECKPOINT_SPEED,
|
||||||
@ -204,7 +207,7 @@ Backup::execREAD_CONFIG_REQ(Signal* signal)
|
|||||||
/ sizeof(Page32);
|
/ sizeof(Page32);
|
||||||
// We need to allocate an additional of 2 pages. 1 page because of a bug in
|
// We need to allocate an additional of 2 pages. 1 page because of a bug in
|
||||||
// ArrayPool and another one for DICTTAINFO.
|
// ArrayPool and another one for DICTTAINFO.
|
||||||
c_pagePool.setSize(noPages + NO_OF_PAGES_META_FILE + 2);
|
c_pagePool.setSize(noPages + NO_OF_PAGES_META_FILE + 2, true);
|
||||||
|
|
||||||
{ // Init all tables
|
{ // Init all tables
|
||||||
SLList<Table> tables(c_tablePool);
|
SLList<Table> tables(c_tablePool);
|
||||||
|
@ -270,8 +270,8 @@ FsBuffer::getReadPtr(Uint32 ** ptr, Uint32 * sz, bool * _eof){
|
|||||||
|
|
||||||
* ptr = &Tp[Tr];
|
* ptr = &Tp[Tr];
|
||||||
|
|
||||||
DEBUG(ndbout_c("getReadPtr() Tr: %d Tw: %d Ts: %d Tm: %d sz1: %d -> %d",
|
DEBUG(ndbout_c("getReadPtr() Tr: %d Tmw: %d Ts: %d Tm: %d sz1: %d -> %d",
|
||||||
Tr, Tw, Ts, Tm, sz1, * sz));
|
Tr, Tmw, Ts, Tm, sz1, * sz));
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
@ -279,8 +279,8 @@ FsBuffer::getReadPtr(Uint32 ** ptr, Uint32 * sz, bool * _eof){
|
|||||||
if(!m_eof){
|
if(!m_eof){
|
||||||
* _eof = false;
|
* _eof = false;
|
||||||
|
|
||||||
DEBUG(ndbout_c("getReadPtr() Tr: %d Tw: %d Ts: %d Tm: %d sz1: %d -> false",
|
DEBUG(ndbout_c("getReadPtr() Tr: %d Tmw: %d Ts: %d Tm: %d sz1: %d -> false",
|
||||||
Tr, Tw, Ts, Tm, sz1));
|
Tr, Tmw, Ts, Tm, sz1));
|
||||||
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
@ -289,8 +289,8 @@ FsBuffer::getReadPtr(Uint32 ** ptr, Uint32 * sz, bool * _eof){
|
|||||||
* _eof = true;
|
* _eof = true;
|
||||||
* ptr = &Tp[Tr];
|
* ptr = &Tp[Tr];
|
||||||
|
|
||||||
DEBUG(ndbout_c("getReadPtr() Tr: %d Tw: %d Ts: %d Tm: %d sz1: %d -> %d eof",
|
DEBUG(ndbout_c("getReadPtr() Tr: %d Tmw: %d Ts: %d Tm: %d sz1: %d -> %d eof",
|
||||||
Tr, Tw, Ts, Tm, sz1, * sz));
|
Tr, Tmw, Ts, Tm, sz1, * sz));
|
||||||
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
@ -316,13 +316,13 @@ FsBuffer::getWritePtr(Uint32 ** ptr, Uint32 sz){
|
|||||||
if(sz1 > sz){ // Note at least 1 word of slack
|
if(sz1 > sz){ // Note at least 1 word of slack
|
||||||
* ptr = &Tp[Tw];
|
* ptr = &Tp[Tw];
|
||||||
|
|
||||||
DEBUG(ndbout_c("getWritePtr(%d) Tr: %d Tw: %d Ts: %d sz1: %d -> true",
|
DEBUG(ndbout_c("getWritePtr(%d) Tw: %d sz1: %d -> true",
|
||||||
sz, Tr, Tw, Ts, sz1));
|
sz, Tw, sz1));
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
DEBUG(ndbout_c("getWritePtr(%d) Tr: %d Tw: %d Ts: %d sz1: %d -> false",
|
DEBUG(ndbout_c("getWritePtr(%d) Tw: %d sz1: %d -> false",
|
||||||
sz, Tr, Tw, Ts, sz1));
|
sz, Tw, sz1));
|
||||||
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
@ -339,11 +339,15 @@ FsBuffer::updateWritePtr(Uint32 sz){
|
|||||||
m_free -= sz;
|
m_free -= sz;
|
||||||
if(Tnew < Ts){
|
if(Tnew < Ts){
|
||||||
m_writeIndex = Tnew;
|
m_writeIndex = Tnew;
|
||||||
|
DEBUG(ndbout_c("updateWritePtr(%d) m_writeIndex: %d",
|
||||||
|
sz, m_writeIndex));
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
memcpy(Tp, &Tp[Ts], (Tnew - Ts) << 2);
|
memcpy(Tp, &Tp[Ts], (Tnew - Ts) << 2);
|
||||||
m_writeIndex = Tnew - Ts;
|
m_writeIndex = Tnew - Ts;
|
||||||
|
DEBUG(ndbout_c("updateWritePtr(%d) m_writeIndex: %d",
|
||||||
|
sz, m_writeIndex));
|
||||||
}
|
}
|
||||||
|
|
||||||
inline
|
inline
|
||||||
|
@ -698,6 +698,9 @@ void Dbdict::execFSCLOSECONF(Signal* signal)
|
|||||||
case FsConnectRecord::OPEN_READ_SCHEMA2:
|
case FsConnectRecord::OPEN_READ_SCHEMA2:
|
||||||
openSchemaFile(signal, 1, fsPtr.i, false, false);
|
openSchemaFile(signal, 1, fsPtr.i, false, false);
|
||||||
break;
|
break;
|
||||||
|
case FsConnectRecord::OPEN_READ_TAB_FILE2:
|
||||||
|
openTableFile(signal, 1, fsPtr.i, c_readTableRecord.tableId, false);
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
jamLine((fsPtr.p->fsState & 0xFFF));
|
jamLine((fsPtr.p->fsState & 0xFFF));
|
||||||
ndbrequire(false);
|
ndbrequire(false);
|
||||||
@ -1073,8 +1076,11 @@ void Dbdict::readTableConf(Signal* signal,
|
|||||||
void Dbdict::readTableRef(Signal* signal,
|
void Dbdict::readTableRef(Signal* signal,
|
||||||
FsConnectRecordPtr fsPtr)
|
FsConnectRecordPtr fsPtr)
|
||||||
{
|
{
|
||||||
|
/**
|
||||||
|
* First close corrupt file
|
||||||
|
*/
|
||||||
fsPtr.p->fsState = FsConnectRecord::OPEN_READ_TAB_FILE2;
|
fsPtr.p->fsState = FsConnectRecord::OPEN_READ_TAB_FILE2;
|
||||||
openTableFile(signal, 1, fsPtr.i, c_readTableRecord.tableId, false);
|
closeFile(signal, fsPtr.p->filePtr, fsPtr.i);
|
||||||
return;
|
return;
|
||||||
}//Dbdict::readTableRef()
|
}//Dbdict::readTableRef()
|
||||||
|
|
||||||
|
@ -4741,12 +4741,18 @@ void Dbdih::failedNodeLcpHandling(Signal* signal, NodeRecordPtr failedNodePtr)
|
|||||||
jam();
|
jam();
|
||||||
const Uint32 nodeId = failedNodePtr.i;
|
const Uint32 nodeId = failedNodePtr.i;
|
||||||
|
|
||||||
if (c_lcpState.m_participatingLQH.get(failedNodePtr.i)){
|
if (isMaster() && c_lcpState.m_participatingLQH.get(failedNodePtr.i))
|
||||||
|
{
|
||||||
/*----------------------------------------------------*/
|
/*----------------------------------------------------*/
|
||||||
/* THE NODE WAS INVOLVED IN A LOCAL CHECKPOINT. WE */
|
/* THE NODE WAS INVOLVED IN A LOCAL CHECKPOINT. WE */
|
||||||
/* MUST UPDATE THE ACTIVE STATUS TO INDICATE THAT */
|
/* MUST UPDATE THE ACTIVE STATUS TO INDICATE THAT */
|
||||||
/* THE NODE HAVE MISSED A LOCAL CHECKPOINT. */
|
/* THE NODE HAVE MISSED A LOCAL CHECKPOINT. */
|
||||||
/*----------------------------------------------------*/
|
/*----------------------------------------------------*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Bug#28717, Only master should do this, as this status is copied
|
||||||
|
* to other nodes
|
||||||
|
*/
|
||||||
switch (failedNodePtr.p->activeStatus) {
|
switch (failedNodePtr.p->activeStatus) {
|
||||||
case Sysfile::NS_Active:
|
case Sysfile::NS_Active:
|
||||||
jam();
|
jam();
|
||||||
|
@ -71,7 +71,6 @@ class Dbtup;
|
|||||||
/* CONSTANTS OF THE LOG PAGES */
|
/* CONSTANTS OF THE LOG PAGES */
|
||||||
/* ------------------------------------------------------------------------- */
|
/* ------------------------------------------------------------------------- */
|
||||||
#define ZPAGE_HEADER_SIZE 32
|
#define ZPAGE_HEADER_SIZE 32
|
||||||
#define ZNO_MBYTES_IN_FILE 16
|
|
||||||
#define ZPAGE_SIZE 8192
|
#define ZPAGE_SIZE 8192
|
||||||
#define ZPAGES_IN_MBYTE 32
|
#define ZPAGES_IN_MBYTE 32
|
||||||
#define ZTWOLOG_NO_PAGES_IN_MBYTE 5
|
#define ZTWOLOG_NO_PAGES_IN_MBYTE 5
|
||||||
@ -115,9 +114,6 @@ class Dbtup;
|
|||||||
/* ------------------------------------------------------------------------- */
|
/* ------------------------------------------------------------------------- */
|
||||||
/* VARIOUS CONSTANTS USED AS FLAGS TO THE FILE MANAGER. */
|
/* VARIOUS CONSTANTS USED AS FLAGS TO THE FILE MANAGER. */
|
||||||
/* ------------------------------------------------------------------------- */
|
/* ------------------------------------------------------------------------- */
|
||||||
#define ZOPEN_READ 0
|
|
||||||
#define ZOPEN_WRITE 1
|
|
||||||
#define ZOPEN_READ_WRITE 2
|
|
||||||
#define ZVAR_NO_LOG_PAGE_WORD 1
|
#define ZVAR_NO_LOG_PAGE_WORD 1
|
||||||
#define ZLIST_OF_PAIRS 0
|
#define ZLIST_OF_PAIRS 0
|
||||||
#define ZLIST_OF_PAIRS_SYNCH 16
|
#define ZLIST_OF_PAIRS_SYNCH 16
|
||||||
@ -142,7 +138,7 @@ class Dbtup;
|
|||||||
/* IN THE MBYTE. */
|
/* IN THE MBYTE. */
|
||||||
/* ------------------------------------------------------------------------- */
|
/* ------------------------------------------------------------------------- */
|
||||||
#define ZFD_HEADER_SIZE 3
|
#define ZFD_HEADER_SIZE 3
|
||||||
#define ZFD_PART_SIZE 48
|
#define ZFD_MBYTE_SIZE 3
|
||||||
#define ZLOG_HEAD_SIZE 8
|
#define ZLOG_HEAD_SIZE 8
|
||||||
#define ZNEXT_LOG_SIZE 2
|
#define ZNEXT_LOG_SIZE 2
|
||||||
#define ZABORT_LOG_SIZE 3
|
#define ZABORT_LOG_SIZE 3
|
||||||
@ -169,7 +165,6 @@ class Dbtup;
|
|||||||
#define ZPOS_LOG_TYPE 0
|
#define ZPOS_LOG_TYPE 0
|
||||||
#define ZPOS_NO_FD 1
|
#define ZPOS_NO_FD 1
|
||||||
#define ZPOS_FILE_NO 2
|
#define ZPOS_FILE_NO 2
|
||||||
#define ZMAX_LOG_FILES_IN_PAGE_ZERO 40
|
|
||||||
/* ------------------------------------------------------------------------- */
|
/* ------------------------------------------------------------------------- */
|
||||||
/* THE POSITIONS WITHIN A PREPARE LOG RECORD AND A NEW PREPARE */
|
/* THE POSITIONS WITHIN A PREPARE LOG RECORD AND A NEW PREPARE */
|
||||||
/* LOG RECORD. */
|
/* LOG RECORD. */
|
||||||
@ -1437,17 +1432,17 @@ public:
|
|||||||
* header of each log file. That information is used during
|
* header of each log file. That information is used during
|
||||||
* system restart to find the tail of the log.
|
* system restart to find the tail of the log.
|
||||||
*/
|
*/
|
||||||
UintR logLastPrepRef[16];
|
UintR *logLastPrepRef;
|
||||||
/**
|
/**
|
||||||
* The max global checkpoint completed before the mbyte in the
|
* The max global checkpoint completed before the mbyte in the
|
||||||
* log file was started. One variable per mbyte.
|
* log file was started. One variable per mbyte.
|
||||||
*/
|
*/
|
||||||
UintR logMaxGciCompleted[16];
|
UintR *logMaxGciCompleted;
|
||||||
/**
|
/**
|
||||||
* The max global checkpoint started before the mbyte in the log
|
* The max global checkpoint started before the mbyte in the log
|
||||||
* file was started. One variable per mbyte.
|
* file was started. One variable per mbyte.
|
||||||
*/
|
*/
|
||||||
UintR logMaxGciStarted[16];
|
UintR *logMaxGciStarted;
|
||||||
/**
|
/**
|
||||||
* This variable contains the file name as needed by the file
|
* This variable contains the file name as needed by the file
|
||||||
* system when opening the file.
|
* system when opening the file.
|
||||||
@ -2163,6 +2158,7 @@ private:
|
|||||||
void execSTART_RECREF(Signal* signal);
|
void execSTART_RECREF(Signal* signal);
|
||||||
|
|
||||||
void execGCP_SAVEREQ(Signal* signal);
|
void execGCP_SAVEREQ(Signal* signal);
|
||||||
|
void execFSOPENREF(Signal* signal);
|
||||||
void execFSOPENCONF(Signal* signal);
|
void execFSOPENCONF(Signal* signal);
|
||||||
void execFSCLOSECONF(Signal* signal);
|
void execFSCLOSECONF(Signal* signal);
|
||||||
void execFSWRITECONF(Signal* signal);
|
void execFSWRITECONF(Signal* signal);
|
||||||
@ -2671,6 +2667,8 @@ private:
|
|||||||
LogPartRecord *logPartRecord;
|
LogPartRecord *logPartRecord;
|
||||||
LogPartRecordPtr logPartPtr;
|
LogPartRecordPtr logPartPtr;
|
||||||
UintR clogPartFileSize;
|
UintR clogPartFileSize;
|
||||||
|
Uint32 clogFileSize; // In MBYTE
|
||||||
|
Uint32 cmaxLogFilesInPageZero; //
|
||||||
|
|
||||||
// Configurable
|
// Configurable
|
||||||
LogFileRecord *logFileRecord;
|
LogFileRecord *logFileRecord;
|
||||||
@ -2686,6 +2684,7 @@ private:
|
|||||||
UintR clfoFileSize;
|
UintR clfoFileSize;
|
||||||
|
|
||||||
LogPageRecord *logPageRecord;
|
LogPageRecord *logPageRecord;
|
||||||
|
void *logPageRecordUnaligned;
|
||||||
LogPageRecordPtr logPagePtr;
|
LogPageRecordPtr logPagePtr;
|
||||||
UintR cfirstfreeLogPage;
|
UintR cfirstfreeLogPage;
|
||||||
UintR clogPageFileSize;
|
UintR clogPageFileSize;
|
||||||
@ -2889,6 +2888,7 @@ private:
|
|||||||
UintR ctransidHash[1024];
|
UintR ctransidHash[1024];
|
||||||
|
|
||||||
Uint32 c_diskless;
|
Uint32 c_diskless;
|
||||||
|
Uint32 c_o_direct;
|
||||||
Uint32 c_error_insert_table_id;
|
Uint32 c_error_insert_table_id;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
@ -49,6 +49,7 @@ void Dblqh::initData()
|
|||||||
logFileRecord = 0;
|
logFileRecord = 0;
|
||||||
logFileOperationRecord = 0;
|
logFileOperationRecord = 0;
|
||||||
logPageRecord = 0;
|
logPageRecord = 0;
|
||||||
|
logPageRecordUnaligned= 0;
|
||||||
pageRefRecord = 0;
|
pageRefRecord = 0;
|
||||||
tablerec = 0;
|
tablerec = 0;
|
||||||
tcConnectionrec = 0;
|
tcConnectionrec = 0;
|
||||||
@ -60,6 +61,8 @@ void Dblqh::initData()
|
|||||||
cLqhTimeOutCheckCount = 0;
|
cLqhTimeOutCheckCount = 0;
|
||||||
cbookedAccOps = 0;
|
cbookedAccOps = 0;
|
||||||
m_backup_ptr = RNIL;
|
m_backup_ptr = RNIL;
|
||||||
|
clogFileSize = 16;
|
||||||
|
cmaxLogFilesInPageZero = 40;
|
||||||
}//Dblqh::initData()
|
}//Dblqh::initData()
|
||||||
|
|
||||||
void Dblqh::initRecords()
|
void Dblqh::initRecords()
|
||||||
@ -105,10 +108,13 @@ void Dblqh::initRecords()
|
|||||||
sizeof(LogFileOperationRecord),
|
sizeof(LogFileOperationRecord),
|
||||||
clfoFileSize);
|
clfoFileSize);
|
||||||
|
|
||||||
logPageRecord = (LogPageRecord*)allocRecord("LogPageRecord",
|
logPageRecord =
|
||||||
sizeof(LogPageRecord),
|
(LogPageRecord*)allocRecordAligned("LogPageRecord",
|
||||||
clogPageFileSize,
|
sizeof(LogPageRecord),
|
||||||
false);
|
clogPageFileSize,
|
||||||
|
&logPageRecordUnaligned,
|
||||||
|
NDB_O_DIRECT_WRITE_ALIGNMENT,
|
||||||
|
false);
|
||||||
|
|
||||||
pageRefRecord = (PageRefRecord*)allocRecord("PageRefRecord",
|
pageRefRecord = (PageRefRecord*)allocRecord("PageRefRecord",
|
||||||
sizeof(PageRefRecord),
|
sizeof(PageRefRecord),
|
||||||
@ -260,6 +266,7 @@ Dblqh::Dblqh(Block_context& ctx):
|
|||||||
addRecSignal(GSN_START_FRAGREQ, &Dblqh::execSTART_FRAGREQ);
|
addRecSignal(GSN_START_FRAGREQ, &Dblqh::execSTART_FRAGREQ);
|
||||||
addRecSignal(GSN_START_RECREF, &Dblqh::execSTART_RECREF);
|
addRecSignal(GSN_START_RECREF, &Dblqh::execSTART_RECREF);
|
||||||
addRecSignal(GSN_GCP_SAVEREQ, &Dblqh::execGCP_SAVEREQ);
|
addRecSignal(GSN_GCP_SAVEREQ, &Dblqh::execGCP_SAVEREQ);
|
||||||
|
addRecSignal(GSN_FSOPENREF, &Dblqh::execFSOPENREF, true);
|
||||||
addRecSignal(GSN_FSOPENCONF, &Dblqh::execFSOPENCONF);
|
addRecSignal(GSN_FSOPENCONF, &Dblqh::execFSOPENCONF);
|
||||||
addRecSignal(GSN_FSCLOSECONF, &Dblqh::execFSCLOSECONF);
|
addRecSignal(GSN_FSCLOSECONF, &Dblqh::execFSCLOSECONF);
|
||||||
addRecSignal(GSN_FSWRITECONF, &Dblqh::execFSWRITECONF);
|
addRecSignal(GSN_FSWRITECONF, &Dblqh::execFSWRITECONF);
|
||||||
@ -377,7 +384,7 @@ Dblqh::~Dblqh()
|
|||||||
sizeof(LogFileOperationRecord),
|
sizeof(LogFileOperationRecord),
|
||||||
clfoFileSize);
|
clfoFileSize);
|
||||||
|
|
||||||
deallocRecord((void**)&logPageRecord,
|
deallocRecord((void**)&logPageRecordUnaligned,
|
||||||
"LogPageRecord",
|
"LogPageRecord",
|
||||||
sizeof(LogPageRecord),
|
sizeof(LogPageRecord),
|
||||||
clogPageFileSize);
|
clogPageFileSize);
|
||||||
|
@ -1036,11 +1036,41 @@ void Dblqh::execREAD_CONFIG_REQ(Signal* signal)
|
|||||||
cmaxAccOps = cscanrecFileSize * MAX_PARALLEL_OP_PER_SCAN;
|
cmaxAccOps = cscanrecFileSize * MAX_PARALLEL_OP_PER_SCAN;
|
||||||
|
|
||||||
ndbrequire(!ndb_mgm_get_int_parameter(p, CFG_DB_DISCLESS, &c_diskless));
|
ndbrequire(!ndb_mgm_get_int_parameter(p, CFG_DB_DISCLESS, &c_diskless));
|
||||||
|
c_o_direct = true;
|
||||||
|
ndb_mgm_get_int_parameter(p, CFG_DB_O_DIRECT, &c_o_direct);
|
||||||
|
|
||||||
Uint32 tmp= 0;
|
Uint32 tmp= 0;
|
||||||
ndbrequire(!ndb_mgm_get_int_parameter(p, CFG_LQH_FRAG, &tmp));
|
ndbrequire(!ndb_mgm_get_int_parameter(p, CFG_LQH_FRAG, &tmp));
|
||||||
c_fragment_pool.setSize(tmp);
|
c_fragment_pool.setSize(tmp);
|
||||||
|
|
||||||
|
if (!ndb_mgm_get_int_parameter(p, CFG_DB_REDOLOG_FILE_SIZE,
|
||||||
|
&clogFileSize))
|
||||||
|
{
|
||||||
|
// convert to mbyte
|
||||||
|
clogFileSize = (clogFileSize + 1024*1024 - 1) / (1024 * 1024);
|
||||||
|
ndbrequire(clogFileSize >= 4 && clogFileSize <= 1024);
|
||||||
|
}
|
||||||
|
|
||||||
|
cmaxLogFilesInPageZero = (ZPAGE_SIZE - ZPAGE_HEADER_SIZE - 128) /
|
||||||
|
(ZFD_MBYTE_SIZE * clogFileSize);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* "Old" cmaxLogFilesInPageZero was 40
|
||||||
|
* Each FD need 3 words per mb, require that they can fit into 1 page
|
||||||
|
* (atleast 1 FD)
|
||||||
|
* Is also checked in ConfigInfo.cpp (max FragmentLogFileSize = 1Gb)
|
||||||
|
* 1Gb = 1024Mb => 3(ZFD_MBYTE_SIZE) * 1024 < 8192 (ZPAGE_SIZE)
|
||||||
|
*/
|
||||||
|
if (cmaxLogFilesInPageZero > 40)
|
||||||
|
{
|
||||||
|
jam();
|
||||||
|
cmaxLogFilesInPageZero = 40;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
ndbrequire(cmaxLogFilesInPageZero);
|
||||||
|
}
|
||||||
|
|
||||||
initRecords();
|
initRecords();
|
||||||
initialiseRecordsLab(signal, 0, ref, senderData);
|
initialiseRecordsLab(signal, 0, ref, senderData);
|
||||||
|
|
||||||
@ -11793,9 +11823,9 @@ void Dblqh::sendStartLcp(Signal* signal)
|
|||||||
Uint32 Dblqh::remainingLogSize(const LogFileRecordPtr &sltCurrLogFilePtr,
|
Uint32 Dblqh::remainingLogSize(const LogFileRecordPtr &sltCurrLogFilePtr,
|
||||||
const LogPartRecordPtr &sltLogPartPtr)
|
const LogPartRecordPtr &sltLogPartPtr)
|
||||||
{
|
{
|
||||||
Uint32 hf = sltCurrLogFilePtr.p->fileNo*ZNO_MBYTES_IN_FILE+sltCurrLogFilePtr.p->currentMbyte;
|
Uint32 hf = sltCurrLogFilePtr.p->fileNo*clogFileSize+sltCurrLogFilePtr.p->currentMbyte;
|
||||||
Uint32 tf = sltLogPartPtr.p->logTailFileNo*ZNO_MBYTES_IN_FILE+sltLogPartPtr.p->logTailMbyte;
|
Uint32 tf = sltLogPartPtr.p->logTailFileNo*clogFileSize+sltLogPartPtr.p->logTailMbyte;
|
||||||
Uint32 sz = sltLogPartPtr.p->noLogFiles*ZNO_MBYTES_IN_FILE;
|
Uint32 sz = sltLogPartPtr.p->noLogFiles*clogFileSize;
|
||||||
if (tf > hf) hf += sz;
|
if (tf > hf) hf += sz;
|
||||||
return sz-(hf-tf);
|
return sz-(hf-tf);
|
||||||
}
|
}
|
||||||
@ -11853,7 +11883,7 @@ void Dblqh::setLogTail(Signal* signal, Uint32 keepGci)
|
|||||||
/* ------------------------------------------------------------------------- */
|
/* ------------------------------------------------------------------------- */
|
||||||
SLT_LOOP:
|
SLT_LOOP:
|
||||||
for (tsltIndex = tsltStartMbyte;
|
for (tsltIndex = tsltStartMbyte;
|
||||||
tsltIndex <= ZNO_MBYTES_IN_FILE - 1;
|
tsltIndex <= clogFileSize - 1;
|
||||||
tsltIndex++) {
|
tsltIndex++) {
|
||||||
if (sltLogFilePtr.p->logMaxGciStarted[tsltIndex] >= keepGci) {
|
if (sltLogFilePtr.p->logMaxGciStarted[tsltIndex] >= keepGci) {
|
||||||
/* ------------------------------------------------------------------------- */
|
/* ------------------------------------------------------------------------- */
|
||||||
@ -11869,7 +11899,7 @@ void Dblqh::setLogTail(Signal* signal, Uint32 keepGci)
|
|||||||
/* ------------------------------------------------------------------------- */
|
/* ------------------------------------------------------------------------- */
|
||||||
/*STEPPING BACK INCLUDES ALSO STEPPING BACK TO THE PREVIOUS LOG FILE. */
|
/*STEPPING BACK INCLUDES ALSO STEPPING BACK TO THE PREVIOUS LOG FILE. */
|
||||||
/* ------------------------------------------------------------------------- */
|
/* ------------------------------------------------------------------------- */
|
||||||
tsltMbyte = ZNO_MBYTES_IN_FILE - 1;
|
tsltMbyte = clogFileSize - 1;
|
||||||
sltLogFilePtr.i = sltLogFilePtr.p->prevLogFile;
|
sltLogFilePtr.i = sltLogFilePtr.p->prevLogFile;
|
||||||
ptrCheckGuard(sltLogFilePtr, clogFileFileSize, logFileRecord);
|
ptrCheckGuard(sltLogFilePtr, clogFileFileSize, logFileRecord);
|
||||||
}//if
|
}//if
|
||||||
@ -11907,7 +11937,7 @@ void Dblqh::setLogTail(Signal* signal, Uint32 keepGci)
|
|||||||
UintR ToldTailFileNo = sltLogPartPtr.p->logTailFileNo;
|
UintR ToldTailFileNo = sltLogPartPtr.p->logTailFileNo;
|
||||||
UintR ToldTailMByte = sltLogPartPtr.p->logTailMbyte;
|
UintR ToldTailMByte = sltLogPartPtr.p->logTailMbyte;
|
||||||
|
|
||||||
arrGuard(tsltMbyte, 16);
|
arrGuard(tsltMbyte, clogFileSize);
|
||||||
sltLogPartPtr.p->logTailFileNo =
|
sltLogPartPtr.p->logTailFileNo =
|
||||||
sltLogFilePtr.p->logLastPrepRef[tsltMbyte] >> 16;
|
sltLogFilePtr.p->logLastPrepRef[tsltMbyte] >> 16;
|
||||||
/* ------------------------------------------------------------------------- */
|
/* ------------------------------------------------------------------------- */
|
||||||
@ -12407,6 +12437,26 @@ void Dblqh::execFSOPENCONF(Signal* signal)
|
|||||||
}//switch
|
}//switch
|
||||||
}//Dblqh::execFSOPENCONF()
|
}//Dblqh::execFSOPENCONF()
|
||||||
|
|
||||||
|
void
|
||||||
|
Dblqh::execFSOPENREF(Signal* signal)
|
||||||
|
{
|
||||||
|
jamEntry();
|
||||||
|
FsRef* ref = (FsRef*)signal->getDataPtr();
|
||||||
|
Uint32 err = ref->errorCode;
|
||||||
|
if (err == FsRef::fsErrInvalidFileSize)
|
||||||
|
{
|
||||||
|
char buf[256];
|
||||||
|
BaseString::snprintf(buf, sizeof(buf),
|
||||||
|
"Invalid file size for redo logfile, "
|
||||||
|
" size only changable with --initial");
|
||||||
|
progError(__LINE__,
|
||||||
|
NDBD_EXIT_INVALID_CONFIG,
|
||||||
|
buf);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
SimulatedBlock::execFSOPENREF(signal);
|
||||||
|
}
|
||||||
|
|
||||||
/* ************>> */
|
/* ************>> */
|
||||||
/* FSREADCONF > */
|
/* FSREADCONF > */
|
||||||
@ -13052,7 +13102,7 @@ void Dblqh::openFileInitLab(Signal* signal)
|
|||||||
{
|
{
|
||||||
logFilePtr.p->logFileStatus = LogFileRecord::OPEN_INIT;
|
logFilePtr.p->logFileStatus = LogFileRecord::OPEN_INIT;
|
||||||
seizeLogpage(signal);
|
seizeLogpage(signal);
|
||||||
writeSinglePage(signal, (ZNO_MBYTES_IN_FILE * ZPAGES_IN_MBYTE) - 1,
|
writeSinglePage(signal, (clogFileSize * ZPAGES_IN_MBYTE) - 1,
|
||||||
ZPAGE_SIZE - 1, __LINE__);
|
ZPAGE_SIZE - 1, __LINE__);
|
||||||
lfoPtr.p->lfoState = LogFileOperationRecord::INIT_WRITE_AT_END;
|
lfoPtr.p->lfoState = LogFileOperationRecord::INIT_WRITE_AT_END;
|
||||||
return;
|
return;
|
||||||
@ -13115,7 +13165,7 @@ void Dblqh::writeInitMbyteLab(Signal* signal)
|
|||||||
{
|
{
|
||||||
releaseLfo(signal);
|
releaseLfo(signal);
|
||||||
logFilePtr.p->currentMbyte = logFilePtr.p->currentMbyte + 1;
|
logFilePtr.p->currentMbyte = logFilePtr.p->currentMbyte + 1;
|
||||||
if (logFilePtr.p->currentMbyte == ZNO_MBYTES_IN_FILE) {
|
if (logFilePtr.p->currentMbyte == clogFileSize) {
|
||||||
jam();
|
jam();
|
||||||
releaseLogpage(signal);
|
releaseLogpage(signal);
|
||||||
logFilePtr.p->logFileStatus = LogFileRecord::CLOSING_INIT;
|
logFilePtr.p->logFileStatus = LogFileRecord::CLOSING_INIT;
|
||||||
@ -13235,7 +13285,7 @@ void Dblqh::initLogfile(Signal* signal, Uint32 fileNo)
|
|||||||
logFilePtr.p->lastPageWritten = 0;
|
logFilePtr.p->lastPageWritten = 0;
|
||||||
logFilePtr.p->logPageZero = RNIL;
|
logFilePtr.p->logPageZero = RNIL;
|
||||||
logFilePtr.p->currentMbyte = 0;
|
logFilePtr.p->currentMbyte = 0;
|
||||||
for (tilIndex = 0; tilIndex <= 15; tilIndex++) {
|
for (tilIndex = 0; tilIndex < clogFileSize; tilIndex++) {
|
||||||
logFilePtr.p->logMaxGciCompleted[tilIndex] = (UintR)-1;
|
logFilePtr.p->logMaxGciCompleted[tilIndex] = (UintR)-1;
|
||||||
logFilePtr.p->logMaxGciStarted[tilIndex] = (UintR)-1;
|
logFilePtr.p->logMaxGciStarted[tilIndex] = (UintR)-1;
|
||||||
logFilePtr.p->logLastPrepRef[tilIndex] = 0;
|
logFilePtr.p->logLastPrepRef[tilIndex] = 0;
|
||||||
@ -13286,8 +13336,14 @@ void Dblqh::openFileRw(Signal* signal, LogFileRecordPtr olfLogFilePtr)
|
|||||||
signal->theData[3] = olfLogFilePtr.p->fileName[1];
|
signal->theData[3] = olfLogFilePtr.p->fileName[1];
|
||||||
signal->theData[4] = olfLogFilePtr.p->fileName[2];
|
signal->theData[4] = olfLogFilePtr.p->fileName[2];
|
||||||
signal->theData[5] = olfLogFilePtr.p->fileName[3];
|
signal->theData[5] = olfLogFilePtr.p->fileName[3];
|
||||||
signal->theData[6] = ZOPEN_READ_WRITE | FsOpenReq::OM_AUTOSYNC;
|
signal->theData[6] = FsOpenReq::OM_READWRITE | FsOpenReq::OM_AUTOSYNC | FsOpenReq::OM_CHECK_SIZE;
|
||||||
|
if (c_o_direct)
|
||||||
|
signal->theData[6] |= FsOpenReq::OM_DIRECT;
|
||||||
req->auto_sync_size = MAX_REDO_PAGES_WITHOUT_SYNCH * sizeof(LogPageRecord);
|
req->auto_sync_size = MAX_REDO_PAGES_WITHOUT_SYNCH * sizeof(LogPageRecord);
|
||||||
|
Uint64 sz = clogFileSize;
|
||||||
|
sz *= 1024; sz *= 1024;
|
||||||
|
req->file_size_hi = sz >> 32;
|
||||||
|
req->file_size_lo = sz & 0xFFFFFFFF;
|
||||||
sendSignal(NDBFS_REF, GSN_FSOPENREQ, signal, FsOpenReq::SignalLength, JBA);
|
sendSignal(NDBFS_REF, GSN_FSOPENREQ, signal, FsOpenReq::SignalLength, JBA);
|
||||||
}//Dblqh::openFileRw()
|
}//Dblqh::openFileRw()
|
||||||
|
|
||||||
@ -13306,7 +13362,9 @@ void Dblqh::openLogfileInit(Signal* signal)
|
|||||||
signal->theData[3] = logFilePtr.p->fileName[1];
|
signal->theData[3] = logFilePtr.p->fileName[1];
|
||||||
signal->theData[4] = logFilePtr.p->fileName[2];
|
signal->theData[4] = logFilePtr.p->fileName[2];
|
||||||
signal->theData[5] = logFilePtr.p->fileName[3];
|
signal->theData[5] = logFilePtr.p->fileName[3];
|
||||||
signal->theData[6] = 0x302 | FsOpenReq::OM_AUTOSYNC;
|
signal->theData[6] = FsOpenReq::OM_READWRITE | FsOpenReq::OM_TRUNCATE | FsOpenReq::OM_CREATE | FsOpenReq::OM_AUTOSYNC;
|
||||||
|
if (c_o_direct)
|
||||||
|
signal->theData[6] |= FsOpenReq::OM_DIRECT;
|
||||||
req->auto_sync_size = MAX_REDO_PAGES_WITHOUT_SYNCH * sizeof(LogPageRecord);
|
req->auto_sync_size = MAX_REDO_PAGES_WITHOUT_SYNCH * sizeof(LogPageRecord);
|
||||||
sendSignal(NDBFS_REF, GSN_FSOPENREQ, signal, FsOpenReq::SignalLength, JBA);
|
sendSignal(NDBFS_REF, GSN_FSOPENREQ, signal, FsOpenReq::SignalLength, JBA);
|
||||||
}//Dblqh::openLogfileInit()
|
}//Dblqh::openLogfileInit()
|
||||||
@ -13342,8 +13400,14 @@ void Dblqh::openNextLogfile(Signal* signal)
|
|||||||
signal->theData[3] = onlLogFilePtr.p->fileName[1];
|
signal->theData[3] = onlLogFilePtr.p->fileName[1];
|
||||||
signal->theData[4] = onlLogFilePtr.p->fileName[2];
|
signal->theData[4] = onlLogFilePtr.p->fileName[2];
|
||||||
signal->theData[5] = onlLogFilePtr.p->fileName[3];
|
signal->theData[5] = onlLogFilePtr.p->fileName[3];
|
||||||
signal->theData[6] = 2 | FsOpenReq::OM_AUTOSYNC;
|
signal->theData[6] = FsOpenReq::OM_READWRITE | FsOpenReq::OM_AUTOSYNC | FsOpenReq::OM_CHECK_SIZE;
|
||||||
|
if (c_o_direct)
|
||||||
|
signal->theData[6] |= FsOpenReq::OM_DIRECT;
|
||||||
req->auto_sync_size = MAX_REDO_PAGES_WITHOUT_SYNCH * sizeof(LogPageRecord);
|
req->auto_sync_size = MAX_REDO_PAGES_WITHOUT_SYNCH * sizeof(LogPageRecord);
|
||||||
|
Uint64 sz = clogFileSize;
|
||||||
|
sz *= 1024; sz *= 1024;
|
||||||
|
req->file_size_hi = sz >> 32;
|
||||||
|
req->file_size_lo = sz & 0xFFFFFFFF;
|
||||||
sendSignal(NDBFS_REF, GSN_FSOPENREQ, signal, FsOpenReq::SignalLength, JBA);
|
sendSignal(NDBFS_REF, GSN_FSOPENREQ, signal, FsOpenReq::SignalLength, JBA);
|
||||||
}//if
|
}//if
|
||||||
}//Dblqh::openNextLogfile()
|
}//Dblqh::openNextLogfile()
|
||||||
@ -13474,7 +13538,7 @@ void Dblqh::writeFileDescriptor(Signal* signal)
|
|||||||
/* -------------------------------------------------- */
|
/* -------------------------------------------------- */
|
||||||
/* START BY WRITING TO LOG FILE RECORD */
|
/* START BY WRITING TO LOG FILE RECORD */
|
||||||
/* -------------------------------------------------- */
|
/* -------------------------------------------------- */
|
||||||
arrGuard(logFilePtr.p->currentMbyte, 16);
|
arrGuard(logFilePtr.p->currentMbyte, clogFileSize);
|
||||||
logFilePtr.p->logMaxGciCompleted[logFilePtr.p->currentMbyte] =
|
logFilePtr.p->logMaxGciCompleted[logFilePtr.p->currentMbyte] =
|
||||||
logPartPtr.p->logPartNewestCompletedGCI;
|
logPartPtr.p->logPartNewestCompletedGCI;
|
||||||
logFilePtr.p->logMaxGciStarted[logFilePtr.p->currentMbyte] = cnewestGci;
|
logFilePtr.p->logMaxGciStarted[logFilePtr.p->currentMbyte] = cnewestGci;
|
||||||
@ -13500,10 +13564,7 @@ void Dblqh::writeFileDescriptor(Signal* signal)
|
|||||||
/* ------------------------------------------------------------------------- */
|
/* ------------------------------------------------------------------------- */
|
||||||
void Dblqh::writeFileHeaderOpen(Signal* signal, Uint32 wmoType)
|
void Dblqh::writeFileHeaderOpen(Signal* signal, Uint32 wmoType)
|
||||||
{
|
{
|
||||||
LogFileRecordPtr wmoLogFilePtr;
|
|
||||||
UintR twmoNoLogDescriptors;
|
UintR twmoNoLogDescriptors;
|
||||||
UintR twmoLoop;
|
|
||||||
UintR twmoIndex;
|
|
||||||
|
|
||||||
/* -------------------------------------------------- */
|
/* -------------------------------------------------- */
|
||||||
/* WRITE HEADER INFORMATION IN THE NEW FILE. */
|
/* WRITE HEADER INFORMATION IN THE NEW FILE. */
|
||||||
@ -13511,52 +13572,44 @@ void Dblqh::writeFileHeaderOpen(Signal* signal, Uint32 wmoType)
|
|||||||
logPagePtr.p->logPageWord[ZPAGE_HEADER_SIZE + ZPOS_LOG_TYPE] = ZFD_TYPE;
|
logPagePtr.p->logPageWord[ZPAGE_HEADER_SIZE + ZPOS_LOG_TYPE] = ZFD_TYPE;
|
||||||
logPagePtr.p->logPageWord[ZPAGE_HEADER_SIZE + ZPOS_FILE_NO] =
|
logPagePtr.p->logPageWord[ZPAGE_HEADER_SIZE + ZPOS_FILE_NO] =
|
||||||
logFilePtr.p->fileNo;
|
logFilePtr.p->fileNo;
|
||||||
if (logPartPtr.p->noLogFiles > ZMAX_LOG_FILES_IN_PAGE_ZERO) {
|
if (logPartPtr.p->noLogFiles > cmaxLogFilesInPageZero) {
|
||||||
jam();
|
jam();
|
||||||
twmoNoLogDescriptors = ZMAX_LOG_FILES_IN_PAGE_ZERO;
|
twmoNoLogDescriptors = cmaxLogFilesInPageZero;
|
||||||
} else {
|
} else {
|
||||||
jam();
|
jam();
|
||||||
twmoNoLogDescriptors = logPartPtr.p->noLogFiles;
|
twmoNoLogDescriptors = logPartPtr.p->noLogFiles;
|
||||||
}//if
|
}//if
|
||||||
logPagePtr.p->logPageWord[ZPAGE_HEADER_SIZE + ZPOS_NO_FD] =
|
logPagePtr.p->logPageWord[ZPAGE_HEADER_SIZE + ZPOS_NO_FD] =
|
||||||
twmoNoLogDescriptors;
|
twmoNoLogDescriptors;
|
||||||
wmoLogFilePtr.i = logFilePtr.i;
|
|
||||||
twmoLoop = 0;
|
{
|
||||||
WMO_LOOP:
|
Uint32 pos = ZPAGE_HEADER_SIZE + ZFD_HEADER_SIZE;
|
||||||
jam();
|
LogFileRecordPtr filePtr = logFilePtr;
|
||||||
if (twmoLoop < twmoNoLogDescriptors) {
|
for (Uint32 fd = 0; fd < twmoNoLogDescriptors; fd++)
|
||||||
jam();
|
{
|
||||||
ptrCheckGuard(wmoLogFilePtr, clogFileFileSize, logFileRecord);
|
|
||||||
for (twmoIndex = 0; twmoIndex <= ZNO_MBYTES_IN_FILE - 1; twmoIndex++) {
|
|
||||||
jam();
|
jam();
|
||||||
arrGuard(((ZPAGE_HEADER_SIZE + ZFD_HEADER_SIZE) +
|
ptrCheckGuard(filePtr, clogFileFileSize, logFileRecord);
|
||||||
(twmoLoop * ZFD_PART_SIZE)) + twmoIndex, ZPAGE_SIZE);
|
for (Uint32 mb = 0; mb < clogFileSize; mb ++)
|
||||||
logPagePtr.p->logPageWord[((ZPAGE_HEADER_SIZE + ZFD_HEADER_SIZE) +
|
{
|
||||||
(twmoLoop * ZFD_PART_SIZE)) + twmoIndex] =
|
jam();
|
||||||
wmoLogFilePtr.p->logMaxGciCompleted[twmoIndex];
|
Uint32 pos0 = pos + fd * (ZFD_MBYTE_SIZE * clogFileSize) + mb;
|
||||||
arrGuard((((ZPAGE_HEADER_SIZE + ZFD_HEADER_SIZE) +
|
Uint32 pos1 = pos0 + clogFileSize;
|
||||||
(twmoLoop * ZFD_PART_SIZE)) + ZNO_MBYTES_IN_FILE) +
|
Uint32 pos2 = pos1 + clogFileSize;
|
||||||
twmoIndex, ZPAGE_SIZE);
|
arrGuard(pos0, ZPAGE_SIZE);
|
||||||
logPagePtr.p->logPageWord[(((ZPAGE_HEADER_SIZE + ZFD_HEADER_SIZE) +
|
arrGuard(pos1, ZPAGE_SIZE);
|
||||||
(twmoLoop * ZFD_PART_SIZE)) + ZNO_MBYTES_IN_FILE) + twmoIndex] =
|
arrGuard(pos2, ZPAGE_SIZE);
|
||||||
wmoLogFilePtr.p->logMaxGciStarted[twmoIndex];
|
logPagePtr.p->logPageWord[pos0] = filePtr.p->logMaxGciCompleted[mb];
|
||||||
arrGuard((((ZPAGE_HEADER_SIZE + ZFD_HEADER_SIZE) +
|
logPagePtr.p->logPageWord[pos1] = filePtr.p->logMaxGciStarted[mb];
|
||||||
(twmoLoop * ZFD_PART_SIZE)) + (2 * ZNO_MBYTES_IN_FILE)) +
|
logPagePtr.p->logPageWord[pos2] = filePtr.p->logLastPrepRef[mb];
|
||||||
twmoIndex, ZPAGE_SIZE);
|
}
|
||||||
logPagePtr.p->logPageWord[(((ZPAGE_HEADER_SIZE + ZFD_HEADER_SIZE) +
|
filePtr.i = filePtr.p->prevLogFile;
|
||||||
(twmoLoop * ZFD_PART_SIZE)) + (2 * ZNO_MBYTES_IN_FILE)) + twmoIndex] =
|
}
|
||||||
wmoLogFilePtr.p->logLastPrepRef[twmoIndex];
|
pos += (twmoNoLogDescriptors * ZFD_MBYTE_SIZE * clogFileSize);
|
||||||
}//for
|
arrGuard(pos, ZPAGE_SIZE);
|
||||||
wmoLogFilePtr.i = wmoLogFilePtr.p->prevLogFile;
|
logPagePtr.p->logPageWord[ZCURR_PAGE_INDEX] = pos;
|
||||||
twmoLoop = twmoLoop + 1;
|
logPagePtr.p->logPageWord[pos] = ZNEXT_LOG_RECORD_TYPE;
|
||||||
goto WMO_LOOP;
|
}
|
||||||
}//if
|
|
||||||
logPagePtr.p->logPageWord[ZCURR_PAGE_INDEX] =
|
|
||||||
(ZPAGE_HEADER_SIZE + ZFD_HEADER_SIZE) +
|
|
||||||
(ZFD_PART_SIZE * twmoNoLogDescriptors);
|
|
||||||
arrGuard(logPagePtr.p->logPageWord[ZCURR_PAGE_INDEX], ZPAGE_SIZE);
|
|
||||||
logPagePtr.p->logPageWord[logPagePtr.p->logPageWord[ZCURR_PAGE_INDEX]] =
|
|
||||||
ZNEXT_LOG_RECORD_TYPE;
|
|
||||||
/* ------------------------------------------------------- */
|
/* ------------------------------------------------------- */
|
||||||
/* THIS IS A SPECIAL WRITE OF THE FIRST PAGE IN THE */
|
/* THIS IS A SPECIAL WRITE OF THE FIRST PAGE IN THE */
|
||||||
/* LOG FILE. THIS HAS SPECIAL SIGNIFANCE TO FIND */
|
/* LOG FILE. THIS HAS SPECIAL SIGNIFANCE TO FIND */
|
||||||
@ -13701,9 +13754,9 @@ void Dblqh::openSrLastFileLab(Signal* signal)
|
|||||||
void Dblqh::readSrLastFileLab(Signal* signal)
|
void Dblqh::readSrLastFileLab(Signal* signal)
|
||||||
{
|
{
|
||||||
logPartPtr.p->logLap = logPagePtr.p->logPageWord[ZPOS_LOG_LAP];
|
logPartPtr.p->logLap = logPagePtr.p->logPageWord[ZPOS_LOG_LAP];
|
||||||
if (logPartPtr.p->noLogFiles > ZMAX_LOG_FILES_IN_PAGE_ZERO) {
|
if (logPartPtr.p->noLogFiles > cmaxLogFilesInPageZero) {
|
||||||
jam();
|
jam();
|
||||||
initGciInLogFileRec(signal, ZMAX_LOG_FILES_IN_PAGE_ZERO);
|
initGciInLogFileRec(signal, cmaxLogFilesInPageZero);
|
||||||
} else {
|
} else {
|
||||||
jam();
|
jam();
|
||||||
initGciInLogFileRec(signal, logPartPtr.p->noLogFiles);
|
initGciInLogFileRec(signal, logPartPtr.p->noLogFiles);
|
||||||
@ -13728,7 +13781,7 @@ void Dblqh::readSrLastMbyteLab(Signal* signal)
|
|||||||
logPartPtr.p->lastMbyte = logFilePtr.p->currentMbyte - 1;
|
logPartPtr.p->lastMbyte = logFilePtr.p->currentMbyte - 1;
|
||||||
}//if
|
}//if
|
||||||
}//if
|
}//if
|
||||||
arrGuard(logFilePtr.p->currentMbyte, 16);
|
arrGuard(logFilePtr.p->currentMbyte, clogFileSize);
|
||||||
logFilePtr.p->logMaxGciCompleted[logFilePtr.p->currentMbyte] =
|
logFilePtr.p->logMaxGciCompleted[logFilePtr.p->currentMbyte] =
|
||||||
logPagePtr.p->logPageWord[ZPOS_MAX_GCI_COMPLETED];
|
logPagePtr.p->logPageWord[ZPOS_MAX_GCI_COMPLETED];
|
||||||
logFilePtr.p->logMaxGciStarted[logFilePtr.p->currentMbyte] =
|
logFilePtr.p->logMaxGciStarted[logFilePtr.p->currentMbyte] =
|
||||||
@ -13736,7 +13789,7 @@ void Dblqh::readSrLastMbyteLab(Signal* signal)
|
|||||||
logFilePtr.p->logLastPrepRef[logFilePtr.p->currentMbyte] =
|
logFilePtr.p->logLastPrepRef[logFilePtr.p->currentMbyte] =
|
||||||
logPagePtr.p->logPageWord[ZLAST_LOG_PREP_REF];
|
logPagePtr.p->logPageWord[ZLAST_LOG_PREP_REF];
|
||||||
releaseLogpage(signal);
|
releaseLogpage(signal);
|
||||||
if (logFilePtr.p->currentMbyte < (ZNO_MBYTES_IN_FILE - 1)) {
|
if (logFilePtr.p->currentMbyte < (clogFileSize - 1)) {
|
||||||
jam();
|
jam();
|
||||||
logFilePtr.p->currentMbyte++;
|
logFilePtr.p->currentMbyte++;
|
||||||
readSinglePage(signal, ZPAGES_IN_MBYTE * logFilePtr.p->currentMbyte);
|
readSinglePage(signal, ZPAGES_IN_MBYTE * logFilePtr.p->currentMbyte);
|
||||||
@ -13750,21 +13803,21 @@ void Dblqh::readSrLastMbyteLab(Signal* signal)
|
|||||||
* ---------------------------------------------------------------------- */
|
* ---------------------------------------------------------------------- */
|
||||||
if (logPartPtr.p->lastMbyte == ZNIL) {
|
if (logPartPtr.p->lastMbyte == ZNIL) {
|
||||||
jam();
|
jam();
|
||||||
logPartPtr.p->lastMbyte = ZNO_MBYTES_IN_FILE - 1;
|
logPartPtr.p->lastMbyte = clogFileSize - 1;
|
||||||
}//if
|
}//if
|
||||||
}//if
|
}//if
|
||||||
logFilePtr.p->logFileStatus = LogFileRecord::CLOSING_SR;
|
logFilePtr.p->logFileStatus = LogFileRecord::CLOSING_SR;
|
||||||
closeFile(signal, logFilePtr, __LINE__);
|
closeFile(signal, logFilePtr, __LINE__);
|
||||||
if (logPartPtr.p->noLogFiles > ZMAX_LOG_FILES_IN_PAGE_ZERO) {
|
if (logPartPtr.p->noLogFiles > cmaxLogFilesInPageZero) {
|
||||||
Uint32 fileNo;
|
Uint32 fileNo;
|
||||||
if (logFilePtr.p->fileNo >= ZMAX_LOG_FILES_IN_PAGE_ZERO) {
|
if (logFilePtr.p->fileNo >= cmaxLogFilesInPageZero) {
|
||||||
jam();
|
jam();
|
||||||
fileNo = logFilePtr.p->fileNo - ZMAX_LOG_FILES_IN_PAGE_ZERO;
|
fileNo = logFilePtr.p->fileNo - cmaxLogFilesInPageZero;
|
||||||
} else {
|
} else {
|
||||||
jam();
|
jam();
|
||||||
fileNo =
|
fileNo =
|
||||||
(logPartPtr.p->noLogFiles + logFilePtr.p->fileNo) -
|
(logPartPtr.p->noLogFiles + logFilePtr.p->fileNo) -
|
||||||
ZMAX_LOG_FILES_IN_PAGE_ZERO;
|
cmaxLogFilesInPageZero;
|
||||||
}//if
|
}//if
|
||||||
if (fileNo == 0) {
|
if (fileNo == 0) {
|
||||||
jam();
|
jam();
|
||||||
@ -13774,11 +13827,11 @@ void Dblqh::readSrLastMbyteLab(Signal* signal)
|
|||||||
* -------------------------------------------------------------------- */
|
* -------------------------------------------------------------------- */
|
||||||
fileNo = 1;
|
fileNo = 1;
|
||||||
logPartPtr.p->srRemainingFiles =
|
logPartPtr.p->srRemainingFiles =
|
||||||
logPartPtr.p->noLogFiles - (ZMAX_LOG_FILES_IN_PAGE_ZERO - 1);
|
logPartPtr.p->noLogFiles - (cmaxLogFilesInPageZero - 1);
|
||||||
} else {
|
} else {
|
||||||
jam();
|
jam();
|
||||||
logPartPtr.p->srRemainingFiles =
|
logPartPtr.p->srRemainingFiles =
|
||||||
logPartPtr.p->noLogFiles - ZMAX_LOG_FILES_IN_PAGE_ZERO;
|
logPartPtr.p->noLogFiles - cmaxLogFilesInPageZero;
|
||||||
}//if
|
}//if
|
||||||
LogFileRecordPtr locLogFilePtr;
|
LogFileRecordPtr locLogFilePtr;
|
||||||
findLogfile(signal, fileNo, logPartPtr, &locLogFilePtr);
|
findLogfile(signal, fileNo, logPartPtr, &locLogFilePtr);
|
||||||
@ -13803,9 +13856,9 @@ void Dblqh::openSrNextFileLab(Signal* signal)
|
|||||||
|
|
||||||
void Dblqh::readSrNextFileLab(Signal* signal)
|
void Dblqh::readSrNextFileLab(Signal* signal)
|
||||||
{
|
{
|
||||||
if (logPartPtr.p->srRemainingFiles > ZMAX_LOG_FILES_IN_PAGE_ZERO) {
|
if (logPartPtr.p->srRemainingFiles > cmaxLogFilesInPageZero) {
|
||||||
jam();
|
jam();
|
||||||
initGciInLogFileRec(signal, ZMAX_LOG_FILES_IN_PAGE_ZERO);
|
initGciInLogFileRec(signal, cmaxLogFilesInPageZero);
|
||||||
} else {
|
} else {
|
||||||
jam();
|
jam();
|
||||||
initGciInLogFileRec(signal, logPartPtr.p->srRemainingFiles);
|
initGciInLogFileRec(signal, logPartPtr.p->srRemainingFiles);
|
||||||
@ -13813,16 +13866,16 @@ void Dblqh::readSrNextFileLab(Signal* signal)
|
|||||||
releaseLogpage(signal);
|
releaseLogpage(signal);
|
||||||
logFilePtr.p->logFileStatus = LogFileRecord::CLOSING_SR;
|
logFilePtr.p->logFileStatus = LogFileRecord::CLOSING_SR;
|
||||||
closeFile(signal, logFilePtr, __LINE__);
|
closeFile(signal, logFilePtr, __LINE__);
|
||||||
if (logPartPtr.p->srRemainingFiles > ZMAX_LOG_FILES_IN_PAGE_ZERO) {
|
if (logPartPtr.p->srRemainingFiles > cmaxLogFilesInPageZero) {
|
||||||
Uint32 fileNo;
|
Uint32 fileNo;
|
||||||
if (logFilePtr.p->fileNo >= ZMAX_LOG_FILES_IN_PAGE_ZERO) {
|
if (logFilePtr.p->fileNo >= cmaxLogFilesInPageZero) {
|
||||||
jam();
|
jam();
|
||||||
fileNo = logFilePtr.p->fileNo - ZMAX_LOG_FILES_IN_PAGE_ZERO;
|
fileNo = logFilePtr.p->fileNo - cmaxLogFilesInPageZero;
|
||||||
} else {
|
} else {
|
||||||
jam();
|
jam();
|
||||||
fileNo =
|
fileNo =
|
||||||
(logPartPtr.p->noLogFiles + logFilePtr.p->fileNo) -
|
(logPartPtr.p->noLogFiles + logFilePtr.p->fileNo) -
|
||||||
ZMAX_LOG_FILES_IN_PAGE_ZERO;
|
cmaxLogFilesInPageZero;
|
||||||
}//if
|
}//if
|
||||||
if (fileNo == 0) {
|
if (fileNo == 0) {
|
||||||
jam();
|
jam();
|
||||||
@ -13831,11 +13884,11 @@ void Dblqh::readSrNextFileLab(Signal* signal)
|
|||||||
* -------------------------------------------------------------------- */
|
* -------------------------------------------------------------------- */
|
||||||
fileNo = 1;
|
fileNo = 1;
|
||||||
logPartPtr.p->srRemainingFiles =
|
logPartPtr.p->srRemainingFiles =
|
||||||
logPartPtr.p->srRemainingFiles - (ZMAX_LOG_FILES_IN_PAGE_ZERO - 1);
|
logPartPtr.p->srRemainingFiles - (cmaxLogFilesInPageZero - 1);
|
||||||
} else {
|
} else {
|
||||||
jam();
|
jam();
|
||||||
logPartPtr.p->srRemainingFiles =
|
logPartPtr.p->srRemainingFiles =
|
||||||
logPartPtr.p->srRemainingFiles - ZMAX_LOG_FILES_IN_PAGE_ZERO;
|
logPartPtr.p->srRemainingFiles - cmaxLogFilesInPageZero;
|
||||||
}//if
|
}//if
|
||||||
LogFileRecordPtr locLogFilePtr;
|
LogFileRecordPtr locLogFilePtr;
|
||||||
findLogfile(signal, fileNo, logPartPtr, &locLogFilePtr);
|
findLogfile(signal, fileNo, logPartPtr, &locLogFilePtr);
|
||||||
@ -14706,7 +14759,7 @@ void Dblqh::srLogLimits(Signal* signal)
|
|||||||
* EXECUTED.
|
* EXECUTED.
|
||||||
* ----------------------------------------------------------------------- */
|
* ----------------------------------------------------------------------- */
|
||||||
while(true) {
|
while(true) {
|
||||||
ndbrequire(tmbyte < 16);
|
ndbrequire(tmbyte < clogFileSize);
|
||||||
if (logPartPtr.p->logExecState == LogPartRecord::LES_SEARCH_STOP) {
|
if (logPartPtr.p->logExecState == LogPartRecord::LES_SEARCH_STOP) {
|
||||||
if (logFilePtr.p->logMaxGciCompleted[tmbyte] < logPartPtr.p->logLastGci) {
|
if (logFilePtr.p->logMaxGciCompleted[tmbyte] < logPartPtr.p->logLastGci) {
|
||||||
jam();
|
jam();
|
||||||
@ -14747,7 +14800,7 @@ void Dblqh::srLogLimits(Signal* signal)
|
|||||||
if (logPartPtr.p->logExecState != LogPartRecord::LES_EXEC_LOG) {
|
if (logPartPtr.p->logExecState != LogPartRecord::LES_EXEC_LOG) {
|
||||||
if (tmbyte == 0) {
|
if (tmbyte == 0) {
|
||||||
jam();
|
jam();
|
||||||
tmbyte = ZNO_MBYTES_IN_FILE - 1;
|
tmbyte = clogFileSize - 1;
|
||||||
logFilePtr.i = logFilePtr.p->prevLogFile;
|
logFilePtr.i = logFilePtr.p->prevLogFile;
|
||||||
ptrCheckGuard(logFilePtr, clogFileFileSize, logFileRecord);
|
ptrCheckGuard(logFilePtr, clogFileFileSize, logFileRecord);
|
||||||
} else {
|
} else {
|
||||||
@ -15141,7 +15194,7 @@ void Dblqh::execSr(Signal* signal)
|
|||||||
logPagePtr.p->logPageWord[ZPAGE_HEADER_SIZE + ZPOS_NO_FD];
|
logPagePtr.p->logPageWord[ZPAGE_HEADER_SIZE + ZPOS_NO_FD];
|
||||||
logPagePtr.p->logPageWord[ZCURR_PAGE_INDEX] =
|
logPagePtr.p->logPageWord[ZCURR_PAGE_INDEX] =
|
||||||
(ZPAGE_HEADER_SIZE + ZFD_HEADER_SIZE) +
|
(ZPAGE_HEADER_SIZE + ZFD_HEADER_SIZE) +
|
||||||
(noFdDescriptors * ZFD_PART_SIZE);
|
(noFdDescriptors * ZFD_MBYTE_SIZE * clogFileSize);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
/* ========================================================================= */
|
/* ========================================================================= */
|
||||||
@ -15181,11 +15234,11 @@ void Dblqh::execSr(Signal* signal)
|
|||||||
/*---------------------------------------------------------------------------*/
|
/*---------------------------------------------------------------------------*/
|
||||||
/* START EXECUTION OF A NEW MBYTE IN THE LOG. */
|
/* START EXECUTION OF A NEW MBYTE IN THE LOG. */
|
||||||
/*---------------------------------------------------------------------------*/
|
/*---------------------------------------------------------------------------*/
|
||||||
if (logFilePtr.p->currentMbyte < (ZNO_MBYTES_IN_FILE - 1)) {
|
if (logFilePtr.p->currentMbyte < (clogFileSize - 1)) {
|
||||||
jam();
|
jam();
|
||||||
logPartPtr.p->logExecState = LogPartRecord::LES_EXEC_LOG_NEW_MBYTE;
|
logPartPtr.p->logExecState = LogPartRecord::LES_EXEC_LOG_NEW_MBYTE;
|
||||||
} else {
|
} else {
|
||||||
ndbrequire(logFilePtr.p->currentMbyte == (ZNO_MBYTES_IN_FILE - 1));
|
ndbrequire(logFilePtr.p->currentMbyte == (clogFileSize - 1));
|
||||||
jam();
|
jam();
|
||||||
/*---------------------------------------------------------------------------*/
|
/*---------------------------------------------------------------------------*/
|
||||||
/* WE HAVE TO CHANGE FILE. CLOSE THIS ONE AND THEN OPEN THE NEXT. */
|
/* WE HAVE TO CHANGE FILE. CLOSE THIS ONE AND THEN OPEN THE NEXT. */
|
||||||
@ -15380,7 +15433,7 @@ void Dblqh::invalidateLogAfterLastGCI(Signal* signal) {
|
|||||||
jam();
|
jam();
|
||||||
releaseLfo(signal);
|
releaseLfo(signal);
|
||||||
releaseLogpage(signal);
|
releaseLogpage(signal);
|
||||||
if (logPartPtr.p->invalidatePageNo < (ZNO_MBYTES_IN_FILE * ZPAGES_IN_MBYTE - 1)) {
|
if (logPartPtr.p->invalidatePageNo < (clogFileSize * ZPAGES_IN_MBYTE - 1)) {
|
||||||
// We continue in this file.
|
// We continue in this file.
|
||||||
logPartPtr.p->invalidatePageNo++;
|
logPartPtr.p->invalidatePageNo++;
|
||||||
} else {
|
} else {
|
||||||
@ -16721,6 +16774,22 @@ void Dblqh::initialiseLogFile(Signal* signal)
|
|||||||
ptrAss(logFilePtr, logFileRecord);
|
ptrAss(logFilePtr, logFileRecord);
|
||||||
logFilePtr.p->nextLogFile = logFilePtr.i + 1;
|
logFilePtr.p->nextLogFile = logFilePtr.i + 1;
|
||||||
logFilePtr.p->logFileStatus = LogFileRecord::LFS_IDLE;
|
logFilePtr.p->logFileStatus = LogFileRecord::LFS_IDLE;
|
||||||
|
|
||||||
|
logFilePtr.p->logLastPrepRef = new Uint32[clogFileSize];
|
||||||
|
logFilePtr.p->logMaxGciCompleted = new Uint32[clogFileSize];
|
||||||
|
logFilePtr.p->logMaxGciStarted = new Uint32[clogFileSize];
|
||||||
|
|
||||||
|
if (logFilePtr.p->logLastPrepRef == 0 ||
|
||||||
|
logFilePtr.p->logMaxGciCompleted == 0 ||
|
||||||
|
logFilePtr.p->logMaxGciStarted == 0)
|
||||||
|
{
|
||||||
|
char buf[256];
|
||||||
|
BaseString::snprintf(buf, sizeof(buf),
|
||||||
|
"Failed to alloc mbyte(%u) arrays for logfile %u",
|
||||||
|
clogFileSize, logFilePtr.i);
|
||||||
|
progError(__LINE__, NDBD_EXIT_MEMALLOC, buf);
|
||||||
|
}
|
||||||
|
|
||||||
}//for
|
}//for
|
||||||
logFilePtr.i = clogFileFileSize - 1;
|
logFilePtr.i = clogFileFileSize - 1;
|
||||||
ptrAss(logFilePtr, logFileRecord);
|
ptrAss(logFilePtr, logFileRecord);
|
||||||
@ -17049,41 +17118,31 @@ void Dblqh::initFragrec(Signal* signal,
|
|||||||
* ========================================================================= */
|
* ========================================================================= */
|
||||||
void Dblqh::initGciInLogFileRec(Signal* signal, Uint32 noFdDescriptors)
|
void Dblqh::initGciInLogFileRec(Signal* signal, Uint32 noFdDescriptors)
|
||||||
{
|
{
|
||||||
LogFileRecordPtr iglLogFilePtr;
|
LogFileRecordPtr filePtr = logFilePtr;
|
||||||
UintR tiglLoop;
|
Uint32 pos = ZPAGE_HEADER_SIZE + ZFD_HEADER_SIZE;
|
||||||
UintR tiglIndex;
|
for (Uint32 fd = 0; fd < noFdDescriptors; fd++)
|
||||||
|
{
|
||||||
tiglLoop = 0;
|
|
||||||
iglLogFilePtr.i = logFilePtr.i;
|
|
||||||
iglLogFilePtr.p = logFilePtr.p;
|
|
||||||
IGL_LOOP:
|
|
||||||
for (tiglIndex = 0; tiglIndex <= ZNO_MBYTES_IN_FILE - 1; tiglIndex++) {
|
|
||||||
arrGuard(((ZPAGE_HEADER_SIZE + ZFD_HEADER_SIZE) +
|
|
||||||
(tiglLoop * ZFD_PART_SIZE)) + tiglIndex, ZPAGE_SIZE);
|
|
||||||
iglLogFilePtr.p->logMaxGciCompleted[tiglIndex] =
|
|
||||||
logPagePtr.p->logPageWord[((ZPAGE_HEADER_SIZE + ZFD_HEADER_SIZE) +
|
|
||||||
(tiglLoop * ZFD_PART_SIZE)) + tiglIndex];
|
|
||||||
arrGuard((((ZPAGE_HEADER_SIZE + ZFD_HEADER_SIZE) + ZNO_MBYTES_IN_FILE) +
|
|
||||||
(tiglLoop * ZFD_PART_SIZE)) + tiglIndex, ZPAGE_SIZE);
|
|
||||||
iglLogFilePtr.p->logMaxGciStarted[tiglIndex] =
|
|
||||||
logPagePtr.p->logPageWord[(((ZPAGE_HEADER_SIZE + ZFD_HEADER_SIZE) +
|
|
||||||
ZNO_MBYTES_IN_FILE) +
|
|
||||||
(tiglLoop * ZFD_PART_SIZE)) + tiglIndex];
|
|
||||||
arrGuard((((ZPAGE_HEADER_SIZE + ZFD_HEADER_SIZE) +
|
|
||||||
(2 * ZNO_MBYTES_IN_FILE)) + (tiglLoop * ZFD_PART_SIZE)) +
|
|
||||||
tiglIndex, ZPAGE_SIZE);
|
|
||||||
iglLogFilePtr.p->logLastPrepRef[tiglIndex] =
|
|
||||||
logPagePtr.p->logPageWord[(((ZPAGE_HEADER_SIZE + ZFD_HEADER_SIZE) +
|
|
||||||
(2 * ZNO_MBYTES_IN_FILE)) +
|
|
||||||
(tiglLoop * ZFD_PART_SIZE)) + tiglIndex];
|
|
||||||
}//for
|
|
||||||
tiglLoop = tiglLoop + 1;
|
|
||||||
if (tiglLoop < noFdDescriptors) {
|
|
||||||
jam();
|
jam();
|
||||||
iglLogFilePtr.i = iglLogFilePtr.p->prevLogFile;
|
for (Uint32 mb = 0; mb < clogFileSize; mb++)
|
||||||
ptrCheckGuard(iglLogFilePtr, clogFileFileSize, logFileRecord);
|
{
|
||||||
goto IGL_LOOP;
|
jam();
|
||||||
}//if
|
Uint32 pos0 = pos + fd * (ZFD_MBYTE_SIZE * clogFileSize) + mb;
|
||||||
|
Uint32 pos1 = pos0 + clogFileSize;
|
||||||
|
Uint32 pos2 = pos1 + clogFileSize;
|
||||||
|
arrGuard(pos0, ZPAGE_SIZE);
|
||||||
|
arrGuard(pos1, ZPAGE_SIZE);
|
||||||
|
arrGuard(pos2, ZPAGE_SIZE);
|
||||||
|
filePtr.p->logMaxGciCompleted[mb] = logPagePtr.p->logPageWord[pos0];
|
||||||
|
filePtr.p->logMaxGciStarted[mb] = logPagePtr.p->logPageWord[pos1];
|
||||||
|
filePtr.p->logLastPrepRef[mb] = logPagePtr.p->logPageWord[pos2];
|
||||||
|
}
|
||||||
|
if (fd + 1 < noFdDescriptors)
|
||||||
|
{
|
||||||
|
jam();
|
||||||
|
filePtr.i = filePtr.p->prevLogFile;
|
||||||
|
ptrCheckGuard(filePtr, clogFileFileSize, logFileRecord);
|
||||||
|
}
|
||||||
|
}
|
||||||
}//Dblqh::initGciInLogFileRec()
|
}//Dblqh::initGciInLogFileRec()
|
||||||
|
|
||||||
/* ==========================================================================
|
/* ==========================================================================
|
||||||
@ -18336,7 +18395,7 @@ void Dblqh::writeNextLog(Signal* signal)
|
|||||||
ndbrequire(logPagePtr.p->logPageWord[ZCURR_PAGE_INDEX] < ZPAGE_SIZE);
|
ndbrequire(logPagePtr.p->logPageWord[ZCURR_PAGE_INDEX] < ZPAGE_SIZE);
|
||||||
logPagePtr.p->logPageWord[logPagePtr.p->logPageWord[ZCURR_PAGE_INDEX]] =
|
logPagePtr.p->logPageWord[logPagePtr.p->logPageWord[ZCURR_PAGE_INDEX]] =
|
||||||
ZNEXT_MBYTE_TYPE;
|
ZNEXT_MBYTE_TYPE;
|
||||||
if (logFilePtr.p->currentMbyte == (ZNO_MBYTES_IN_FILE - 1)) {
|
if (logFilePtr.p->currentMbyte == (clogFileSize - 1)) {
|
||||||
jam();
|
jam();
|
||||||
/* -------------------------------------------------- */
|
/* -------------------------------------------------- */
|
||||||
/* CALCULATE THE NEW REMAINING WORDS WHEN */
|
/* CALCULATE THE NEW REMAINING WORDS WHEN */
|
||||||
@ -18425,7 +18484,7 @@ void Dblqh::writeNextLog(Signal* signal)
|
|||||||
systemError(signal, __LINE__);
|
systemError(signal, __LINE__);
|
||||||
}//if
|
}//if
|
||||||
}//if
|
}//if
|
||||||
if (logFilePtr.p->currentMbyte == (ZNO_MBYTES_IN_FILE - 1)) {
|
if (logFilePtr.p->currentMbyte == (clogFileSize - 1)) {
|
||||||
jam();
|
jam();
|
||||||
twnlNextMbyte = 0;
|
twnlNextMbyte = 0;
|
||||||
if (logFilePtr.p->fileChangeState != LogFileRecord::NOT_ONGOING) {
|
if (logFilePtr.p->fileChangeState != LogFileRecord::NOT_ONGOING) {
|
||||||
|
@ -16,7 +16,7 @@
|
|||||||
EXTRA_PROGRAMS = ndbd_redo_log_reader
|
EXTRA_PROGRAMS = ndbd_redo_log_reader
|
||||||
|
|
||||||
ndbd_redo_log_reader_SOURCES = redoLogReader/records.cpp \
|
ndbd_redo_log_reader_SOURCES = redoLogReader/records.cpp \
|
||||||
redoLogReader/redoLogFileReader.cpp
|
redoLogReader/reader.cpp
|
||||||
|
|
||||||
include $(top_srcdir)/storage/ndb/config/common.mk.am
|
include $(top_srcdir)/storage/ndb/config/common.mk.am
|
||||||
include $(top_srcdir)/storage/ndb/config/type_kernel.mk.am
|
include $(top_srcdir)/storage/ndb/config/type_kernel.mk.am
|
||||||
|
@ -2700,6 +2700,7 @@ private:
|
|||||||
|
|
||||||
ArrayPool<Page> c_page_pool;
|
ArrayPool<Page> c_page_pool;
|
||||||
Uint32 cnoOfAllocatedPages;
|
Uint32 cnoOfAllocatedPages;
|
||||||
|
Uint32 m_max_allocate_pages;
|
||||||
|
|
||||||
Tablerec *tablerec;
|
Tablerec *tablerec;
|
||||||
Uint32 cnoOfTablerec;
|
Uint32 cnoOfTablerec;
|
||||||
|
@ -74,6 +74,10 @@ Dbtup::reportMemoryUsage(Signal* signal, int incDec){
|
|||||||
sendSignal(CMVMI_REF, GSN_EVENT_REP, signal, 6, JBB);
|
sendSignal(CMVMI_REF, GSN_EVENT_REP, signal, 6, JBB);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifdef VM_TRACE
|
||||||
|
extern Uint32 fc_left, fc_right, fc_remove;
|
||||||
|
#endif
|
||||||
|
|
||||||
void
|
void
|
||||||
Dbtup::execDUMP_STATE_ORD(Signal* signal)
|
Dbtup::execDUMP_STATE_ORD(Signal* signal)
|
||||||
{
|
{
|
||||||
@ -155,12 +159,20 @@ Dbtup::execDUMP_STATE_ORD(Signal* signal)
|
|||||||
return;
|
return;
|
||||||
}//if
|
}//if
|
||||||
#endif
|
#endif
|
||||||
#if defined VM_TRACE && 0
|
#if defined VM_TRACE
|
||||||
if (type == 1211){
|
if (type == 1211 || type == 1212 || type == 1213){
|
||||||
ndbout_c("Startar modul test av Page Manager");
|
Uint32 seed = time(0);
|
||||||
|
if (signal->getLength() > 1)
|
||||||
|
seed = signal->theData[1];
|
||||||
|
ndbout_c("Startar modul test av Page Manager (seed: 0x%x)", seed);
|
||||||
|
srand(seed);
|
||||||
|
|
||||||
Vector<Chunk> chunks;
|
Vector<Chunk> chunks;
|
||||||
const Uint32 LOOPS = 1000;
|
const Uint32 LOOPS = 1000;
|
||||||
|
Uint32 sum_req = 0;
|
||||||
|
Uint32 sum_conf = 0;
|
||||||
|
Uint32 sum_loop = 0;
|
||||||
|
Uint32 max_loop = 0;
|
||||||
for(Uint32 i = 0; i<LOOPS; i++){
|
for(Uint32 i = 0; i<LOOPS; i++){
|
||||||
|
|
||||||
// Case
|
// Case
|
||||||
@ -178,7 +190,14 @@ Dbtup::execDUMP_STATE_ORD(Signal* signal)
|
|||||||
c = 1 + rand() % 2;
|
c = 1 + rand() % 2;
|
||||||
}
|
}
|
||||||
|
|
||||||
ndbout_c("loop=%d case=%d free=%d alloc=%d", i, c, free, alloc);
|
if (type == 1211)
|
||||||
|
ndbout_c("loop=%d case=%d free=%d alloc=%d", i, c, free, alloc);
|
||||||
|
|
||||||
|
if (type == 1213)
|
||||||
|
{
|
||||||
|
c = 1;
|
||||||
|
alloc = 2 + (sum_conf >> 3) + (sum_conf >> 4);
|
||||||
|
}
|
||||||
switch(c){
|
switch(c){
|
||||||
case 0:{ // Release
|
case 0:{ // Release
|
||||||
const int ch = rand() % chunks.size();
|
const int ch = rand() % chunks.size();
|
||||||
@ -190,23 +209,33 @@ Dbtup::execDUMP_STATE_ORD(Signal* signal)
|
|||||||
case 2: { // Seize(n) - fail
|
case 2: { // Seize(n) - fail
|
||||||
alloc += free;
|
alloc += free;
|
||||||
// Fall through
|
// Fall through
|
||||||
|
sum_req += free;
|
||||||
|
goto doalloc;
|
||||||
}
|
}
|
||||||
case 1: { // Seize(n) (success)
|
case 1: { // Seize(n) (success)
|
||||||
|
sum_req += alloc;
|
||||||
|
doalloc:
|
||||||
Chunk chunk;
|
Chunk chunk;
|
||||||
allocConsPages(alloc, chunk.pageCount, chunk.pageId);
|
allocConsPages(alloc, chunk.pageCount, chunk.pageId);
|
||||||
ndbrequire(chunk.pageCount <= alloc);
|
ndbrequire(chunk.pageCount <= alloc);
|
||||||
if(chunk.pageCount != 0){
|
if(chunk.pageCount != 0){
|
||||||
chunks.push_back(chunk);
|
chunks.push_back(chunk);
|
||||||
if(chunk.pageCount != alloc) {
|
if(chunk.pageCount != alloc) {
|
||||||
ndbout_c(" Tried to allocate %d - only allocated %d - free: %d",
|
if (type == 1211)
|
||||||
alloc, chunk.pageCount, free);
|
ndbout_c(" Tried to allocate %d - only allocated %d - free: %d",
|
||||||
|
alloc, chunk.pageCount, free);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
ndbout_c(" Failed to alloc %d pages with %d pages free",
|
ndbout_c(" Failed to alloc %d pages with %d pages free",
|
||||||
alloc, free);
|
alloc, free);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
sum_conf += chunk.pageCount;
|
||||||
|
Uint32 tot = fc_left + fc_right + fc_remove;
|
||||||
|
sum_loop += tot;
|
||||||
|
if (tot > max_loop)
|
||||||
|
max_loop = tot;
|
||||||
|
|
||||||
for(Uint32 i = 0; i<chunk.pageCount; i++){
|
for(Uint32 i = 0; i<chunk.pageCount; i++){
|
||||||
PagePtr pagePtr;
|
PagePtr pagePtr;
|
||||||
pagePtr.i = chunk.pageId + i;
|
pagePtr.i = chunk.pageId + i;
|
||||||
@ -225,6 +254,10 @@ Dbtup::execDUMP_STATE_ORD(Signal* signal)
|
|||||||
returnCommonArea(chunk.pageId, chunk.pageCount);
|
returnCommonArea(chunk.pageId, chunk.pageCount);
|
||||||
chunks.erase(chunks.size() - 1);
|
chunks.erase(chunks.size() - 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
ndbout_c("Got %u%% of requested allocs, loops : %u 100*avg: %u max: %u",
|
||||||
|
(100 * sum_conf) / sum_req, sum_loop, 100*sum_loop / LOOPS,
|
||||||
|
max_loop);
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
}//Dbtup::execDUMP_STATE_ORD()
|
}//Dbtup::execDUMP_STATE_ORD()
|
||||||
|
@ -305,6 +305,12 @@ void Dbtup::execREAD_CONFIG_REQ(Signal* signal)
|
|||||||
Uint32 noOfTriggers= 0;
|
Uint32 noOfTriggers= 0;
|
||||||
|
|
||||||
Uint32 tmp= 0;
|
Uint32 tmp= 0;
|
||||||
|
|
||||||
|
if (ndb_mgm_get_int_parameter(p, CFG_DB_MAX_ALLOCATE, &tmp))
|
||||||
|
tmp = 32 * 1024 * 1024;
|
||||||
|
m_max_allocate_pages = (tmp + GLOBAL_PAGE_SIZE - 1) / GLOBAL_PAGE_SIZE;
|
||||||
|
|
||||||
|
tmp = 0;
|
||||||
ndbrequire(!ndb_mgm_get_int_parameter(p, CFG_TUP_PAGE_RANGE, &tmp));
|
ndbrequire(!ndb_mgm_get_int_parameter(p, CFG_TUP_PAGE_RANGE, &tmp));
|
||||||
initPageRangeSize(tmp);
|
initPageRangeSize(tmp);
|
||||||
ndbrequire(!ndb_mgm_get_int_parameter(p, CFG_TUP_TABLE, &cnoOfTablerec));
|
ndbrequire(!ndb_mgm_get_int_parameter(p, CFG_TUP_TABLE, &cnoOfTablerec));
|
||||||
|
@ -146,10 +146,17 @@ void Dbtup::initializePage()
|
|||||||
cnoOfAllocatedPages = tmp; // Is updated by returnCommonArea
|
cnoOfAllocatedPages = tmp; // Is updated by returnCommonArea
|
||||||
}//Dbtup::initializePage()
|
}//Dbtup::initializePage()
|
||||||
|
|
||||||
|
#ifdef VM_TRACE
|
||||||
|
Uint32 fc_left, fc_right, fc_remove;
|
||||||
|
#endif
|
||||||
|
|
||||||
void Dbtup::allocConsPages(Uint32 noOfPagesToAllocate,
|
void Dbtup::allocConsPages(Uint32 noOfPagesToAllocate,
|
||||||
Uint32& noOfPagesAllocated,
|
Uint32& noOfPagesAllocated,
|
||||||
Uint32& allocPageRef)
|
Uint32& allocPageRef)
|
||||||
{
|
{
|
||||||
|
#ifdef VM_TRACE
|
||||||
|
fc_left = fc_right = fc_remove = 0;
|
||||||
|
#endif
|
||||||
if (noOfPagesToAllocate == 0){
|
if (noOfPagesToAllocate == 0){
|
||||||
jam();
|
jam();
|
||||||
noOfPagesAllocated = 0;
|
noOfPagesAllocated = 0;
|
||||||
@ -228,7 +235,10 @@ void Dbtup::findFreeLeftNeighbours(Uint32& allocPageRef,
|
|||||||
{
|
{
|
||||||
PagePtr pageFirstPtr, pageLastPtr;
|
PagePtr pageFirstPtr, pageLastPtr;
|
||||||
Uint32 remainAllocate = noOfPagesToAllocate - noPagesAllocated;
|
Uint32 remainAllocate = noOfPagesToAllocate - noPagesAllocated;
|
||||||
while (allocPageRef > 0) {
|
Uint32 loop = 0;
|
||||||
|
while (allocPageRef > 0 &&
|
||||||
|
++loop < 16)
|
||||||
|
{
|
||||||
jam();
|
jam();
|
||||||
pageLastPtr.i = allocPageRef - 1;
|
pageLastPtr.i = allocPageRef - 1;
|
||||||
c_page_pool.getPtr(pageLastPtr);
|
c_page_pool.getPtr(pageLastPtr);
|
||||||
@ -256,6 +266,9 @@ void Dbtup::findFreeLeftNeighbours(Uint32& allocPageRef,
|
|||||||
remainAllocate -= listSize;
|
remainAllocate -= listSize;
|
||||||
}//if
|
}//if
|
||||||
}//if
|
}//if
|
||||||
|
#ifdef VM_TRACE
|
||||||
|
fc_left++;
|
||||||
|
#endif
|
||||||
}//while
|
}//while
|
||||||
}//Dbtup::findFreeLeftNeighbours()
|
}//Dbtup::findFreeLeftNeighbours()
|
||||||
|
|
||||||
@ -269,7 +282,10 @@ void Dbtup::findFreeRightNeighbours(Uint32& allocPageRef,
|
|||||||
jam();
|
jam();
|
||||||
return;
|
return;
|
||||||
}//if
|
}//if
|
||||||
while ((allocPageRef + noPagesAllocated) < c_page_pool.getSize()) {
|
Uint32 loop = 0;
|
||||||
|
while ((allocPageRef + noPagesAllocated) < c_page_pool.getSize() &&
|
||||||
|
++loop < 16)
|
||||||
|
{
|
||||||
jam();
|
jam();
|
||||||
pageFirstPtr.i = allocPageRef + noPagesAllocated;
|
pageFirstPtr.i = allocPageRef + noPagesAllocated;
|
||||||
c_page_pool.getPtr(pageFirstPtr);
|
c_page_pool.getPtr(pageFirstPtr);
|
||||||
@ -296,24 +312,37 @@ void Dbtup::findFreeRightNeighbours(Uint32& allocPageRef,
|
|||||||
remainAllocate -= listSize;
|
remainAllocate -= listSize;
|
||||||
}//if
|
}//if
|
||||||
}//if
|
}//if
|
||||||
|
#ifdef VM_TRACE
|
||||||
|
fc_right++;
|
||||||
|
#endif
|
||||||
}//while
|
}//while
|
||||||
}//Dbtup::findFreeRightNeighbours()
|
}//Dbtup::findFreeRightNeighbours()
|
||||||
|
|
||||||
void Dbtup::insertCommonArea(Uint32 insPageRef, Uint32 insList)
|
void Dbtup::insertCommonArea(Uint32 insPageRef, Uint32 insList)
|
||||||
{
|
{
|
||||||
cnoOfAllocatedPages -= (1 << insList);
|
cnoOfAllocatedPages -= (1 << insList);
|
||||||
PagePtr pageLastPtr, pageInsPtr;
|
PagePtr pageLastPtr, pageInsPtr, pageHeadPtr;
|
||||||
|
|
||||||
|
pageHeadPtr.i = cfreepageList[insList];
|
||||||
c_page_pool.getPtr(pageInsPtr, insPageRef);
|
c_page_pool.getPtr(pageInsPtr, insPageRef);
|
||||||
ndbrequire(insList < 16);
|
ndbrequire(insList < 16);
|
||||||
pageLastPtr.i = (pageInsPtr.i + (1 << insList)) - 1;
|
pageLastPtr.i = (pageInsPtr.i + (1 << insList)) - 1;
|
||||||
|
|
||||||
pageInsPtr.p->next_cluster_page = cfreepageList[insList];
|
pageInsPtr.p->page_state = ZFREE_COMMON;
|
||||||
|
pageInsPtr.p->next_cluster_page = pageHeadPtr.i;
|
||||||
pageInsPtr.p->prev_cluster_page = RNIL;
|
pageInsPtr.p->prev_cluster_page = RNIL;
|
||||||
pageInsPtr.p->last_cluster_page = pageLastPtr.i;
|
pageInsPtr.p->last_cluster_page = pageLastPtr.i;
|
||||||
cfreepageList[insList] = pageInsPtr.i;
|
cfreepageList[insList] = pageInsPtr.i;
|
||||||
|
|
||||||
|
if (pageHeadPtr.i != RNIL)
|
||||||
|
{
|
||||||
|
jam();
|
||||||
|
c_page_pool.getPtr(pageHeadPtr);
|
||||||
|
pageHeadPtr.p->prev_cluster_page = pageInsPtr.i;
|
||||||
|
}
|
||||||
|
|
||||||
c_page_pool.getPtr(pageLastPtr);
|
c_page_pool.getPtr(pageLastPtr);
|
||||||
|
pageLastPtr.p->page_state = ZFREE_COMMON;
|
||||||
pageLastPtr.p->first_cluster_page = pageInsPtr.i;
|
pageLastPtr.p->first_cluster_page = pageInsPtr.i;
|
||||||
pageLastPtr.p->next_page = RNIL;
|
pageLastPtr.p->next_page = RNIL;
|
||||||
}//Dbtup::insertCommonArea()
|
}//Dbtup::insertCommonArea()
|
||||||
@ -321,12 +350,13 @@ void Dbtup::insertCommonArea(Uint32 insPageRef, Uint32 insList)
|
|||||||
void Dbtup::removeCommonArea(Uint32 remPageRef, Uint32 list)
|
void Dbtup::removeCommonArea(Uint32 remPageRef, Uint32 list)
|
||||||
{
|
{
|
||||||
cnoOfAllocatedPages += (1 << list);
|
cnoOfAllocatedPages += (1 << list);
|
||||||
PagePtr pagePrevPtr, pageNextPtr, pageLastPtr, pageSearchPtr, remPagePtr;
|
PagePtr pagePrevPtr, pageNextPtr, pageLastPtr, remPagePtr;
|
||||||
|
|
||||||
c_page_pool.getPtr(remPagePtr, remPageRef);
|
c_page_pool.getPtr(remPagePtr, remPageRef);
|
||||||
ndbrequire(list < 16);
|
ndbrequire(list < 16);
|
||||||
if (cfreepageList[list] == remPagePtr.i) {
|
if (cfreepageList[list] == remPagePtr.i) {
|
||||||
jam();
|
jam();
|
||||||
|
ndbassert(remPagePtr.p->prev_cluster_page == RNIL);
|
||||||
cfreepageList[list] = remPagePtr.p->next_cluster_page;
|
cfreepageList[list] = remPagePtr.p->next_cluster_page;
|
||||||
pageNextPtr.i = cfreepageList[list];
|
pageNextPtr.i = cfreepageList[list];
|
||||||
if (pageNextPtr.i != RNIL) {
|
if (pageNextPtr.i != RNIL) {
|
||||||
@ -335,30 +365,25 @@ void Dbtup::removeCommonArea(Uint32 remPageRef, Uint32 list)
|
|||||||
pageNextPtr.p->prev_cluster_page = RNIL;
|
pageNextPtr.p->prev_cluster_page = RNIL;
|
||||||
}//if
|
}//if
|
||||||
} else {
|
} else {
|
||||||
pageSearchPtr.i = cfreepageList[list];
|
pagePrevPtr.i = remPagePtr.p->prev_cluster_page;
|
||||||
while (true) {
|
|
||||||
jam();
|
|
||||||
c_page_pool.getPtr(pageSearchPtr);
|
|
||||||
pagePrevPtr = pageSearchPtr;
|
|
||||||
pageSearchPtr.i = pageSearchPtr.p->next_cluster_page;
|
|
||||||
if (pageSearchPtr.i == remPagePtr.i) {
|
|
||||||
jam();
|
|
||||||
break;
|
|
||||||
}//if
|
|
||||||
}//while
|
|
||||||
pageNextPtr.i = remPagePtr.p->next_cluster_page;
|
pageNextPtr.i = remPagePtr.p->next_cluster_page;
|
||||||
|
c_page_pool.getPtr(pagePrevPtr);
|
||||||
pagePrevPtr.p->next_cluster_page = pageNextPtr.i;
|
pagePrevPtr.p->next_cluster_page = pageNextPtr.i;
|
||||||
if (pageNextPtr.i != RNIL) {
|
if (pageNextPtr.i != RNIL)
|
||||||
|
{
|
||||||
jam();
|
jam();
|
||||||
c_page_pool.getPtr(pageNextPtr);
|
c_page_pool.getPtr(pageNextPtr);
|
||||||
pageNextPtr.p->prev_cluster_page = pagePrevPtr.i;
|
pageNextPtr.p->prev_cluster_page = pagePrevPtr.i;
|
||||||
}//if
|
}
|
||||||
}//if
|
}//if
|
||||||
remPagePtr.p->next_cluster_page= RNIL;
|
remPagePtr.p->next_cluster_page= RNIL;
|
||||||
remPagePtr.p->last_cluster_page= RNIL;
|
remPagePtr.p->last_cluster_page= RNIL;
|
||||||
remPagePtr.p->prev_cluster_page= RNIL;
|
remPagePtr.p->prev_cluster_page= RNIL;
|
||||||
|
remPagePtr.p->page_state = ~ZFREE_COMMON;
|
||||||
|
|
||||||
pageLastPtr.i = (remPagePtr.i + (1 << list)) - 1;
|
pageLastPtr.i = (remPagePtr.i + (1 << list)) - 1;
|
||||||
c_page_pool.getPtr(pageLastPtr);
|
c_page_pool.getPtr(pageLastPtr);
|
||||||
pageLastPtr.p->first_cluster_page= RNIL;
|
pageLastPtr.p->first_cluster_page= RNIL;
|
||||||
|
pageLastPtr.p->page_state = ~ZFREE_COMMON;
|
||||||
|
|
||||||
}//Dbtup::removeCommonArea()
|
}//Dbtup::removeCommonArea()
|
||||||
|
@ -432,6 +432,11 @@ void Dbtup::allocMoreFragPages(Fragrecord* const regFragPtr)
|
|||||||
// We will grow by 18.75% plus two more additional pages to grow
|
// We will grow by 18.75% plus two more additional pages to grow
|
||||||
// a little bit quicker in the beginning.
|
// a little bit quicker in the beginning.
|
||||||
/* -----------------------------------------------------------------*/
|
/* -----------------------------------------------------------------*/
|
||||||
|
|
||||||
|
if (noAllocPages > m_max_allocate_pages)
|
||||||
|
{
|
||||||
|
noAllocPages = m_max_allocate_pages;
|
||||||
|
}
|
||||||
Uint32 allocated = allocFragPages(regFragPtr, noAllocPages);
|
Uint32 allocated = allocFragPages(regFragPtr, noAllocPages);
|
||||||
regFragPtr->noOfPagesToGrow += allocated;
|
regFragPtr->noOfPagesToGrow += allocated;
|
||||||
}//Dbtup::allocMoreFragPages()
|
}//Dbtup::allocMoreFragPages()
|
||||||
|
@ -277,6 +277,14 @@ void Ndbcntr::execSTTOR(Signal* signal)
|
|||||||
break;
|
break;
|
||||||
case ZSTART_PHASE_1:
|
case ZSTART_PHASE_1:
|
||||||
jam();
|
jam();
|
||||||
|
{
|
||||||
|
Uint32 db_watchdog_interval = 0;
|
||||||
|
const ndb_mgm_configuration_iterator * p =
|
||||||
|
m_ctx.m_config.getOwnConfigIterator();
|
||||||
|
ndb_mgm_get_int_parameter(p, CFG_DB_WATCHDOG_INTERVAL, &db_watchdog_interval);
|
||||||
|
ndbrequire(db_watchdog_interval);
|
||||||
|
update_watch_dog_timer(db_watchdog_interval);
|
||||||
|
}
|
||||||
startPhase1Lab(signal);
|
startPhase1Lab(signal);
|
||||||
break;
|
break;
|
||||||
case ZSTART_PHASE_2:
|
case ZSTART_PHASE_2:
|
||||||
@ -1410,6 +1418,13 @@ void Ndbcntr::execNODE_FAILREP(Signal* signal)
|
|||||||
{
|
{
|
||||||
jamEntry();
|
jamEntry();
|
||||||
|
|
||||||
|
if (ERROR_INSERTED(1001))
|
||||||
|
{
|
||||||
|
sendSignalWithDelay(reference(), GSN_NODE_FAILREP, signal, 100,
|
||||||
|
signal->getLength());
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
const NodeFailRep * nodeFail = (NodeFailRep *)&signal->theData[0];
|
const NodeFailRep * nodeFail = (NodeFailRep *)&signal->theData[0];
|
||||||
NdbNodeBitmask allFailed;
|
NdbNodeBitmask allFailed;
|
||||||
allFailed.assign(NdbNodeBitmask::Size, nodeFail->theNodes);
|
allFailed.assign(NdbNodeBitmask::Size, nodeFail->theNodes);
|
||||||
@ -2734,16 +2749,34 @@ void Ndbcntr::execSTART_ORD(Signal* signal){
|
|||||||
c_missra.execSTART_ORD(signal);
|
c_missra.execSTART_ORD(signal);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#define CLEAR_DX 13
|
||||||
|
#define CLEAR_LCP 3
|
||||||
|
|
||||||
void
|
void
|
||||||
Ndbcntr::clearFilesystem(Signal* signal){
|
Ndbcntr::clearFilesystem(Signal* signal)
|
||||||
|
{
|
||||||
|
const Uint32 lcp = c_fsRemoveCount >= CLEAR_DX;
|
||||||
|
|
||||||
FsRemoveReq * req = (FsRemoveReq *)signal->getDataPtrSend();
|
FsRemoveReq * req = (FsRemoveReq *)signal->getDataPtrSend();
|
||||||
req->userReference = reference();
|
req->userReference = reference();
|
||||||
req->userPointer = 0;
|
req->userPointer = 0;
|
||||||
req->directory = 1;
|
req->directory = 1;
|
||||||
req->ownDirectory = 1;
|
req->ownDirectory = 1;
|
||||||
FsOpenReq::setVersion(req->fileNumber, 3);
|
|
||||||
FsOpenReq::setSuffix(req->fileNumber, FsOpenReq::S_CTL); // Can by any...
|
if (lcp == 0)
|
||||||
FsOpenReq::v1_setDisk(req->fileNumber, c_fsRemoveCount);
|
{
|
||||||
|
FsOpenReq::setVersion(req->fileNumber, 3);
|
||||||
|
FsOpenReq::setSuffix(req->fileNumber, FsOpenReq::S_CTL); // Can by any...
|
||||||
|
FsOpenReq::v1_setDisk(req->fileNumber, c_fsRemoveCount);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
FsOpenReq::setVersion(req->fileNumber, 5);
|
||||||
|
FsOpenReq::setSuffix(req->fileNumber, FsOpenReq::S_DATA);
|
||||||
|
FsOpenReq::v5_setLcpNo(req->fileNumber, c_fsRemoveCount - CLEAR_DX);
|
||||||
|
FsOpenReq::v5_setTableId(req->fileNumber, 0);
|
||||||
|
FsOpenReq::v5_setFragmentId(req->fileNumber, 0);
|
||||||
|
}
|
||||||
sendSignal(NDBFS_REF, GSN_FSREMOVEREQ, signal,
|
sendSignal(NDBFS_REF, GSN_FSREMOVEREQ, signal,
|
||||||
FsRemoveReq::SignalLength, JBA);
|
FsRemoveReq::SignalLength, JBA);
|
||||||
c_fsRemoveCount++;
|
c_fsRemoveCount++;
|
||||||
@ -2752,12 +2785,12 @@ Ndbcntr::clearFilesystem(Signal* signal){
|
|||||||
void
|
void
|
||||||
Ndbcntr::execFSREMOVECONF(Signal* signal){
|
Ndbcntr::execFSREMOVECONF(Signal* signal){
|
||||||
jamEntry();
|
jamEntry();
|
||||||
if(c_fsRemoveCount == 13){
|
if(c_fsRemoveCount == CLEAR_DX + CLEAR_LCP){
|
||||||
jam();
|
jam();
|
||||||
sendSttorry(signal);
|
sendSttorry(signal);
|
||||||
} else {
|
} else {
|
||||||
jam();
|
jam();
|
||||||
ndbrequire(c_fsRemoveCount < 13);
|
ndbrequire(c_fsRemoveCount < CLEAR_DX + CLEAR_LCP);
|
||||||
clearFilesystem(signal);
|
clearFilesystem(signal);
|
||||||
}//if
|
}//if
|
||||||
}
|
}
|
||||||
|
@ -163,7 +163,12 @@ AsyncFile::run()
|
|||||||
theStartFlag = true;
|
theStartFlag = true;
|
||||||
// Create write buffer for bigger writes
|
// Create write buffer for bigger writes
|
||||||
theWriteBufferSize = WRITEBUFFERSIZE;
|
theWriteBufferSize = WRITEBUFFERSIZE;
|
||||||
theWriteBuffer = (char *) ndbd_malloc(theWriteBufferSize);
|
theWriteBufferUnaligned = (char *) ndbd_malloc(theWriteBufferSize +
|
||||||
|
NDB_O_DIRECT_WRITE_ALIGNMENT-1);
|
||||||
|
theWriteBuffer = (char *)
|
||||||
|
(((UintPtr)theWriteBufferUnaligned + NDB_O_DIRECT_WRITE_ALIGNMENT - 1) &
|
||||||
|
~(UintPtr)(NDB_O_DIRECT_WRITE_ALIGNMENT - 1));
|
||||||
|
|
||||||
NdbMutex_Unlock(theStartMutexPtr);
|
NdbMutex_Unlock(theStartMutexPtr);
|
||||||
NdbCondition_Signal(theStartConditionPtr);
|
NdbCondition_Signal(theStartConditionPtr);
|
||||||
|
|
||||||
@ -247,6 +252,78 @@ AsyncFile::run()
|
|||||||
static char g_odirect_readbuf[2*GLOBAL_PAGE_SIZE -1];
|
static char g_odirect_readbuf[2*GLOBAL_PAGE_SIZE -1];
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
int
|
||||||
|
AsyncFile::check_odirect_write(Uint32 flags, int& new_flags, int mode)
|
||||||
|
{
|
||||||
|
assert(new_flags & (O_CREAT | O_TRUNC));
|
||||||
|
#ifdef O_DIRECT
|
||||||
|
int ret;
|
||||||
|
char * bufptr = (char*)((UintPtr(g_odirect_readbuf)+(GLOBAL_PAGE_SIZE - 1)) & ~(GLOBAL_PAGE_SIZE - 1));
|
||||||
|
while (((ret = ::write(theFd, bufptr, GLOBAL_PAGE_SIZE)) == -1) &&
|
||||||
|
(errno == EINTR));
|
||||||
|
if (ret == -1)
|
||||||
|
{
|
||||||
|
new_flags &= ~O_DIRECT;
|
||||||
|
ndbout_c("%s Failed to write using O_DIRECT, disabling",
|
||||||
|
theFileName.c_str());
|
||||||
|
}
|
||||||
|
|
||||||
|
close(theFd);
|
||||||
|
theFd = ::open(theFileName.c_str(), new_flags, mode);
|
||||||
|
if (theFd == -1)
|
||||||
|
return errno;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
AsyncFile::check_odirect_read(Uint32 flags, int &new_flags, int mode)
|
||||||
|
{
|
||||||
|
#ifdef O_DIRECT
|
||||||
|
int ret;
|
||||||
|
char * bufptr = (char*)((UintPtr(g_odirect_readbuf)+(GLOBAL_PAGE_SIZE - 1)) & ~(GLOBAL_PAGE_SIZE - 1));
|
||||||
|
while (((ret = ::read(theFd, bufptr, GLOBAL_PAGE_SIZE)) == -1) &&
|
||||||
|
(errno == EINTR));
|
||||||
|
if (ret == -1)
|
||||||
|
{
|
||||||
|
ndbout_c("%s Failed to read using O_DIRECT, disabling",
|
||||||
|
theFileName.c_str());
|
||||||
|
goto reopen;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(lseek(theFd, 0, SEEK_SET) != 0)
|
||||||
|
{
|
||||||
|
return errno;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ((flags & FsOpenReq::OM_CHECK_SIZE) == 0)
|
||||||
|
{
|
||||||
|
struct stat buf;
|
||||||
|
if ((fstat(theFd, &buf) == -1))
|
||||||
|
{
|
||||||
|
return errno;
|
||||||
|
}
|
||||||
|
else if ((buf.st_size % GLOBAL_PAGE_SIZE) != 0)
|
||||||
|
{
|
||||||
|
ndbout_c("%s filesize not a multiple of %d, disabling O_DIRECT",
|
||||||
|
theFileName.c_str(), GLOBAL_PAGE_SIZE);
|
||||||
|
goto reopen;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
reopen:
|
||||||
|
close(theFd);
|
||||||
|
new_flags &= ~O_DIRECT;
|
||||||
|
theFd = ::open(theFileName.c_str(), new_flags, mode);
|
||||||
|
if (theFd == -1)
|
||||||
|
return errno;
|
||||||
|
#endif
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
void AsyncFile::openReq(Request* request)
|
void AsyncFile::openReq(Request* request)
|
||||||
{
|
{
|
||||||
m_auto_sync_freq = 0;
|
m_auto_sync_freq = 0;
|
||||||
@ -312,7 +389,7 @@ void AsyncFile::openReq(Request* request)
|
|||||||
}
|
}
|
||||||
#else
|
#else
|
||||||
Uint32 flags = request->par.open.flags;
|
Uint32 flags = request->par.open.flags;
|
||||||
Uint32 new_flags = 0;
|
int new_flags = 0;
|
||||||
|
|
||||||
// Convert file open flags from Solaris to Liux
|
// Convert file open flags from Solaris to Liux
|
||||||
if (flags & FsOpenReq::OM_CREATE)
|
if (flags & FsOpenReq::OM_CREATE)
|
||||||
@ -343,10 +420,6 @@ void AsyncFile::openReq(Request* request)
|
|||||||
{
|
{
|
||||||
new_flags |= O_DIRECT;
|
new_flags |= O_DIRECT;
|
||||||
}
|
}
|
||||||
#elif defined O_SYNC
|
|
||||||
{
|
|
||||||
flags |= FsOpenReq::OM_SYNC;
|
|
||||||
}
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
if ((flags & FsOpenReq::OM_SYNC) && ! (flags & FsOpenReq::OM_INIT))
|
if ((flags & FsOpenReq::OM_SYNC) && ! (flags & FsOpenReq::OM_INIT))
|
||||||
@ -356,14 +429,18 @@ void AsyncFile::openReq(Request* request)
|
|||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const char * rw = "";
|
||||||
switch(flags & 0x3){
|
switch(flags & 0x3){
|
||||||
case FsOpenReq::OM_READONLY:
|
case FsOpenReq::OM_READONLY:
|
||||||
|
rw = "r";
|
||||||
new_flags |= O_RDONLY;
|
new_flags |= O_RDONLY;
|
||||||
break;
|
break;
|
||||||
case FsOpenReq::OM_WRITEONLY:
|
case FsOpenReq::OM_WRITEONLY:
|
||||||
|
rw = "w";
|
||||||
new_flags |= O_WRONLY;
|
new_flags |= O_WRONLY;
|
||||||
break;
|
break;
|
||||||
case FsOpenReq::OM_READWRITE:
|
case FsOpenReq::OM_READWRITE:
|
||||||
|
rw = "rw";
|
||||||
new_flags |= O_RDWR;
|
new_flags |= O_RDWR;
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
@ -404,11 +481,6 @@ no_odirect:
|
|||||||
if (new_flags & O_DIRECT)
|
if (new_flags & O_DIRECT)
|
||||||
{
|
{
|
||||||
new_flags &= ~O_DIRECT;
|
new_flags &= ~O_DIRECT;
|
||||||
flags |= FsOpenReq::OM_SYNC;
|
|
||||||
#ifdef O_SYNC
|
|
||||||
if (! (flags & FsOpenReq::OM_INIT))
|
|
||||||
new_flags |= O_SYNC;
|
|
||||||
#endif
|
|
||||||
goto no_odirect;
|
goto no_odirect;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
@ -421,11 +493,6 @@ no_odirect:
|
|||||||
else if (new_flags & O_DIRECT)
|
else if (new_flags & O_DIRECT)
|
||||||
{
|
{
|
||||||
new_flags &= ~O_DIRECT;
|
new_flags &= ~O_DIRECT;
|
||||||
flags |= FsOpenReq::OM_SYNC;
|
|
||||||
#ifdef O_SYNC
|
|
||||||
if (! (flags & FsOpenReq::OM_INIT))
|
|
||||||
new_flags |= O_SYNC;
|
|
||||||
#endif
|
|
||||||
goto no_odirect;
|
goto no_odirect;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
@ -512,7 +579,6 @@ no_odirect:
|
|||||||
{
|
{
|
||||||
ndbout_c("error on first write(%d), disable O_DIRECT", err);
|
ndbout_c("error on first write(%d), disable O_DIRECT", err);
|
||||||
new_flags &= ~O_DIRECT;
|
new_flags &= ~O_DIRECT;
|
||||||
flags |= FsOpenReq::OM_SYNC;
|
|
||||||
close(theFd);
|
close(theFd);
|
||||||
theFd = ::open(theFileName.c_str(), new_flags, mode);
|
theFd = ::open(theFileName.c_str(), new_flags, mode);
|
||||||
if (theFd != -1)
|
if (theFd != -1)
|
||||||
@ -532,26 +598,32 @@ no_odirect:
|
|||||||
else if (flags & FsOpenReq::OM_DIRECT)
|
else if (flags & FsOpenReq::OM_DIRECT)
|
||||||
{
|
{
|
||||||
#ifdef O_DIRECT
|
#ifdef O_DIRECT
|
||||||
do {
|
if (flags & (FsOpenReq::OM_TRUNCATE | FsOpenReq::OM_CREATE))
|
||||||
int ret;
|
{
|
||||||
char * bufptr = (char*)((UintPtr(g_odirect_readbuf)+(GLOBAL_PAGE_SIZE - 1)) & ~(GLOBAL_PAGE_SIZE - 1));
|
request->error = check_odirect_write(flags, new_flags, mode);
|
||||||
while (((ret = ::read(theFd, bufptr, GLOBAL_PAGE_SIZE)) == -1) && (errno == EINTR));
|
}
|
||||||
if (ret == -1)
|
else
|
||||||
{
|
{
|
||||||
ndbout_c("%s Failed to read using O_DIRECT, disabling", theFileName.c_str());
|
request->error = check_odirect_read(flags, new_flags, mode);
|
||||||
flags |= FsOpenReq::OM_SYNC;
|
}
|
||||||
flags |= FsOpenReq::OM_INIT;
|
|
||||||
break;
|
if (request->error)
|
||||||
}
|
return;
|
||||||
if(lseek(theFd, 0, SEEK_SET) != 0)
|
|
||||||
{
|
|
||||||
request->error = errno;
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
} while (0);
|
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
#ifdef VM_TRACE
|
||||||
|
if (flags & FsOpenReq::OM_DIRECT)
|
||||||
|
{
|
||||||
|
#ifdef O_DIRECT
|
||||||
|
ndbout_c("%s %s O_DIRECT: %d",
|
||||||
|
theFileName.c_str(), rw,
|
||||||
|
!!(new_flags & O_DIRECT));
|
||||||
|
#else
|
||||||
|
ndbout_c("%s %s O_DIRECT: 0",
|
||||||
|
theFileName.c_str(), rw);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
#endif
|
||||||
if ((flags & FsOpenReq::OM_SYNC) && (flags & FsOpenReq::OM_INIT))
|
if ((flags & FsOpenReq::OM_SYNC) && (flags & FsOpenReq::OM_INIT))
|
||||||
{
|
{
|
||||||
#ifdef O_SYNC
|
#ifdef O_SYNC
|
||||||
@ -562,6 +634,10 @@ no_odirect:
|
|||||||
new_flags &= ~(O_CREAT | O_TRUNC);
|
new_flags &= ~(O_CREAT | O_TRUNC);
|
||||||
new_flags |= O_SYNC;
|
new_flags |= O_SYNC;
|
||||||
theFd = ::open(theFileName.c_str(), new_flags, mode);
|
theFd = ::open(theFileName.c_str(), new_flags, mode);
|
||||||
|
if (theFd == -1)
|
||||||
|
{
|
||||||
|
request->error = errno;
|
||||||
|
}
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
@ -1079,7 +1155,8 @@ AsyncFile::rmrfReq(Request * request, char * path, bool removePath){
|
|||||||
void AsyncFile::endReq()
|
void AsyncFile::endReq()
|
||||||
{
|
{
|
||||||
// Thread is ended with return
|
// Thread is ended with return
|
||||||
if (theWriteBuffer) ndbd_free(theWriteBuffer, theWriteBufferSize);
|
if (theWriteBufferUnaligned)
|
||||||
|
ndbd_free(theWriteBufferUnaligned, theWriteBufferSize);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -234,9 +234,13 @@ private:
|
|||||||
bool theStartFlag;
|
bool theStartFlag;
|
||||||
int theWriteBufferSize;
|
int theWriteBufferSize;
|
||||||
char* theWriteBuffer;
|
char* theWriteBuffer;
|
||||||
|
void* theWriteBufferUnaligned;
|
||||||
|
|
||||||
size_t m_write_wo_sync; // Writes wo/ sync
|
size_t m_write_wo_sync; // Writes wo/ sync
|
||||||
size_t m_auto_sync_freq; // Auto sync freq in bytes
|
size_t m_auto_sync_freq; // Auto sync freq in bytes
|
||||||
|
|
||||||
|
int check_odirect_read(Uint32 flags, int&new_flags, int mode);
|
||||||
|
int check_odirect_write(Uint32 flags, int&new_flags, int mode);
|
||||||
public:
|
public:
|
||||||
SimulatedBlock& m_fs;
|
SimulatedBlock& m_fs;
|
||||||
Ptr<GlobalPage> m_page_ptr;
|
Ptr<GlobalPage> m_page_ptr;
|
||||||
|
@ -652,7 +652,7 @@ AsyncFile*
|
|||||||
Ndbfs::createAsyncFile(){
|
Ndbfs::createAsyncFile(){
|
||||||
|
|
||||||
// Check limit of open files
|
// Check limit of open files
|
||||||
if (m_maxFiles !=0 && theFiles.size()+1 == m_maxFiles) {
|
if (m_maxFiles !=0 && theFiles.size() == m_maxFiles) {
|
||||||
// Print info about all open files
|
// Print info about all open files
|
||||||
for (unsigned i = 0; i < theFiles.size(); i++){
|
for (unsigned i = 0; i < theFiles.size(); i++){
|
||||||
AsyncFile* file = theFiles[i];
|
AsyncFile* file = theFiles[i];
|
||||||
|
@ -668,6 +668,7 @@ Pgman::lirs_reference(Ptr<Page_entry> ptr)
|
|||||||
jam();
|
jam();
|
||||||
move_cleanup_ptr(ptr);
|
move_cleanup_ptr(ptr);
|
||||||
pl_queue.remove(ptr);
|
pl_queue.remove(ptr);
|
||||||
|
state &= ~ Page_entry::ONQUEUE;
|
||||||
}
|
}
|
||||||
if (state & Page_entry::BOUND)
|
if (state & Page_entry::BOUND)
|
||||||
{
|
{
|
||||||
@ -698,6 +699,12 @@ Pgman::lirs_reference(Ptr<Page_entry> ptr)
|
|||||||
pl_stack.add(ptr);
|
pl_stack.add(ptr);
|
||||||
state |= Page_entry::ONSTACK;
|
state |= Page_entry::ONSTACK;
|
||||||
state |= Page_entry::HOT;
|
state |= Page_entry::HOT;
|
||||||
|
// it could be on queue already
|
||||||
|
if (state & Page_entry::ONQUEUE) {
|
||||||
|
jam();
|
||||||
|
pl_queue.remove(ptr);
|
||||||
|
state &= ~Page_entry::ONQUEUE;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
set_page_state(ptr, state);
|
set_page_state(ptr, state);
|
||||||
|
@ -557,6 +557,9 @@ Restore::restore_next(Signal* signal, FilePtr file_ptr)
|
|||||||
case BackupFormat::GCP_ENTRY:
|
case BackupFormat::GCP_ENTRY:
|
||||||
parse_gcp_entry(signal, file_ptr, data, len);
|
parse_gcp_entry(signal, file_ptr, data, len);
|
||||||
break;
|
break;
|
||||||
|
case BackupFormat::EMPTY_ENTRY:
|
||||||
|
// skip
|
||||||
|
break;
|
||||||
case 0x4e444242: // 'NDBB'
|
case 0x4e444242: // 'NDBB'
|
||||||
if (check_file_version(signal, ntohl(* (data+2))) == 0)
|
if (check_file_version(signal, ntohl(* (data+2))) == 0)
|
||||||
{
|
{
|
||||||
|
@ -443,6 +443,11 @@ Configuration::setupConfiguration(){
|
|||||||
"TimeBetweenWatchDogCheck missing");
|
"TimeBetweenWatchDogCheck missing");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if(iter.get(CFG_DB_WATCHDOG_INTERVAL_INITIAL, &_timeBetweenWatchDogCheckInitial)){
|
||||||
|
ERROR_SET(fatal, NDBD_EXIT_INVALID_CONFIG, "Invalid configuration fetched",
|
||||||
|
"TimeBetweenWatchDogCheckInitial missing");
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Get paths
|
* Get paths
|
||||||
*/
|
*/
|
||||||
@ -462,9 +467,12 @@ Configuration::setupConfiguration(){
|
|||||||
* Create the watch dog thread
|
* Create the watch dog thread
|
||||||
*/
|
*/
|
||||||
{
|
{
|
||||||
Uint32 t = _timeBetweenWatchDogCheck;
|
if (_timeBetweenWatchDogCheckInitial < _timeBetweenWatchDogCheck)
|
||||||
|
_timeBetweenWatchDogCheckInitial = _timeBetweenWatchDogCheck;
|
||||||
|
|
||||||
|
Uint32 t = _timeBetweenWatchDogCheckInitial;
|
||||||
t = globalEmulatorData.theWatchDog ->setCheckInterval(t);
|
t = globalEmulatorData.theWatchDog ->setCheckInterval(t);
|
||||||
_timeBetweenWatchDogCheck = t;
|
_timeBetweenWatchDogCheckInitial = t;
|
||||||
}
|
}
|
||||||
|
|
||||||
ConfigValues* cf = ConfigValuesFactory::extractCurrentSection(iter.m_config);
|
ConfigValues* cf = ConfigValuesFactory::extractCurrentSection(iter.m_config);
|
||||||
|
@ -84,6 +84,7 @@ private:
|
|||||||
Uint32 _maxErrorLogs;
|
Uint32 _maxErrorLogs;
|
||||||
Uint32 _lockPagesInMainMemory;
|
Uint32 _lockPagesInMainMemory;
|
||||||
Uint32 _timeBetweenWatchDogCheck;
|
Uint32 _timeBetweenWatchDogCheck;
|
||||||
|
Uint32 _timeBetweenWatchDogCheckInitial;
|
||||||
|
|
||||||
ndb_mgm_configuration * m_ownConfig;
|
ndb_mgm_configuration * m_ownConfig;
|
||||||
ndb_mgm_configuration * m_clusterConfig;
|
ndb_mgm_configuration * m_clusterConfig;
|
||||||
|
@ -19,6 +19,7 @@
|
|||||||
#include <NdbOut.hpp>
|
#include <NdbOut.hpp>
|
||||||
#include <GlobalData.hpp>
|
#include <GlobalData.hpp>
|
||||||
#include <Emulator.hpp>
|
#include <Emulator.hpp>
|
||||||
|
#include <WatchDog.hpp>
|
||||||
#include <ErrorHandlingMacros.hpp>
|
#include <ErrorHandlingMacros.hpp>
|
||||||
#include <TimeQueue.hpp>
|
#include <TimeQueue.hpp>
|
||||||
#include <TransporterRegistry.hpp>
|
#include <TransporterRegistry.hpp>
|
||||||
@ -38,6 +39,9 @@
|
|||||||
#include <AttributeDescriptor.hpp>
|
#include <AttributeDescriptor.hpp>
|
||||||
#include <NdbSqlUtil.hpp>
|
#include <NdbSqlUtil.hpp>
|
||||||
|
|
||||||
|
#include <EventLogger.hpp>
|
||||||
|
extern EventLogger g_eventLogger;
|
||||||
|
|
||||||
#define ljamEntry() jamEntryLine(30000 + __LINE__)
|
#define ljamEntry() jamEntryLine(30000 + __LINE__)
|
||||||
#define ljam() jamLine(30000 + __LINE__)
|
#define ljam() jamLine(30000 + __LINE__)
|
||||||
|
|
||||||
@ -655,14 +659,20 @@ SimulatedBlock::getBatSize(Uint16 blockNo){
|
|||||||
return sb->theBATSize;
|
return sb->theBATSize;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void* SimulatedBlock::allocRecord(const char * type, size_t s, size_t n, bool clear, Uint32 paramId)
|
||||||
|
{
|
||||||
|
return allocRecordAligned(type, s, n, 0, 0, clear, paramId);
|
||||||
|
}
|
||||||
|
|
||||||
void*
|
void*
|
||||||
SimulatedBlock::allocRecord(const char * type, size_t s, size_t n, bool clear, Uint32 paramId)
|
SimulatedBlock::allocRecordAligned(const char * type, size_t s, size_t n, void **unaligned_buffer, Uint32 align, bool clear, Uint32 paramId)
|
||||||
{
|
{
|
||||||
|
|
||||||
void * p = NULL;
|
void * p = NULL;
|
||||||
size_t size = n*s;
|
Uint32 over_alloc = unaligned_buffer ? (align - 1) : 0;
|
||||||
Uint64 real_size = (Uint64)((Uint64)n)*((Uint64)s);
|
size_t size = n*s + over_alloc;
|
||||||
refresh_watch_dog();
|
Uint64 real_size = (Uint64)((Uint64)n)*((Uint64)s) + over_alloc;
|
||||||
|
refresh_watch_dog(9);
|
||||||
if (real_size > 0){
|
if (real_size > 0){
|
||||||
#ifdef VM_TRACE_MEM
|
#ifdef VM_TRACE_MEM
|
||||||
ndbout_c("%s::allocRecord(%s, %u, %u) = %llu bytes",
|
ndbout_c("%s::allocRecord(%s, %u, %u) = %llu bytes",
|
||||||
@ -696,14 +706,24 @@ SimulatedBlock::allocRecord(const char * type, size_t s, size_t n, bool clear, U
|
|||||||
char * ptr = (char*)p;
|
char * ptr = (char*)p;
|
||||||
const Uint32 chunk = 128 * 1024;
|
const Uint32 chunk = 128 * 1024;
|
||||||
while(size > chunk){
|
while(size > chunk){
|
||||||
refresh_watch_dog();
|
refresh_watch_dog(9);
|
||||||
memset(ptr, 0, chunk);
|
memset(ptr, 0, chunk);
|
||||||
ptr += chunk;
|
ptr += chunk;
|
||||||
size -= chunk;
|
size -= chunk;
|
||||||
}
|
}
|
||||||
refresh_watch_dog();
|
refresh_watch_dog(9);
|
||||||
memset(ptr, 0, size);
|
memset(ptr, 0, size);
|
||||||
}
|
}
|
||||||
|
if (unaligned_buffer)
|
||||||
|
{
|
||||||
|
*unaligned_buffer = p;
|
||||||
|
p = (void *)(((UintPtr)p + over_alloc) & ~(UintPtr)(over_alloc));
|
||||||
|
#ifdef VM_TRACE
|
||||||
|
g_eventLogger.info("'%s' (%u) %llu %llu, alignment correction %u bytes",
|
||||||
|
type, align, (Uint64)p, (Uint64)p+n*s,
|
||||||
|
(Uint32)((UintPtr)p - (UintPtr)*unaligned_buffer));
|
||||||
|
#endif
|
||||||
|
}
|
||||||
}
|
}
|
||||||
return p;
|
return p;
|
||||||
}
|
}
|
||||||
@ -720,9 +740,16 @@ SimulatedBlock::deallocRecord(void ** ptr,
|
|||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
SimulatedBlock::refresh_watch_dog()
|
SimulatedBlock::refresh_watch_dog(Uint32 place)
|
||||||
{
|
{
|
||||||
globalData.incrementWatchDogCounter(1);
|
globalData.incrementWatchDogCounter(place);
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
SimulatedBlock::update_watch_dog_timer(Uint32 interval)
|
||||||
|
{
|
||||||
|
extern EmulatorData globalEmulatorData;
|
||||||
|
globalEmulatorData.theWatchDog->setCheckInterval(interval);
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
|
@ -334,7 +334,8 @@ protected:
|
|||||||
* Refresh Watch Dog in initialising code
|
* Refresh Watch Dog in initialising code
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
void refresh_watch_dog();
|
void refresh_watch_dog(Uint32 place = 1);
|
||||||
|
void update_watch_dog_timer(Uint32 interval);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Prog error
|
* Prog error
|
||||||
@ -377,6 +378,7 @@ protected:
|
|||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
void* allocRecord(const char * type, size_t s, size_t n, bool clear = true, Uint32 paramId = 0);
|
void* allocRecord(const char * type, size_t s, size_t n, bool clear = true, Uint32 paramId = 0);
|
||||||
|
void* allocRecordAligned(const char * type, size_t s, size_t n, void **unaligned_buffer, Uint32 align = NDB_O_DIRECT_WRITE_ALIGNMENT, bool clear = true, Uint32 paramId = 0);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Deallocate record
|
* Deallocate record
|
||||||
|
@ -16,6 +16,7 @@
|
|||||||
|
|
||||||
#include <ndb_global.h>
|
#include <ndb_global.h>
|
||||||
#include <my_pthread.h>
|
#include <my_pthread.h>
|
||||||
|
#include <sys/times.h>
|
||||||
|
|
||||||
#include "WatchDog.hpp"
|
#include "WatchDog.hpp"
|
||||||
#include "GlobalData.hpp"
|
#include "GlobalData.hpp"
|
||||||
@ -24,6 +25,8 @@
|
|||||||
#include <ErrorHandlingMacros.hpp>
|
#include <ErrorHandlingMacros.hpp>
|
||||||
#include <EventLogger.hpp>
|
#include <EventLogger.hpp>
|
||||||
|
|
||||||
|
#include <NdbTick.h>
|
||||||
|
|
||||||
extern EventLogger g_eventLogger;
|
extern EventLogger g_eventLogger;
|
||||||
|
|
||||||
extern "C"
|
extern "C"
|
||||||
@ -71,66 +74,115 @@ WatchDog::doStop(){
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const char *get_action(Uint32 IPValue)
|
||||||
|
{
|
||||||
|
const char *action;
|
||||||
|
switch (IPValue) {
|
||||||
|
case 1:
|
||||||
|
action = "Job Handling";
|
||||||
|
break;
|
||||||
|
case 2:
|
||||||
|
action = "Scanning Timers";
|
||||||
|
break;
|
||||||
|
case 3:
|
||||||
|
action = "External I/O";
|
||||||
|
break;
|
||||||
|
case 4:
|
||||||
|
action = "Print Job Buffers at crash";
|
||||||
|
break;
|
||||||
|
case 5:
|
||||||
|
action = "Checking connections";
|
||||||
|
break;
|
||||||
|
case 6:
|
||||||
|
action = "Performing Send";
|
||||||
|
break;
|
||||||
|
case 7:
|
||||||
|
action = "Polling for Receive";
|
||||||
|
break;
|
||||||
|
case 8:
|
||||||
|
action = "Performing Receive";
|
||||||
|
break;
|
||||||
|
case 9:
|
||||||
|
action = "Allocating memory";
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
action = "Unknown place";
|
||||||
|
break;
|
||||||
|
}//switch
|
||||||
|
return action;
|
||||||
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
WatchDog::run(){
|
WatchDog::run()
|
||||||
unsigned int anIPValue;
|
{
|
||||||
unsigned int alerts = 0;
|
unsigned int anIPValue, sleep_time;
|
||||||
unsigned int oldIPValue = 0;
|
unsigned int oldIPValue = 0;
|
||||||
|
unsigned int theIntervalCheck = theInterval;
|
||||||
|
struct MicroSecondTimer start_time, last_time, now;
|
||||||
|
NdbTick_getMicroTimer(&start_time);
|
||||||
|
last_time = start_time;
|
||||||
|
|
||||||
// WatchDog for the single threaded NDB
|
// WatchDog for the single threaded NDB
|
||||||
while(!theStop){
|
while (!theStop)
|
||||||
Uint32 tmp = theInterval / 500;
|
{
|
||||||
tmp= (tmp ? tmp : 1);
|
sleep_time= 100;
|
||||||
|
|
||||||
while(!theStop && tmp > 0){
|
|
||||||
NdbSleep_MilliSleep(500);
|
|
||||||
tmp--;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
NdbSleep_MilliSleep(sleep_time);
|
||||||
if(theStop)
|
if(theStop)
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
NdbTick_getMicroTimer(&now);
|
||||||
|
if (NdbTick_getMicrosPassed(last_time, now)/1000 > sleep_time*2)
|
||||||
|
{
|
||||||
|
struct tms my_tms;
|
||||||
|
times(&my_tms);
|
||||||
|
g_eventLogger.info("Watchdog: User time: %llu System time: %llu",
|
||||||
|
(Uint64)my_tms.tms_utime,
|
||||||
|
(Uint64)my_tms.tms_stime);
|
||||||
|
g_eventLogger.warning("Watchdog: Warning overslept %u ms, expected %u ms.",
|
||||||
|
NdbTick_getMicrosPassed(last_time, now)/1000,
|
||||||
|
sleep_time);
|
||||||
|
}
|
||||||
|
last_time = now;
|
||||||
|
|
||||||
// Verify that the IP thread is not stuck in a loop
|
// Verify that the IP thread is not stuck in a loop
|
||||||
anIPValue = *theIPValue;
|
anIPValue = *theIPValue;
|
||||||
if(anIPValue != 0) {
|
if (anIPValue != 0)
|
||||||
|
{
|
||||||
oldIPValue = anIPValue;
|
oldIPValue = anIPValue;
|
||||||
globalData.incrementWatchDogCounter(0);
|
globalData.incrementWatchDogCounter(0);
|
||||||
alerts = 0;
|
NdbTick_getMicroTimer(&start_time);
|
||||||
} else {
|
theIntervalCheck = theInterval;
|
||||||
const char *last_stuck_action;
|
}
|
||||||
alerts++;
|
else
|
||||||
switch (oldIPValue) {
|
{
|
||||||
case 1:
|
int warn = 1;
|
||||||
last_stuck_action = "Job Handling";
|
Uint32 elapsed = NdbTick_getMicrosPassed(start_time, now)/1000;
|
||||||
break;
|
/*
|
||||||
case 2:
|
oldIPValue == 9 indicates malloc going on, this can take some time
|
||||||
last_stuck_action = "Scanning Timers";
|
so only warn if we pass the watchdog interval
|
||||||
break;
|
*/
|
||||||
case 3:
|
if (oldIPValue == 9)
|
||||||
last_stuck_action = "External I/O";
|
if (elapsed < theIntervalCheck)
|
||||||
break;
|
warn = 0;
|
||||||
case 4:
|
else
|
||||||
last_stuck_action = "Print Job Buffers at crash";
|
theIntervalCheck += theInterval;
|
||||||
break;
|
|
||||||
case 5:
|
if (warn)
|
||||||
last_stuck_action = "Checking connections";
|
{
|
||||||
break;
|
const char *last_stuck_action = get_action(oldIPValue);
|
||||||
case 6:
|
g_eventLogger.warning("Ndb kernel is stuck in: %s", last_stuck_action);
|
||||||
last_stuck_action = "Performing Send";
|
{
|
||||||
break;
|
struct tms my_tms;
|
||||||
case 7:
|
times(&my_tms);
|
||||||
last_stuck_action = "Polling for Receive";
|
g_eventLogger.info("Watchdog: User time: %llu System time: %llu",
|
||||||
break;
|
(Uint64)my_tms.tms_utime,
|
||||||
case 8:
|
(Uint64)my_tms.tms_stime);
|
||||||
last_stuck_action = "Performing Receive";
|
}
|
||||||
break;
|
if (elapsed > 3 * theInterval)
|
||||||
default:
|
{
|
||||||
last_stuck_action = "Unknown place";
|
shutdownSystem(last_stuck_action);
|
||||||
break;
|
}
|
||||||
}//switch
|
|
||||||
g_eventLogger.warning("Ndb kernel is stuck in: %s", last_stuck_action);
|
|
||||||
if(alerts == 3){
|
|
||||||
shutdownSystem(last_stuck_action);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -524,7 +524,7 @@ ndb_mgm_connect(NdbMgmHandle handle, int no_retries,
|
|||||||
NDB_SOCKET_TYPE sockfd= NDB_INVALID_SOCKET;
|
NDB_SOCKET_TYPE sockfd= NDB_INVALID_SOCKET;
|
||||||
Uint32 i;
|
Uint32 i;
|
||||||
SocketClient s(0, 0);
|
SocketClient s(0, 0);
|
||||||
s.set_connect_timeout(handle->timeout);
|
s.set_connect_timeout((handle->timeout+999)/1000);
|
||||||
if (!s.init())
|
if (!s.init())
|
||||||
{
|
{
|
||||||
fprintf(handle->errstream,
|
fprintf(handle->errstream,
|
||||||
|
@ -18,6 +18,7 @@
|
|||||||
#include <Vector.hpp>
|
#include <Vector.hpp>
|
||||||
#include <mgmapi.h>
|
#include <mgmapi.h>
|
||||||
#include <util/BaseString.hpp>
|
#include <util/BaseString.hpp>
|
||||||
|
#include <ndbd_exit_codes.h>
|
||||||
|
|
||||||
class MgmtSrvr;
|
class MgmtSrvr;
|
||||||
|
|
||||||
@ -704,6 +705,113 @@ CommandInterpreter::printError()
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* print log event from mgmsrv to console screen
|
||||||
|
*/
|
||||||
|
static void
|
||||||
|
printLogEvent(struct ndb_logevent* event)
|
||||||
|
{
|
||||||
|
switch (event->type) {
|
||||||
|
/**
|
||||||
|
* NDB_MGM_EVENT_CATEGORY_BACKUP
|
||||||
|
*/
|
||||||
|
case NDB_LE_BackupStarted:
|
||||||
|
ndbout_c("Backup %d started from node %d",
|
||||||
|
event->BackupStarted.backup_id, event->BackupStarted.starting_node);
|
||||||
|
break;
|
||||||
|
case NDB_LE_BackupFailedToStart:
|
||||||
|
ndbout_c("Backup request from %d failed to start. Error: %d",
|
||||||
|
event->BackupFailedToStart.starting_node, event->BackupFailedToStart.error);
|
||||||
|
break;
|
||||||
|
case NDB_LE_BackupCompleted:
|
||||||
|
ndbout_c("Backup %u started from node %u completed\n"
|
||||||
|
" StartGCP: %u StopGCP: %u\n"
|
||||||
|
" #Records: %u #LogRecords: %u\n"
|
||||||
|
" Data: %u bytes Log: %u bytes",
|
||||||
|
event->BackupCompleted.backup_id, event->BackupCompleted.starting_node,
|
||||||
|
event->BackupCompleted.start_gci, event->BackupCompleted.stop_gci,
|
||||||
|
event->BackupCompleted.n_records, event->BackupCompleted.n_log_records,
|
||||||
|
event->BackupCompleted.n_bytes, event->BackupCompleted.n_log_bytes);
|
||||||
|
break;
|
||||||
|
case NDB_LE_BackupAborted:
|
||||||
|
ndbout_c("Backup %d started from %d has been aborted. Error: %d",
|
||||||
|
event->BackupAborted.backup_id, event->BackupAborted.starting_node,
|
||||||
|
event->BackupAborted.error);
|
||||||
|
break;
|
||||||
|
/**
|
||||||
|
* NDB_MGM_EVENT_CATEGORY_STARTUP
|
||||||
|
*/
|
||||||
|
case NDB_LE_NDBStartStarted:
|
||||||
|
ndbout_c("Start initiated (version %d.%d.%d)",
|
||||||
|
getMajor(event->NDBStartStarted.version),
|
||||||
|
getMinor(event->NDBStartStarted.version),
|
||||||
|
getBuild(event->NDBStartStarted.version));
|
||||||
|
break;
|
||||||
|
case NDB_LE_NDBStartCompleted:
|
||||||
|
ndbout_c("Started (version %d.%d.%d)",
|
||||||
|
getMajor(event->NDBStartCompleted.version),
|
||||||
|
getMinor(event->NDBStartCompleted.version),
|
||||||
|
getBuild(event->NDBStartCompleted.version));
|
||||||
|
break;
|
||||||
|
case NDB_LE_NDBStopStarted:
|
||||||
|
ndbout_c("%s shutdown initiated",
|
||||||
|
(event->NDBStopStarted.stoptype == 1 ? "Cluster" : "Node"));
|
||||||
|
break;
|
||||||
|
case NDB_LE_NDBStopCompleted:
|
||||||
|
{
|
||||||
|
BaseString action_str("");
|
||||||
|
BaseString signum_str("");
|
||||||
|
getRestartAction(event->NDBStopCompleted.action, action_str);
|
||||||
|
if (event->NDBStopCompleted.signum)
|
||||||
|
signum_str.appfmt(" Initiated by signal %d.",
|
||||||
|
event->NDBStopCompleted.signum);
|
||||||
|
ndbout_c("Node shutdown completed%s.%s",
|
||||||
|
action_str.c_str(),
|
||||||
|
signum_str.c_str());
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case NDB_LE_NDBStopForced:
|
||||||
|
{
|
||||||
|
BaseString action_str("");
|
||||||
|
BaseString reason_str("");
|
||||||
|
BaseString sphase_str("");
|
||||||
|
int signum = event->NDBStopForced.signum;
|
||||||
|
int error = event->NDBStopForced.error;
|
||||||
|
int sphase = event->NDBStopForced.sphase;
|
||||||
|
int extra = event->NDBStopForced.extra;
|
||||||
|
getRestartAction(event->NDBStopForced.action, action_str);
|
||||||
|
if (signum)
|
||||||
|
reason_str.appfmt(" Initiated by signal %d.", signum);
|
||||||
|
if (error)
|
||||||
|
{
|
||||||
|
ndbd_exit_classification cl;
|
||||||
|
ndbd_exit_status st;
|
||||||
|
const char *msg = ndbd_exit_message(error, &cl);
|
||||||
|
const char *cl_msg = ndbd_exit_classification_message(cl, &st);
|
||||||
|
const char *st_msg = ndbd_exit_status_message(st);
|
||||||
|
reason_str.appfmt(" Caused by error %d: \'%s(%s). %s\'.",
|
||||||
|
error, msg, cl_msg, st_msg);
|
||||||
|
if (extra != 0)
|
||||||
|
reason_str.appfmt(" (extra info %d)", extra);
|
||||||
|
}
|
||||||
|
if (sphase < 255)
|
||||||
|
sphase_str.appfmt(" Occured during startphase %u.", sphase);
|
||||||
|
ndbout_c("Forced node shutdown completed%s.%s%s",
|
||||||
|
action_str.c_str(), sphase_str.c_str(),
|
||||||
|
reason_str.c_str());
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case NDB_LE_NDBStopAborted:
|
||||||
|
ndbout_c("Node shutdown aborted");
|
||||||
|
break;
|
||||||
|
/**
|
||||||
|
* default nothing to print
|
||||||
|
*/
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
//*****************************************************************************
|
//*****************************************************************************
|
||||||
//*****************************************************************************
|
//*****************************************************************************
|
||||||
|
|
||||||
@ -720,30 +828,21 @@ event_thread_run(void* p)
|
|||||||
int filter[] = { 15, NDB_MGM_EVENT_CATEGORY_BACKUP,
|
int filter[] = { 15, NDB_MGM_EVENT_CATEGORY_BACKUP,
|
||||||
1, NDB_MGM_EVENT_CATEGORY_STARTUP,
|
1, NDB_MGM_EVENT_CATEGORY_STARTUP,
|
||||||
0 };
|
0 };
|
||||||
int fd = ndb_mgm_listen_event(handle, filter);
|
|
||||||
if (fd != NDB_INVALID_SOCKET)
|
NdbLogEventHandle log_handle= NULL;
|
||||||
|
struct ndb_logevent log_event;
|
||||||
|
|
||||||
|
log_handle= ndb_mgm_create_logevent_handle(handle, filter);
|
||||||
|
if (log_handle)
|
||||||
{
|
{
|
||||||
do_event_thread= 1;
|
do_event_thread= 1;
|
||||||
char *tmp= 0;
|
|
||||||
char buf[1024];
|
|
||||||
do {
|
do {
|
||||||
SocketInputStream in(fd,2000);
|
if (ndb_logevent_get_next(log_handle, &log_event, 2000) <= 0)
|
||||||
if((tmp = in.gets(buf, sizeof(buf))))
|
continue;
|
||||||
{
|
Guard g(printmutex);
|
||||||
const char ping_token[]= "<PING>";
|
printLogEvent(&log_event);
|
||||||
if (memcmp(ping_token,tmp,sizeof(ping_token)-1))
|
|
||||||
if(tmp && strlen(tmp))
|
|
||||||
{
|
|
||||||
Guard g(printmutex);
|
|
||||||
ndbout << tmp;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else if(in.timedout() && ndb_mgm_check_connection(handle)<0)
|
|
||||||
{
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
} while(do_event_thread);
|
} while(do_event_thread);
|
||||||
NDB_CLOSE_SOCKET(fd);
|
ndb_mgm_destroy_logevent_handle(&log_handle);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@ -1007,6 +1106,7 @@ CommandInterpreter::execute_impl(const char *_line, bool interactive)
|
|||||||
DBUG_RETURN(true);
|
DBUG_RETURN(true);
|
||||||
}
|
}
|
||||||
else if(strcasecmp(firstToken, "ENTER") == 0 &&
|
else if(strcasecmp(firstToken, "ENTER") == 0 &&
|
||||||
|
allAfterFirstToken != NULL &&
|
||||||
allAfterFirstToken != NULL &&
|
allAfterFirstToken != NULL &&
|
||||||
strncasecmp(allAfterFirstToken, "SINGLE USER MODE ",
|
strncasecmp(allAfterFirstToken, "SINGLE USER MODE ",
|
||||||
sizeof("SINGLE USER MODE") - 1) == 0){
|
sizeof("SINGLE USER MODE") - 1) == 0){
|
||||||
@ -2476,7 +2576,6 @@ CommandInterpreter::executeStartBackup(char* parameters, bool interactive)
|
|||||||
{
|
{
|
||||||
struct ndb_mgm_reply reply;
|
struct ndb_mgm_reply reply;
|
||||||
unsigned int backupId;
|
unsigned int backupId;
|
||||||
int fd = -1;
|
|
||||||
|
|
||||||
Vector<BaseString> args;
|
Vector<BaseString> args;
|
||||||
{
|
{
|
||||||
@ -2494,8 +2593,6 @@ CommandInterpreter::executeStartBackup(char* parameters, bool interactive)
|
|||||||
if (sz == 2 && args[1] == "NOWAIT")
|
if (sz == 2 && args[1] == "NOWAIT")
|
||||||
{
|
{
|
||||||
flags = 0;
|
flags = 0;
|
||||||
result = ndb_mgm_start_backup(m_mgmsrv, 0, &backupId, &reply);
|
|
||||||
goto END_BACKUP;
|
|
||||||
}
|
}
|
||||||
else if (sz == 1 || (sz == 3 && args[1] == "WAIT" && args[2] == "COMPLETED"))
|
else if (sz == 1 || (sz == 3 && args[1] == "WAIT" && args[2] == "COMPLETED"))
|
||||||
{
|
{
|
||||||
@ -2513,62 +2610,74 @@ CommandInterpreter::executeStartBackup(char* parameters, bool interactive)
|
|||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
NdbLogEventHandle log_handle= NULL;
|
||||||
* If interactive...event listner is already running
|
struct ndb_logevent log_event;
|
||||||
*/
|
|
||||||
if (flags == 2 && !interactive)
|
if (flags == 2 && !interactive)
|
||||||
{
|
{
|
||||||
int filter[] = { 15, NDB_MGM_EVENT_CATEGORY_BACKUP, 0, 0 };
|
int filter[] = { 15, NDB_MGM_EVENT_CATEGORY_BACKUP, 0, 0 };
|
||||||
fd = ndb_mgm_listen_event(m_mgmsrv, filter);
|
log_handle = ndb_mgm_create_logevent_handle(m_mgmsrv, filter);
|
||||||
if (fd < 0)
|
if (!log_handle)
|
||||||
{
|
{
|
||||||
ndbout << "Initializing start of backup failed" << endl;
|
ndbout << "Initializing start of backup failed" << endl;
|
||||||
printError();
|
printError();
|
||||||
return fd;
|
return -1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
result = ndb_mgm_start_backup(m_mgmsrv, flags, &backupId, &reply);
|
result = ndb_mgm_start_backup(m_mgmsrv, flags, &backupId, &reply);
|
||||||
|
|
||||||
END_BACKUP:
|
|
||||||
if (result != 0) {
|
if (result != 0) {
|
||||||
ndbout << "Backup failed" << endl;
|
ndbout << "Backup failed" << endl;
|
||||||
printError();
|
printError();
|
||||||
|
|
||||||
if (fd >= 0)
|
if (log_handle)
|
||||||
close(fd);
|
ndb_mgm_destroy_logevent_handle(&log_handle);
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (fd >= 0)
|
/**
|
||||||
|
* If interactive, event listner thread is already running
|
||||||
|
*/
|
||||||
|
if (log_handle && !interactive)
|
||||||
{
|
{
|
||||||
char *tmp;
|
int count = 0;
|
||||||
char buf[1024];
|
int retry = 0;
|
||||||
{
|
|
||||||
SocketInputStream in(fd);
|
|
||||||
int count = 0;
|
|
||||||
do {
|
|
||||||
tmp = in.gets(buf, 1024);
|
|
||||||
if(tmp)
|
|
||||||
{
|
|
||||||
ndbout << tmp;
|
|
||||||
unsigned int id;
|
|
||||||
if(sscanf(tmp, "%*[^:]: Backup %d ", &id) == 1 && id == backupId){
|
|
||||||
count++;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} while(count < 2);
|
|
||||||
}
|
|
||||||
|
|
||||||
SocketInputStream in(fd, 10);
|
|
||||||
do {
|
do {
|
||||||
tmp = in.gets(buf, 1024);
|
if (ndb_logevent_get_next(log_handle, &log_event, 60000) > 0)
|
||||||
if(tmp && tmp[0] != 0)
|
|
||||||
{
|
{
|
||||||
ndbout << tmp;
|
int print = 0;
|
||||||
|
switch (log_event.type) {
|
||||||
|
case NDB_LE_BackupStarted:
|
||||||
|
if (log_event.BackupStarted.backup_id == backupId)
|
||||||
|
print = 1;
|
||||||
|
break;
|
||||||
|
case NDB_LE_BackupCompleted:
|
||||||
|
if (log_event.BackupCompleted.backup_id == backupId)
|
||||||
|
print = 1;
|
||||||
|
break;
|
||||||
|
case NDB_LE_BackupAborted:
|
||||||
|
if (log_event.BackupAborted.backup_id == backupId)
|
||||||
|
print = 1;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
if (print)
|
||||||
|
{
|
||||||
|
Guard g(m_print_mutex);
|
||||||
|
printLogEvent(&log_event);
|
||||||
|
count++;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
} while(tmp && tmp[0] != 0);
|
else
|
||||||
|
{
|
||||||
|
retry++;
|
||||||
|
}
|
||||||
|
} while(count < 2 && retry < 3);
|
||||||
|
|
||||||
close(fd);
|
if (retry >= 3)
|
||||||
|
ndbout << "get backup event failed for " << retry << " times" << endl;
|
||||||
|
|
||||||
|
ndb_mgm_destroy_logevent_handle(&log_handle);
|
||||||
}
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -21,7 +21,8 @@ libndbmgmclient_la_LIBADD = ../mgmapi/libmgmapi.la \
|
|||||||
../common/logger/liblogger.la \
|
../common/logger/liblogger.la \
|
||||||
../common/portlib/libportlib.la \
|
../common/portlib/libportlib.la \
|
||||||
../common/util/libgeneral.la \
|
../common/util/libgeneral.la \
|
||||||
../common/portlib/libportlib.la
|
../common/portlib/libportlib.la \
|
||||||
|
../common/debugger/libtrace.la
|
||||||
|
|
||||||
|
|
||||||
ndb_mgm_SOURCES = main.cpp
|
ndb_mgm_SOURCES = main.cpp
|
||||||
|
@ -23,6 +23,8 @@ extern "C" {
|
|||||||
#elif !defined(__NETWARE__)
|
#elif !defined(__NETWARE__)
|
||||||
#include <readline/readline.h>
|
#include <readline/readline.h>
|
||||||
extern "C" int add_history(const char *command); /* From readline directory */
|
extern "C" int add_history(const char *command); /* From readline directory */
|
||||||
|
extern "C" int read_history(const char *command);
|
||||||
|
extern "C" int write_history(const char *command);
|
||||||
#define HAVE_READLINE
|
#define HAVE_READLINE
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
@ -155,10 +157,35 @@ int main(int argc, char** argv){
|
|||||||
signal(SIGPIPE, handler);
|
signal(SIGPIPE, handler);
|
||||||
com = new Ndb_mgmclient(opt_connect_str,1);
|
com = new Ndb_mgmclient(opt_connect_str,1);
|
||||||
int ret= 0;
|
int ret= 0;
|
||||||
|
BaseString histfile;
|
||||||
if (!opt_execute_str)
|
if (!opt_execute_str)
|
||||||
{
|
{
|
||||||
|
#ifdef HAVE_READLINE
|
||||||
|
char *histfile_env= getenv("NDB_MGM_HISTFILE");
|
||||||
|
if (histfile_env)
|
||||||
|
histfile.assign(histfile_env,strlen(histfile_env));
|
||||||
|
else if(getenv("HOME"))
|
||||||
|
{
|
||||||
|
histfile.assign(getenv("HOME"),strlen(getenv("HOME")));
|
||||||
|
histfile.append("/.ndb_mgm_history");
|
||||||
|
}
|
||||||
|
if (histfile.length())
|
||||||
|
read_history(histfile.c_str());
|
||||||
|
#endif
|
||||||
|
|
||||||
ndbout << "-- NDB Cluster -- Management Client --" << endl;
|
ndbout << "-- NDB Cluster -- Management Client --" << endl;
|
||||||
while(read_and_execute(_try_reconnect));
|
while(read_and_execute(_try_reconnect));
|
||||||
|
|
||||||
|
#ifdef HAVE_READLINE
|
||||||
|
if (histfile.length())
|
||||||
|
{
|
||||||
|
BaseString histfile_tmp;
|
||||||
|
histfile_tmp.assign(histfile);
|
||||||
|
histfile_tmp.append(".TMP");
|
||||||
|
if(!write_history(histfile_tmp.c_str()))
|
||||||
|
my_rename(histfile_tmp.c_str(), histfile.c_str(), MYF(MY_WME));
|
||||||
|
}
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
@ -579,6 +579,18 @@ const ConfigInfo::ParamInfo ConfigInfo::m_ParamInfo[] = {
|
|||||||
"70",
|
"70",
|
||||||
STR_VALUE(MAX_INT_RNIL) },
|
STR_VALUE(MAX_INT_RNIL) },
|
||||||
|
|
||||||
|
{
|
||||||
|
CFG_DB_WATCHDOG_INTERVAL_INITIAL,
|
||||||
|
"TimeBetweenWatchDogCheckInitial",
|
||||||
|
DB_TOKEN,
|
||||||
|
"Time between execution checks inside a database node in the early start phases when memory is allocated",
|
||||||
|
ConfigInfo::CI_USED,
|
||||||
|
true,
|
||||||
|
ConfigInfo::CI_INT,
|
||||||
|
"6000",
|
||||||
|
"70",
|
||||||
|
STR_VALUE(MAX_INT_RNIL) },
|
||||||
|
|
||||||
{
|
{
|
||||||
CFG_DB_STOP_ON_ERROR,
|
CFG_DB_STOP_ON_ERROR,
|
||||||
"StopOnError",
|
"StopOnError",
|
||||||
@ -879,6 +891,18 @@ const ConfigInfo::ParamInfo ConfigInfo::m_ParamInfo[] = {
|
|||||||
"3",
|
"3",
|
||||||
STR_VALUE(MAX_INT_RNIL) },
|
STR_VALUE(MAX_INT_RNIL) },
|
||||||
|
|
||||||
|
{
|
||||||
|
CFG_DB_REDOLOG_FILE_SIZE,
|
||||||
|
"FragmentLogFileSize",
|
||||||
|
DB_TOKEN,
|
||||||
|
"Size of each Redo log file",
|
||||||
|
ConfigInfo::CI_USED,
|
||||||
|
false,
|
||||||
|
ConfigInfo::CI_INT,
|
||||||
|
"16M",
|
||||||
|
"4M",
|
||||||
|
"1G" },
|
||||||
|
|
||||||
{
|
{
|
||||||
CFG_DB_MAX_OPEN_FILES,
|
CFG_DB_MAX_OPEN_FILES,
|
||||||
"MaxNoOfOpenFiles",
|
"MaxNoOfOpenFiles",
|
||||||
@ -1297,6 +1321,18 @@ const ConfigInfo::ParamInfo ConfigInfo::m_ParamInfo[] = {
|
|||||||
"0",
|
"0",
|
||||||
STR_VALUE(MAX_INT_RNIL) },
|
STR_VALUE(MAX_INT_RNIL) },
|
||||||
|
|
||||||
|
{
|
||||||
|
CFG_DB_MAX_ALLOCATE,
|
||||||
|
"MaxAllocate",
|
||||||
|
DB_TOKEN,
|
||||||
|
"Maximum size of allocation to use when allocating memory for tables",
|
||||||
|
ConfigInfo::CI_USED,
|
||||||
|
false,
|
||||||
|
ConfigInfo::CI_INT,
|
||||||
|
"32M",
|
||||||
|
"1M",
|
||||||
|
"1G" },
|
||||||
|
|
||||||
{
|
{
|
||||||
CFG_DB_MEMREPORT_FREQUENCY,
|
CFG_DB_MEMREPORT_FREQUENCY,
|
||||||
"MemReportFrequency",
|
"MemReportFrequency",
|
||||||
@ -1309,6 +1345,18 @@ const ConfigInfo::ParamInfo ConfigInfo::m_ParamInfo[] = {
|
|||||||
"0",
|
"0",
|
||||||
STR_VALUE(MAX_INT_RNIL) },
|
STR_VALUE(MAX_INT_RNIL) },
|
||||||
|
|
||||||
|
{
|
||||||
|
CFG_DB_O_DIRECT,
|
||||||
|
"ODirect",
|
||||||
|
DB_TOKEN,
|
||||||
|
"Use O_DIRECT file write/read when possible",
|
||||||
|
ConfigInfo::CI_USED,
|
||||||
|
true,
|
||||||
|
ConfigInfo::CI_BOOL,
|
||||||
|
"false",
|
||||||
|
"false",
|
||||||
|
"true"},
|
||||||
|
|
||||||
/***************************************************************************
|
/***************************************************************************
|
||||||
* API
|
* API
|
||||||
***************************************************************************/
|
***************************************************************************/
|
||||||
|
@ -18,6 +18,7 @@
|
|||||||
|
|
||||||
#include "MgmtSrvr.hpp"
|
#include "MgmtSrvr.hpp"
|
||||||
#include "MgmtErrorReporter.hpp"
|
#include "MgmtErrorReporter.hpp"
|
||||||
|
#include "ndb_mgmd_error.h"
|
||||||
#include <ConfigRetriever.hpp>
|
#include <ConfigRetriever.hpp>
|
||||||
|
|
||||||
#include <NdbOut.hpp>
|
#include <NdbOut.hpp>
|
||||||
@ -239,13 +240,6 @@ MgmtSrvr::stopEventLog()
|
|||||||
// Nothing yet
|
// Nothing yet
|
||||||
}
|
}
|
||||||
|
|
||||||
class ErrorItem
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
int _errorCode;
|
|
||||||
const char * _errorText;
|
|
||||||
};
|
|
||||||
|
|
||||||
bool
|
bool
|
||||||
MgmtSrvr::setEventLogFilter(int severity, int enable)
|
MgmtSrvr::setEventLogFilter(int severity, int enable)
|
||||||
{
|
{
|
||||||
@ -268,62 +262,6 @@ MgmtSrvr::isEventLogFilterEnabled(int severity)
|
|||||||
return g_eventLogger.isEnable((Logger::LoggerLevel)severity);
|
return g_eventLogger.isEnable((Logger::LoggerLevel)severity);
|
||||||
}
|
}
|
||||||
|
|
||||||
static ErrorItem errorTable[] =
|
|
||||||
{
|
|
||||||
{MgmtSrvr::NO_CONTACT_WITH_PROCESS, "No contact with the process (dead ?)."},
|
|
||||||
{MgmtSrvr::PROCESS_NOT_CONFIGURED, "The process is not configured."},
|
|
||||||
{MgmtSrvr::WRONG_PROCESS_TYPE,
|
|
||||||
"The process has wrong type. Expected a DB process."},
|
|
||||||
{MgmtSrvr::COULD_NOT_ALLOCATE_MEMORY, "Could not allocate memory."},
|
|
||||||
{MgmtSrvr::SEND_OR_RECEIVE_FAILED, "Send to process or receive failed."},
|
|
||||||
{MgmtSrvr::INVALID_LEVEL, "Invalid level. Should be between 1 and 30."},
|
|
||||||
{MgmtSrvr::INVALID_ERROR_NUMBER, "Invalid error number. Should be >= 0."},
|
|
||||||
{MgmtSrvr::INVALID_TRACE_NUMBER, "Invalid trace number."},
|
|
||||||
{MgmtSrvr::NOT_IMPLEMENTED, "Not implemented."},
|
|
||||||
{MgmtSrvr::INVALID_BLOCK_NAME, "Invalid block name"},
|
|
||||||
|
|
||||||
{MgmtSrvr::CONFIG_PARAM_NOT_EXIST,
|
|
||||||
"The configuration parameter does not exist for the process type."},
|
|
||||||
{MgmtSrvr::CONFIG_PARAM_NOT_UPDATEABLE,
|
|
||||||
"The configuration parameter is not possible to update."},
|
|
||||||
{MgmtSrvr::VALUE_WRONG_FORMAT_INT_EXPECTED,
|
|
||||||
"Incorrect value. Expected integer."},
|
|
||||||
{MgmtSrvr::VALUE_TOO_LOW, "Value is too low."},
|
|
||||||
{MgmtSrvr::VALUE_TOO_HIGH, "Value is too high."},
|
|
||||||
{MgmtSrvr::VALUE_WRONG_FORMAT_BOOL_EXPECTED,
|
|
||||||
"Incorrect value. Expected TRUE or FALSE."},
|
|
||||||
|
|
||||||
{MgmtSrvr::CONFIG_FILE_OPEN_WRITE_ERROR,
|
|
||||||
"Could not open configuration file for writing."},
|
|
||||||
{MgmtSrvr::CONFIG_FILE_OPEN_READ_ERROR,
|
|
||||||
"Could not open configuration file for reading."},
|
|
||||||
{MgmtSrvr::CONFIG_FILE_WRITE_ERROR,
|
|
||||||
"Write error when writing configuration file."},
|
|
||||||
{MgmtSrvr::CONFIG_FILE_READ_ERROR,
|
|
||||||
"Read error when reading configuration file."},
|
|
||||||
{MgmtSrvr::CONFIG_FILE_CLOSE_ERROR, "Could not close configuration file."},
|
|
||||||
|
|
||||||
{MgmtSrvr::CONFIG_CHANGE_REFUSED_BY_RECEIVER,
|
|
||||||
"The change was refused by the receiving process."},
|
|
||||||
{MgmtSrvr::COULD_NOT_SYNC_CONFIG_CHANGE_AGAINST_PHYSICAL_MEDIUM,
|
|
||||||
"The change could not be synced against physical medium."},
|
|
||||||
{MgmtSrvr::CONFIG_FILE_CHECKSUM_ERROR,
|
|
||||||
"The config file is corrupt. Checksum error."},
|
|
||||||
{MgmtSrvr::NOT_POSSIBLE_TO_SEND_CONFIG_UPDATE_TO_PROCESS_TYPE,
|
|
||||||
"It is not possible to send an update of a configuration variable "
|
|
||||||
"to this kind of process."},
|
|
||||||
{MgmtSrvr::NODE_SHUTDOWN_IN_PROGESS, "Node shutdown in progress" },
|
|
||||||
{MgmtSrvr::SYSTEM_SHUTDOWN_IN_PROGRESS, "System shutdown in progress" },
|
|
||||||
{MgmtSrvr::NODE_SHUTDOWN_WOULD_CAUSE_SYSTEM_CRASH,
|
|
||||||
"Node shutdown would cause system crash" },
|
|
||||||
{MgmtSrvr::UNSUPPORTED_NODE_SHUTDOWN,
|
|
||||||
"Unsupported multi node shutdown. Abort option required." },
|
|
||||||
{MgmtSrvr::NODE_NOT_API_NODE, "The specified node is not an API node." },
|
|
||||||
{MgmtSrvr::OPERATION_NOT_ALLOWED_START_STOP,
|
|
||||||
"Operation not allowed while nodes are starting or stopping."},
|
|
||||||
{MgmtSrvr::NO_CONTACT_WITH_DB_NODES, "No contact with database nodes" }
|
|
||||||
};
|
|
||||||
|
|
||||||
int MgmtSrvr::translateStopRef(Uint32 errCode)
|
int MgmtSrvr::translateStopRef(Uint32 errCode)
|
||||||
{
|
{
|
||||||
switch(errCode){
|
switch(errCode){
|
||||||
@ -343,8 +281,6 @@ int MgmtSrvr::translateStopRef(Uint32 errCode)
|
|||||||
return 4999;
|
return 4999;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int noOfErrorCodes = sizeof(errorTable) / sizeof(ErrorItem);
|
|
||||||
|
|
||||||
int
|
int
|
||||||
MgmtSrvr::getNodeCount(enum ndb_mgm_node_type type) const
|
MgmtSrvr::getNodeCount(enum ndb_mgm_node_type type) const
|
||||||
{
|
{
|
||||||
@ -1969,18 +1905,8 @@ MgmtSrvr::dumpState(int nodeId, const Uint32 args[], Uint32 no)
|
|||||||
|
|
||||||
const char* MgmtSrvr::getErrorText(int errorCode, char *buf, int buf_sz)
|
const char* MgmtSrvr::getErrorText(int errorCode, char *buf, int buf_sz)
|
||||||
{
|
{
|
||||||
|
|
||||||
for (int i = 0; i < noOfErrorCodes; ++i) {
|
|
||||||
if (errorCode == errorTable[i]._errorCode) {
|
|
||||||
BaseString::snprintf(buf, buf_sz, errorTable[i]._errorText);
|
|
||||||
buf[buf_sz-1]= 0;
|
|
||||||
return buf;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
ndb_error_string(errorCode, buf, buf_sz);
|
ndb_error_string(errorCode, buf, buf_sz);
|
||||||
buf[buf_sz-1]= 0;
|
buf[buf_sz-1]= 0;
|
||||||
|
|
||||||
return buf;
|
return buf;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -148,45 +148,6 @@ public:
|
|||||||
*/
|
*/
|
||||||
bool isEventLogFilterEnabled(int severity);
|
bool isEventLogFilterEnabled(int severity);
|
||||||
|
|
||||||
STATIC_CONST( NO_CONTACT_WITH_PROCESS = 5000 );
|
|
||||||
STATIC_CONST( PROCESS_NOT_CONFIGURED = 5001 );
|
|
||||||
STATIC_CONST( WRONG_PROCESS_TYPE = 5002 );
|
|
||||||
STATIC_CONST( COULD_NOT_ALLOCATE_MEMORY = 5003 );
|
|
||||||
STATIC_CONST( SEND_OR_RECEIVE_FAILED = 5005 );
|
|
||||||
STATIC_CONST( INVALID_LEVEL = 5006 );
|
|
||||||
STATIC_CONST( INVALID_ERROR_NUMBER = 5007 );
|
|
||||||
STATIC_CONST( INVALID_TRACE_NUMBER = 5008 );
|
|
||||||
STATIC_CONST( NOT_IMPLEMENTED = 5009 );
|
|
||||||
STATIC_CONST( INVALID_BLOCK_NAME = 5010 );
|
|
||||||
|
|
||||||
STATIC_CONST( CONFIG_PARAM_NOT_EXIST = 5011 );
|
|
||||||
STATIC_CONST( CONFIG_PARAM_NOT_UPDATEABLE = 5012 );
|
|
||||||
STATIC_CONST( VALUE_WRONG_FORMAT_INT_EXPECTED = 5013 );
|
|
||||||
STATIC_CONST( VALUE_TOO_LOW = 5014 );
|
|
||||||
STATIC_CONST( VALUE_TOO_HIGH = 5015 );
|
|
||||||
STATIC_CONST( VALUE_WRONG_FORMAT_BOOL_EXPECTED = 5016 );
|
|
||||||
|
|
||||||
STATIC_CONST( CONFIG_FILE_OPEN_WRITE_ERROR = 5017 );
|
|
||||||
STATIC_CONST( CONFIG_FILE_OPEN_READ_ERROR = 5018 );
|
|
||||||
STATIC_CONST( CONFIG_FILE_WRITE_ERROR = 5019 );
|
|
||||||
STATIC_CONST( CONFIG_FILE_READ_ERROR = 5020 );
|
|
||||||
STATIC_CONST( CONFIG_FILE_CLOSE_ERROR = 5021 );
|
|
||||||
|
|
||||||
STATIC_CONST( CONFIG_CHANGE_REFUSED_BY_RECEIVER = 5022 );
|
|
||||||
STATIC_CONST( COULD_NOT_SYNC_CONFIG_CHANGE_AGAINST_PHYSICAL_MEDIUM = 5023 );
|
|
||||||
STATIC_CONST( CONFIG_FILE_CHECKSUM_ERROR = 5024 );
|
|
||||||
STATIC_CONST( NOT_POSSIBLE_TO_SEND_CONFIG_UPDATE_TO_PROCESS_TYPE = 5025 );
|
|
||||||
|
|
||||||
STATIC_CONST( NODE_SHUTDOWN_IN_PROGESS = 5026 );
|
|
||||||
STATIC_CONST( SYSTEM_SHUTDOWN_IN_PROGRESS = 5027 );
|
|
||||||
STATIC_CONST( NODE_SHUTDOWN_WOULD_CAUSE_SYSTEM_CRASH = 5028 );
|
|
||||||
|
|
||||||
STATIC_CONST( NO_CONTACT_WITH_DB_NODES = 5030 );
|
|
||||||
STATIC_CONST( UNSUPPORTED_NODE_SHUTDOWN = 5031 );
|
|
||||||
|
|
||||||
STATIC_CONST( NODE_NOT_API_NODE = 5062 );
|
|
||||||
STATIC_CONST( OPERATION_NOT_ALLOWED_START_STOP = 5063 );
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* This enum specifies the different signal loggig modes possible to set
|
* This enum specifies the different signal loggig modes possible to set
|
||||||
* with the setSignalLoggingMode method.
|
* with the setSignalLoggingMode method.
|
||||||
|
33
storage/ndb/src/mgmsrv/ndb_mgmd_error.h
Normal file
33
storage/ndb/src/mgmsrv/ndb_mgmd_error.h
Normal file
@ -0,0 +1,33 @@
|
|||||||
|
/* Copyright (C) 2007 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; version 2 of the License.
|
||||||
|
|
||||||
|
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 NDB_MGMD_ERROR_H
|
||||||
|
#define NDB_MGMD_ERROR_H
|
||||||
|
|
||||||
|
#define NO_CONTACT_WITH_PROCESS 5000
|
||||||
|
#define WRONG_PROCESS_TYPE 5002
|
||||||
|
#define SEND_OR_RECEIVE_FAILED 5005
|
||||||
|
#define INVALID_ERROR_NUMBER 5007
|
||||||
|
#define INVALID_TRACE_NUMBER 5008
|
||||||
|
#define INVALID_BLOCK_NAME 5010
|
||||||
|
#define NODE_SHUTDOWN_IN_PROGESS 5026
|
||||||
|
#define SYSTEM_SHUTDOWN_IN_PROGRESS 5027
|
||||||
|
#define NODE_SHUTDOWN_WOULD_CAUSE_SYSTEM_CRASH 5028
|
||||||
|
#define NO_CONTACT_WITH_DB_NODES 5030
|
||||||
|
#define UNSUPPORTED_NODE_SHUTDOWN 5031
|
||||||
|
#define NODE_NOT_API_NODE 5062
|
||||||
|
#define OPERATION_NOT_ALLOWED_START_STOP 5063
|
||||||
|
|
||||||
|
#endif
|
@ -1261,6 +1261,7 @@ NdbBlob::deletePartsUnknown(Uint32 part)
|
|||||||
DBUG_RETURN(-1);
|
DBUG_RETURN(-1);
|
||||||
}
|
}
|
||||||
tOp->m_abortOption= NdbOperation::AO_IgnoreError;
|
tOp->m_abortOption= NdbOperation::AO_IgnoreError;
|
||||||
|
tOp->m_noErrorPropagation = true;
|
||||||
n++;
|
n++;
|
||||||
}
|
}
|
||||||
DBUG_PRINT("info", ("bat=%u", bat));
|
DBUG_PRINT("info", ("bat=%u", bat));
|
||||||
@ -1597,6 +1598,7 @@ NdbBlob::preExecute(NdbTransaction::ExecType anExecType, bool& batch)
|
|||||||
}
|
}
|
||||||
if (isWriteOp()) {
|
if (isWriteOp()) {
|
||||||
tOp->m_abortOption = NdbOperation::AO_IgnoreError;
|
tOp->m_abortOption = NdbOperation::AO_IgnoreError;
|
||||||
|
tOp->m_noErrorPropagation = true;
|
||||||
}
|
}
|
||||||
theHeadInlineReadOp = tOp;
|
theHeadInlineReadOp = tOp;
|
||||||
// execute immediately
|
// execute immediately
|
||||||
@ -1643,6 +1645,7 @@ NdbBlob::preExecute(NdbTransaction::ExecType anExecType, bool& batch)
|
|||||||
}
|
}
|
||||||
if (isWriteOp()) {
|
if (isWriteOp()) {
|
||||||
tOp->m_abortOption = NdbOperation::AO_IgnoreError;
|
tOp->m_abortOption = NdbOperation::AO_IgnoreError;
|
||||||
|
tOp->m_noErrorPropagation = true;
|
||||||
}
|
}
|
||||||
theHeadInlineReadOp = tOp;
|
theHeadInlineReadOp = tOp;
|
||||||
// execute immediately
|
// execute immediately
|
||||||
|
@ -41,6 +41,7 @@
|
|||||||
#include <NdbEventOperation.hpp>
|
#include <NdbEventOperation.hpp>
|
||||||
#include "NdbEventOperationImpl.hpp"
|
#include "NdbEventOperationImpl.hpp"
|
||||||
#include <signaldata/AlterTable.hpp>
|
#include <signaldata/AlterTable.hpp>
|
||||||
|
#include "ndb_internal.hpp"
|
||||||
|
|
||||||
#include <EventLogger.hpp>
|
#include <EventLogger.hpp>
|
||||||
extern EventLogger g_eventLogger;
|
extern EventLogger g_eventLogger;
|
||||||
@ -2838,7 +2839,7 @@ send_report:
|
|||||||
data[5]= apply_gci >> 32;
|
data[5]= apply_gci >> 32;
|
||||||
data[6]= latest_gci & ~(Uint32)0;
|
data[6]= latest_gci & ~(Uint32)0;
|
||||||
data[7]= latest_gci >> 32;
|
data[7]= latest_gci >> 32;
|
||||||
m_ndb->theImpl->send_event_report(data,8);
|
Ndb_internal::send_event_report(m_ndb, data,8);
|
||||||
#ifdef VM_TRACE
|
#ifdef VM_TRACE
|
||||||
assert(m_total_alloc >= m_free_data_sz);
|
assert(m_total_alloc >= m_free_data_sz);
|
||||||
#endif
|
#endif
|
||||||
|
@ -76,7 +76,8 @@ NdbOperation::NdbOperation(Ndb* aNdb, NdbOperation::Type aType) :
|
|||||||
m_keyInfoGSN(GSN_KEYINFO),
|
m_keyInfoGSN(GSN_KEYINFO),
|
||||||
m_attrInfoGSN(GSN_ATTRINFO),
|
m_attrInfoGSN(GSN_ATTRINFO),
|
||||||
theBlobList(NULL),
|
theBlobList(NULL),
|
||||||
m_abortOption(-1)
|
m_abortOption(-1),
|
||||||
|
m_noErrorPropagation(false)
|
||||||
{
|
{
|
||||||
theReceiver.init(NdbReceiver::NDB_OPERATION, this);
|
theReceiver.init(NdbReceiver::NDB_OPERATION, this);
|
||||||
theError.code = 0;
|
theError.code = 0;
|
||||||
@ -101,7 +102,8 @@ NdbOperation::setErrorCode(int anErrorCode)
|
|||||||
theError.code = anErrorCode;
|
theError.code = anErrorCode;
|
||||||
theNdbCon->theErrorLine = theErrorLine;
|
theNdbCon->theErrorLine = theErrorLine;
|
||||||
theNdbCon->theErrorOperation = this;
|
theNdbCon->theErrorOperation = this;
|
||||||
theNdbCon->setOperationErrorCode(anErrorCode);
|
if (!(m_abortOption == AO_IgnoreError && m_noErrorPropagation))
|
||||||
|
theNdbCon->setOperationErrorCode(anErrorCode);
|
||||||
}
|
}
|
||||||
|
|
||||||
/******************************************************************************
|
/******************************************************************************
|
||||||
@ -116,6 +118,7 @@ NdbOperation::setErrorCodeAbort(int anErrorCode)
|
|||||||
theError.code = anErrorCode;
|
theError.code = anErrorCode;
|
||||||
theNdbCon->theErrorLine = theErrorLine;
|
theNdbCon->theErrorLine = theErrorLine;
|
||||||
theNdbCon->theErrorOperation = this;
|
theNdbCon->theErrorOperation = this;
|
||||||
|
// ignore m_noErrorPropagation
|
||||||
theNdbCon->setOperationErrorCodeAbort(anErrorCode);
|
theNdbCon->setOperationErrorCodeAbort(anErrorCode);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -161,6 +164,7 @@ NdbOperation::init(const NdbTableImpl* tab, NdbTransaction* myConnection){
|
|||||||
theMagicNumber = 0xABCDEF01;
|
theMagicNumber = 0xABCDEF01;
|
||||||
theBlobList = NULL;
|
theBlobList = NULL;
|
||||||
m_abortOption = -1;
|
m_abortOption = -1;
|
||||||
|
m_noErrorPropagation = false;
|
||||||
m_no_disk_flag = 1;
|
m_no_disk_flag = 1;
|
||||||
|
|
||||||
tSignal = theNdb->getSignal();
|
tSignal = theNdb->getSignal();
|
||||||
|
26
storage/ndb/src/ndbapi/ndb_internal.hpp
Normal file
26
storage/ndb/src/ndbapi/ndb_internal.hpp
Normal file
@ -0,0 +1,26 @@
|
|||||||
|
/* Copyright (C) 2007 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; version 2 of the License.
|
||||||
|
|
||||||
|
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 "NdbImpl.hpp"
|
||||||
|
|
||||||
|
class Ndb_internal
|
||||||
|
{
|
||||||
|
private:
|
||||||
|
friend class NdbEventBuffer;
|
||||||
|
Ndb_internal() {}
|
||||||
|
virtual ~Ndb_internal() {}
|
||||||
|
static int send_event_report(Ndb *ndb, Uint32 *data, Uint32 length)
|
||||||
|
{ return ndb->theImpl->send_event_report(data, length); }
|
||||||
|
};
|
@ -19,6 +19,9 @@
|
|||||||
#include <ndberror.h>
|
#include <ndberror.h>
|
||||||
#include <m_string.h>
|
#include <m_string.h>
|
||||||
|
|
||||||
|
#include "../mgmsrv/ndb_mgmd_error.h"
|
||||||
|
|
||||||
|
|
||||||
typedef struct ErrorBundle {
|
typedef struct ErrorBundle {
|
||||||
int code;
|
int code;
|
||||||
int mysql_code;
|
int mysql_code;
|
||||||
@ -179,7 +182,7 @@ ErrorBundle ErrorCodes[] = {
|
|||||||
{ 873, DMEC, TR, "Out of attrinfo records for scan in tuple manager" },
|
{ 873, DMEC, TR, "Out of attrinfo records for scan in tuple manager" },
|
||||||
{ 899, DMEC, TR, "Rowid already allocated" },
|
{ 899, DMEC, TR, "Rowid already allocated" },
|
||||||
{ 1217, DMEC, TR, "Out of operation records in local data manager (increase MaxNoOfLocalOperations)" },
|
{ 1217, DMEC, TR, "Out of operation records in local data manager (increase MaxNoOfLocalOperations)" },
|
||||||
{ 1220, DMEC, TR, "REDO log files overloaded, consult online manual (decrease TimeBetweenLocalCheckpoints, and|or increase NoOfFragmentLogFiles)" },
|
{ 1220, DMEC, TR, "REDO log files overloaded, consult online manual (increase FragmentLogFileSize)" },
|
||||||
{ 1222, DMEC, TR, "Out of transaction markers in LQH" },
|
{ 1222, DMEC, TR, "Out of transaction markers in LQH" },
|
||||||
{ 4021, DMEC, TR, "Out of Send Buffer space in NDB API" },
|
{ 4021, DMEC, TR, "Out of Send Buffer space in NDB API" },
|
||||||
{ 4022, DMEC, TR, "Out of Send Buffer space in NDB API" },
|
{ 4022, DMEC, TR, "Out of Send Buffer space in NDB API" },
|
||||||
@ -619,6 +622,33 @@ ErrorBundle ErrorCodes[] = {
|
|||||||
{ 4273, DMEC, IE, "No blob table in dict cache" },
|
{ 4273, DMEC, IE, "No blob table in dict cache" },
|
||||||
{ 4274, DMEC, IE, "Corrupted main table PK in blob operation" },
|
{ 4274, DMEC, IE, "Corrupted main table PK in blob operation" },
|
||||||
{ 4275, DMEC, AE, "The blob method is incompatible with operation type or lock mode" },
|
{ 4275, DMEC, AE, "The blob method is incompatible with operation type or lock mode" },
|
||||||
|
|
||||||
|
{ NO_CONTACT_WITH_PROCESS, DMEC, AE,
|
||||||
|
"No contact with the process (dead ?)."},
|
||||||
|
{ WRONG_PROCESS_TYPE, DMEC, AE,
|
||||||
|
"The process has wrong type. Expected a DB process."},
|
||||||
|
{ SEND_OR_RECEIVE_FAILED, DMEC, AE,
|
||||||
|
"Send to process or receive failed."},
|
||||||
|
{ INVALID_ERROR_NUMBER, DMEC, AE,
|
||||||
|
"Invalid error number. Should be >= 0."},
|
||||||
|
{ INVALID_TRACE_NUMBER, DMEC, AE,
|
||||||
|
"Invalid trace number."},
|
||||||
|
{ INVALID_BLOCK_NAME, DMEC, AE,
|
||||||
|
"Invalid block name"},
|
||||||
|
{ NODE_SHUTDOWN_IN_PROGESS, DMEC, AE,
|
||||||
|
"Node shutdown in progress" },
|
||||||
|
{ SYSTEM_SHUTDOWN_IN_PROGRESS, DMEC, AE,
|
||||||
|
"System shutdown in progress" },
|
||||||
|
{ NODE_SHUTDOWN_WOULD_CAUSE_SYSTEM_CRASH, DMEC, AE,
|
||||||
|
"Node shutdown would cause system crash" },
|
||||||
|
{ UNSUPPORTED_NODE_SHUTDOWN, DMEC, AE,
|
||||||
|
"Unsupported multi node shutdown. Abort option required." },
|
||||||
|
{ NODE_NOT_API_NODE, DMEC, AE,
|
||||||
|
"The specified node is not an API node." },
|
||||||
|
{ OPERATION_NOT_ALLOWED_START_STOP, DMEC, AE,
|
||||||
|
"Operation not allowed while nodes are starting or stopping."},
|
||||||
|
{ NO_CONTACT_WITH_DB_NODES, DMEC, AE,
|
||||||
|
"No contact with database nodes" }
|
||||||
};
|
};
|
||||||
|
|
||||||
static
|
static
|
||||||
|
@ -212,6 +212,76 @@ int runTestApiSession(NDBT_Context* ctx, NDBT_Step* step)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int runTestApiConnectTimeout(NDBT_Context* ctx, NDBT_Step* step)
|
||||||
|
{
|
||||||
|
char *mgm= ctx->getRemoteMgm();
|
||||||
|
int result= NDBT_FAILED;
|
||||||
|
int cc= 0;
|
||||||
|
int mgmd_nodeid= 0;
|
||||||
|
ndb_mgm_reply reply;
|
||||||
|
|
||||||
|
NdbMgmHandle h;
|
||||||
|
h= ndb_mgm_create_handle();
|
||||||
|
ndb_mgm_set_connectstring(h, mgm);
|
||||||
|
|
||||||
|
ndbout << "TEST connect timeout" << endl;
|
||||||
|
|
||||||
|
ndb_mgm_set_timeout(h, 3000);
|
||||||
|
|
||||||
|
struct timeval tstart, tend;
|
||||||
|
int secs;
|
||||||
|
timerclear(&tstart);
|
||||||
|
timerclear(&tend);
|
||||||
|
gettimeofday(&tstart,NULL);
|
||||||
|
|
||||||
|
ndb_mgm_connect(h,0,0,0);
|
||||||
|
|
||||||
|
gettimeofday(&tend,NULL);
|
||||||
|
|
||||||
|
secs= tend.tv_sec - tstart.tv_sec;
|
||||||
|
ndbout << "Took about: " << secs <<" seconds"<<endl;
|
||||||
|
|
||||||
|
if(secs < 4)
|
||||||
|
result= NDBT_OK;
|
||||||
|
else
|
||||||
|
goto done;
|
||||||
|
|
||||||
|
ndb_mgm_set_connectstring(h, mgm);
|
||||||
|
|
||||||
|
ndbout << "TEST connect timeout" << endl;
|
||||||
|
|
||||||
|
ndb_mgm_destroy_handle(&h);
|
||||||
|
|
||||||
|
h= ndb_mgm_create_handle();
|
||||||
|
ndb_mgm_set_connectstring(h, "1.1.1.1");
|
||||||
|
|
||||||
|
ndbout << "TEST connect timeout (invalid host)" << endl;
|
||||||
|
|
||||||
|
ndb_mgm_set_timeout(h, 3000);
|
||||||
|
|
||||||
|
timerclear(&tstart);
|
||||||
|
timerclear(&tend);
|
||||||
|
gettimeofday(&tstart,NULL);
|
||||||
|
|
||||||
|
ndb_mgm_connect(h,0,0,0);
|
||||||
|
|
||||||
|
gettimeofday(&tend,NULL);
|
||||||
|
|
||||||
|
secs= tend.tv_sec - tstart.tv_sec;
|
||||||
|
ndbout << "Took about: " << secs <<" seconds"<<endl;
|
||||||
|
|
||||||
|
if(secs < 4)
|
||||||
|
result= NDBT_OK;
|
||||||
|
else
|
||||||
|
result= NDBT_FAILED;
|
||||||
|
|
||||||
|
done:
|
||||||
|
ndb_mgm_disconnect(h);
|
||||||
|
ndb_mgm_destroy_handle(&h);
|
||||||
|
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
int runTestApiTimeoutBasic(NDBT_Context* ctx, NDBT_Step* step)
|
int runTestApiTimeoutBasic(NDBT_Context* ctx, NDBT_Step* step)
|
||||||
{
|
{
|
||||||
char *mgm= ctx->getRemoteMgm();
|
char *mgm= ctx->getRemoteMgm();
|
||||||
@ -727,6 +797,11 @@ TESTCASE("ApiSessionFailure",
|
|||||||
"Test failures in MGMAPI session"){
|
"Test failures in MGMAPI session"){
|
||||||
INITIALIZER(runTestApiSession);
|
INITIALIZER(runTestApiSession);
|
||||||
|
|
||||||
|
}
|
||||||
|
TESTCASE("ApiConnectTimeout",
|
||||||
|
"Connect timeout tests for MGMAPI"){
|
||||||
|
INITIALIZER(runTestApiConnectTimeout);
|
||||||
|
|
||||||
}
|
}
|
||||||
TESTCASE("ApiTimeoutBasic",
|
TESTCASE("ApiTimeoutBasic",
|
||||||
"Basic timeout tests for MGMAPI"){
|
"Basic timeout tests for MGMAPI"){
|
||||||
|
@ -1633,6 +1633,85 @@ runBug28023(NDBT_Context* ctx, NDBT_Step* step)
|
|||||||
return NDBT_OK;
|
return NDBT_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
int
|
||||||
|
runBug28717(NDBT_Context* ctx, NDBT_Step* step)
|
||||||
|
{
|
||||||
|
int result = NDBT_OK;
|
||||||
|
int loops = ctx->getNumLoops();
|
||||||
|
int records = ctx->getNumRecords();
|
||||||
|
Ndb* pNdb = GETNDB(step);
|
||||||
|
NdbRestarter res;
|
||||||
|
|
||||||
|
if (res.getNumDbNodes() < 4)
|
||||||
|
{
|
||||||
|
return NDBT_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
int master = res.getMasterNodeId();
|
||||||
|
int node0 = res.getRandomNodeOtherNodeGroup(master, rand());
|
||||||
|
int node1 = res.getRandomNodeSameNodeGroup(node0, rand());
|
||||||
|
|
||||||
|
ndbout_c("master: %d node0: %d node1: %d", master, node0, node1);
|
||||||
|
|
||||||
|
if (res.restartOneDbNode(node0, false, true, true))
|
||||||
|
{
|
||||||
|
return NDBT_FAILED;
|
||||||
|
}
|
||||||
|
|
||||||
|
{
|
||||||
|
int filter[] = { 15, NDB_MGM_EVENT_CATEGORY_CHECKPOINT, 0 };
|
||||||
|
NdbLogEventHandle handle =
|
||||||
|
ndb_mgm_create_logevent_handle(res.handle, filter);
|
||||||
|
|
||||||
|
|
||||||
|
int dump[] = { DumpStateOrd::DihStartLcpImmediately };
|
||||||
|
struct ndb_logevent event;
|
||||||
|
|
||||||
|
for (Uint32 i = 0; i<3; i++)
|
||||||
|
{
|
||||||
|
res.dumpStateOneNode(master, dump, 1);
|
||||||
|
while(ndb_logevent_get_next(handle, &event, 0) >= 0 &&
|
||||||
|
event.type != NDB_LE_LocalCheckpointStarted);
|
||||||
|
while(ndb_logevent_get_next(handle, &event, 0) >= 0 &&
|
||||||
|
event.type != NDB_LE_LocalCheckpointCompleted);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (res.waitNodesNoStart(&node0, 1))
|
||||||
|
return NDBT_FAILED;
|
||||||
|
|
||||||
|
int val2[] = { DumpStateOrd::CmvmiSetRestartOnErrorInsert, 1 };
|
||||||
|
|
||||||
|
if (res.dumpStateOneNode(node0, val2, 2))
|
||||||
|
return NDBT_FAILED;
|
||||||
|
|
||||||
|
if (res.insertErrorInNode(node0, 5010))
|
||||||
|
return NDBT_FAILED;
|
||||||
|
|
||||||
|
if (res.insertErrorInNode(node1, 1001))
|
||||||
|
return NDBT_FAILED;
|
||||||
|
|
||||||
|
if (res.startNodes(&node0, 1))
|
||||||
|
return NDBT_FAILED;
|
||||||
|
|
||||||
|
NdbSleep_SecSleep(3);
|
||||||
|
|
||||||
|
if (res.insertErrorInNode(node1, 0))
|
||||||
|
return NDBT_FAILED;
|
||||||
|
|
||||||
|
if (res.waitNodesNoStart(&node0, 1))
|
||||||
|
return NDBT_FAILED;
|
||||||
|
|
||||||
|
if (res.startNodes(&node0, 1))
|
||||||
|
return NDBT_FAILED;
|
||||||
|
|
||||||
|
if (res.waitClusterStarted())
|
||||||
|
return NDBT_FAILED;
|
||||||
|
|
||||||
|
return NDBT_OK;
|
||||||
|
}
|
||||||
|
|
||||||
NDBT_TESTSUITE(testNodeRestart);
|
NDBT_TESTSUITE(testNodeRestart);
|
||||||
TESTCASE("NoLoad",
|
TESTCASE("NoLoad",
|
||||||
"Test that one node at a time can be stopped and then restarted "\
|
"Test that one node at a time can be stopped and then restarted "\
|
||||||
@ -1993,6 +2072,9 @@ TESTCASE("Bug27466", ""){
|
|||||||
TESTCASE("Bug28023", ""){
|
TESTCASE("Bug28023", ""){
|
||||||
INITIALIZER(runBug28023);
|
INITIALIZER(runBug28023);
|
||||||
}
|
}
|
||||||
|
TESTCASE("Bug28717", ""){
|
||||||
|
INITIALIZER(runBug28717);
|
||||||
|
}
|
||||||
NDBT_TESTSUITE_END(testNodeRestart);
|
NDBT_TESTSUITE_END(testNodeRestart);
|
||||||
|
|
||||||
int main(int argc, const char** argv){
|
int main(int argc, const char** argv){
|
||||||
|
@ -21,3 +21,6 @@ BackupMemory = 64M
|
|||||||
MaxNoOfConcurrentScans = 100
|
MaxNoOfConcurrentScans = 100
|
||||||
MaxNoOfSavedMessages= 1000
|
MaxNoOfSavedMessages= 1000
|
||||||
SendBufferMemory = 2M
|
SendBufferMemory = 2M
|
||||||
|
NoOfFragmentLogFiles = 4
|
||||||
|
FragmentLogFileSize = 64M
|
||||||
|
|
||||||
|
@ -567,6 +567,10 @@ max-time: 1500
|
|||||||
cmd: testDict
|
cmd: testDict
|
||||||
args: -n CreateAndDrop
|
args: -n CreateAndDrop
|
||||||
|
|
||||||
|
max-time: 1000
|
||||||
|
cmd: testNodeRestart
|
||||||
|
args: -n Bug28717 T1
|
||||||
|
|
||||||
max-time: 1500
|
max-time: 1500
|
||||||
cmd: testDict
|
cmd: testDict
|
||||||
args: -n CreateAndDropAtRandom -l 200 T1
|
args: -n CreateAndDropAtRandom -l 200 T1
|
||||||
@ -706,7 +710,7 @@ args: -n ExecuteAsynch T1
|
|||||||
|
|
||||||
max-time: 1000
|
max-time: 1000
|
||||||
cmd: testNdbApi
|
cmd: testNdbApi
|
||||||
args: -n BugBug28443
|
args: -n Bug28443
|
||||||
|
|
||||||
#max-time: 500
|
#max-time: 500
|
||||||
#cmd: testInterpreter
|
#cmd: testInterpreter
|
||||||
@ -894,6 +898,10 @@ max-time: 120
|
|||||||
cmd: testMgm
|
cmd: testMgm
|
||||||
args: -n ApiSessionFailure T1
|
args: -n ApiSessionFailure T1
|
||||||
|
|
||||||
|
max-time: 15
|
||||||
|
cmd: testMgm
|
||||||
|
args: -n ApiConnectTimeout T1
|
||||||
|
|
||||||
max-time: 120
|
max-time: 120
|
||||||
cmd: testMgm
|
cmd: testMgm
|
||||||
args: -n ApiTimeoutBasic T1
|
args: -n ApiTimeoutBasic T1
|
||||||
|
@ -62,13 +62,13 @@ foreach my $node (@nodes)
|
|||||||
(($config_get_fs)?" with filesystem":"").
|
(($config_get_fs)?" with filesystem":"").
|
||||||
"\n\n";
|
"\n\n";
|
||||||
my $recurse= ($config_get_fs)?'-r ':'';
|
my $recurse= ($config_get_fs)?'-r ':'';
|
||||||
system 'scp '.$recurse.$config_username.config($node,'host').
|
system 'scp -p '.$recurse.$config_username.config($node,'host').
|
||||||
':'.config($node,'datadir')."/ndb_".$node."* ".
|
':'.config($node,'datadir')."/ndb_".$node."* ".
|
||||||
"$reportdir/\n";
|
"$reportdir/\n";
|
||||||
}
|
}
|
||||||
|
|
||||||
print "\n\n Copying configuration file...\n\n\t$config_file\n\n";
|
print "\n\n Copying configuration file...\n\n\t$config_file\n\n";
|
||||||
system "cp $config_file $reportdir/";
|
system "cp -p $config_file $reportdir/";
|
||||||
|
|
||||||
my $r = system 'bzip2 2>&1 > /dev/null < /dev/null';
|
my $r = system 'bzip2 2>&1 > /dev/null < /dev/null';
|
||||||
my $outfile;
|
my $outfile;
|
||||||
|
@ -873,13 +873,32 @@ bool RestoreDataIterator::readFragmentHeader(int & ret, Uint32 *fragmentId)
|
|||||||
|
|
||||||
debug << "RestoreDataIterator::getNextFragment" << endl;
|
debug << "RestoreDataIterator::getNextFragment" << endl;
|
||||||
|
|
||||||
if (buffer_read(&Header, sizeof(Header), 1) != 1){
|
while (1)
|
||||||
|
{
|
||||||
|
/* read first part of header */
|
||||||
|
if (buffer_read(&Header, 8, 1) != 1)
|
||||||
|
{
|
||||||
|
ret = 0;
|
||||||
|
return false;
|
||||||
|
} // if
|
||||||
|
|
||||||
|
/* skip if EMPTY_ENTRY */
|
||||||
|
Header.SectionType = ntohl(Header.SectionType);
|
||||||
|
Header.SectionLength = ntohl(Header.SectionLength);
|
||||||
|
if (Header.SectionType == BackupFormat::EMPTY_ENTRY)
|
||||||
|
{
|
||||||
|
void *tmp;
|
||||||
|
buffer_get_ptr(&tmp, Header.SectionLength*4-8, 1);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
/* read rest of header */
|
||||||
|
if (buffer_read(((char*)&Header)+8, sizeof(Header)-8, 1) != 1)
|
||||||
|
{
|
||||||
ret = 0;
|
ret = 0;
|
||||||
return false;
|
return false;
|
||||||
} // if
|
}
|
||||||
|
|
||||||
Header.SectionType = ntohl(Header.SectionType);
|
|
||||||
Header.SectionLength = ntohl(Header.SectionLength);
|
|
||||||
Header.TableId = ntohl(Header.TableId);
|
Header.TableId = ntohl(Header.TableId);
|
||||||
Header.FragmentNo = ntohl(Header.FragmentNo);
|
Header.FragmentNo = ntohl(Header.FragmentNo);
|
||||||
Header.ChecksumType = ntohl(Header.ChecksumType);
|
Header.ChecksumType = ntohl(Header.ChecksumType);
|
||||||
|
@ -1158,19 +1158,22 @@ void BackupRestore::tuple_a(restore_callback_t *cb)
|
|||||||
char * dataPtr = attr_data->string_value;
|
char * dataPtr = attr_data->string_value;
|
||||||
Uint32 length = 0;
|
Uint32 length = 0;
|
||||||
|
|
||||||
const unsigned char * src = (const unsigned char *)dataPtr;
|
if (!attr_data->null)
|
||||||
switch(attr_desc->m_column->getType()){
|
{
|
||||||
case NdbDictionary::Column::Varchar:
|
const unsigned char * src = (const unsigned char *)dataPtr;
|
||||||
case NdbDictionary::Column::Varbinary:
|
switch(attr_desc->m_column->getType()){
|
||||||
length = src[0] + 1;
|
case NdbDictionary::Column::Varchar:
|
||||||
break;
|
case NdbDictionary::Column::Varbinary:
|
||||||
case NdbDictionary::Column::Longvarchar:
|
length = src[0] + 1;
|
||||||
case NdbDictionary::Column::Longvarbinary:
|
break;
|
||||||
length = src[0] + (src[1] << 8) + 2;
|
case NdbDictionary::Column::Longvarchar:
|
||||||
break;
|
case NdbDictionary::Column::Longvarbinary:
|
||||||
default:
|
length = src[0] + (src[1] << 8) + 2;
|
||||||
length = attr_data->size;
|
break;
|
||||||
break;
|
default:
|
||||||
|
length = attr_data->size;
|
||||||
|
break;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
if (j == 0 && tup.getTable()->have_auto_inc(i))
|
if (j == 0 && tup.getTable()->have_auto_inc(i))
|
||||||
tup.getTable()->update_max_auto_val(dataPtr,size*arraySize);
|
tup.getTable()->update_max_auto_val(dataPtr,size*arraySize);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user