Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
M
MariaDB
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Analytics
Analytics
CI / CD
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
nexedi
MariaDB
Commits
878ce564
Commit
878ce564
authored
Apr 07, 2006
by
jonas@perch.ndb.mysql.com
Browse files
Options
Browse Files
Download
Plain Diff
Merge perch.ndb.mysql.com:/home/jonas/src/50-jonas
into perch.ndb.mysql.com:/home/jonas/src/51-work
parents
327adcf4
2d284fe0
Changes
9
Show whitespace changes
Inline
Side-by-side
Showing
9 changed files
with
473 additions
and
284 deletions
+473
-284
libmysql/libmysql.c
libmysql/libmysql.c
+0
-29
sql-common/client.c
sql-common/client.c
+33
-0
storage/ndb/include/kernel/signaldata/StopReq.hpp
storage/ndb/include/kernel/signaldata/StopReq.hpp
+2
-1
storage/ndb/src/kernel/blocks/ndbcntr/NdbcntrMain.cpp
storage/ndb/src/kernel/blocks/ndbcntr/NdbcntrMain.cpp
+5
-0
storage/ndb/src/kernel/blocks/qmgr/QmgrMain.cpp
storage/ndb/src/kernel/blocks/qmgr/QmgrMain.cpp
+89
-91
storage/ndb/src/mgmclient/CommandInterpreter.cpp
storage/ndb/src/mgmclient/CommandInterpreter.cpp
+177
-55
storage/ndb/src/mgmsrv/MgmtSrvr.cpp
storage/ndb/src/mgmsrv/MgmtSrvr.cpp
+144
-69
storage/ndb/src/mgmsrv/MgmtSrvr.hpp
storage/ndb/src/mgmsrv/MgmtSrvr.hpp
+9
-5
storage/ndb/src/mgmsrv/Services.cpp
storage/ndb/src/mgmsrv/Services.cpp
+14
-34
No files found.
libmysql/libmysql.c
View file @
878ce564
...
...
@@ -1380,35 +1380,6 @@ mysql_get_server_info(MYSQL *mysql)
}
/*
Get version number for server in a form easy to test on
SYNOPSIS
mysql_get_server_version()
mysql Connection
EXAMPLE
4.1.0-alfa -> 40100
NOTES
We will ensure that a newer server always has a bigger number.
RETURN
Signed number > 323000
*/
ulong
STDCALL
mysql_get_server_version
(
MYSQL
*
mysql
)
{
uint
major
,
minor
,
version
;
char
*
pos
=
mysql
->
server_version
,
*
end_pos
;
major
=
(
uint
)
strtoul
(
pos
,
&
end_pos
,
10
);
pos
=
end_pos
+
1
;
minor
=
(
uint
)
strtoul
(
pos
,
&
end_pos
,
10
);
pos
=
end_pos
+
1
;
version
=
(
uint
)
strtoul
(
pos
,
&
end_pos
,
10
);
return
(
ulong
)
major
*
10000L
+
(
ulong
)
(
minor
*
100
+
version
);
}
const
char
*
STDCALL
mysql_get_host_info
(
MYSQL
*
mysql
)
{
...
...
sql-common/client.c
View file @
878ce564
...
...
@@ -2817,6 +2817,36 @@ const char * STDCALL mysql_error(MYSQL *mysql)
return
mysql
->
net
.
last_error
;
}
/*
Get version number for server in a form easy to test on
SYNOPSIS
mysql_get_server_version()
mysql Connection
EXAMPLE
4.1.0-alfa -> 40100
NOTES
We will ensure that a newer server always has a bigger number.
RETURN
Signed number > 323000
*/
ulong
STDCALL
mysql_get_server_version
(
MYSQL
*
mysql
)
{
uint
major
,
minor
,
version
;
char
*
pos
=
mysql
->
server_version
,
*
end_pos
;
major
=
(
uint
)
strtoul
(
pos
,
&
end_pos
,
10
);
pos
=
end_pos
+
1
;
minor
=
(
uint
)
strtoul
(
pos
,
&
end_pos
,
10
);
pos
=
end_pos
+
1
;
version
=
(
uint
)
strtoul
(
pos
,
&
end_pos
,
10
);
return
(
ulong
)
major
*
10000L
+
(
ulong
)
(
minor
*
100
+
version
);
}
/*
mysql_set_character_set function sends SET NAMES cs_name to
the server (which changes character_set_client, character_set_result
...
...
@@ -2836,6 +2866,9 @@ int STDCALL mysql_set_character_set(MYSQL *mysql, const char *cs_name)
{
char
buff
[
MY_CS_NAME_SIZE
+
10
];
charsets_dir
=
save_csdir
;
/* Skip execution of "SET NAMES" for pre-4.1 servers */
if
(
mysql_get_server_version
(
mysql
)
<
40100
)
return
0
;
sprintf
(
buff
,
"SET NAMES %s"
,
cs_name
);
if
(
!
mysql_real_query
(
mysql
,
buff
,
strlen
(
buff
)))
{
...
...
storage/ndb/include/kernel/signaldata/StopReq.hpp
View file @
878ce564
...
...
@@ -92,7 +92,7 @@ class StopRef
friend
class
Ndbcntr
;
public:
STATIC_CONST
(
SignalLength
=
2
);
STATIC_CONST
(
SignalLength
=
3
);
enum
ErrorCode
{
OK
=
0
,
...
...
@@ -107,6 +107,7 @@ public:
public:
Uint32
senderData
;
Uint32
errorCode
;
Uint32
masterNodeId
;
};
inline
...
...
storage/ndb/src/kernel/blocks/ndbcntr/NdbcntrMain.cpp
View file @
878ce564
...
...
@@ -2165,6 +2165,7 @@ Ndbcntr::execSTOP_REQ(Signal* signal){
else
ref
->
errorCode
=
StopRef
::
NodeShutdownInProgress
;
ref
->
senderData
=
senderData
;
ref
->
masterNodeId
=
cmasterNodeId
;
if
(
senderRef
!=
RNIL
)
sendSignal
(
senderRef
,
GSN_STOP_REF
,
signal
,
StopRef
::
SignalLength
,
JBB
);
...
...
@@ -2176,6 +2177,7 @@ Ndbcntr::execSTOP_REQ(Signal* signal){
jam
();
ref
->
errorCode
=
StopRef
::
UnsupportedNodeShutdown
;
ref
->
senderData
=
senderData
;
ref
->
masterNodeId
=
cmasterNodeId
;
if
(
senderRef
!=
RNIL
)
sendSignal
(
senderRef
,
GSN_STOP_REF
,
signal
,
StopRef
::
SignalLength
,
JBB
);
return
;
...
...
@@ -2186,6 +2188,7 @@ Ndbcntr::execSTOP_REQ(Signal* signal){
jam
();
ref
->
errorCode
=
StopRef
::
MultiNodeShutdownNotMaster
;
ref
->
senderData
=
senderData
;
ref
->
masterNodeId
=
cmasterNodeId
;
if
(
senderRef
!=
RNIL
)
sendSignal
(
senderRef
,
GSN_STOP_REF
,
signal
,
StopRef
::
SignalLength
,
JBB
);
return
;
...
...
@@ -2329,6 +2332,7 @@ Ndbcntr::StopRecord::checkNodeFail(Signal* signal){
ref
->
senderData
=
stopReq
.
senderData
;
ref
->
errorCode
=
StopRef
::
NodeShutdownWouldCauseSystemCrash
;
ref
->
masterNodeId
=
cntr
.
cmasterNodeId
;
const
BlockReference
bref
=
stopReq
.
senderRef
;
if
(
bref
!=
RNIL
)
...
...
@@ -2477,6 +2481,7 @@ void Ndbcntr::execABORT_ALL_REF(Signal* signal){
StopRef
*
const
stopRef
=
(
StopRef
*
)
&
signal
->
theData
[
0
];
stopRef
->
senderData
=
c_stopRec
.
stopReq
.
senderData
;
stopRef
->
errorCode
=
StopRef
::
TransactionAbortFailed
;
stopRef
->
masterNodeId
=
cmasterNodeId
;
sendSignal
(
c_stopRec
.
stopReq
.
senderRef
,
GSN_STOP_REF
,
signal
,
StopRef
::
SignalLength
,
JBB
);
}
...
...
storage/ndb/src/kernel/blocks/qmgr/QmgrMain.cpp
View file @
878ce564
...
...
@@ -653,7 +653,6 @@ void Qmgr::execCM_REGREQ(Signal* signal)
jam
();
c_start
.
m_president_candidate
=
addNodePtr
.
i
;
c_start
.
m_president_candidate_gci
=
gci
;
ndbout_c
(
"assign candidate: %u %u"
,
addNodePtr
.
i
,
gci
);
}
sendCmRegrefLab
(
signal
,
Tblockref
,
CmRegRef
::
ZELECTION
);
return
;
...
...
@@ -1106,7 +1105,6 @@ void Qmgr::execCM_REGREF(Signal* signal)
signal
->
theData
[
3
]
=
2
;
c_start
.
m_president_candidate
=
candidate
;
c_start
.
m_president_candidate_gci
=
candidate_gci
;
ndbout_c
(
"assign candidate: %u %u"
,
candidate
,
candidate_gci
);
}
else
{
signal
->
theData
[
3
]
=
4
;
}
//if
...
...
@@ -1216,6 +1214,7 @@ Qmgr::check_startup(Signal* signal)
goto
start_report
;
}
}
{
const
bool
all
=
c_start
.
m_starting_nodes
.
equal
(
c_definedNodes
);
CheckNodeGroups
*
sd
=
(
CheckNodeGroups
*
)
&
signal
->
theData
[
0
];
...
...
@@ -1324,7 +1323,7 @@ Qmgr::check_startup(Signal* signal)
retVal
=
1
;
goto
start_report
;
}
}
ndbrequire
(
false
);
start_report:
...
...
@@ -1409,7 +1408,6 @@ void Qmgr::regreqTimeLimitLab(Signal* signal)
{
jam
();
c_start
.
m_president_candidate
=
getOwnNodeId
();
ndbout_c
(
"Assigning candidate to self: %d"
,
getOwnNodeId
());
}
cmInfoconf010Lab
(
signal
);
...
...
storage/ndb/src/mgmclient/CommandInterpreter.cpp
View file @
878ce564
...
...
@@ -18,6 +18,7 @@
#include <my_sys.h>
#include <Vector.hpp>
#include <mgmapi.h>
#include <util/BaseString.hpp>
class
MgmtSrvr
;
...
...
@@ -63,6 +64,9 @@ class CommandInterpreter {
*/
void
analyseAfterFirstToken
(
int
processId
,
char
*
allAfterFirstTokenCstr
);
void
executeCommand
(
Vector
<
BaseString
>
&
command_list
,
unsigned
command_pos
,
int
*
node_ids
,
int
no_of_nodes
);
/**
* Parse the block specification part of the LOG* commands,
* things after LOG*: [BLOCK = {ALL|<blockName>+}]
...
...
@@ -97,10 +101,14 @@ class CommandInterpreter {
public:
void
executeStop
(
int
processId
,
const
char
*
parameters
,
bool
all
);
void
executeStop
(
Vector
<
BaseString
>
&
command_list
,
unsigned
command_pos
,
int
*
node_ids
,
int
no_of_nodes
);
void
executeEnterSingleUser
(
char
*
parameters
);
void
executeExitSingleUser
(
char
*
parameters
);
void
executeStart
(
int
processId
,
const
char
*
parameters
,
bool
all
);
void
executeRestart
(
int
processId
,
const
char
*
parameters
,
bool
all
);
void
executeRestart
(
Vector
<
BaseString
>
&
command_list
,
unsigned
command_pos
,
int
*
node_ids
,
int
no_of_nodes
);
void
executeLogLevel
(
int
processId
,
const
char
*
parameters
,
bool
all
);
void
executeError
(
int
processId
,
const
char
*
parameters
,
bool
all
);
void
executeLog
(
int
processId
,
const
char
*
parameters
,
bool
all
);
...
...
@@ -583,6 +591,13 @@ CommandInterpreter::execute_impl(const char *_line)
}
}
while
(
do_continue
);
// if there is anything in the line proceed
Vector
<
BaseString
>
command_list
;
{
BaseString
tmp
(
line
);
tmp
.
split
(
command_list
);
for
(
unsigned
i
=
0
;
i
<
command_list
.
size
();)
command_list
[
i
].
c_str
()[
0
]
?
i
++
:
(
command_list
.
erase
(
i
),
0
);
}
char
*
firstToken
=
strtok
(
line
,
" "
);
char
*
allAfterFirstToken
=
strtok
(
NULL
,
""
);
...
...
@@ -656,22 +671,45 @@ CommandInterpreter::execute_impl(const char *_line)
analyseAfterFirstToken
(
-
1
,
allAfterFirstToken
);
}
else
{
/**
* First token
should be a digit, node ID
* First token
s should be digits, node ID's
*/
int
nodeId
;
if
(
!
convert
(
firstToken
,
nodeId
))
{
int
node_ids
[
MAX_NODES
];
unsigned
pos
;
for
(
pos
=
0
;
pos
<
command_list
.
size
();
pos
++
)
{
int
node_id
;
if
(
convert
(
command_list
[
pos
].
c_str
(),
node_id
))
{
if
(
node_id
<=
0
)
{
ndbout
<<
"Invalid node ID: "
<<
command_list
[
pos
].
c_str
()
<<
"."
<<
endl
;
DBUG_RETURN
(
true
);
}
node_ids
[
pos
]
=
node_id
;
continue
;
}
break
;
}
int
no_of_nodes
=
pos
;
if
(
no_of_nodes
==
0
)
{
/* No digit found */
invalid_command
(
_line
);
DBUG_RETURN
(
true
);
}
if
(
nodeId
<=
0
)
{
ndbout
<<
"Invalid node ID: "
<<
firstToken
<<
"."
<<
endl
;
if
(
pos
==
command_list
.
size
())
{
/* No command found */
invalid_command
(
_line
);
DBUG_RETURN
(
true
);
}
analyseAfterFirstToken
(
nodeId
,
allAfterFirstToken
);
if
(
no_of_nodes
==
1
)
{
analyseAfterFirstToken
(
node_ids
[
0
],
allAfterFirstToken
);
DBUG_RETURN
(
true
);
}
executeCommand
(
command_list
,
pos
,
node_ids
,
no_of_nodes
);
DBUG_RETURN
(
true
);
}
DBUG_RETURN
(
true
);
}
...
...
@@ -741,6 +779,27 @@ CommandInterpreter::analyseAfterFirstToken(int processId,
ndbout
<<
endl
;
}
void
CommandInterpreter
::
executeCommand
(
Vector
<
BaseString
>
&
command_list
,
unsigned
command_pos
,
int
*
node_ids
,
int
no_of_nodes
)
{
const
char
*
cmd
=
command_list
[
command_pos
].
c_str
();
if
(
strcasecmp
(
"STOP"
,
cmd
)
==
0
)
{
executeStop
(
command_list
,
command_pos
+
1
,
node_ids
,
no_of_nodes
);
return
;
}
if
(
strcasecmp
(
"RESTART"
,
cmd
)
==
0
)
{
executeRestart
(
command_list
,
command_pos
+
1
,
node_ids
,
no_of_nodes
);
return
;
}
ndbout_c
(
"Invalid command: '%s' after multi node id list. "
"Expected STOP or RESTART."
,
cmd
);
return
;
}
/**
* Get next nodeid larger than the give node_id. node_id will be
* set to the next node_id in the list. node_id should be set
...
...
@@ -1326,23 +1385,59 @@ CommandInterpreter::executeClusterLog(char* parameters)
//*****************************************************************************
void
CommandInterpreter
::
executeStop
(
int
processId
,
const
char
*
,
bool
all
)
CommandInterpreter
::
executeStop
(
int
processId
,
const
char
*
parameters
,
bool
all
)
{
int
result
=
0
;
if
(
all
)
{
result
=
ndb_mgm_stop
(
m_mgmsrv
,
0
,
0
);
}
else
{
result
=
ndb_mgm_stop
(
m_mgmsrv
,
1
,
&
processId
);
Vector
<
BaseString
>
command_list
;
if
(
parameters
)
{
BaseString
tmp
(
parameters
);
tmp
.
split
(
command_list
);
for
(
unsigned
i
=
0
;
i
<
command_list
.
size
();)
command_list
[
i
].
c_str
()[
0
]
?
i
++
:
(
command_list
.
erase
(
i
),
0
);
}
if
(
result
<
0
)
{
ndbout
<<
"Shutdown failed."
<<
endl
;
if
(
all
)
executeStop
(
command_list
,
0
,
0
,
0
);
else
executeStop
(
command_list
,
0
,
&
processId
,
1
);
}
void
CommandInterpreter
::
executeStop
(
Vector
<
BaseString
>
&
command_list
,
unsigned
command_pos
,
int
*
node_ids
,
int
no_of_nodes
)
{
int
abort
=
0
;
for
(;
command_pos
<
command_list
.
size
();
command_pos
++
)
{
const
char
*
item
=
command_list
[
command_pos
].
c_str
();
if
(
strcasecmp
(
item
,
"-A"
)
==
0
)
{
abort
=
1
;
continue
;
}
ndbout_c
(
"Invalid option: %s. Expecting -A after STOP"
,
item
);
return
;
}
int
result
=
ndb_mgm_stop2
(
m_mgmsrv
,
no_of_nodes
,
node_ids
,
abort
);
if
(
result
<
0
)
{
ndbout_c
(
"Shutdown failed."
);
printError
();
}
else
}
else
{
if
(
all
)
ndbout
<<
"NDB Cluster has shutdown."
<<
endl
;
if
(
node_ids
==
0
)
ndbout_c
(
"NDB Cluster has shutdown."
)
;
else
ndbout
<<
"Node "
<<
processId
<<
" has shutdown."
<<
endl
;
{
ndbout
<<
"Node"
;
for
(
int
i
=
0
;
i
<
no_of_nodes
;
i
++
)
ndbout
<<
" "
<<
node_ids
[
i
];
ndbout_c
(
" has shutdown."
);
}
}
}
...
...
@@ -1410,45 +1505,72 @@ CommandInterpreter::executeStart(int processId, const char* parameters,
void
CommandInterpreter
::
executeRestart
(
int
processId
,
const
char
*
parameters
,
bool
all
)
{
Vector
<
BaseString
>
command_list
;
if
(
parameters
)
{
BaseString
tmp
(
parameters
);
tmp
.
split
(
command_list
);
for
(
unsigned
i
=
0
;
i
<
command_list
.
size
();)
command_list
[
i
].
c_str
()[
0
]
?
i
++
:
(
command_list
.
erase
(
i
),
0
);
}
if
(
all
)
executeRestart
(
command_list
,
0
,
0
,
0
);
else
executeRestart
(
command_list
,
0
,
&
processId
,
1
);
}
void
CommandInterpreter
::
executeRestart
(
Vector
<
BaseString
>
&
command_list
,
unsigned
command_pos
,
int
*
node_ids
,
int
no_of_nodes
)
{
int
result
;
int
nostart
=
0
;
int
initialstart
=
0
;
int
abort
=
0
;
int
nostart
=
0
;
int
initialstart
=
0
;
int
abort
=
0
;
if
(
parameters
!=
0
&&
strlen
(
parameters
)
!=
0
){
char
*
tmpString
=
my_strdup
(
parameters
,
MYF
(
MY_WME
));
My_auto_ptr
<
char
>
ap1
(
tmpString
);
char
*
tmpPtr
=
0
;
char
*
item
=
strtok_r
(
tmpString
,
" "
,
&
tmpPtr
);
while
(
item
!=
NULL
){
if
(
strcasecmp
(
item
,
"-N"
)
==
0
)
nostart
=
1
;
if
(
strcasecmp
(
item
,
"-I"
)
==
0
)
initialstart
=
1
;
if
(
strcasecmp
(
item
,
"-A"
)
==
0
)
abort
=
1
;
item
=
strtok_r
(
NULL
,
" "
,
&
tmpPtr
);
for
(;
command_pos
<
command_list
.
size
();
command_pos
++
)
{
const
char
*
item
=
command_list
[
command_pos
].
c_str
();
if
(
strcasecmp
(
item
,
"-N"
)
==
0
)
{
nostart
=
1
;
continue
;
}
if
(
strcasecmp
(
item
,
"-I"
)
==
0
)
{
initialstart
=
1
;
continue
;
}
if
(
all
)
{
result
=
ndb_mgm_restart2
(
m_mgmsrv
,
0
,
NULL
,
initialstart
,
nostart
,
abort
);
}
else
{
int
v
[
1
];
v
[
0
]
=
processId
;
result
=
ndb_mgm_restart2
(
m_mgmsrv
,
1
,
v
,
initialstart
,
nostart
,
abort
);
if
(
strcasecmp
(
item
,
"-A"
)
==
0
)
{
abort
=
1
;
continue
;
}
ndbout_c
(
"Invalid option: %s. Expecting -A,-N or -I after RESTART"
,
item
);
return
;
}
result
=
ndb_mgm_restart2
(
m_mgmsrv
,
no_of_nodes
,
node_ids
,
initialstart
,
nostart
,
abort
);
if
(
result
<=
0
)
{
ndbout
.
println
(
"Restart failed."
,
result
);
ndbout
_c
(
"Restart failed."
);
printError
();
}
else
}
else
{
if
(
all
)
ndbout
<<
"NDB Cluster is being restarted."
<<
endl
;
if
(
node_ids
==
0
)
ndbout_c
(
"NDB Cluster is being restarted."
)
;
else
ndbout_c
(
"Node %d is being restarted."
,
processId
);
{
ndbout
<<
"Node"
;
for
(
int
i
=
0
;
i
<
no_of_nodes
;
i
++
)
ndbout
<<
" "
<<
node_ids
[
i
];
ndbout_c
(
" is being restarted"
);
}
}
}
...
...
storage/ndb/src/mgmsrv/MgmtSrvr.cpp
View file @
878ce564
...
...
@@ -294,6 +294,8 @@ static ErrorItem errorTable[] =
{
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."
},
...
...
@@ -312,6 +314,9 @@ int MgmtSrvr::translateStopRef(Uint32 errCode)
case
StopRef
:
:
NodeShutdownWouldCauseSystemCrash
:
return
NODE_SHUTDOWN_WOULD_CAUSE_SYSTEM_CRASH
;
break
;
case
StopRef
:
:
UnsupportedNodeShutdown
:
return
UNSUPPORTED_NODE_SHUTDOWN
;
break
;
}
return
4999
;
}
...
...
@@ -386,8 +391,9 @@ MgmtSrvr::MgmtSrvr(SocketServer *socket_server,
_ownReference
(
0
),
theSignalIdleList
(
NULL
),
theWaitState
(
WAIT_SUBSCRIBE_CONF
),
m_local_mgm_handle
(
0
),
m_event_listner
(
this
),
m_
local_mgm_handl
e
(
0
)
m_
master_nod
e
(
0
)
{
DBUG_ENTER
(
"MgmtSrvr::MgmtSrvr"
);
...
...
@@ -672,23 +678,16 @@ MgmtSrvr::~MgmtSrvr()
int
MgmtSrvr
::
okToSendTo
(
NodeId
nodeId
,
bool
unCond
)
{
if
(
nodeId
==
0
)
return
0
;
if
(
getNodeType
(
nodeId
)
!=
NDB_MGM_NODE_TYPE_NDB
)
if
(
nodeId
==
0
||
getNodeType
(
nodeId
)
!=
NDB_MGM_NODE_TYPE_NDB
)
return
WRONG_PROCESS_TYPE
;
// Check if we have contact with it
if
(
unCond
){
if
(
theFacade
->
theClusterMgr
->
getNodeInfo
(
nodeId
).
connected
)
return
0
;
return
NO_CONTACT_WITH_PROCESS
;
}
if
(
theFacade
->
get_node_alive
(
nodeId
)
==
0
)
{
return
NO_CONTACT_WITH_PROCESS
;
}
else
{
else
if
(
theFacade
->
get_node_alive
(
nodeId
)
==
true
)
return
0
;
}
return
NO_CONTACT_WITH_PROCESS
;
}
void
report_unknown_signal
(
SimpleSignal
*
signal
)
...
...
@@ -930,7 +929,7 @@ int MgmtSrvr::sendStopMgmd(NodeId nodeId,
* distributed communication up.
*/
int
MgmtSrvr
::
sendSTOP_REQ
(
NodeId
nodeId
,
int
MgmtSrvr
::
sendSTOP_REQ
(
const
Vector
<
NodeId
>
&
node_ids
,
NodeBitmask
&
stoppedNodes
,
Uint32
singleUserNodeId
,
bool
abort
,
...
...
@@ -940,6 +939,12 @@ int MgmtSrvr::sendSTOP_REQ(NodeId nodeId,
bool
initialStart
)
{
int
error
=
0
;
DBUG_ENTER
(
"MgmtSrvr::sendSTOP_REQ"
);
DBUG_PRINT
(
"enter"
,
(
"no of nodes: %d singleUseNodeId: %d "
"abort: %d stop: %d restart: %d "
"nostart: %d initialStart: %d"
,
node_ids
.
size
(),
singleUserNodeId
,
abort
,
stop
,
restart
,
nostart
,
initialStart
));
stoppedNodes
.
clear
();
...
...
@@ -977,36 +982,49 @@ int MgmtSrvr::sendSTOP_REQ(NodeId nodeId,
// send the signals
NodeBitmask
nodes
;
if
(
nodeId
)
NodeId
nodeId
=
0
;
int
use_master_node
=
0
;
int
do_send
=
0
;
int
do_stop_self
=
0
;
NdbNodeBitmask
nodes_to_stop
;
{
for
(
unsigned
i
=
0
;
i
<
node_ids
.
size
();
i
++
)
{
nodeId
=
node_ids
[
i
];
if
(
getNodeType
(
nodeId
)
!=
NDB_MGM_NODE_TYPE_MGM
)
nodes_to_stop
.
set
(
nodeId
);
else
if
(
nodeId
!=
getOwnNodeId
())
{
error
=
sendStopMgmd
(
nodeId
,
abort
,
stop
,
restart
,
nostart
,
initialStart
);
if
(
error
==
0
)
stoppedNodes
.
set
(
nodeId
);
}
else
do_stop_self
=
1
;;
}
}
int
no_of_nodes_to_stop
=
nodes_to_stop
.
count
();
if
(
node_ids
.
size
())
{
if
(
nodeId
==
getOwnNodeId
()
)
if
(
no_of_nodes_to_stop
)
{
if
(
restart
)
g_RestartServer
=
true
;
g_StopServer
=
true
;
return
0
;
}
if
(
getNodeType
(
nodeId
)
==
NDB_MGM_NODE_TYPE_NDB
)
do_send
=
1
;
if
(
no_of_nodes_to_stop
==
1
)
{
int
r
;
if
((
r
=
okToSendTo
(
nodeId
,
true
))
!=
0
)
return
r
;
if
(
ss
.
sendSignal
(
nodeId
,
&
ssig
)
!=
SEND_OK
)
return
SEND_OR_RECEIVE_FAILED
;
nodeId
=
nodes_to_stop
.
find
(
0
);
}
else
if
(
getNodeType
(
nodeId
)
==
NDB_MGM_NODE_TYPE_MGM
)
else
// multi node stop, send to master
{
error
=
sendStopMgmd
(
nodeId
,
abort
,
stop
,
restart
,
nostart
,
initialStart
)
;
if
(
error
==
0
)
stoppedNodes
.
set
(
nodeId
);
return
error
;
use_master_node
=
1
;
nodes_to_stop
.
copyto
(
NdbNodeBitmask
::
Size
,
stopReq
->
nodes
);
StopReq
::
setStopNodes
(
stopReq
->
requestInfo
,
1
);
}
}
else
return
WRONG_PROCESS_TYPE
;
nodes
.
set
(
nodeId
);
}
else
{
nodeId
=
0
;
while
(
getNextNodeId
(
&
nodeId
,
NDB_MGM_NODE_TYPE_NDB
))
{
if
(
okToSendTo
(
nodeId
,
true
)
==
0
)
...
...
@@ -1027,8 +1045,30 @@ int MgmtSrvr::sendSTOP_REQ(NodeId nodeId,
}
// now wait for the replies
while
(
!
nodes
.
isclear
())
while
(
!
nodes
.
isclear
()
||
do_send
)
{
if
(
do_send
)
{
int
r
;
assert
(
nodes
.
count
()
==
0
);
if
(
use_master_node
)
nodeId
=
m_master_node
;
if
((
r
=
okToSendTo
(
nodeId
,
true
))
!=
0
)
{
bool
next
;
if
(
!
use_master_node
)
DBUG_RETURN
(
r
);
m_master_node
=
nodeId
=
0
;
while
((
next
=
getNextNodeId
(
&
nodeId
,
NDB_MGM_NODE_TYPE_NDB
))
==
true
&&
(
r
=
okToSendTo
(
nodeId
,
true
))
!=
0
);
if
(
!
next
)
DBUG_RETURN
(
NO_CONTACT_WITH_DB_NODES
);
}
if
(
ss
.
sendSignal
(
nodeId
,
&
ssig
)
!=
SEND_OK
)
DBUG_RETURN
(
SEND_OR_RECEIVE_FAILED
);
nodes
.
set
(
nodeId
);
do_send
=
0
;
}
SimpleSignal
*
signal
=
ss
.
waitFor
();
int
gsn
=
signal
->
readSignalNumber
();
switch
(
gsn
)
{
...
...
@@ -1040,6 +1080,13 @@ int MgmtSrvr::sendSTOP_REQ(NodeId nodeId,
#endif
assert
(
nodes
.
get
(
nodeId
));
nodes
.
clear
(
nodeId
);
if
(
ref
->
errorCode
==
StopRef
::
MultiNodeShutdownNotMaster
)
{
assert
(
use_master_node
);
m_master_node
=
ref
->
masterNodeId
;
do_send
=
1
;
continue
;
}
error
=
translateStopRef
(
ref
->
errorCode
);
break
;
}
...
...
@@ -1050,9 +1097,16 @@ int MgmtSrvr::sendSTOP_REQ(NodeId nodeId,
ndbout_c
(
"Node %d single user mode"
,
nodeId
);
#endif
assert
(
nodes
.
get
(
nodeId
));
assert
(
singleUserNodeId
!=
0
);
nodes
.
clear
(
nodeId
);
if
(
singleUserNodeId
!=
0
)
{
stoppedNodes
.
set
(
nodeId
);
}
else
{
assert
(
no_of_nodes_to_stop
>
1
);
stoppedNodes
.
bitOR
(
nodes_to_stop
);
}
nodes
.
clear
(
nodeId
);
break
;
}
case
GSN_NF_COMPLETEREP
:{
...
...
@@ -1091,17 +1145,24 @@ int MgmtSrvr::sendSTOP_REQ(NodeId nodeId,
#ifdef VM_TRACE
ndbout_c
(
"Unknown signal %d"
,
gsn
);
#endif
return
SEND_OR_RECEIVE_FAILED
;
DBUG_RETURN
(
SEND_OR_RECEIVE_FAILED
);
}
}
if
(
!
error
&&
do_stop_self
)
{
if
(
restart
)
g_RestartServer
=
true
;
g_StopServer
=
true
;
}
return
error
;
DBUG_RETURN
(
error
)
;
}
/*
* Stop one node
* Stop one node
s
*/
int
MgmtSrvr
::
stopNode
(
int
nodeId
,
bool
abort
)
int
MgmtSrvr
::
stopNodes
(
const
Vector
<
NodeId
>
&
node_ids
,
int
*
stopCount
,
bool
abort
)
{
if
(
!
abort
)
{
...
...
@@ -1116,7 +1177,7 @@ int MgmtSrvr::stopNode(int nodeId, bool abort)
}
}
NodeBitmask
nodes
;
return
sendSTOP_REQ
(
nodeId
,
int
ret
=
sendSTOP_REQ
(
node_ids
,
nodes
,
0
,
abort
,
...
...
@@ -1124,6 +1185,9 @@ int MgmtSrvr::stopNode(int nodeId, bool abort)
false
,
false
,
false
);
if
(
stopCount
)
*
stopCount
=
nodes
.
count
();
return
ret
;
}
/*
...
...
@@ -1133,7 +1197,8 @@ int MgmtSrvr::stopNode(int nodeId, bool abort)
int
MgmtSrvr
::
stop
(
int
*
stopCount
,
bool
abort
)
{
NodeBitmask
nodes
;
int
ret
=
sendSTOP_REQ
(
0
,
Vector
<
NodeId
>
node_ids
;
int
ret
=
sendSTOP_REQ
(
node_ids
,
nodes
,
0
,
abort
,
...
...
@@ -1164,7 +1229,8 @@ int MgmtSrvr::enterSingleUser(int * stopCount, Uint32 singleUserNodeId)
return
OPERATION_NOT_ALLOWED_START_STOP
;
}
NodeBitmask
nodes
;
int
ret
=
sendSTOP_REQ
(
0
,
Vector
<
NodeId
>
node_ids
;
int
ret
=
sendSTOP_REQ
(
node_ids
,
nodes
,
singleUserNodeId
,
false
,
...
...
@@ -1181,11 +1247,12 @@ int MgmtSrvr::enterSingleUser(int * stopCount, Uint32 singleUserNodeId)
* Perform node restart
*/
int
MgmtSrvr
::
restartNode
(
int
nodeId
,
bool
nostart
,
bool
initialStart
,
bool
abort
)
int
MgmtSrvr
::
restartNodes
(
const
Vector
<
NodeId
>
&
node_ids
,
int
*
stopCount
,
bool
nostart
,
bool
initialStart
,
bool
abort
)
{
NodeBitmask
nodes
;
return
sendSTOP_REQ
(
nodeId
,
int
ret
=
sendSTOP_REQ
(
node_ids
,
nodes
,
0
,
abort
,
...
...
@@ -1193,6 +1260,9 @@ int MgmtSrvr::restartNode(int nodeId, bool nostart, bool initialStart,
true
,
nostart
,
initialStart
);
if
(
stopCount
)
*
stopCount
=
nodes
.
count
();
return
ret
;
}
/*
...
...
@@ -1203,7 +1273,8 @@ int MgmtSrvr::restart(bool nostart, bool initialStart,
bool
abort
,
int
*
stopCount
)
{
NodeBitmask
nodes
;
int
ret
=
sendSTOP_REQ
(
0
,
Vector
<
NodeId
>
node_ids
;
int
ret
=
sendSTOP_REQ
(
node_ids
,
nodes
,
0
,
abort
,
...
...
@@ -2241,12 +2312,16 @@ MgmtSrvr::startBackup(Uint32& backupId, int waitCompleted)
SignalSender
ss
(
theFacade
);
ss
.
lock
();
// lock will be released on exit
NodeId
nodeId
=
m_master_node
;
if
(
okToSendTo
(
nodeId
,
false
)
!=
0
)
{
bool
next
;
NodeId
nodeId
=
0
;
nodeId
=
m_master_node
=
0
;
while
((
next
=
getNextNodeId
(
&
nodeId
,
NDB_MGM_NODE_TYPE_NDB
))
==
true
&&
theFacade
->
get_node_alive
(
nodeId
)
==
false
);
if
(
!
next
)
return
NO_CONTACT_WITH_DB_NODES
;
okToSendTo
(
nodeId
,
false
)
!=
0
);
if
(
!
next
)
return
NO_CONTACT_WITH_DB_NODES
;
}
SimpleSignal
ssig
;
BackupReq
*
req
=
CAST_PTR
(
BackupReq
,
ssig
.
getDataPtrSend
());
...
...
@@ -2314,7 +2389,7 @@ MgmtSrvr::startBackup(Uint32& backupId, int waitCompleted)
const
BackupRef
*
const
ref
=
CAST_CONSTPTR
(
BackupRef
,
signal
->
getDataPtr
());
if
(
ref
->
errorCode
==
BackupRef
::
IAmNotMaster
){
nodeId
=
refToNode
(
ref
->
masterRef
);
m_master_node
=
nodeId
=
refToNode
(
ref
->
masterRef
);
#ifdef VM_TRACE
ndbout_c
(
"I'm not master resending to %d"
,
nodeId
);
#endif
...
...
storage/ndb/src/mgmsrv/MgmtSrvr.hpp
View file @
878ce564
...
...
@@ -176,6 +176,7 @@ public:
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
);
...
...
@@ -252,7 +253,7 @@ public:
* @param processId: Id of the DB process to stop
* @return 0 if succeeded, otherwise: as stated above, plus:
*/
int
stopNode
(
int
nodeId
,
bool
abort
=
false
);
int
stopNode
s
(
const
Vector
<
NodeId
>
&
node_ids
,
int
*
stopCount
,
bool
abort
);
/**
* Stop the system
...
...
@@ -286,11 +287,12 @@ public:
int
start
(
int
processId
);
/**
* Restart
a node
* Restart
nodes
* @param processId: Id of the DB process to start
*/
int
restartNode
(
int
processId
,
bool
nostart
,
bool
initialStart
,
bool
abort
=
false
);
int
restartNodes
(
const
Vector
<
NodeId
>
&
node_ids
,
int
*
stopCount
,
bool
nostart
,
bool
initialStart
,
bool
abort
);
/**
* Restart the system
...
...
@@ -489,7 +491,7 @@ private:
bool
nostart
,
bool
initialStart
);
int
sendSTOP_REQ
(
NodeId
nodeId
,
int
sendSTOP_REQ
(
const
Vector
<
NodeId
>
&
node_ids
,
NodeBitmask
&
stoppedNodes
,
Uint32
singleUserNodeId
,
bool
abort
,
...
...
@@ -649,6 +651,8 @@ private:
friend
class
Ndb_mgmd_event_service
;
Ndb_mgmd_event_service
m_event_listner
;
NodeId
m_master_node
;
/**
* Handles the thread wich upon a 'Node is started' event will
* set the node's previous loglevel settings.
...
...
storage/ndb/src/mgmsrv/Services.cpp
View file @
878ce564
...
...
@@ -866,14 +866,11 @@ MgmApiSession::restart(Parser<MgmApiSession>::Context &,
}
int
restarted
=
0
;
int
result
=
0
;
for
(
size_t
i
=
0
;
i
<
nodes
.
size
();
i
++
)
if
((
result
=
m_mgmsrv
.
restartNode
(
nodes
[
i
],
int
result
=
m_mgmsrv
.
restartNodes
(
nodes
,
&
restarted
,
nostart
!=
0
,
initialstart
!=
0
,
abort
!=
0
))
==
0
)
restarted
++
;
abort
!=
0
);
m_output
->
println
(
"restart reply"
);
if
(
result
!=
0
){
...
...
@@ -998,7 +995,12 @@ MgmApiSession::stop(Parser<MgmApiSession>::Context &,
args
.
get
(
"node"
,
(
const
char
**
)
&
nodes_str
);
if
(
nodes_str
==
NULL
)
{
m_output
->
println
(
"stop reply"
);
m_output
->
println
(
"result: empty node list"
);
m_output
->
println
(
""
);
return
;
}
args
.
get
(
"abort"
,
&
abort
);
char
*
p
,
*
last
;
...
...
@@ -1008,29 +1010,10 @@ MgmApiSession::stop(Parser<MgmApiSession>::Context &,
nodes
.
push_back
(
atoi
(
p
));
}
int
stop_self
=
0
;
size_t
i
;
for
(
i
=
0
;
i
<
nodes
.
size
();
i
++
)
{
if
(
nodes
[
i
]
==
m_mgmsrv
.
getOwnNodeId
())
{
stop_self
=
1
;
if
(
i
!=
nodes
.
size
()
-
1
)
{
m_output
->
println
(
"stop reply"
);
m_output
->
println
(
"result: server must be stopped last"
);
m_output
->
println
(
""
);
return
;
}
}
}
int
stopped
=
0
,
result
=
0
;
for
(
i
=
0
;
i
<
nodes
.
size
();
i
++
)
if
(
nodes
[
i
]
!=
m_mgmsrv
.
getOwnNodeId
())
{
if
((
result
=
m_mgmsrv
.
stopNode
(
nodes
[
i
],
abort
!=
0
))
==
0
)
stopped
++
;
}
else
stopped
++
;
int
stopped
=
0
;
int
result
=
0
;
if
(
nodes
.
size
())
result
=
m_mgmsrv
.
stopNodes
(
nodes
,
&
stopped
,
abort
!=
0
);
m_output
->
println
(
"stop reply"
);
if
(
result
!=
0
)
...
...
@@ -1039,9 +1022,6 @@ MgmApiSession::stop(Parser<MgmApiSession>::Context &,
m_output
->
println
(
"result: Ok"
);
m_output
->
println
(
"stopped: %d"
,
stopped
);
m_output
->
println
(
""
);
if
(
stop_self
)
g_StopServer
=
true
;
}
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment