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:
unknown 2007-06-14 16:10:11 +02:00
commit d168b042a9
80 changed files with 1822 additions and 632 deletions

View File

@ -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;
} }

View File

@ -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
# #

View File

@ -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

View 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

View File

@ -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

View File

@ -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

View File

@ -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

View 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'

View File

@ -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
# #

View File

@ -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

View File

@ -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
View 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

View File

@ -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 \

View File

@ -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

View File

@ -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.
* *

View File

@ -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 */

View 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

View File

@ -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

View File

@ -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:

View File

@ -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>;
}; };

View File

@ -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
} }

View File

@ -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:

View File

@ -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:

View File

@ -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:

View File

@ -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:

View File

@ -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

View File

@ -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);
} }

View File

@ -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

View File

@ -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;

View File

@ -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;
}; };
/** /**

View File

@ -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 */
};
}; };
/** /**

View File

@ -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);

View File

@ -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

View File

@ -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()

View File

@ -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();

View File

@ -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:

View File

@ -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);

View File

@ -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) {

View File

@ -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

View File

@ -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;

View File

@ -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()

View File

@ -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));

View File

@ -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()

View File

@ -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()

View File

@ -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
} }

View File

@ -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);
} }

View File

@ -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;

View File

@ -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];

View File

@ -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);

View File

@ -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)
{ {

View File

@ -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);

View File

@ -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;

View File

@ -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

View File

@ -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

View File

@ -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);
} }
} }
} }

View File

@ -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,

View File

@ -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;

View File

@ -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

View File

@ -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
{ {

View File

@ -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
***************************************************************************/ ***************************************************************************/

View File

@ -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;
} }

View File

@ -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.

View 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

View File

@ -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

View File

@ -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

View File

@ -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();

View 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); }
};

View File

@ -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

View File

@ -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"){

View File

@ -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){

View File

@ -21,3 +21,6 @@ BackupMemory = 64M
MaxNoOfConcurrentScans = 100 MaxNoOfConcurrentScans = 100
MaxNoOfSavedMessages= 1000 MaxNoOfSavedMessages= 1000
SendBufferMemory = 2M SendBufferMemory = 2M
NoOfFragmentLogFiles = 4
FragmentLogFileSize = 64M

View File

@ -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

View File

@ -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;

View File

@ -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);

View File

@ -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);