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
Analytics
Analytics
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Commits
Issue Boards
Open sidebar
Kirill Smelkov
mariadb
Commits
c1c2a892
Commit
c1c2a892
authored
Sep 12, 2005
by
unknown
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
reengineered ndb_mgmd to use SignalSender and remove some multi user issues
parent
acf8d0f4
Changes
11
Show whitespace changes
Inline
Side-by-side
Showing
11 changed files
with
595 additions
and
1705 deletions
+595
-1705
ndb/include/kernel/GlobalSignalNumbers.h
ndb/include/kernel/GlobalSignalNumbers.h
+1
-1
ndb/include/kernel/signaldata/EventReport.hpp
ndb/include/kernel/signaldata/EventReport.hpp
+3
-3
ndb/include/kernel/signaldata/StopReq.hpp
ndb/include/kernel/signaldata/StopReq.hpp
+9
-1
ndb/src/common/debugger/EventLogger.cpp
ndb/src/common/debugger/EventLogger.cpp
+12
-457
ndb/src/kernel/blocks/ndbcntr/NdbcntrMain.cpp
ndb/src/kernel/blocks/ndbcntr/NdbcntrMain.cpp
+47
-18
ndb/src/mgmclient/CommandInterpreter.cpp
ndb/src/mgmclient/CommandInterpreter.cpp
+3
-4
ndb/src/mgmsrv/MgmtSrvr.cpp
ndb/src/mgmsrv/MgmtSrvr.cpp
+485
-986
ndb/src/mgmsrv/MgmtSrvr.hpp
ndb/src/mgmsrv/MgmtSrvr.hpp
+23
-115
ndb/src/mgmsrv/MgmtSrvrConfig.cpp
ndb/src/mgmsrv/MgmtSrvrConfig.cpp
+4
-0
ndb/src/mgmsrv/MgmtSrvrGeneralSignalHandling.cpp
ndb/src/mgmsrv/MgmtSrvrGeneralSignalHandling.cpp
+0
-120
ndb/src/mgmsrv/Services.cpp
ndb/src/mgmsrv/Services.cpp
+8
-0
No files found.
ndb/include/kernel/GlobalSignalNumbers.h
View file @
c1c2a892
...
...
@@ -553,7 +553,6 @@ extern const GlobalSignalNumber NO_OF_SIGNAL_NAMES;
#define GSN_STATISTICS_CONF 454
#define GSN_START_ORD 455
/* 456 unused */
/* 457 unused */
#define GSN_EVENT_SUBSCRIBE_REQ 458
...
...
@@ -900,6 +899,7 @@ extern const GlobalSignalNumber NO_OF_SIGNAL_NAMES;
#define GSN_RESUME_REQ 682
#define GSN_STOP_REQ 443
#define GSN_STOP_REF 444
#define GSN_STOP_CONF 456
#define GSN_API_VERSION_REQ 697
#define GSN_API_VERSION_CONF 698
...
...
ndb/include/kernel/signaldata/EventReport.hpp
View file @
c1c2a892
...
...
@@ -133,9 +133,9 @@ public:
CreateLogBytes
=
48
,
InfoEvent
=
49
,
//
GREP
GrepSubscriptionInfo
=
52
,
GrepSubscriptionAlert
=
53
,
//
SINGLE USER
SingleUser
=
52
,
/* unused 53 */
//BACKUP
BackupStarted
=
54
,
...
...
ndb/include/kernel/signaldata/StopReq.hpp
View file @
c1c2a892
...
...
@@ -67,6 +67,13 @@ public:
static
bool
getStopAbort
(
const
Uint32
&
requestInfo
);
};
struct
StopConf
{
STATIC_CONST
(
SignalLength
=
2
);
Uint32
senderData
;
Uint32
nodeState
;
};
class
StopRef
{
/**
...
...
@@ -86,7 +93,8 @@ public:
OK
=
0
,
NodeShutdownInProgress
=
1
,
SystemShutdownInProgress
=
2
,
NodeShutdownWouldCauseSystemCrash
=
3
NodeShutdownWouldCauseSystemCrash
=
3
,
TransactionAbortFailed
=
4
};
public:
...
...
ndb/src/common/debugger/EventLogger.cpp
View file @
c1c2a892
...
...
@@ -105,9 +105,8 @@ const EventLoggerBase::EventRepLogLevelMatrix EventLoggerBase::matrix[] = {
{
EventReport
::
CreateLogBytes
,
LogLevel
::
llInfo
,
11
,
Logger
::
LL_INFO
},
{
EventReport
::
InfoEvent
,
LogLevel
::
llInfo
,
2
,
Logger
::
LL_INFO
},
//Global replication
{
EventReport
::
GrepSubscriptionInfo
,
LogLevel
::
llGrep
,
7
,
Logger
::
LL_INFO
},
{
EventReport
::
GrepSubscriptionAlert
,
LogLevel
::
llGrep
,
7
,
Logger
::
LL_ALERT
},
//Single User
{
EventReport
::
SingleUser
,
LogLevel
::
llInfo
,
7
,
Logger
::
LL_INFO
},
// Backup
{
EventReport
::
BackupStarted
,
LogLevel
::
llBackup
,
7
,
Logger
::
LL_INFO
},
...
...
@@ -800,473 +799,29 @@ EventLogger::getText(char * m_text, size_t m_text_len,
);
break
;
}
case
EventReport
:
:
GrepSubscriptionInfo
:
case
EventReport
:
:
SingleUser
:
{
GrepEvent
::
Subscription
event
=
(
GrepEvent
::
Subscription
)
theData
[
1
];
switch
(
event
)
{
case
GrepEvent
:
:
GrepSS_CreateSubIdConf
:
switch
(
theData
[
1
])
{
const
int
subId
=
theData
[
2
];
const
int
subKey
=
theData
[
3
];
const
int
err
=
theData
[
4
];
BaseString
::
snprintf
(
m_text
,
m_text_len
,
"Grep::SSCoord: Created subscription id"
" (subId=%d,SubKey=%d)"
" Return code: %d."
,
subId
,
subKey
,
err
);
break
;
}
case
GrepEvent
:
:
GrepPS_CreateSubIdConf
:
{
const
int
subId
=
theData
[
2
];
const
int
subKey
=
theData
[
3
];
const
int
err
=
theData
[
4
];
BaseString
::
snprintf
(
m_text
,
m_text_len
,
"Grep::PSCoord: Created subscription id"
" (subId=%d,SubKey=%d)"
" Return code: %d."
,
subId
,
subKey
,
err
);
break
;
}
case
GrepEvent
:
:
GrepSS_SubCreateConf
:
{
const
int
subId
=
theData
[
2
];
const
int
subKey
=
theData
[
3
];
const
int
err
=
theData
[
4
];
const
int
nodegrp
=
theData
[
5
];
BaseString
::
snprintf
(
m_text
,
m_text_len
,
"Grep::SSCoord: Created subscription using"
" (subId=%d,SubKey=%d)"
" in primary system. Primary system has %d nodegroup(s)."
" Return code: %d"
,
subId
,
subKey
,
nodegrp
,
err
);
break
;
}
case
GrepEvent
:
:
GrepPS_SubCreateConf
:
{
const
int
subId
=
theData
[
2
];
const
int
subKey
=
theData
[
3
];
const
int
err
=
theData
[
4
];
BaseString
::
snprintf
(
m_text
,
m_text_len
,
"Grep::PSCoord: All participants have created "
"subscriptions"
" using (subId=%d,SubKey=%d)."
" Return code: %d"
,
subId
,
subKey
,
err
);
break
;
}
case
GrepEvent
:
:
GrepSS_SubStartMetaConf
:
{
const
int
subId
=
theData
[
2
];
const
int
subKey
=
theData
[
3
];
const
int
err
=
theData
[
4
];
BaseString
::
snprintf
(
m_text
,
m_text_len
,
"Grep::SSCoord: Logging started on meta data changes."
" using (subId=%d,SubKey=%d)"
" Return code: %d"
,
subId
,
subKey
,
err
);
break
;
}
case
GrepEvent
:
:
GrepPS_SubStartMetaConf
:
{
const
int
subId
=
theData
[
2
];
const
int
subKey
=
theData
[
3
];
const
int
err
=
theData
[
4
];
BaseString
::
snprintf
(
m_text
,
m_text_len
,
"Grep::PSCoord: All participants have started "
"logging meta data"
" changes on the subscription subId=%d,SubKey=%d) "
"(N.I yet)."
" Return code: %d"
,
subId
,
subKey
,
err
);
break
;
}
case
GrepEvent
:
:
GrepSS_SubStartDataConf
:
{
const
int
subId
=
theData
[
2
];
const
int
subKey
=
theData
[
3
];
const
int
err
=
theData
[
4
];
BaseString
::
snprintf
(
m_text
,
m_text_len
,
"Grep::SSCoord: Logging started on table data changes "
" using (subId=%d,SubKey=%d)"
" Return code: %d"
,
subId
,
subKey
,
err
);
break
;
}
case
GrepEvent
:
:
GrepPS_SubStartDataConf
:
{
const
int
subId
=
theData
[
2
];
const
int
subKey
=
theData
[
3
];
const
int
err
=
theData
[
4
];
BaseString
::
snprintf
(
m_text
,
m_text_len
,
"Grep::PSCoord: All participants have started logging "
"table data changes on the subscription "
"subId=%d,SubKey=%d)."
" Return code: %d"
,
subId
,
subKey
,
err
);
break
;
}
case
GrepEvent
:
:
GrepPS_SubSyncMetaConf
:
{
const
int
subId
=
theData
[
2
];
const
int
subKey
=
theData
[
3
];
const
int
err
=
theData
[
4
];
BaseString
::
snprintf
(
m_text
,
m_text_len
,
"Grep::PSCoord: All participants have started "
" synchronization on meta data (META SCAN) using "
"(subId=%d,SubKey=%d)."
" Return code: %d"
,
subId
,
subKey
,
err
);
break
;
}
case
GrepEvent
:
:
GrepSS_SubSyncMetaConf
:
{
const
int
subId
=
theData
[
2
];
const
int
subKey
=
theData
[
3
];
const
int
err
=
theData
[
4
];
BaseString
::
snprintf
(
m_text
,
m_text_len
,
"Grep::SSCoord: Synchronization started (META SCAN) on "
" meta data using (subId=%d,SubKey=%d)"
" Return code: %d"
,
subId
,
subKey
,
err
);
break
;
}
case
GrepEvent
:
:
GrepPS_SubSyncDataConf
:
{
const
int
subId
=
theData
[
2
];
const
int
subKey
=
theData
[
3
];
const
int
err
=
theData
[
4
];
BaseString
::
snprintf
(
m_text
,
m_text_len
,
"Grep::PSCoord: All participants have started "
"synchronization "
" on table data (DATA SCAN) using (subId=%d,SubKey=%d)."
" Return code: %d"
,
subId
,
subKey
,
err
);
break
;
}
case
GrepEvent
:
:
GrepSS_SubSyncDataConf
:
{
const
int
subId
=
theData
[
2
];
const
int
subKey
=
theData
[
3
];
const
int
err
=
theData
[
4
];
const
int
gci
=
theData
[
5
];
case
0
:
BaseString
::
snprintf
(
m_text
,
m_text_len
,
"Grep::SSCoord: Synchronization started (DATA SCAN) on "
"table data using (subId=%d,SubKey=%d). GCI = %d"
" Return code: %d"
,
subId
,
subKey
,
gci
,
err
);
"%sEntering single user mode"
,
theNodeId
);
break
;
}
case
GrepEvent
:
:
GrepPS_SubRemoveConf
:
{
const
int
subId
=
theData
[
2
];
const
int
subKey
=
theData
[
3
];
const
int
err
=
theData
[
4
];
case
1
:
BaseString
::
snprintf
(
m_text
,
m_text_len
,
"Grep::PSCoord: All participants have removed "
"subscription (subId=%d,SubKey=%d). I have cleaned "
"up resources I've used."
" Return code: %d"
,
subId
,
subKey
,
err
);
"%sEntered single user mode %d"
,
theNodeId
,
theData
[
2
]);
break
;
}
case
GrepEvent
:
:
GrepSS_SubRemoveConf
:
{
const
int
subId
=
theData
[
2
];
const
int
subKey
=
theData
[
3
];
const
int
err
=
theData
[
4
];
case
2
:
BaseString
::
snprintf
(
m_text
,
m_text_len
,
"Grep::SSCoord: Removed subscription "
"(subId=%d,SubKey=%d)"
" Return code: %d"
,
subId
,
subKey
,
err
);
"%sExiting single user mode"
,
theNodeId
);
break
;
}
default:
BaseString
::
snprintf
(
m_text
,
m_text_len
,
"%sUnknown GrepSubscriptonInfo event: %d"
,
theNodeId
,
theData
[
1
]);
}
break
;
}
case
EventReport
:
:
GrepSubscriptionAlert
:
{
GrepEvent
::
Subscription
event
=
(
GrepEvent
::
Subscription
)
theData
[
1
];
switch
(
event
)
{
case
GrepEvent
:
:
GrepSS_CreateSubIdRef
:
{
const
int
subId
=
theData
[
2
];
const
int
subKey
=
theData
[
3
];
const
int
err
=
theData
[
4
];
BaseString
::
snprintf
(
m_text
,
m_text_len
,
"Grep::SSCoord:Error code: %d Error message: %s"
" (subId=%d,SubKey=%d)"
,
err
,
GrepError
::
getErrorDesc
((
GrepError
::
GE_Code
)
err
),
subId
,
subKey
);
break
;
}
case
GrepEvent
:
:
GrepSS_SubCreateRef
:
{
const
int
subId
=
theData
[
2
];
const
int
subKey
=
theData
[
3
];
const
int
err
=
theData
[
4
];
BaseString
::
snprintf
(
m_text
,
m_text_len
,
"Grep::SSCoord: FAILED to Created subscription using"
" (subId=%d,SubKey=%d)in primary system."
" Error code: %d Error Message: %s"
,
subId
,
subKey
,
err
,
GrepError
::
getErrorDesc
((
GrepError
::
GE_Code
)
err
));
break
;
}
case
GrepEvent
:
:
GrepSS_SubStartMetaRef
:
{
const
int
subId
=
theData
[
2
];
const
int
subKey
=
theData
[
3
];
const
int
err
=
theData
[
4
];
BaseString
::
snprintf
(
m_text
,
m_text_len
,
"Grep::SSCoord: Logging failed to start on meta "
"data changes."
" using (subId=%d,SubKey=%d)"
" Error code: %d Error Message: %s"
,
subId
,
subKey
,
err
,
GrepError
::
getErrorDesc
((
GrepError
::
GE_Code
)
err
));
break
;
}
case
GrepEvent
:
:
GrepSS_SubStartDataRef
:
{
const
int
subId
=
theData
[
2
];
const
int
subKey
=
theData
[
3
];
const
int
err
=
theData
[
4
];
BaseString
::
snprintf
(
m_text
,
m_text_len
,
"Grep::SSCoord: Logging FAILED to start on table data "
" changes using (subId=%d,SubKey=%d)"
" Error code: %d Error Message: %s"
,
subId
,
subKey
,
err
,
GrepError
::
getErrorDesc
((
GrepError
::
GE_Code
)
err
));
break
;
}
case
GrepEvent
:
:
GrepSS_SubSyncMetaRef
:
{
const
int
subId
=
theData
[
2
];
const
int
subKey
=
theData
[
3
];
const
int
err
=
theData
[
4
];
BaseString
::
snprintf
(
m_text
,
m_text_len
,
"Grep::SSCoord: Synchronization FAILED (META SCAN) on "
" meta data using (subId=%d,SubKey=%d)"
" Error code: %d Error Message: %s"
,
subId
,
subKey
,
err
,
GrepError
::
getErrorDesc
((
GrepError
::
GE_Code
)
err
));
break
;
}
case
GrepEvent
:
:
GrepSS_SubSyncDataRef
:
{
const
int
subId
=
theData
[
2
];
const
int
subKey
=
theData
[
3
];
const
int
err
=
theData
[
4
];
const
int
gci
=
theData
[
5
];
BaseString
::
snprintf
(
m_text
,
m_text_len
,
"Grep::SSCoord: Synchronization FAILED (DATA SCAN) on "
"table data using (subId=%d,SubKey=%d). GCI = %d"
" Error code: %d Error Message: %s"
,
subId
,
subKey
,
gci
,
err
,
GrepError
::
getErrorDesc
((
GrepError
::
GE_Code
)
err
));
"%sUnknown single user report %d"
,
theNodeId
,
theData
[
1
]);
break
;
}
case
GrepEvent
:
:
GrepSS_SubRemoveRef
:
{
const
int
subId
=
theData
[
2
];
const
int
subKey
=
theData
[
3
];
const
int
err
=
theData
[
4
];
BaseString
::
snprintf
(
m_text
,
m_text_len
,
"Grep::SSCoord: Failed to remove subscription "
"(subId=%d,SubKey=%d). "
" Error code: %d Error Message: %s"
,
subId
,
subKey
,
err
,
GrepError
::
getErrorDesc
((
GrepError
::
GE_Code
)
err
)
);
break
;
}
case
GrepEvent
:
:
GrepPS_CreateSubIdRef
:
{
const
int
subId
=
theData
[
2
];
const
int
subKey
=
theData
[
3
];
const
int
err
=
theData
[
4
];
BaseString
::
snprintf
(
m_text
,
m_text_len
,
"Grep::PSCoord: Error code: %d Error Message: %s"
" (subId=%d,SubKey=%d)"
,
err
,
GrepError
::
getErrorDesc
((
GrepError
::
GE_Code
)
err
),
subId
,
subKey
);
break
;
}
case
GrepEvent
:
:
GrepPS_SubCreateRef
:
{
const
int
subId
=
theData
[
2
];
const
int
subKey
=
theData
[
3
];
const
int
err
=
theData
[
4
];
BaseString
::
snprintf
(
m_text
,
m_text_len
,
"Grep::PSCoord: FAILED to Created subscription using"
" (subId=%d,SubKey=%d)in primary system."
" Error code: %d Error Message: %s"
,
subId
,
subKey
,
err
,
GrepError
::
getErrorDesc
((
GrepError
::
GE_Code
)
err
));
break
;
}
case
GrepEvent
:
:
GrepPS_SubStartMetaRef
:
{
const
int
subId
=
theData
[
2
];
const
int
subKey
=
theData
[
3
];
const
int
err
=
theData
[
4
];
BaseString
::
snprintf
(
m_text
,
m_text_len
,
"Grep::PSCoord: Logging failed to start on meta "
"data changes."
" using (subId=%d,SubKey=%d)"
" Error code: %d Error Message: %s"
,
subId
,
subKey
,
err
,
GrepError
::
getErrorDesc
((
GrepError
::
GE_Code
)
err
));
break
;
}
case
GrepEvent
:
:
GrepPS_SubStartDataRef
:
{
const
int
subId
=
theData
[
2
];
const
int
subKey
=
theData
[
3
];
const
int
err
=
theData
[
4
];
BaseString
::
snprintf
(
m_text
,
m_text_len
,
"Grep::PSCoord: Logging FAILED to start on table data "
" changes using (subId=%d,SubKey=%d)"
" Error code: %d Error Message: %s"
,
subId
,
subKey
,
err
,
GrepError
::
getErrorDesc
((
GrepError
::
GE_Code
)
err
));
break
;
}
case
GrepEvent
:
:
GrepPS_SubSyncMetaRef
:
{
const
int
subId
=
theData
[
2
];
const
int
subKey
=
theData
[
3
];
const
int
err
=
theData
[
4
];
BaseString
::
snprintf
(
m_text
,
m_text_len
,
"Grep::PSCoord: Synchronization FAILED (META SCAN) on "
" meta data using (subId=%d,SubKey=%d)"
" Error code: %d Error Message: %s"
,
subId
,
subKey
,
err
,
GrepError
::
getErrorDesc
((
GrepError
::
GE_Code
)
err
));
break
;
}
case
GrepEvent
:
:
GrepPS_SubSyncDataRef
:
{
const
int
subId
=
theData
[
2
];
const
int
subKey
=
theData
[
3
];
const
int
err
=
theData
[
4
];
const
int
gci
=
theData
[
5
];
BaseString
::
snprintf
(
m_text
,
m_text_len
,
"Grep::PSCoord: Synchronization FAILED (DATA SCAN) on "
"table data using (subId=%d,SubKey=%d). GCI = %d. "
" Error code: %d Error Message: %s"
,
subId
,
subKey
,
gci
,
err
,
GrepError
::
getErrorDesc
((
GrepError
::
GE_Code
)
err
));
break
;
}
case
GrepEvent
:
:
GrepPS_SubRemoveRef
:
{
const
int
subId
=
theData
[
2
];
const
int
subKey
=
theData
[
3
];
const
int
err
=
theData
[
4
];
BaseString
::
snprintf
(
m_text
,
m_text_len
,
"Grep::PSCoord: Failed to remove subscription "
"(subId=%d,SubKey=%d)."
" Error code: %d Error Message: %s"
,
subId
,
subKey
,
err
,
GrepError
::
getErrorDesc
((
GrepError
::
GE_Code
)
err
));
break
;
}
case
GrepEvent
:
:
Rep_Disconnect
:
{
const
int
err
=
theData
[
4
];
const
int
nodeId
=
theData
[
5
];
BaseString
::
snprintf
(
m_text
,
m_text_len
,
"Rep: Node %d."
" Error code: %d Error Message: %s"
,
nodeId
,
err
,
GrepError
::
getErrorDesc
((
GrepError
::
GE_Code
)
err
));
break
;
}
default:
BaseString
::
snprintf
(
m_text
,
m_text_len
,
"%sUnknown GrepSubscriptionAlert event: %d"
,
theNodeId
,
theData
[
1
]);
break
;
}
break
;
}
case
EventReport
:
:
BackupStarted
:
BaseString
::
snprintf
(
m_text
,
m_text_len
,
...
...
ndb/src/kernel/blocks/ndbcntr/NdbcntrMain.cpp
View file @
c1c2a892
...
...
@@ -1966,6 +1966,11 @@ Ndbcntr::execRESUME_REQ(Signal* signal){
//ResumeRef * const ref = (ResumeRef *)&signal->theData[0];
jamEntry
();
signal
->
theData
[
0
]
=
EventReport
::
SingleUser
;
signal
->
theData
[
1
]
=
2
;
sendSignal
(
CMVMI_REF
,
GSN_EVENT_REP
,
signal
,
2
,
JBB
);
//Uint32 senderData = req->senderData;
//BlockReference senderRef = req->senderRef;
NodeState
newState
(
NodeState
::
SL_STARTED
);
...
...
@@ -2004,12 +2009,11 @@ Ndbcntr::execSTOP_REQ(Signal* signal){
return
;
}
if
(
c_stopRec
.
stopReq
.
senderRef
!=
0
&&
!
singleuser
){
jam
();
if
(
c_stopRec
.
stopReq
.
senderRef
!=
0
){
/**
* Requested a system shutdown
*/
if
(
StopReq
::
getSystemStop
(
req
->
requestInfo
)){
if
(
!
singleuser
&&
StopReq
::
getSystemStop
(
req
->
requestInfo
)){
jam
();
sendSignalWithDelay
(
reference
(),
GSN_STOP_REQ
,
signal
,
100
,
StopReq
::
SignalLength
);
...
...
@@ -2031,22 +2035,27 @@ Ndbcntr::execSTOP_REQ(Signal* signal){
c_stopRec
.
stopReq
=
*
req
;
c_stopRec
.
stopInitiatedTime
=
NdbTick_CurrentMillisecond
();
if
(
StopReq
::
getSystemStop
(
c_stopRec
.
stopReq
.
requestInfo
)
&&
!
singleuser
)
{
if
(
!
singleuser
)
{
if
(
StopReq
::
getSystemStop
(
c_stopRec
.
stopReq
.
requestInfo
))
{
jam
();
if
(
StopReq
::
getPerformRestart
(
c_stopRec
.
stopReq
.
requestInfo
)){
((
Configuration
&
)
theConfiguration
).
stopOnError
(
false
);
}
}
if
(
!
singleuser
)
{
if
(
!
c_stopRec
.
checkNodeFail
(
signal
)){
jam
();
return
;
}
}
signal
->
theData
[
0
]
=
EventReport
::
NDBStopStarted
;
signal
->
theData
[
1
]
=
StopReq
::
getSystemStop
(
c_stopRec
.
stopReq
.
requestInfo
)
?
1
:
0
;
sendSignal
(
CMVMI_REF
,
GSN_EVENT_REP
,
signal
,
2
,
JBB
);
}
else
{
signal
->
theData
[
0
]
=
EventReport
::
SingleUser
;
signal
->
theData
[
1
]
=
0
;
sendSignal
(
CMVMI_REF
,
GSN_EVENT_REP
,
signal
,
2
,
JBB
);
}
NodeState
newState
(
NodeState
::
SL_STOPPING_1
,
StopReq
::
getSystemStop
(
c_stopRec
.
stopReq
.
requestInfo
));
...
...
@@ -2129,9 +2138,11 @@ Ndbcntr::StopRecord::checkNodeFail(Signal* signal){
stopReq
.
senderRef
=
0
;
if
(
cntr
.
getNodeState
().
startLevel
!=
NodeState
::
SL_SINGLEUSER
)
{
NodeState
newState
(
NodeState
::
SL_STARTED
);
cntr
.
updateNodeState
(
signal
,
newState
);
}
signal
->
theData
[
0
]
=
EventReport
::
NDBStopAborted
;
cntr
.
sendSignal
(
CMVMI_REF
,
GSN_EVENT_REP
,
signal
,
1
,
JBB
);
...
...
@@ -2227,12 +2238,24 @@ void Ndbcntr::execABORT_ALL_CONF(Signal* signal){
jamEntry
();
if
(
c_stopRec
.
stopReq
.
singleuser
)
{
jam
();
NodeState
newState
(
NodeState
::
SL_SINGLEUSER
);
newState
.
setSingleUser
(
true
);
newState
.
setSingleUserApi
(
c_stopRec
.
stopReq
.
singleUserApi
);
updateNodeState
(
signal
,
newState
);
c_stopRec
.
stopInitiatedTime
=
NdbTick_CurrentMillisecond
();
StopConf
*
const
stopConf
=
(
StopConf
*
)
&
signal
->
theData
[
0
];
stopConf
->
senderData
=
c_stopRec
.
stopReq
.
senderData
;
stopConf
->
nodeState
=
(
Uint32
)
NodeState
::
SL_SINGLEUSER
;
sendSignal
(
c_stopRec
.
stopReq
.
senderRef
,
GSN_STOP_CONF
,
signal
,
StopConf
::
SignalLength
,
JBB
);
c_stopRec
.
stopReq
.
senderRef
=
0
;
// the command is done
signal
->
theData
[
0
]
=
EventReport
::
SingleUser
;
signal
->
theData
[
1
]
=
1
;
signal
->
theData
[
2
]
=
c_stopRec
.
stopReq
.
singleUserApi
;
sendSignal
(
CMVMI_REF
,
GSN_EVENT_REP
,
signal
,
3
,
JBB
);
}
else
{
...
...
@@ -2250,7 +2273,13 @@ void Ndbcntr::execABORT_ALL_CONF(Signal* signal){
void
Ndbcntr
::
execABORT_ALL_REF
(
Signal
*
signal
){
jamEntry
();
ndbrequire
(
false
);
AbortAllRef
*
abortAllRef
=
(
AbortAllRef
*
)
&
signal
->
theData
[
0
];
AbortAllRef
::
ErrorCode
errorCode
=
(
AbortAllRef
::
ErrorCode
)
abortAllRef
->
errorCode
;
StopRef
*
const
stopRef
=
(
StopRef
*
)
&
signal
->
theData
[
0
];
stopRef
->
senderData
=
c_stopRec
.
stopReq
.
senderData
;
stopRef
->
errorCode
=
StopRef
::
TransactionAbortFailed
;
sendSignal
(
c_stopRec
.
stopReq
.
senderRef
,
GSN_STOP_REF
,
signal
,
StopRef
::
SignalLength
,
JBB
);
}
void
...
...
ndb/src/mgmclient/CommandInterpreter.cpp
View file @
c1c2a892
...
...
@@ -1430,9 +1430,8 @@ CommandInterpreter::executeEnterSingleUser(char* parameters)
ndbout_c
(
"Entering single user mode for node %d failed"
,
nodeId
);
printError
();
}
else
{
ndbout_c
(
"Entering single user mode"
);
ndbout_c
(
"Access will be granted for API node %d only."
,
nodeId
);
ndbout_c
(
"Use ALL STATUS to see when single user mode has been entered."
);
ndbout_c
(
"Single user mode entered"
);
ndbout_c
(
"Access is granted for API node %d only."
,
nodeId
);
}
}
...
...
@@ -1445,7 +1444,7 @@ CommandInterpreter::executeExitSingleUser(char* parameters)
printError
();
}
else
{
ndbout_c
(
"Exiting single user mode in progress."
);
ndbout_c
(
"Use ALL STATUS to see when single user mode has been exited."
);
ndbout_c
(
"Use ALL STATUS
or SHOW
to see when single user mode has been exited."
);
}
}
...
...
ndb/src/mgmsrv/MgmtSrvr.cpp
View file @
c1c2a892
...
...
@@ -67,6 +67,16 @@
#define DEBUG(x)
#endif
#define INIT_SIGNAL_SENDER(ss,nodeId) \
SignalSender ss(theFacade); \
ss.lock();
/* lock will be released on exit */
\
{\
int result = okToSendTo(nodeId, true);\
if (result != 0) {\
return result;\
}\
}
extern
int
global_flag_send_heartbeat_now
;
extern
int
g_no_nodeid_checks
;
extern
my_bool
opt_core
;
...
...
@@ -90,55 +100,6 @@ MgmtSrvr::logLevelThread_C(void* m)
return
0
;
}
void
*
MgmtSrvr
::
signalRecvThread_C
(
void
*
m
)
{
MgmtSrvr
*
mgm
=
(
MgmtSrvr
*
)
m
;
mgm
->
signalRecvThreadRun
();
return
0
;
}
class
SigMatch
{
public:
int
gsn
;
void
(
MgmtSrvr
::*
function
)(
NdbApiSignal
*
signal
);
SigMatch
()
{
gsn
=
0
;
function
=
NULL
;
};
SigMatch
(
int
_gsn
,
void
(
MgmtSrvr
::*
_function
)(
NdbApiSignal
*
signal
))
{
gsn
=
_gsn
;
function
=
_function
;
};
bool
check
(
NdbApiSignal
*
signal
)
{
if
(
signal
->
readSignalNumber
()
==
gsn
)
return
true
;
return
false
;
};
};
void
MgmtSrvr
::
signalRecvThreadRun
()
{
Vector
<
SigMatch
>
siglist
;
siglist
.
push_back
(
SigMatch
(
GSN_MGM_LOCK_CONFIG_REQ
,
&
MgmtSrvr
::
handle_MGM_LOCK_CONFIG_REQ
));
siglist
.
push_back
(
SigMatch
(
GSN_MGM_UNLOCK_CONFIG_REQ
,
&
MgmtSrvr
::
handle_MGM_UNLOCK_CONFIG_REQ
));
while
(
!
_isStopThread
)
{
SigMatch
*
handler
=
NULL
;
NdbApiSignal
*
signal
=
NULL
;
if
(
m_signalRecvQueue
.
waitFor
(
siglist
,
&
handler
,
&
signal
,
DEFAULT_TIMEOUT
))
{
if
(
handler
->
function
!=
0
)
(
this
->*
handler
->
function
)(
signal
);
}
}
}
extern
EventLogger
g_eventLogger
;
static
NdbOut
&
...
...
@@ -427,7 +388,6 @@ MgmtSrvr::MgmtSrvr(SocketServer *socket_server,
_isStopThread
=
false
;
_logLevelThread
=
NULL
;
_logLevelThreadSleep
=
500
;
m_signalRecvThread
=
NULL
;
theFacade
=
0
;
...
...
@@ -636,12 +596,6 @@ MgmtSrvr::start(BaseString &error_string)
"MgmtSrvr_Loglevel"
,
NDB_THREAD_PRIO_LOW
);
m_signalRecvThread
=
NdbThread_Create
(
signalRecvThread_C
,
(
void
**
)
this
,
32768
,
"MgmtSrvr_Service"
,
NDB_THREAD_PRIO_LOW
);
DBUG_RETURN
(
true
);
}
...
...
@@ -650,10 +604,6 @@ MgmtSrvr::start(BaseString &error_string)
//****************************************************************************
MgmtSrvr
::~
MgmtSrvr
()
{
while
(
theSignalIdleList
!=
NULL
)
{
freeSignal
();
}
if
(
theFacade
!=
0
){
theFacade
->
stop_instance
();
delete
theFacade
;
...
...
@@ -681,10 +631,6 @@ MgmtSrvr::~MgmtSrvr()
NdbThread_Destroy
(
&
_logLevelThread
);
}
if
(
m_signalRecvThread
!=
NULL
)
{
NdbThread_WaitFor
(
m_signalRecvThread
,
&
res
);
NdbThread_Destroy
(
&
m_signalRecvThread
);
}
if
(
m_config_retriever
)
delete
m_config_retriever
;
}
...
...
@@ -692,21 +638,21 @@ MgmtSrvr::~MgmtSrvr()
//****************************************************************************
//****************************************************************************
int
MgmtSrvr
::
okToSendTo
(
NodeId
process
Id
,
bool
unCond
)
int
MgmtSrvr
::
okToSendTo
(
NodeId
node
Id
,
bool
unCond
)
{
if
(
process
Id
==
0
)
if
(
node
Id
==
0
)
return
0
;
if
(
getNodeType
(
process
Id
)
!=
NDB_MGM_NODE_TYPE_NDB
)
if
(
getNodeType
(
node
Id
)
!=
NDB_MGM_NODE_TYPE_NDB
)
return
WRONG_PROCESS_TYPE
;
// Check if we have contact with it
if
(
unCond
){
if
(
theFacade
->
theClusterMgr
->
getNodeInfo
(
process
Id
).
connected
)
if
(
theFacade
->
theClusterMgr
->
getNodeInfo
(
node
Id
).
connected
)
return
0
;
return
NO_CONTACT_WITH_PROCESS
;
}
if
(
theFacade
->
get_node_alive
(
process
Id
)
==
0
)
{
if
(
theFacade
->
get_node_alive
(
node
Id
)
==
0
)
{
return
NO_CONTACT_WITH_PROCESS
;
}
else
{
return
0
;
...
...
@@ -727,259 +673,16 @@ void report_unknown_signal(SimpleSignal *signal)
****************************************************************************/
int
MgmtSrvr
::
start
(
int
process
Id
)
MgmtSrvr
::
start
(
int
node
Id
)
{
int
result
;
result
=
okToSendTo
(
processId
,
true
);
if
(
result
!=
0
)
{
return
result
;
}
NdbApiSignal
*
signal
=
getSignal
();
if
(
signal
==
NULL
)
{
return
COULD_NOT_ALLOCATE_MEMORY
;
}
StartOrd
*
const
startOrd
=
CAST_PTR
(
StartOrd
,
signal
->
getDataPtrSend
());
signal
->
set
(
TestOrd
::
TraceAPI
,
CMVMI
,
GSN_START_ORD
,
StartOrd
::
SignalLength
);
INIT_SIGNAL_SENDER
(
ss
,
nodeId
);
SimpleSignal
ssig
;
StartOrd
*
const
startOrd
=
CAST_PTR
(
StartOrd
,
ssig
.
getDataPtrSend
());
ssig
.
set
(
ss
,
TestOrd
::
TraceAPI
,
CMVMI
,
GSN_START_ORD
,
StartOrd
::
SignalLength
);
startOrd
->
restartInfo
=
0
;
result
=
sendSignal
(
processId
,
NO_WAIT
,
signal
,
true
);
if
(
result
==
-
1
)
{
return
SEND_OR_RECEIVE_FAILED
;
}
return
0
;
}
/**
* Restart one database node
*/
int
MgmtSrvr
::
restartNode
(
int
processId
,
bool
nostart
,
bool
initalStart
,
bool
abort
,
StopCallback
callback
,
void
*
anyData
)
{
int
result
;
if
(
m_stopRec
.
singleUserMode
)
return
5060
;
if
(
m_stopRec
.
inUse
){
return
5029
;
}
result
=
okToSendTo
(
processId
,
true
);
if
(
result
!=
0
)
{
return
result
;
}
NdbApiSignal
*
signal
=
getSignal
();
if
(
signal
==
NULL
)
{
return
COULD_NOT_ALLOCATE_MEMORY
;
}
StopReq
*
const
stopReq
=
CAST_PTR
(
StopReq
,
signal
->
getDataPtrSend
());
signal
->
set
(
TestOrd
::
TraceAPI
,
NDBCNTR
,
GSN_STOP_REQ
,
StopReq
::
SignalLength
);
stopReq
->
requestInfo
=
0
;
StopReq
::
setSystemStop
(
stopReq
->
requestInfo
,
false
);
StopReq
::
setPerformRestart
(
stopReq
->
requestInfo
,
true
);
StopReq
::
setNoStart
(
stopReq
->
requestInfo
,
nostart
);
StopReq
::
setInitialStart
(
stopReq
->
requestInfo
,
initalStart
);
StopReq
::
setStopAbort
(
stopReq
->
requestInfo
,
abort
);
stopReq
->
singleuser
=
0
;
stopReq
->
apiTimeout
=
5000
;
stopReq
->
transactionTimeout
=
1000
;
stopReq
->
readOperationTimeout
=
1000
;
stopReq
->
operationTimeout
=
1000
;
stopReq
->
senderData
=
12
;
stopReq
->
senderRef
=
_ownReference
;
m_stopRec
.
singleUserMode
=
false
;
m_stopRec
.
sentCount
=
1
;
m_stopRec
.
reply
=
0
;
m_stopRec
.
nodeId
=
processId
;
m_stopRec
.
anyData
=
anyData
;
m_stopRec
.
callback
=
callback
;
m_stopRec
.
inUse
=
true
;
if
(
callback
==
NULL
){
Uint32
timeOut
=
0
;
timeOut
+=
stopReq
->
apiTimeout
;
timeOut
+=
stopReq
->
transactionTimeout
;
timeOut
+=
stopReq
->
readOperationTimeout
;
timeOut
+=
stopReq
->
operationTimeout
;
timeOut
*=
3
;
result
=
sendRecSignal
(
processId
,
WAIT_STOP
,
signal
,
true
,
timeOut
);
}
else
{
result
=
sendSignal
(
processId
,
NO_WAIT
,
signal
,
true
);
}
if
(
result
==
-
1
&&
theWaitState
!=
WAIT_NODEFAILURE
)
{
m_stopRec
.
inUse
=
false
;
return
SEND_OR_RECEIVE_FAILED
;
}
if
(
callback
==
0
){
m_stopRec
.
inUse
=
false
;
return
m_stopRec
.
reply
;
}
else
{
return
0
;
}
}
/**
* Restart all database nodes
*/
int
MgmtSrvr
::
restart
(
bool
nostart
,
bool
initalStart
,
bool
abort
,
int
*
stopCount
,
StopCallback
callback
,
void
*
anyData
)
{
if
(
m_stopRec
.
singleUserMode
)
return
5060
;
if
(
m_stopRec
.
inUse
){
return
5029
;
}
m_stopRec
.
singleUserMode
=
false
;
m_stopRec
.
sentCount
=
0
;
m_stopRec
.
reply
=
0
;
m_stopRec
.
nodeId
=
0
;
m_stopRec
.
anyData
=
anyData
;
m_stopRec
.
callback
=
callback
;
m_stopRec
.
inUse
=
true
;
/**
* Restart all database nodes into idle ("no-started") state
*/
Uint32
timeOut
=
0
;
NodeId
nodeId
=
0
;
NodeBitmask
nodes
;
while
(
getNextNodeId
(
&
nodeId
,
NDB_MGM_NODE_TYPE_NDB
)){
if
(
okToSendTo
(
nodeId
,
true
)
==
0
){
NdbApiSignal
*
signal
=
getSignal
();
if
(
signal
==
NULL
)
{
return
COULD_NOT_ALLOCATE_MEMORY
;
}
StopReq
*
const
stopReq
=
CAST_PTR
(
StopReq
,
signal
->
getDataPtrSend
());
signal
->
set
(
TestOrd
::
TraceAPI
,
NDBCNTR
,
GSN_STOP_REQ
,
StopReq
::
SignalLength
);
stopReq
->
requestInfo
=
0
;
stopReq
->
singleuser
=
0
;
StopReq
::
setSystemStop
(
stopReq
->
requestInfo
,
true
);
StopReq
::
setPerformRestart
(
stopReq
->
requestInfo
,
true
);
if
(
callback
==
0
)
{
// Start node in idle ("no-started") state
StopReq
::
setNoStart
(
stopReq
->
requestInfo
,
1
);
}
else
{
StopReq
::
setNoStart
(
stopReq
->
requestInfo
,
nostart
);
}
StopReq
::
setInitialStart
(
stopReq
->
requestInfo
,
initalStart
);
StopReq
::
setStopAbort
(
stopReq
->
requestInfo
,
abort
);
stopReq
->
apiTimeout
=
5000
;
stopReq
->
transactionTimeout
=
1000
;
stopReq
->
readOperationTimeout
=
1000
;
stopReq
->
operationTimeout
=
1000
;
stopReq
->
senderData
=
12
;
stopReq
->
senderRef
=
_ownReference
;
timeOut
+=
stopReq
->
apiTimeout
;
timeOut
+=
stopReq
->
transactionTimeout
;
timeOut
+=
stopReq
->
readOperationTimeout
;
timeOut
+=
stopReq
->
operationTimeout
;
timeOut
*=
3
;
m_stopRec
.
sentCount
++
;
int
res
;
if
(
callback
==
0
){
res
=
sendSignal
(
nodeId
,
WAIT_STOP
,
signal
,
true
);
}
else
{
res
=
sendSignal
(
nodeId
,
NO_WAIT
,
signal
,
true
);
}
if
(
res
!=
-
1
){
nodes
.
set
(
nodeId
);
}
}
}
if
(
stopCount
!=
0
){
*
stopCount
=
m_stopRec
.
sentCount
;
}
if
(
m_stopRec
.
sentCount
==
0
){
m_stopRec
.
inUse
=
false
;
return
0
;
}
if
(
callback
!=
0
){
return
0
;
}
theFacade
->
lock_mutex
();
int
waitTime
=
timeOut
/
m_stopRec
.
sentCount
;
if
(
receiveOptimisedResponse
(
waitTime
)
!=
0
)
{
m_stopRec
.
inUse
=
false
;
return
-
1
;
}
/**
* Here all nodes were correctly stopped,
* so we wait for all nodes to be contactable
*/
nodeId
=
0
;
NDB_TICKS
maxTime
=
NdbTick_CurrentMillisecond
()
+
waitTime
;
while
(
getNextNodeId
(
&
nodeId
,
NDB_MGM_NODE_TYPE_NDB
)
&&
nodes
.
get
(
nodeId
))
{
enum
ndb_mgm_node_status
s
;
s
=
NDB_MGM_NODE_STATUS_NO_CONTACT
;
while
(
s
!=
NDB_MGM_NODE_STATUS_NOT_STARTED
&&
waitTime
>
0
)
{
Uint32
startPhase
=
0
,
version
=
0
,
dynamicId
=
0
,
nodeGroup
=
0
;
Uint32
connectCount
=
0
;
bool
system
;
status
(
nodeId
,
&
s
,
&
version
,
&
startPhase
,
&
system
,
&
dynamicId
,
&
nodeGroup
,
&
connectCount
);
NdbSleep_MilliSleep
(
100
);
waitTime
=
(
maxTime
-
NdbTick_CurrentMillisecond
());
}
}
if
(
nostart
){
m_stopRec
.
inUse
=
false
;
return
0
;
}
/**
* Now we start all database nodes (i.e. we make them non-idle)
* We ignore the result we get from the start command.
*/
nodeId
=
0
;
while
(
getNextNodeId
(
&
nodeId
,
NDB_MGM_NODE_TYPE_NDB
)
&&
nodes
.
get
(
nodeId
))
{
int
result
;
result
=
start
(
nodeId
);
DEBUG
(
"Starting node "
<<
nodeId
<<
" with result "
<<
result
);
/**
* Errors from this call are deliberately ignored.
* Maybe the user only wanted to restart a subset of the nodes.
* It is also easy for the user to check which nodes have
* started and which nodes have not.
*
* if (result != 0) {
* m_stopRec.inUse = false;
* return result;
* }
*/
}
m_stopRec
.
inUse
=
false
;
return
0
;
return
ss
.
sendSignal
(
nodeId
,
&
ssig
)
==
SEND_OK
?
0
:
SEND_OR_RECEIVE_FAILED
;
}
/*****************************************************************************
...
...
@@ -987,438 +690,430 @@ MgmtSrvr::restart(bool nostart, bool initalStart, bool abort,
*****************************************************************************/
int
MgmtSrvr
::
versionNode
(
int
processId
,
bool
abort
,
VersionCallback
callback
,
void
*
anyData
)
MgmtSrvr
::
versionNode
(
int
nodeId
,
Uint32
&
version
)
{
int
version
;
if
(
m_versionRec
.
inUse
)
return
OPERATION_IN_PROGRESS
;
m_versionRec
.
callback
=
callback
;
m_versionRec
.
inUse
=
true
;
if
(
getOwnNodeId
()
==
processId
)
version
=
0
;
if
(
getOwnNodeId
()
==
nodeId
)
{
version
=
NDB_VERSION
;
}
else
if
(
getNodeType
(
process
Id
)
==
NDB_MGM_NODE_TYPE_NDB
)
else
if
(
getNodeType
(
node
Id
)
==
NDB_MGM_NODE_TYPE_NDB
)
{
ClusterMgr
::
Node
node
=
theFacade
->
theClusterMgr
->
getNodeInfo
(
process
Id
);
ClusterMgr
::
Node
node
=
theFacade
->
theClusterMgr
->
getNodeInfo
(
node
Id
);
if
(
node
.
connected
)
version
=
node
.
m_info
.
m_version
;
else
version
=
0
;
}
else
if
(
getNodeType
(
process
Id
)
==
NDB_MGM_NODE_TYPE_API
||
getNodeType
(
process
Id
)
==
NDB_MGM_NODE_TYPE_MGM
)
else
if
(
getNodeType
(
node
Id
)
==
NDB_MGM_NODE_TYPE_API
||
getNodeType
(
node
Id
)
==
NDB_MGM_NODE_TYPE_MGM
)
{
return
sendVersionReq
(
processId
);
return
sendVersionReq
(
nodeId
,
version
);
}
else
version
=
0
;
if
(
m_versionRec
.
callback
!=
0
)
m_versionRec
.
callback
(
processId
,
version
,
this
,
0
);
m_versionRec
.
inUse
=
false
;
m_versionRec
.
version
[
processId
]
=
version
;
return
0
;
}
int
MgmtSrvr
::
sendVersionReq
(
int
processId
)
MgmtSrvr
::
sendVersionReq
(
int
v_nodeId
,
Uint32
&
version
)
{
Uint32
ndbnode
=
0
;
int
result
;
for
(
Uint32
i
=
0
;
i
<
MAX_NODES
;
i
++
)
{
if
(
getNodeType
(
i
)
==
NDB_MGM_NODE_TYPE_NDB
)
{
if
(
okToSendTo
(
i
,
true
)
==
0
)
{
ndbnode
=
i
;
break
;
}
}
}
if
(
ndbnode
==
0
)
{
m_versionRec
.
inUse
=
false
;
if
(
m_versionRec
.
callback
!=
0
)
m_versionRec
.
callback
(
processId
,
0
,
this
,
0
);
return
NO_CONTACT_WITH_CLUSTER
;
}
NdbApiSignal
*
signal
=
getSignal
();
if
(
signal
==
NULL
)
{
m_versionRec
.
inUse
=
false
;
if
(
m_versionRec
.
callback
!=
0
)
m_versionRec
.
callback
(
processId
,
0
,
this
,
0
);
return
COULD_NOT_ALLOCATE_MEMORY
;
}
ApiVersionReq
*
req
=
CAST_PTR
(
ApiVersionReq
,
signal
->
getDataPtrSend
());
req
->
senderRef
=
_ownReference
;
req
->
nodeId
=
processId
;
SignalSender
ss
(
theFacade
);
ss
.
lock
();
signal
->
set
(
TestOrd
::
TraceAPI
,
QMGR
,
GSN_API_VERSION_REQ
,
SimpleSignal
ssig
;
ApiVersionReq
*
req
=
CAST_PTR
(
ApiVersionReq
,
ssig
.
getDataPtrSend
());
req
->
senderRef
=
ss
.
getOwnRef
();
req
->
nodeId
=
v_nodeId
;
ssig
.
set
(
ss
,
TestOrd
::
TraceAPI
,
QMGR
,
GSN_API_VERSION_REQ
,
ApiVersionReq
::
SignalLength
);
int
do_send
=
1
;
NodeId
nodeId
;
// if(m_versionRec.callback == 0){
Uint32
timeOut
=
0
;
timeOut
=
10000
;
result
=
sendRecSignal
(
ndbnode
,
WAIT_VERSION
,
signal
,
true
,
timeOut
);
//} else {
//result = sendSignal(processId, NO_WAIT, signal, true);
// }
while
(
1
)
{
if
(
do_send
)
{
bool
next
;
nodeId
=
0
;
while
((
next
=
getNextNodeId
(
&
nodeId
,
NDB_MGM_NODE_TYPE_NDB
))
==
true
&&
okToSendTo
(
nodeId
,
true
)
!=
0
);
if
(
!
next
)
return
NO_CONTACT_WITH_DB_NODES
;
if
(
result
==
-
1
)
{
m_versionRec
.
inUse
=
false
;
if
(
m_versionRec
.
callback
!=
0
)
m_versionRec
.
callback
(
processId
,
0
,
this
,
0
);
m_versionRec
.
version
[
processId
]
=
0
;
if
(
ss
.
sendSignal
(
nodeId
,
&
ssig
)
!=
SEND_OK
)
{
return
SEND_OR_RECEIVE_FAILED
;
}
m_versionRec
.
inUse
=
false
;
return
0
;
}
int
MgmtSrvr
::
version
(
int
*
stopCount
,
bool
abort
,
VersionCallback
callback
,
void
*
anyData
)
{
ClusterMgr
::
Node
node
;
int
version
;
if
(
m_versionRec
.
inUse
)
return
1
;
m_versionRec
.
callback
=
callback
;
m_versionRec
.
inUse
=
true
;
Uint32
i
;
for
(
i
=
0
;
i
<
MAX_NODES
;
i
++
)
{
if
(
getNodeType
(
i
)
==
NDB_MGM_NODE_TYPE_MGM
)
{
m_versionRec
.
callback
(
i
,
NDB_VERSION
,
this
,
0
);
}
do_send
=
0
;
}
for
(
i
=
0
;
i
<
MAX_NODES
;
i
++
)
{
if
(
getNodeType
(
i
)
==
NDB_MGM_NODE_TYPE_NDB
)
{
node
=
theFacade
->
theClusterMgr
->
getNodeInfo
(
i
);
version
=
node
.
m_info
.
m_version
;
if
(
theFacade
->
theClusterMgr
->
getNodeInfo
(
i
).
connected
)
m_versionRec
.
callback
(
i
,
version
,
this
,
0
);
else
m_versionRec
.
callback
(
i
,
0
,
this
,
0
);
SimpleSignal
*
signal
=
ss
.
waitFor
();
int
gsn
=
signal
->
readSignalNumber
();
switch
(
gsn
)
{
case
GSN_API_VERSION_CONF
:
{
const
ApiVersionConf
*
const
conf
=
CAST_CONSTPTR
(
ApiVersionConf
,
signal
->
getDataPtr
());
assert
(
conf
->
nodeId
==
v_nodeId
);
version
=
conf
->
version
;
return
0
;
}
case
GSN_NF_COMPLETEREP
:{
const
NFCompleteRep
*
const
rep
=
CAST_CONSTPTR
(
NFCompleteRep
,
signal
->
getDataPtr
());
if
(
rep
->
failedNodeId
==
nodeId
)
do_send
=
1
;
// retry with other node
continue
;
}
for
(
i
=
0
;
i
<
MAX_NODES
;
i
++
)
{
if
(
getNodeType
(
i
)
==
NDB_MGM_NODE_TYPE_API
)
{
return
sendVersionReq
(
i
);
case
GSN_NODE_FAILREP
:{
const
NodeFailRep
*
const
rep
=
CAST_CONSTPTR
(
NodeFailRep
,
signal
->
getDataPtr
());
if
(
rep
->
failNo
==
nodeId
)
do_send
=
1
;
// retry with other node
continue
;
}
default:
report_unknown_signal
(
signal
);
return
SEND_OR_RECEIVE_FAILED
;
}
break
;
}
// while(1)
return
0
;
}
int
MgmtSrvr
::
stopNode
(
int
processId
,
bool
abort
,
StopCallback
callback
,
void
*
anyData
)
/*
* Common method for handeling all STOP_REQ signalling that
* is used by Stopping, Restarting and Single user commands
*/
int
MgmtSrvr
::
sendSTOP_REQ
(
NodeId
nodeId
,
NodeBitmask
&
stoppedNodes
,
Uint32
singleUserNodeId
,
bool
abort
,
bool
stop
,
bool
restart
,
bool
nostart
,
bool
initialStart
)
{
if
(
m_stopRec
.
singleUserMode
)
return
5060
;
if
(
m_stopRec
.
inUse
)
return
5029
;
stoppedNodes
.
clear
();
int
result
;
result
=
okToSendTo
(
processId
,
true
);
if
(
result
!=
0
)
{
return
result
;
}
NdbApiSignal
*
signal
=
getSignal
();
if
(
signal
==
NULL
)
{
return
COULD_NOT_ALLOCATE_MEMORY
;
}
SignalSender
ss
(
theFacade
);
ss
.
lock
();
// lock will be released on exit
StopReq
*
const
stopReq
=
CAST_PTR
(
StopReq
,
signal
->
getDataPtrSend
());
signal
->
set
(
TestOrd
::
TraceAPI
,
NDBCNTR
,
GSN_STOP_REQ
,
StopReq
::
SignalLength
);
SimpleSignal
ssig
;
StopReq
*
const
stopReq
=
CAST_PTR
(
StopReq
,
ssig
.
getDataPtrSend
());
ssig
.
set
(
ss
,
TestOrd
::
TraceAPI
,
NDBCNTR
,
GSN_STOP_REQ
,
StopReq
::
SignalLength
);
stopReq
->
requestInfo
=
0
;
stopReq
->
singleuser
=
0
;
StopReq
::
setPerformRestart
(
stopReq
->
requestInfo
,
false
);
StopReq
::
setSystemStop
(
stopReq
->
requestInfo
,
false
);
StopReq
::
setStopAbort
(
stopReq
->
requestInfo
,
abort
);
stopReq
->
apiTimeout
=
5000
;
stopReq
->
transactionTimeout
=
1000
;
stopReq
->
readOperationTimeout
=
1000
;
stopReq
->
operationTimeout
=
1000
;
stopReq
->
senderData
=
12
;
stopReq
->
senderRef
=
_ownReference
;
m_stopRec
.
sentCount
=
1
;
m_stopRec
.
reply
=
0
;
m_stopRec
.
nodeId
=
processId
;
m_stopRec
.
anyData
=
anyData
;
m_stopRec
.
callback
=
callback
;
m_stopRec
.
inUse
=
true
;
if
(
callback
==
NULL
){
Uint32
timeOut
=
0
;
timeOut
+=
stopReq
->
apiTimeout
;
timeOut
+=
stopReq
->
transactionTimeout
;
timeOut
+=
stopReq
->
readOperationTimeout
;
timeOut
+=
stopReq
->
operationTimeout
;
timeOut
*=
3
;
result
=
sendRecSignal
(
processId
,
WAIT_STOP
,
signal
,
true
,
timeOut
);
}
else
{
result
=
sendSignal
(
processId
,
NO_WAIT
,
signal
,
true
);
stopReq
->
senderRef
=
ss
.
getOwnRef
();
if
(
singleUserNodeId
)
{
stopReq
->
singleuser
=
1
;
stopReq
->
singleUserApi
=
singleUserNodeId
;
StopReq
::
setSystemStop
(
stopReq
->
requestInfo
,
false
);
StopReq
::
setPerformRestart
(
stopReq
->
requestInfo
,
false
);
StopReq
::
setStopAbort
(
stopReq
->
requestInfo
,
false
);
}
if
(
result
==
-
1
)
{
m_stopRec
.
inUse
=
false
;
return
SEND_OR_RECEIVE_FAILED
;
else
{
stopReq
->
singleuser
=
0
;
StopReq
::
setSystemStop
(
stopReq
->
requestInfo
,
stop
);
StopReq
::
setPerformRestart
(
stopReq
->
requestInfo
,
restart
);
StopReq
::
setStopAbort
(
stopReq
->
requestInfo
,
abort
);
StopReq
::
setNoStart
(
stopReq
->
requestInfo
,
nostart
);
StopReq
::
setInitialStart
(
stopReq
->
requestInfo
,
initialStart
);
}
if
(
callback
==
0
){
m_stopRec
.
inUse
=
false
;
return
m_stopRec
.
reply
;
}
else
{
return
0
;
// send the signals
NodeBitmask
nodes
;
if
(
nodeId
)
{
{
int
r
;
if
((
r
=
okToSendTo
(
nodeId
,
true
))
!=
0
)
return
r
;
}
}
int
MgmtSrvr
::
stop
(
int
*
stopCount
,
bool
abort
,
StopCallback
callback
,
void
*
anyData
)
{
if
(
m_stopRec
.
singleUserMode
)
return
5060
;
if
(
m_stopRec
.
inUse
){
return
5029
;
{
if
(
ss
.
sendSignal
(
nodeId
,
&
ssig
)
!=
SEND_OK
)
return
SEND_OR_RECEIVE_FAILED
;
}
m_stopRec
.
singleUserMode
=
false
;
m_stopRec
.
sentCount
=
0
;
m_stopRec
.
reply
=
0
;
m_stopRec
.
nodeId
=
0
;
m_stopRec
.
anyData
=
anyData
;
m_stopRec
.
callback
=
callback
;
m_stopRec
.
inUse
=
true
;
NodeId
nodeId
=
0
;
Uint32
timeOut
=
0
;
while
(
getNextNodeId
(
&
nodeId
,
NDB_MGM_NODE_TYPE_NDB
)){
if
(
okToSendTo
(
nodeId
,
true
)
==
0
){
NdbApiSignal
*
signal
=
getSignal
();
if
(
signal
==
NULL
)
{
return
COULD_NOT_ALLOCATE_MEMORY
;
nodes
.
set
(
nodeId
);
}
StopReq
*
const
stopReq
=
CAST_PTR
(
StopReq
,
signal
->
getDataPtrSend
());
signal
->
set
(
TestOrd
::
TraceAPI
,
NDBCNTR
,
GSN_STOP_REQ
,
StopReq
::
SignalLength
);
stopReq
->
requestInfo
=
0
;
stopReq
->
singleuser
=
0
;
StopReq
::
setSystemStop
(
stopReq
->
requestInfo
,
true
);
StopReq
::
setPerformRestart
(
stopReq
->
requestInfo
,
false
);
StopReq
::
setStopAbort
(
stopReq
->
requestInfo
,
abort
);
stopReq
->
apiTimeout
=
5000
;
stopReq
->
transactionTimeout
=
1000
;
stopReq
->
readOperationTimeout
=
1000
;
stopReq
->
operationTimeout
=
1000
;
stopReq
->
senderData
=
12
;
stopReq
->
senderRef
=
_ownReference
;
timeOut
+=
stopReq
->
apiTimeout
;
timeOut
+=
stopReq
->
transactionTimeout
;
timeOut
+=
stopReq
->
readOperationTimeout
;
timeOut
+=
stopReq
->
operationTimeout
;
timeOut
*=
3
;
m_stopRec
.
sentCount
++
;
if
(
callback
==
0
)
sendSignal
(
nodeId
,
WAIT_STOP
,
signal
,
true
);
else
sendSignal
(
nodeId
,
NO_WAIT
,
signal
,
true
);
while
(
getNextNodeId
(
&
nodeId
,
NDB_MGM_NODE_TYPE_NDB
))
{
if
(
okToSendTo
(
nodeId
,
true
)
==
0
)
{
SendStatus
result
=
ss
.
sendSignal
(
nodeId
,
&
ssig
);
if
(
result
==
SEND_OK
)
nodes
.
set
(
nodeId
);
}
}
if
(
stopCount
!=
0
)
*
stopCount
=
m_stopRec
.
sentCount
;
if
(
m_stopRec
.
sentCount
>
0
){
if
(
callback
==
0
){
theFacade
->
lock_mutex
();
receiveOptimisedResponse
(
timeOut
/
m_stopRec
.
sentCount
);
}
else
{
return
0
;
// now wait for the replies
int
error
=
0
;
while
(
!
nodes
.
isclear
())
{
SimpleSignal
*
signal
=
ss
.
waitFor
();
int
gsn
=
signal
->
readSignalNumber
();
switch
(
gsn
)
{
case
GSN_STOP_REF
:{
const
StopRef
*
const
ref
=
CAST_CONSTPTR
(
StopRef
,
signal
->
getDataPtr
());
const
NodeId
nodeId
=
refToNode
(
signal
->
header
.
theSendersBlockRef
);
#ifdef VM_TRACE
ndbout_c
(
"Node %d refused stop"
,
nodeId
);
#endif
assert
(
nodes
.
get
(
nodeId
));
nodes
.
clear
(
nodeId
);
error
=
translateStopRef
(
ref
->
errorCode
);
break
;
}
case
GSN_STOP_CONF
:{
const
StopConf
*
const
ref
=
CAST_CONSTPTR
(
StopConf
,
signal
->
getDataPtr
());
const
NodeId
nodeId
=
refToNode
(
signal
->
header
.
theSendersBlockRef
);
#ifdef VM_TRACE
ndbout_c
(
"Node %d single user mode"
,
nodeId
);
#endif
assert
(
nodes
.
get
(
nodeId
));
assert
(
singleUserNodeId
!=
0
);
nodes
.
clear
(
nodeId
);
stoppedNodes
.
set
(
nodeId
);
break
;
}
case
GSN_NF_COMPLETEREP
:{
const
NFCompleteRep
*
const
rep
=
CAST_CONSTPTR
(
NFCompleteRep
,
signal
->
getDataPtr
());
#ifdef VM_TRACE
ndbout_c
(
"Node %d fail completed"
,
rep
->
failedNodeId
);
#endif
break
;
}
case
GSN_NODE_FAILREP
:{
const
NodeFailRep
*
const
rep
=
CAST_CONSTPTR
(
NodeFailRep
,
signal
->
getDataPtr
());
#ifdef VM_TRACE
ndbout_c
(
"Node %d failed"
,
rep
->
failNo
);
#endif
if
(
nodes
.
get
(
rep
->
failNo
))
{
nodes
.
clear
(
rep
->
failNo
);
if
(
singleUserNodeId
==
0
)
stoppedNodes
.
set
(
rep
->
failNo
);
}
break
;
}
default:
report_unknown_signal
(
signal
);
#ifdef VM_TRACE
ndbout_c
(
"Unknown signal %d"
,
gsn
);
#endif
return
SEND_OR_RECEIVE_FAILED
;
}
}
return
error
;
}
m_stopRec
.
inUse
=
false
;
return
m_stopRec
.
reply
;
/*
* Stop one node
*/
int
MgmtSrvr
::
stopNode
(
int
nodeId
,
bool
abort
)
{
NodeBitmask
nodes
;
return
sendSTOP_REQ
(
nodeId
,
nodes
,
0
,
abort
,
false
,
false
,
false
,
false
);
}
/*
****************************************************************************
*
Single user mode
*
***************************************************************************
/
/*
*
Perform system shutdown
*/
int
MgmtSrvr
::
enterSingleUser
(
int
*
stopCount
,
Uint32
singleUserNodeId
,
EnterSingleCallback
callback
,
void
*
anyData
)
int
MgmtSrvr
::
stop
(
int
*
stopCount
,
bool
abort
)
{
if
(
m_stopRec
.
singleUserMode
)
{
return
5060
;
}
NodeBitmask
nodes
;
int
ret
=
sendSTOP_REQ
(
0
,
nodes
,
0
,
abort
,
true
,
false
,
false
,
false
);
if
(
stopCount
)
*
stopCount
=
nodes
.
count
();
return
ret
;
}
if
(
getNodeType
(
singleUserNodeId
)
!=
NDB_MGM_NODE_TYPE_API
)
{
/*
* Enter single user mode on all live nodes
*/
int
MgmtSrvr
::
enterSingleUser
(
int
*
stopCount
,
Uint32
singleUserNodeId
)
{
if
(
getNodeType
(
singleUserNodeId
)
!=
NDB_MGM_NODE_TYPE_API
)
return
5062
;
}
NodeId
nodeId
=
0
;
ClusterMgr
::
Node
node
;
for
(
Uint32
i
=
0
;
i
<
MAX_NODES
;
i
++
)
{
if
(
getNodeType
(
i
)
==
NDB_MGM_NODE_TYPE_NDB
)
{
node
=
theFacade
->
theClusterMgr
->
getNodeInfo
(
i
);
while
(
getNextNodeId
(
&
nodeId
,
NDB_MGM_NODE_TYPE_NDB
))
{
node
=
theFacade
->
theClusterMgr
->
getNodeInfo
(
nodeId
);
if
((
node
.
m_state
.
startLevel
!=
NodeState
::
SL_STARTED
)
&&
(
node
.
m_state
.
startLevel
!=
NodeState
::
SL_NOTHING
))
{
(
node
.
m_state
.
startLevel
!=
NodeState
::
SL_NOTHING
))
return
5063
;
}
}
}
NodeBitmask
nodes
;
int
ret
=
sendSTOP_REQ
(
0
,
nodes
,
singleUserNodeId
,
false
,
false
,
false
,
false
,
false
);
if
(
stopCount
)
*
stopCount
=
nodes
.
count
();
return
ret
;
}
if
(
m_stopRec
.
inUse
){
return
5029
;
}
/*
* Perform node restart
*/
if
(
singleUserNodeId
==
0
)
return
1
;
m_stopRec
.
singleUserMode
=
true
;
m_stopRec
.
sentCount
=
0
;
m_stopRec
.
reply
=
0
;
m_stopRec
.
nodeId
=
0
;
m_stopRec
.
anyData
=
anyData
;
m_stopRec
.
callback
=
callback
;
m_stopRec
.
inUse
=
true
;
int
MgmtSrvr
::
restartNode
(
int
nodeId
,
bool
nostart
,
bool
initialStart
,
bool
abort
)
{
NodeBitmask
nodes
;
return
sendSTOP_REQ
(
nodeId
,
nodes
,
0
,
abort
,
false
,
true
,
nostart
,
initialStart
);
}
NodeId
nodeId
=
0
;
Uint32
timeOut
=
0
;
while
(
getNextNodeId
(
&
nodeId
,
NDB_MGM_NODE_TYPE_NDB
)){
if
(
okToSendTo
(
nodeId
,
true
)
==
0
){
/*
* Perform system restart
*/
NdbApiSignal
*
signal
=
getSignal
();
if
(
signal
==
NULL
)
{
return
COULD_NOT_ALLOCATE_MEMORY
;
}
int
MgmtSrvr
::
restart
(
bool
nostart
,
bool
initialStart
,
bool
abort
,
int
*
stopCount
)
{
NodeBitmask
nodes
;
int
ret
=
sendSTOP_REQ
(
0
,
nodes
,
0
,
abort
,
true
,
true
,
true
,
initialStart
);
StopReq
*
const
stopReq
=
CAST_PTR
(
StopReq
,
signal
->
getDataPtrSend
());
signal
->
set
(
TestOrd
::
TraceAPI
,
NDBCNTR
,
GSN_STOP_REQ
,
StopReq
::
SignalLength
);
if
(
ret
)
return
ret
;
stopReq
->
requestInfo
=
0
;
stopReq
->
singleuser
=
1
;
stopReq
->
singleUserApi
=
singleUserNodeId
;
StopReq
::
setSystemStop
(
stopReq
->
requestInfo
,
false
);
StopReq
::
setPerformRestart
(
stopReq
->
requestInfo
,
false
);
StopReq
::
setStopAbort
(
stopReq
->
requestInfo
,
false
);
if
(
stopCount
)
*
stopCount
=
nodes
.
count
();
stopReq
->
apiTimeout
=
5000
;
stopReq
->
transactionTimeout
=
1000
;
stopReq
->
readOperationTimeout
=
1000
;
stopReq
->
operationTimeout
=
1000
;
stopReq
->
senderData
=
12
;
stopReq
->
senderRef
=
_ownReference
;
timeOut
+=
stopReq
->
apiTimeout
;
timeOut
+=
stopReq
->
transactionTimeout
;
timeOut
+=
stopReq
->
readOperationTimeout
;
timeOut
+=
stopReq
->
operationTimeout
;
timeOut
*=
3
;
m_stopRec
.
sentCount
++
;
if
(
callback
==
0
)
sendSignal
(
nodeId
,
WAIT_STOP
,
signal
,
true
);
else
sendSignal
(
nodeId
,
NO_WAIT
,
signal
,
true
);
#ifdef VM_TRACE
ndbout_c
(
"Stopped %d nodes"
,
nodes
.
count
());
#endif
/**
* Here all nodes were correctly stopped,
* so we wait for all nodes to be contactable
*/
int
waitTime
=
12000
;
NodeId
nodeId
=
0
;
NDB_TICKS
maxTime
=
NdbTick_CurrentMillisecond
()
+
waitTime
;
ndbout_c
(
" %d"
,
nodes
.
get
(
1
));
ndbout_c
(
" %d"
,
nodes
.
get
(
2
));
while
(
getNextNodeId
(
&
nodeId
,
NDB_MGM_NODE_TYPE_NDB
))
{
if
(
!
nodes
.
get
(
nodeId
))
continue
;
enum
ndb_mgm_node_status
s
;
s
=
NDB_MGM_NODE_STATUS_NO_CONTACT
;
#ifdef VM_TRACE
ndbout_c
(
"Waiting for %d not started"
,
nodeId
);
#endif
while
(
s
!=
NDB_MGM_NODE_STATUS_NOT_STARTED
&&
waitTime
>
0
)
{
Uint32
startPhase
=
0
,
version
=
0
,
dynamicId
=
0
,
nodeGroup
=
0
;
Uint32
connectCount
=
0
;
bool
system
;
status
(
nodeId
,
&
s
,
&
version
,
&
startPhase
,
&
system
,
&
dynamicId
,
&
nodeGroup
,
&
connectCount
);
NdbSleep_MilliSleep
(
100
);
waitTime
=
(
maxTime
-
NdbTick_CurrentMillisecond
());
}
}
if
(
stopCount
!=
0
)
*
stopCount
=
m_stopRec
.
sentCount
;
if
(
callback
==
0
){
m_stopRec
.
inUse
=
false
;
return
0
;
// return m_stopRec.reply;
}
else
{
if
(
nostart
)
return
0
;
/**
* Now we start all database nodes (i.e. we make them non-idle)
* We ignore the result we get from the start command.
*/
nodeId
=
0
;
while
(
getNextNodeId
(
&
nodeId
,
NDB_MGM_NODE_TYPE_NDB
))
{
if
(
!
nodes
.
get
(
nodeId
))
continue
;
int
result
;
result
=
start
(
nodeId
);
DEBUG
(
"Starting node "
<<
nodeId
<<
" with result "
<<
result
);
/**
* Errors from this call are deliberately ignored.
* Maybe the user only wanted to restart a subset of the nodes.
* It is also easy for the user to check which nodes have
* started and which nodes have not.
*/
}
m_stopRec
.
inUse
=
false
;
return
m_stopRec
.
reply
;
return
0
;
}
int
MgmtSrvr
::
exitSingleUser
(
int
*
stopCount
,
bool
abort
,
ExitSingleCallback
callback
,
void
*
anyData
)
MgmtSrvr
::
exitSingleUser
(
int
*
stopCount
,
bool
abort
)
{
m_stopRec
.
sentCount
=
0
;
m_stopRec
.
reply
=
0
;
m_stopRec
.
nodeId
=
0
;
m_stopRec
.
anyData
=
anyData
;
m_stopRec
.
callback
=
callback
;
m_stopRec
.
inUse
=
true
;
NodeId
nodeId
=
0
;
while
(
getNextNodeId
(
&
nodeId
,
NDB_MGM_NODE_TYPE_NDB
)){
if
(
okToSendTo
(
nodeId
,
true
)
==
0
){
int
count
=
0
;
NdbApiSignal
*
signal
=
getSignal
();
if
(
signal
==
NULL
)
{
return
COULD_NOT_ALLOCATE_MEMORY
;
}
SignalSender
ss
(
theFacade
);
ss
.
lock
();
// lock will be released on exit
SimpleSignal
ssig
;
ResumeReq
*
const
resumeReq
=
CAST_PTR
(
ResumeReq
,
signal
->
getDataPtrSend
());
signal
->
set
(
TestOrd
::
TraceAPI
,
NDBCNTR
,
GSN_RESUME_REQ
,
Stop
Req
::
SignalLength
);
CAST_PTR
(
ResumeReq
,
ssig
.
getDataPtrSend
());
ssig
.
set
(
ss
,
TestOrd
::
TraceAPI
,
NDBCNTR
,
GSN_RESUME_REQ
,
Resume
Req
::
SignalLength
);
resumeReq
->
senderData
=
12
;
resumeReq
->
senderRef
=
_ownReference
;
resumeReq
->
senderRef
=
ss
.
getOwnRef
()
;
m_stopRec
.
sentCount
++
;
if
(
callback
==
0
)
sendSignal
(
nodeId
,
WAIT_STOP
,
signal
,
true
);
else
sendSignal
(
nodeId
,
NO_WAIT
,
signal
,
true
)
;
while
(
getNextNodeId
(
&
nodeId
,
NDB_MGM_NODE_TYPE_NDB
)){
if
(
okToSendTo
(
nodeId
,
true
)
==
0
){
SendStatus
result
=
ss
.
sendSignal
(
nodeId
,
&
ssig
);
if
(
result
==
SEND_OK
)
count
++
;
}
}
m_stopRec
.
singleUserMode
=
false
;
if
(
stopCount
!=
0
)
*
stopCount
=
m_stopRec
.
sentCount
;
*
stopCount
=
count
;
if
(
callback
==
0
){
m_stopRec
.
inUse
=
false
;
return
m_stopRec
.
reply
;
}
else
{
return
0
;
}
m_stopRec
.
inUse
=
false
;
return
m_stopRec
.
reply
;
}
/*****************************************************************************
* Status
****************************************************************************/
...
...
@@ -1426,7 +1121,7 @@ MgmtSrvr::exitSingleUser(int * stopCount, bool abort,
#include <ClusterMgr.hpp>
int
MgmtSrvr
::
status
(
int
process
Id
,
MgmtSrvr
::
status
(
int
node
Id
,
ndb_mgm_node_status
*
_status
,
Uint32
*
version
,
Uint32
*
_phase
,
...
...
@@ -1435,23 +1130,20 @@ MgmtSrvr::status(int processId,
Uint32
*
nodegroup
,
Uint32
*
connectCount
)
{
if
(
getNodeType
(
processId
)
==
NDB_MGM_NODE_TYPE_API
||
getNodeType
(
processId
)
==
NDB_MGM_NODE_TYPE_MGM
)
{
if
(
versionNode
(
processId
,
false
,
0
,
0
)
==
0
)
*
version
=
m_versionRec
.
version
[
processId
];
else
*
version
=
0
;
if
(
getNodeType
(
nodeId
)
==
NDB_MGM_NODE_TYPE_API
||
getNodeType
(
nodeId
)
==
NDB_MGM_NODE_TYPE_MGM
)
{
versionNode
(
nodeId
,
*
version
);
}
const
ClusterMgr
::
Node
node
=
theFacade
->
theClusterMgr
->
getNodeInfo
(
process
Id
);
theFacade
->
theClusterMgr
->
getNodeInfo
(
node
Id
);
if
(
!
node
.
connected
){
*
_status
=
NDB_MGM_NODE_STATUS_NO_CONTACT
;
return
0
;
}
if
(
getNodeType
(
process
Id
)
==
NDB_MGM_NODE_TYPE_NDB
)
{
if
(
getNodeType
(
node
Id
)
==
NDB_MGM_NODE_TYPE_NDB
)
{
*
version
=
node
.
m_info
.
m_version
;
}
...
...
@@ -1514,103 +1206,93 @@ MgmtSrvr::status(int processId,
}
int
MgmtSrvr
::
setEventReportingLevelImpl
(
int
process
Id
,
MgmtSrvr
::
setEventReportingLevelImpl
(
int
node
Id
,
const
EventSubscribeReq
&
ll
)
{
INIT_SIGNAL_SENDER
(
ss
,
nodeId
);
int
result
=
okToSendTo
(
processId
,
true
);
if
(
result
!=
0
)
{
return
result
;
}
NdbApiSignal
signal
(
_ownReference
);
SimpleSignal
ssig
;
EventSubscribeReq
*
dst
=
CAST_PTR
(
EventSubscribeReq
,
signal
.
getDataPtrSend
());
*
dst
=
ll
;
signal
.
set
(
TestOrd
::
TraceAPI
,
CMVMI
,
GSN_EVENT_SUBSCRIBE_REQ
,
CAST_PTR
(
EventSubscribeReq
,
ssig
.
getDataPtrSend
());
ssig
.
set
(
ss
,
TestOrd
::
TraceAPI
,
CMVMI
,
GSN_EVENT_SUBSCRIBE_REQ
,
EventSubscribeReq
::
SignalLength
);
*
dst
=
ll
;
if
(
ss
.
sendSignal
(
nodeId
,
&
ssig
)
!=
SEND_OK
)
{
return
SEND_OR_RECEIVE_FAILED
;
}
theFacade
->
lock_mutex
();
send
(
&
signal
,
processId
,
NODE_TYPE_DB
);
theFacade
->
unlock_mutex
();
#if 0
while (1)
{
SimpleSignal *signal = ss.waitFor();
int gsn = signal->readSignalNumber();
switch (gsn) {
case GSN_EVENT_SUBSCRIBE_CONF:{
break;
}
case GSN_EVENT_SUBSCRIBE_REF:{
return SEND_OR_RECEIVE_FAILED;
}
case GSN_NF_COMPLETEREP:{
const NFCompleteRep * const rep =
CAST_CONSTPTR(NFCompleteRep, signal->getDataPtr());
if (rep->failedNodeId == nodeId)
return SEND_OR_RECEIVE_FAILED;
break;
}
case GSN_NODE_FAILREP:{
const NodeFailRep * const rep =
CAST_CONSTPTR(NodeFailRep, signal->getDataPtr());
if (rep->failNo == nodeId)
return SEND_OR_RECEIVE_FAILED;
break;
}
default:
report_unknown_signal(signal);
return SEND_OR_RECEIVE_FAILED;
}
}
#endif
return
0
;
}
//****************************************************************************
//****************************************************************************
int
MgmtSrvr
::
setNodeLogLevelImpl
(
int
process
Id
,
const
SetLogLevelOrd
&
ll
)
MgmtSrvr
::
setNodeLogLevelImpl
(
int
node
Id
,
const
SetLogLevelOrd
&
ll
)
{
int
result
=
okToSendTo
(
processId
,
true
);
if
(
result
!=
0
)
{
return
result
;
}
NdbApiSignal
signal
(
_ownReference
);
SetLogLevelOrd
*
dst
=
CAST_PTR
(
SetLogLevelOrd
,
signal
.
getDataPtrSend
());
INIT_SIGNAL_SENDER
(
ss
,
nodeId
);
*
dst
=
ll
;
signal
.
set
(
TestOrd
::
TraceAPI
,
CMVMI
,
GSN_SET_LOGLEVELORD
,
SimpleSignal
ssig
;
ssig
.
set
(
ss
,
TestOrd
::
TraceAPI
,
CMVMI
,
GSN_SET_LOGLEVELORD
,
SetLogLevelOrd
::
SignalLength
);
SetLogLevelOrd
*
const
dst
=
CAST_PTR
(
SetLogLevelOrd
,
ssig
.
getDataPtrSend
());
*
dst
=
ll
;
theFacade
->
lock_mutex
();
theFacade
->
sendSignalUnCond
(
&
signal
,
processId
);
theFacade
->
unlock_mutex
();
return
0
;
}
int
MgmtSrvr
::
send
(
NdbApiSignal
*
signal
,
Uint32
node
,
Uint32
node_type
){
Uint32
max
=
(
node
==
0
)
?
MAX_NODES
:
node
+
1
;
for
(;
node
<
max
;
node
++
){
while
(
nodeTypes
[
node
]
!=
(
int
)
node_type
&&
node
<
max
)
node
++
;
if
(
nodeTypes
[
node
]
!=
(
int
)
node_type
)
break
;
theFacade
->
sendSignalUnCond
(
signal
,
node
);
}
return
0
;
return
ss
.
sendSignal
(
nodeId
,
&
ssig
)
==
SEND_OK
?
0
:
SEND_OR_RECEIVE_FAILED
;
}
//****************************************************************************
//****************************************************************************
int
MgmtSrvr
::
insertError
(
int
process
Id
,
int
errorNo
)
MgmtSrvr
::
insertError
(
int
node
Id
,
int
errorNo
)
{
if
(
errorNo
<
0
)
{
return
INVALID_ERROR_NUMBER
;
}
int
result
;
result
=
okToSendTo
(
processId
,
true
);
if
(
result
!=
0
)
{
return
result
;
}
NdbApiSignal
*
signal
=
getSignal
();
if
(
signal
==
NULL
)
{
return
COULD_NOT_ALLOCATE_MEMORY
;
}
INIT_SIGNAL_SENDER
(
ss
,
nodeId
);
TamperOrd
*
const
tamperOrd
=
CAST_PTR
(
TamperOrd
,
signal
->
getDataPtrSend
());
tamperOrd
->
errorNo
=
errorNo
;
signal
->
set
(
TestOrd
::
TraceAPI
,
CMVMI
,
GSN_TAMPER_ORD
,
SimpleSignal
ssig
;
ssig
.
set
(
ss
,
TestOrd
::
TraceAPI
,
CMVMI
,
GSN_TAMPER_ORD
,
TamperOrd
::
SignalLength
);
TamperOrd
*
const
tamperOrd
=
CAST_PTR
(
TamperOrd
,
ssig
.
getDataPtrSend
());
tamperOrd
->
errorNo
=
errorNo
;
result
=
sendSignal
(
processId
,
NO_WAIT
,
signal
,
true
);
if
(
result
==
-
1
)
{
return
SEND_OR_RECEIVE_FAILED
;
}
return
0
;
return
ss
.
sendSignal
(
nodeId
,
&
ssig
)
==
SEND_OK
?
0
:
SEND_OR_RECEIVE_FAILED
;
}
...
...
@@ -1619,37 +1301,23 @@ MgmtSrvr::insertError(int processId, int errorNo)
//****************************************************************************
int
MgmtSrvr
::
setTraceNo
(
int
processId
,
int
traceNo
)
MgmtSrvr
::
setTraceNo
(
int
nodeId
,
int
traceNo
)
{
if
(
traceNo
<
0
)
{
return
INVALID_TRACE_NUMBER
;
}
int
result
;
result
=
okToSendTo
(
processId
,
true
);
if
(
result
!=
0
)
{
return
result
;
}
NdbApiSignal
*
signal
=
getSignal
();
if
(
signal
==
NULL
)
{
return
COULD_NOT_ALLOCATE_MEMORY
;
}
INIT_SIGNAL_SENDER
(
ss
,
nodeId
);
TestOrd
*
const
testOrd
=
CAST_PTR
(
TestOrd
,
signal
->
getDataPtrSend
());
SimpleSignal
ssig
;
ssig
.
set
(
ss
,
TestOrd
::
TraceAPI
,
CMVMI
,
GSN_TEST_ORD
,
TestOrd
::
SignalLength
);
TestOrd
*
const
testOrd
=
CAST_PTR
(
TestOrd
,
ssig
.
getDataPtrSend
());
testOrd
->
clear
();
// Assume TRACE command causes toggling. Not really defined... ? TODO
testOrd
->
setTraceCommand
(
TestOrd
::
Toggle
,
(
TestOrd
::
TraceSpecification
)
traceNo
);
signal
->
set
(
TestOrd
::
TraceAPI
,
CMVMI
,
GSN_TEST_ORD
,
TestOrd
::
SignalLength
);
result
=
sendSignal
(
processId
,
NO_WAIT
,
signal
,
true
);
if
(
result
==
-
1
)
{
return
SEND_OR_RECEIVE_FAILED
;
}
return
0
;
return
ss
.
sendSignal
(
nodeId
,
&
ssig
)
==
SEND_OK
?
0
:
SEND_OR_RECEIVE_FAILED
;
}
//****************************************************************************
...
...
@@ -1668,14 +1336,10 @@ MgmtSrvr::getBlockNumber(const BaseString &blockName)
//****************************************************************************
int
MgmtSrvr
::
setSignalLoggingMode
(
int
process
Id
,
LogMode
mode
,
MgmtSrvr
::
setSignalLoggingMode
(
int
node
Id
,
LogMode
mode
,
const
Vector
<
BaseString
>&
blocks
)
{
int
result
;
result
=
okToSendTo
(
processId
,
true
);
if
(
result
!=
0
)
{
return
result
;
}
INIT_SIGNAL_SENDER
(
ss
,
nodeId
);
// Convert from MgmtSrvr format...
...
...
@@ -1710,12 +1374,10 @@ MgmtSrvr::setSignalLoggingMode(int processId, LogMode mode,
return
-
1
;
}
NdbApiSignal
*
signal
=
getSignal
();
if
(
signal
==
NULL
)
{
return
COULD_NOT_ALLOCATE_MEMORY
;
}
SimpleSignal
ssig
;
ssig
.
set
(
ss
,
TestOrd
::
TraceAPI
,
CMVMI
,
GSN_TEST_ORD
,
TestOrd
::
SignalLength
);
TestOrd
*
const
testOrd
=
CAST_PTR
(
TestOrd
,
s
ignal
->
getDataPtrSend
());
TestOrd
*
const
testOrd
=
CAST_PTR
(
TestOrd
,
s
sig
.
getDataPtrSend
());
testOrd
->
clear
();
if
(
blocks
.
size
()
==
0
||
blocks
[
0
]
==
"ALL"
)
{
...
...
@@ -1725,78 +1387,44 @@ MgmtSrvr::setSignalLoggingMode(int processId, LogMode mode,
for
(
unsigned
i
=
0
;
i
<
blocks
.
size
();
i
++
){
int
blockNumber
=
getBlockNumber
(
blocks
[
i
]);
if
(
blockNumber
==
-
1
)
{
releaseSignal
(
signal
);
return
INVALID_BLOCK_NAME
;
}
testOrd
->
addSignalLoggerCommand
(
blockNumber
,
command
,
logSpec
);
}
// for
}
// else
signal
->
set
(
TestOrd
::
TraceAPI
,
CMVMI
,
GSN_TEST_ORD
,
TestOrd
::
SignalLength
);
result
=
sendSignal
(
processId
,
NO_WAIT
,
signal
,
true
);
if
(
result
==
-
1
)
{
return
SEND_OR_RECEIVE_FAILED
;
}
return
0
;
return
ss
.
sendSignal
(
nodeId
,
&
ssig
)
==
SEND_OK
?
0
:
SEND_OR_RECEIVE_FAILED
;
}
/*****************************************************************************
* Signal tracing
*****************************************************************************/
int
MgmtSrvr
::
startSignalTracing
(
int
process
Id
)
int
MgmtSrvr
::
startSignalTracing
(
int
node
Id
)
{
int
result
;
result
=
okToSendTo
(
processId
,
true
);
if
(
result
!=
0
)
{
return
result
;
}
NdbApiSignal
*
signal
=
getSignal
();
if
(
signal
==
NULL
)
{
return
COULD_NOT_ALLOCATE_MEMORY
;
}
INIT_SIGNAL_SENDER
(
ss
,
nodeId
);
SimpleSignal
ssig
;
ssig
.
set
(
ss
,
TestOrd
::
TraceAPI
,
CMVMI
,
GSN_TEST_ORD
,
TestOrd
::
SignalLength
);
TestOrd
*
const
testOrd
=
CAST_PTR
(
TestOrd
,
s
ignal
->
getDataPtrSend
());
TestOrd
*
const
testOrd
=
CAST_PTR
(
TestOrd
,
s
sig
.
getDataPtrSend
());
testOrd
->
clear
();
testOrd
->
setTestCommand
(
TestOrd
::
On
);
signal
->
set
(
TestOrd
::
TraceAPI
,
CMVMI
,
GSN_TEST_ORD
,
TestOrd
::
SignalLength
);
result
=
sendSignal
(
processId
,
NO_WAIT
,
signal
,
true
);
if
(
result
==
-
1
)
{
return
SEND_OR_RECEIVE_FAILED
;
}
return
0
;
return
ss
.
sendSignal
(
nodeId
,
&
ssig
)
==
SEND_OK
?
0
:
SEND_OR_RECEIVE_FAILED
;
}
int
MgmtSrvr
::
stopSignalTracing
(
int
process
Id
)
MgmtSrvr
::
stopSignalTracing
(
int
node
Id
)
{
int
result
;
result
=
okToSendTo
(
processId
,
true
);
if
(
result
!=
0
)
{
return
result
;
}
INIT_SIGNAL_SENDER
(
ss
,
nodeId
);
NdbApiSignal
*
signal
=
getSignal
();
if
(
signal
==
NULL
)
{
return
COULD_NOT_ALLOCATE_MEMORY
;
}
TestOrd
*
const
testOrd
=
CAST_PTR
(
TestOrd
,
signal
->
getDataPtrSend
());
SimpleSignal
ssig
;
ssig
.
set
(
ss
,
TestOrd
::
TraceAPI
,
CMVMI
,
GSN_TEST_ORD
,
TestOrd
::
SignalLength
);
TestOrd
*
const
testOrd
=
CAST_PTR
(
TestOrd
,
ssig
.
getDataPtrSend
());
testOrd
->
clear
();
testOrd
->
setTestCommand
(
TestOrd
::
Off
);
signal
->
set
(
TestOrd
::
TraceAPI
,
CMVMI
,
GSN_TEST_ORD
,
TestOrd
::
SignalLength
);
result
=
sendSignal
(
processId
,
NO_WAIT
,
signal
,
true
);
if
(
result
==
-
1
)
{
return
SEND_OR_RECEIVE_FAILED
;
}
return
0
;
return
ss
.
sendSignal
(
nodeId
,
&
ssig
)
==
SEND_OK
?
0
:
SEND_OR_RECEIVE_FAILED
;
}
...
...
@@ -1805,7 +1433,7 @@ MgmtSrvr::stopSignalTracing(int processId)
*****************************************************************************/
int
MgmtSrvr
::
dumpState
(
int
process
Id
,
const
char
*
args
)
MgmtSrvr
::
dumpState
(
int
node
Id
,
const
char
*
args
)
{
// Convert the space separeted args
// string to an int array
...
...
@@ -1827,29 +1455,20 @@ MgmtSrvr::dumpState(int processId, const char* args)
}
}
return
dumpState
(
process
Id
,
args_array
,
numArgs
);
return
dumpState
(
node
Id
,
args_array
,
numArgs
);
}
int
MgmtSrvr
::
dumpState
(
int
process
Id
,
const
Uint32
args
[],
Uint32
no
)
MgmtSrvr
::
dumpState
(
int
node
Id
,
const
Uint32
args
[],
Uint32
no
)
{
int
result
;
result
=
okToSendTo
(
processId
,
true
);
if
(
result
!=
0
)
{
return
result
;
}
NdbApiSignal
*
signal
=
getSignal
();
if
(
signal
==
NULL
)
{
return
COULD_NOT_ALLOCATE_MEMORY
;
}
INIT_SIGNAL_SENDER
(
ss
,
nodeId
);
const
Uint32
len
=
no
>
25
?
25
:
no
;
SimpleSignal
ssig
;
DumpStateOrd
*
const
dumpOrd
=
CAST_PTR
(
DumpStateOrd
,
s
ignal
->
getDataPtrSend
());
s
ignal
->
set
(
TestOrd
::
TraceAPI
,
CMVMI
,
GSN_DUMP_STATE_ORD
,
len
);
CAST_PTR
(
DumpStateOrd
,
s
sig
.
getDataPtrSend
());
s
sig
.
set
(
ss
,
TestOrd
::
TraceAPI
,
CMVMI
,
GSN_DUMP_STATE_ORD
,
len
);
for
(
Uint32
i
=
0
;
i
<
25
;
i
++
){
if
(
i
<
len
)
dumpOrd
->
args
[
i
]
=
args
[
i
];
...
...
@@ -1857,12 +1476,7 @@ MgmtSrvr::dumpState(int processId, const Uint32 args[], Uint32 no)
dumpOrd
->
args
[
i
]
=
0
;
}
result
=
sendSignal
(
processId
,
NO_WAIT
,
signal
,
true
);
if
(
result
==
-
1
)
{
return
SEND_OR_RECEIVE_FAILED
;
}
return
0
;
return
ss
.
sendSignal
(
nodeId
,
&
ssig
)
==
SEND_OK
?
0
:
SEND_OR_RECEIVE_FAILED
;
}
...
...
@@ -1895,42 +1509,18 @@ MgmtSrvr::handleReceivedSignal(NdbApiSignal* signal)
int
gsn
=
signal
->
readSignalNumber
();
switch
(
gsn
)
{
case
GSN_API_VERSION_CONF
:
{
if
(
theWaitState
==
WAIT_VERSION
)
{
const
ApiVersionConf
*
const
conf
=
CAST_CONSTPTR
(
ApiVersionConf
,
signal
->
getDataPtr
());
if
(
m_versionRec
.
callback
!=
0
)
m_versionRec
.
callback
(
conf
->
nodeId
,
conf
->
version
,
this
,
0
);
else
{
m_versionRec
.
version
[
conf
->
nodeId
]
=
conf
->
version
;
}
}
else
return
;
theWaitState
=
NO_WAIT
;
}
break
;
case
GSN_EVENT_SUBSCRIBE_CONF
:
break
;
case
GSN_EVENT_SUBSCRIBE_REF
:
break
;
case
GSN_EVENT_REP
:
eventReport
(
refToNode
(
signal
->
theSendersBlockRef
),
signal
->
getDataPtr
());
break
;
case
GSN_STOP_REF
:{
const
StopRef
*
const
ref
=
CAST_CONSTPTR
(
StopRef
,
signal
->
getDataPtr
());
const
NodeId
nodeId
=
refToNode
(
signal
->
theSendersBlockRef
);
handleStopReply
(
nodeId
,
ref
->
errorCode
);
return
;
}
case
GSN_NF_COMPLETEREP
:
break
;
case
GSN_MGM_LOCK_CONFIG_REP
:
case
GSN_MGM_LOCK_CONFIG_REQ
:
case
GSN_MGM_UNLOCK_CONFIG_REP
:
case
GSN_MGM_UNLOCK_CONFIG_REQ
:
{
m_signalRecvQueue
.
receive
(
new
NdbApiSignal
(
*
signal
));
case
GSN_NODE_FAILREP
:
break
;
}
default:
g_eventLogger
.
error
(
"Unknown signal received. SignalNumber: "
...
...
@@ -1945,75 +1535,6 @@ MgmtSrvr::handleReceivedSignal(NdbApiSignal* signal)
}
}
/**
* A database node was either stopped or there was some error
*/
void
MgmtSrvr
::
handleStopReply
(
NodeId
nodeId
,
Uint32
errCode
)
{
/**
* If we are in single user mode and get a stop reply from a
* DB node, then we have had a node crash.
* If all DB nodes are gone, and we are still in single user mode,
* the set m_stopRec.singleUserMode = false;
*/
if
(
m_stopRec
.
singleUserMode
)
{
ClusterMgr
::
Node
node
;
bool
failure
=
true
;
for
(
Uint32
i
=
0
;
i
<
MAX_NODES
;
i
++
)
{
if
(
getNodeType
(
i
)
==
NDB_MGM_NODE_TYPE_NDB
)
{
node
=
theFacade
->
theClusterMgr
->
getNodeInfo
(
i
);
if
((
node
.
m_state
.
startLevel
==
NodeState
::
SL_NOTHING
))
failure
=
true
;
else
failure
=
false
;
}
}
if
(
failure
)
{
m_stopRec
.
singleUserMode
=
false
;
}
}
if
(
m_stopRec
.
inUse
==
false
)
return
;
if
(
!
(
m_stopRec
.
nodeId
==
0
||
m_stopRec
.
nodeId
==
nodeId
))
goto
error
;
if
(
m_stopRec
.
sentCount
<=
0
)
goto
error
;
if
(
!
(
theWaitState
==
WAIT_STOP
||
m_stopRec
.
callback
!=
0
))
goto
error
;
if
(
errCode
!=
0
)
m_stopRec
.
reply
=
translateStopRef
(
errCode
);
m_stopRec
.
sentCount
--
;
if
(
m_stopRec
.
sentCount
==
0
){
if
(
theWaitState
==
WAIT_STOP
){
theWaitState
=
NO_WAIT
;
NdbCondition_Signal
(
theMgmtWaitForResponseCondPtr
);
return
;
}
if
(
m_stopRec
.
callback
!=
0
){
m_stopRec
.
inUse
=
false
;
StopCallback
callback
=
m_stopRec
.
callback
;
m_stopRec
.
callback
=
NULL
;
(
*
callback
)(
m_stopRec
.
nodeId
,
m_stopRec
.
anyData
,
m_stopRec
.
reply
);
return
;
}
}
return
;
error:
if
(
errCode
!=
0
){
g_eventLogger
.
error
(
"Unexpected signal received. SignalNumber: %i from %d"
,
GSN_STOP_REF
,
nodeId
);
}
}
void
MgmtSrvr
::
handleStatus
(
NodeId
nodeId
,
bool
alive
,
bool
nfComplete
)
{
...
...
@@ -2027,16 +1548,8 @@ MgmtSrvr::handleStatus(NodeId nodeId, bool alive, bool nfComplete)
theData
[
0
]
=
EventReport
::
Disconnected
;
if
(
nfComplete
)
{
handleStopReply
(
nodeId
,
0
);
DBUG_VOID_RETURN
;
}
if
(
theWaitNode
==
nodeId
&&
theWaitState
!=
NO_WAIT
&&
theWaitState
!=
WAIT_STOP
)
{
theWaitState
=
WAIT_NODEFAILURE
;
NdbCondition_Signal
(
theMgmtWaitForResponseCondPtr
);
}
}
eventReport
(
_ownNodeId
,
theData
);
...
...
@@ -2381,6 +1894,7 @@ MgmtSrvr::eventReport(NodeId nodeId, const Uint32 * theData)
/***************************************************************************
* Backup
***************************************************************************/
int
MgmtSrvr
::
startBackup
(
Uint32
&
backupId
,
int
waitCompleted
)
{
...
...
@@ -2395,7 +1909,6 @@ MgmtSrvr::startBackup(Uint32& backupId, int waitCompleted)
if
(
!
next
)
return
NO_CONTACT_WITH_DB_NODES
;
SimpleSignal
ssig
;
BackupReq
*
req
=
CAST_PTR
(
BackupReq
,
ssig
.
getDataPtrSend
());
ssig
.
set
(
ss
,
TestOrd
::
TraceAPI
,
BACKUP
,
GSN_BACKUP_REQ
,
BackupReq
::
SignalLength
);
...
...
@@ -2410,8 +1923,7 @@ MgmtSrvr::startBackup(Uint32& backupId, int waitCompleted)
while
(
1
)
{
if
(
do_send
)
{
SendStatus
result
=
ss
.
sendSignal
(
nodeId
,
&
ssig
);
if
(
result
!=
SEND_OK
)
{
if
(
ss
.
sendSignal
(
nodeId
,
&
ssig
)
!=
SEND_OK
)
{
return
SEND_OR_RECEIVE_FAILED
;
}
if
(
waitCompleted
==
0
)
...
...
@@ -2516,13 +2028,13 @@ MgmtSrvr::startBackup(Uint32& backupId, int waitCompleted)
return
SEND_OR_RECEIVE_FAILED
;
}
}
return
0
;
}
int
MgmtSrvr
::
abortBackup
(
Uint32
backupId
)
{
SignalSender
ss
(
theFacade
);
bool
next
;
NodeId
nodeId
=
0
;
while
((
next
=
getNextNodeId
(
&
nodeId
,
NDB_MGM_NODE_TYPE_NDB
))
==
true
&&
...
...
@@ -2532,25 +2044,17 @@ MgmtSrvr::abortBackup(Uint32 backupId)
return
NO_CONTACT_WITH_DB_NODES
;
}
NdbApiSignal
*
signal
=
getSignal
();
if
(
signal
==
NULL
)
{
return
COULD_NOT_ALLOCATE_MEMORY
;
}
SimpleSignal
ssig
;
AbortBackupOrd
*
ord
=
CAST_PTR
(
AbortBackupOrd
,
s
ignal
->
getDataPtrSend
());
s
ignal
->
set
(
TestOrd
::
TraceAPI
,
BACKUP
,
GSN_ABORT_BACKUP_ORD
,
AbortBackupOrd
*
ord
=
CAST_PTR
(
AbortBackupOrd
,
s
sig
.
getDataPtrSend
());
s
sig
.
set
(
ss
,
TestOrd
::
TraceAPI
,
BACKUP
,
GSN_ABORT_BACKUP_ORD
,
AbortBackupOrd
::
SignalLength
);
ord
->
requestType
=
AbortBackupOrd
::
ClientAbort
;
ord
->
senderData
=
19
;
ord
->
backupId
=
backupId
;
int
result
=
sendSignal
(
nodeId
,
NO_WAIT
,
signal
,
true
);
if
(
result
==
-
1
)
{
return
SEND_OR_RECEIVE_FAILED
;
}
return
0
;
return
ss
.
sendSignal
(
nodeId
,
&
ssig
)
==
SEND_OK
?
0
:
SEND_OR_RECEIVE_FAILED
;
}
...
...
@@ -2724,11 +2228,6 @@ MgmtSrvr::setDbParameter(int node, int param, const char * value,
return
0
;
}
template
class
Vector
<
SigMatch
>;
#if __SUNPRO_CC != 0x560
template
bool
SignalQueue
::
waitFor
<
SigMatch
>(
Vector
<
SigMatch
>&
,
SigMatch
**
,
NdbApiSignal
**
,
unsigned
);
#endif
template
class
MutexVector
<
unsigned
short
>;
template
class
MutexVector
<
Ndb_mgmd_event_service
::
Event_listener
>;
template
class
MutexVector
<
EventSubscribeReq
>;
ndb/src/mgmsrv/MgmtSrvr.hpp
View file @
c1c2a892
...
...
@@ -22,11 +22,11 @@
#include <NdbCondition.h>
#include <mgmapi.h>
#include <NdbTCP.h>
#include <ConfigRetriever.hpp>
#include <Vector.hpp>
#include <NodeBitmask.hpp>
#include <signaldata/ManagementServer.hpp>
#include "SignalQueue.hpp"
#include <ndb_version.h>
#include <EventLogger.hpp>
#include <signaldata/EventSubscribeReq.hpp>
...
...
@@ -213,17 +213,6 @@ public:
// COULD_NOT_ALLOCATE_MEMORY, SEND_OR_RECEIVE_FAILED
typedef
void
(
*
StopCallback
)(
int
nodeId
,
void
*
anyData
,
int
errorCode
);
typedef
void
(
*
VersionCallback
)(
int
nodeId
,
int
version
,
void
*
anyData
,
int
errorCode
);
typedef
void
(
*
EnterSingleCallback
)(
int
nodeId
,
void
*
anyData
,
int
errorCode
);
typedef
void
(
*
ExitSingleCallback
)(
int
nodeId
,
void
*
anyData
,
int
errorCode
);
/**
* Lock configuration
*/
...
...
@@ -272,12 +261,12 @@ 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
,
StopCallback
=
0
,
void
*
any
=
0
);
int
stopNode
(
int
nodeId
,
bool
abort
=
false
);
/**
* Stop the system
*/
int
stop
(
int
*
cnt
=
0
,
bool
abort
=
false
,
StopCallback
=
0
,
void
*
any
=
0
);
int
stop
(
int
*
cnt
=
0
,
bool
abort
=
false
);
/**
* print version info about a node
...
...
@@ -285,27 +274,18 @@ public:
* @param processId: Id of the DB process to stop
* @return 0 if succeeded, otherwise: as stated above, plus:
*/
int
versionNode
(
int
nodeId
,
bool
abort
=
false
,
VersionCallback
=
0
,
void
*
any
=
0
);
/**
* print version info about all node in the system
*/
int
version
(
int
*
cnt
=
0
,
bool
abort
=
false
,
VersionCallback
=
0
,
void
*
any
=
0
);
int
versionNode
(
int
nodeId
,
Uint32
&
version
);
/**
* Maintenance on the system
*/
int
enterSingleUser
(
int
*
cnt
=
0
,
Uint32
singleuserNodeId
=
0
,
EnterSingleCallback
=
0
,
void
*
any
=
0
);
int
enterSingleUser
(
int
*
cnt
=
0
,
Uint32
singleuserNodeId
=
0
);
/**
* Resume from maintenance on the system
*/
int
exitSingleUser
(
int
*
cnt
=
0
,
bool
abort
=
false
,
ExitSingleCallback
=
0
,
void
*
any
=
0
);
int
exitSingleUser
(
int
*
cnt
=
0
,
bool
abort
=
false
);
/**
* Start DB process.
...
...
@@ -319,15 +299,14 @@ public:
* @param processId: Id of the DB process to start
*/
int
restartNode
(
int
processId
,
bool
nostart
,
bool
initialStart
,
bool
abort
=
false
,
StopCallback
=
0
,
void
*
anyData
=
0
);
bool
abort
=
false
);
/**
* Restart the system
*/
int
restart
(
bool
nostart
,
bool
initialStart
,
bool
abort
=
false
,
int
*
stopCount
=
0
,
StopCallback
=
0
,
void
*
anyData
=
0
);
int
*
stopCount
=
0
);
struct
BackupEvent
{
enum
Event
{
...
...
@@ -518,6 +497,16 @@ private:
//**************************************************************************
int
setEventReportingLevel
(
int
processId
,
LogLevel
::
EventCategory
,
Uint32
);
void
set_common_stop_req_params
(
void
*
stopReq
);
int
sendSTOP_REQ
(
NodeId
nodeId
,
NodeBitmask
&
stoppedNodes
,
Uint32
singleUserNodeId
,
bool
abort
,
bool
stop
,
bool
restart
,
bool
nostart
,
bool
initialStart
);
/**
* Check if it is possible to send a signal to a (DB) process
...
...
@@ -608,60 +597,9 @@ private:
enum
WaitSignalType
{
NO_WAIT
,
// We don't expect to receive any signal
WAIT_SET_VAR
,
// Accept SET_VAR_CONF and SET_VAR_REF
WAIT_SUBSCRIBE_CONF
,
// Accept event subscription confirmation
WAIT_STOP
,
WAIT_BACKUP_STARTED
,
WAIT_BACKUP_COMPLETED
,
WAIT_VERSION
,
WAIT_NODEFAILURE
WAIT_SUBSCRIBE_CONF
// Accept event subscription confirmation
};
/**
* Get an unused signal
* @return A signal if succeeded, NULL otherwise
*/
NdbApiSignal
*
getSignal
();
/**
* Add a signal to the list of unused signals
* @param signal: The signal to add
*/
void
releaseSignal
(
NdbApiSignal
*
signal
);
/**
* Remove a signal from the list of unused signals and delete
* the memory for it.
*/
void
freeSignal
();
/**
* Send a signal
* @param processId: Id of the receiver process
* @param waitState: State denoting a set of signals we accept to receive
* @param signal: The signal to send
* @return 0 if succeeded, -1 otherwise
*/
int
sendSignal
(
Uint16
processId
,
WaitSignalType
waitState
,
NdbApiSignal
*
signal
,
bool
force
=
false
);
/**
* Send a signal and wait for an answer signal
* @param processId: Id of the receiver process
* @param waitState: State denoting a set of signals we accept to receive.
* @param signal: The signal to send
* @return 0 if succeeded, -1 otherwise (for example failed to send or
* failed to receive expected signal).
*/
int
sendRecSignal
(
Uint16
processId
,
WaitSignalType
waitState
,
NdbApiSignal
*
signal
,
bool
force
=
false
,
int
waitTime
=
WAIT_FOR_RESPONSE_TIMEOUT
);
/**
* Wait for a signal to arrive.
* @return 0 if signal arrived, -1 otherwise
*/
int
receiveOptimisedResponse
(
int
waitTime
);
/**
* This function is called from "outside" of MgmtSrvr
* when a signal is sent to MgmtSrvr.
...
...
@@ -708,31 +646,7 @@ private:
class
TransporterFacade
*
theFacade
;
class
SignalQueue
m_signalRecvQueue
;
struct
StopRecord
{
StopRecord
(){
inUse
=
false
;
callback
=
0
;
singleUserMode
=
false
;}
bool
inUse
;
bool
singleUserMode
;
int
sentCount
;
int
reply
;
int
nodeId
;
void
*
anyData
;
StopCallback
callback
;
};
StopRecord
m_stopRec
;
struct
VersionRecord
{
VersionRecord
(){
inUse
=
false
;
callback
=
0
;}
bool
inUse
;
Uint32
version
[
MAX_NODES
];
VersionCallback
callback
;
};
VersionRecord
m_versionRec
;
int
sendVersionReq
(
int
processId
);
void
handleStopReply
(
NodeId
nodeId
,
Uint32
errCode
);
int
sendVersionReq
(
int
processId
,
Uint32
&
version
);
int
translateStopRef
(
Uint32
errCode
);
bool
_isStopThread
;
...
...
@@ -753,14 +667,8 @@ private:
static
void
*
logLevelThread_C
(
void
*
);
void
logLevelThreadRun
();
struct
NdbThread
*
m_signalRecvThread
;
static
void
*
signalRecvThread_C
(
void
*
);
void
signalRecvThreadRun
();
Config
*
_props
;
int
send
(
class
NdbApiSignal
*
signal
,
Uint32
node
,
Uint32
node_type
);
ConfigRetriever
*
m_config_retriever
;
}
;
...
...
ndb/src/mgmsrv/MgmtSrvrConfig.cpp
View file @
c1c2a892
...
...
@@ -23,6 +23,8 @@
#include <ConfigRetriever.hpp>
#include <ndb_version.h>
#if 0 // code must be rewritten to use SignalSender
void
MgmtSrvr::handle_MGM_LOCK_CONFIG_REQ(NdbApiSignal *signal) {
NodeId sender = refToNode(signal->theSendersBlockRef);
...
...
@@ -221,6 +223,8 @@ MgmtSrvr::unlockConf(bool commit) {
return result;
}
#endif // code must be rewritten to use SignalSender
/**
* Commit the new configuration
*/
...
...
ndb/src/mgmsrv/MgmtSrvrGeneralSignalHandling.cpp
View file @
c1c2a892
...
...
@@ -20,123 +20,3 @@
// Some kind of reuse should be preferred.
//******************************************************************************
#include "MgmtSrvr.hpp"
#include <NdbApiSignal.hpp>
#include <NdbTick.h>
NdbApiSignal
*
MgmtSrvr
::
getSignal
()
{
NdbApiSignal
*
tSignal
;
tSignal
=
theSignalIdleList
;
if
(
tSignal
!=
NULL
){
NdbApiSignal
*
tSignalNext
=
tSignal
->
next
();
tSignal
->
next
(
NULL
);
theSignalIdleList
=
tSignalNext
;
return
tSignal
;
}
else
{
tSignal
=
new
NdbApiSignal
(
_ownReference
);
if
(
tSignal
!=
NULL
)
tSignal
->
next
(
NULL
);
}
return
tSignal
;
}
void
MgmtSrvr
::
releaseSignal
(
NdbApiSignal
*
aSignal
)
{
aSignal
->
next
(
theSignalIdleList
);
theSignalIdleList
=
aSignal
;
}
void
MgmtSrvr
::
freeSignal
()
{
NdbApiSignal
*
tSignal
=
theSignalIdleList
;
theSignalIdleList
=
tSignal
->
next
();
delete
tSignal
;
}
int
MgmtSrvr
::
sendSignal
(
Uint16
aNodeId
,
WaitSignalType
aWaitState
,
NdbApiSignal
*
aSignal
,
bool
force
)
{
int
tReturnCode
;
theFacade
->
lock_mutex
();
if
(
force
){
tReturnCode
=
theFacade
->
sendSignalUnCond
(
aSignal
,
aNodeId
);
}
else
{
tReturnCode
=
theFacade
->
sendSignal
(
aSignal
,
aNodeId
);
}
releaseSignal
(
aSignal
);
if
(
tReturnCode
==
-
1
)
{
theFacade
->
unlock_mutex
();
return
-
1
;
}
theWaitState
=
aWaitState
;
theFacade
->
unlock_mutex
();
return
0
;
}
int
MgmtSrvr
::
sendRecSignal
(
Uint16
aNodeId
,
WaitSignalType
aWaitState
,
NdbApiSignal
*
aSignal
,
bool
force
,
int
waitTime
)
{
int
tReturnCode
;
theFacade
->
lock_mutex
();
if
(
force
){
tReturnCode
=
theFacade
->
sendSignalUnCond
(
aSignal
,
aNodeId
);
}
else
{
tReturnCode
=
theFacade
->
sendSignalUnCond
(
aSignal
,
aNodeId
);
}
releaseSignal
(
aSignal
);
if
(
tReturnCode
==
-
1
)
{
theFacade
->
unlock_mutex
();
return
-
1
;
}
theWaitState
=
aWaitState
;
theWaitNode
=
aNodeId
;
return
receiveOptimisedResponse
(
waitTime
);
}
int
MgmtSrvr
::
receiveOptimisedResponse
(
int
waitTime
)
{
int
tResultCode
;
theFacade
->
checkForceSend
(
_blockNumber
);
NDB_TICKS
maxTime
=
NdbTick_CurrentMillisecond
()
+
waitTime
;
while
(
theWaitState
!=
NO_WAIT
&&
theWaitState
!=
WAIT_NODEFAILURE
&&
waitTime
>
0
)
{
NdbCondition_WaitTimeout
(
theMgmtWaitForResponseCondPtr
,
theFacade
->
theMutexPtr
,
waitTime
);
if
(
theWaitState
==
NO_WAIT
||
theWaitState
==
WAIT_NODEFAILURE
)
break
;
waitTime
=
(
maxTime
-
NdbTick_CurrentMillisecond
());
}
//while
if
(
theWaitState
==
NO_WAIT
)
{
tResultCode
=
0
;
}
else
{
tResultCode
=
-
1
;
}
theFacade
->
unlock_mutex
();
return
tResultCode
;
}
ndb/src/mgmsrv/Services.cpp
View file @
c1c2a892
...
...
@@ -1203,7 +1203,11 @@ MgmApiSession::setLogFilter(Parser_t::Context &ctx,
void
MgmApiSession
::
configLock
(
Parser_t
::
Context
&
,
Properties
const
&
)
{
#if 0 // not implemented
int ret = m_mgmsrv.lockConf();
#else
int
ret
=
-
1
;
#endif
m_output
->
println
(
"config lock reply"
);
m_output
->
println
(
"result: %d"
,
ret
);
m_output
->
println
(
""
);
...
...
@@ -1214,7 +1218,11 @@ MgmApiSession::configUnlock(Parser_t::Context &,
Properties
const
&
args
)
{
Uint32
commit
;
args
.
get
(
"commit"
,
&
commit
);
#if 0 // not implemented
int ret = m_mgmsrv.unlockConf(commit == 1);
#else
int
ret
=
-
1
;
#endif
m_output
->
println
(
"config unlock reply"
);
m_output
->
println
(
"result: %d"
,
ret
);
m_output
->
println
(
""
);
...
...
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