reengineered ndb_mgmd to use SignalSender and remove some multi user issues

parent 99bc9607
...@@ -553,7 +553,6 @@ extern const GlobalSignalNumber NO_OF_SIGNAL_NAMES; ...@@ -553,7 +553,6 @@ extern const GlobalSignalNumber NO_OF_SIGNAL_NAMES;
#define GSN_STATISTICS_CONF 454 #define GSN_STATISTICS_CONF 454
#define GSN_START_ORD 455 #define GSN_START_ORD 455
/* 456 unused */
/* 457 unused */ /* 457 unused */
#define GSN_EVENT_SUBSCRIBE_REQ 458 #define GSN_EVENT_SUBSCRIBE_REQ 458
...@@ -900,6 +899,7 @@ extern const GlobalSignalNumber NO_OF_SIGNAL_NAMES; ...@@ -900,6 +899,7 @@ extern const GlobalSignalNumber NO_OF_SIGNAL_NAMES;
#define GSN_RESUME_REQ 682 #define GSN_RESUME_REQ 682
#define GSN_STOP_REQ 443 #define GSN_STOP_REQ 443
#define GSN_STOP_REF 444 #define GSN_STOP_REF 444
#define GSN_STOP_CONF 456
#define GSN_API_VERSION_REQ 697 #define GSN_API_VERSION_REQ 697
#define GSN_API_VERSION_CONF 698 #define GSN_API_VERSION_CONF 698
......
...@@ -133,9 +133,9 @@ public: ...@@ -133,9 +133,9 @@ public:
CreateLogBytes = 48, CreateLogBytes = 48,
InfoEvent = 49, InfoEvent = 49,
//GREP // SINGLE USER
GrepSubscriptionInfo = 52, SingleUser = 52,
GrepSubscriptionAlert = 53, /* unused 53 */
//BACKUP //BACKUP
BackupStarted = 54, BackupStarted = 54,
......
...@@ -67,6 +67,13 @@ public: ...@@ -67,6 +67,13 @@ public:
static bool getStopAbort(const Uint32 & requestInfo); static bool getStopAbort(const Uint32 & requestInfo);
}; };
struct StopConf
{
STATIC_CONST( SignalLength = 2 );
Uint32 senderData;
Uint32 nodeState;
};
class StopRef class StopRef
{ {
/** /**
...@@ -86,7 +93,8 @@ public: ...@@ -86,7 +93,8 @@ public:
OK = 0, OK = 0,
NodeShutdownInProgress = 1, NodeShutdownInProgress = 1,
SystemShutdownInProgress = 2, SystemShutdownInProgress = 2,
NodeShutdownWouldCauseSystemCrash = 3 NodeShutdownWouldCauseSystemCrash = 3,
TransactionAbortFailed = 4
}; };
public: public:
......
This diff is collapsed.
...@@ -1966,6 +1966,11 @@ Ndbcntr::execRESUME_REQ(Signal* signal){ ...@@ -1966,6 +1966,11 @@ Ndbcntr::execRESUME_REQ(Signal* signal){
//ResumeRef * const ref = (ResumeRef *)&signal->theData[0]; //ResumeRef * const ref = (ResumeRef *)&signal->theData[0];
jamEntry(); jamEntry();
signal->theData[0] = EventReport::SingleUser;
signal->theData[1] = 2;
sendSignal(CMVMI_REF, GSN_EVENT_REP, signal, 2, JBB);
//Uint32 senderData = req->senderData; //Uint32 senderData = req->senderData;
//BlockReference senderRef = req->senderRef; //BlockReference senderRef = req->senderRef;
NodeState newState(NodeState::SL_STARTED); NodeState newState(NodeState::SL_STARTED);
...@@ -2004,12 +2009,11 @@ Ndbcntr::execSTOP_REQ(Signal* signal){ ...@@ -2004,12 +2009,11 @@ Ndbcntr::execSTOP_REQ(Signal* signal){
return; return;
} }
if(c_stopRec.stopReq.senderRef != 0 && !singleuser){ if(c_stopRec.stopReq.senderRef != 0){
jam();
/** /**
* Requested a system shutdown * Requested a system shutdown
*/ */
if(StopReq::getSystemStop(req->requestInfo)){ if(!singleuser && StopReq::getSystemStop(req->requestInfo)){
jam(); jam();
sendSignalWithDelay(reference(), GSN_STOP_REQ, signal, 100, sendSignalWithDelay(reference(), GSN_STOP_REQ, signal, 100,
StopReq::SignalLength); StopReq::SignalLength);
...@@ -2031,22 +2035,27 @@ Ndbcntr::execSTOP_REQ(Signal* signal){ ...@@ -2031,22 +2035,27 @@ Ndbcntr::execSTOP_REQ(Signal* signal){
c_stopRec.stopReq = * req; c_stopRec.stopReq = * req;
c_stopRec.stopInitiatedTime = NdbTick_CurrentMillisecond(); c_stopRec.stopInitiatedTime = NdbTick_CurrentMillisecond();
if(StopReq::getSystemStop(c_stopRec.stopReq.requestInfo) && !singleuser) { if(!singleuser) {
if(StopReq::getSystemStop(c_stopRec.stopReq.requestInfo)) {
jam(); jam();
if(StopReq::getPerformRestart(c_stopRec.stopReq.requestInfo)){ if(StopReq::getPerformRestart(c_stopRec.stopReq.requestInfo)){
((Configuration&)theConfiguration).stopOnError(false); ((Configuration&)theConfiguration).stopOnError(false);
} }
} }
if(!singleuser) {
if(!c_stopRec.checkNodeFail(signal)){ if(!c_stopRec.checkNodeFail(signal)){
jam(); jam();
return; return;
} }
}
signal->theData[0] = EventReport::NDBStopStarted; signal->theData[0] = EventReport::NDBStopStarted;
signal->theData[1] = StopReq::getSystemStop(c_stopRec.stopReq.requestInfo) ? 1 : 0; signal->theData[1] = StopReq::getSystemStop(c_stopRec.stopReq.requestInfo) ? 1 : 0;
sendSignal(CMVMI_REF, GSN_EVENT_REP, signal, 2, JBB); 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, NodeState newState(NodeState::SL_STOPPING_1,
StopReq::getSystemStop(c_stopRec.stopReq.requestInfo)); StopReq::getSystemStop(c_stopRec.stopReq.requestInfo));
...@@ -2129,9 +2138,11 @@ Ndbcntr::StopRecord::checkNodeFail(Signal* signal){ ...@@ -2129,9 +2138,11 @@ Ndbcntr::StopRecord::checkNodeFail(Signal* signal){
stopReq.senderRef = 0; stopReq.senderRef = 0;
if (cntr.getNodeState().startLevel != NodeState::SL_SINGLEUSER)
{
NodeState newState(NodeState::SL_STARTED); NodeState newState(NodeState::SL_STARTED);
cntr.updateNodeState(signal, newState); cntr.updateNodeState(signal, newState);
}
signal->theData[0] = EventReport::NDBStopAborted; signal->theData[0] = EventReport::NDBStopAborted;
cntr.sendSignal(CMVMI_REF, GSN_EVENT_REP, signal, 1, JBB); cntr.sendSignal(CMVMI_REF, GSN_EVENT_REP, signal, 1, JBB);
...@@ -2227,12 +2238,24 @@ void Ndbcntr::execABORT_ALL_CONF(Signal* signal){ ...@@ -2227,12 +2238,24 @@ void Ndbcntr::execABORT_ALL_CONF(Signal* signal){
jamEntry(); jamEntry();
if(c_stopRec.stopReq.singleuser) { if(c_stopRec.stopReq.singleuser) {
jam(); jam();
NodeState newState(NodeState::SL_SINGLEUSER); NodeState newState(NodeState::SL_SINGLEUSER);
newState.setSingleUser(true); newState.setSingleUser(true);
newState.setSingleUserApi(c_stopRec.stopReq.singleUserApi); newState.setSingleUserApi(c_stopRec.stopReq.singleUserApi);
updateNodeState(signal, newState); updateNodeState(signal, newState);
c_stopRec.stopInitiatedTime = NdbTick_CurrentMillisecond(); 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 else
{ {
...@@ -2250,7 +2273,13 @@ void Ndbcntr::execABORT_ALL_CONF(Signal* signal){ ...@@ -2250,7 +2273,13 @@ void Ndbcntr::execABORT_ALL_CONF(Signal* signal){
void Ndbcntr::execABORT_ALL_REF(Signal* signal){ void Ndbcntr::execABORT_ALL_REF(Signal* signal){
jamEntry(); 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 void
......
...@@ -1430,9 +1430,8 @@ CommandInterpreter::executeEnterSingleUser(char* parameters) ...@@ -1430,9 +1430,8 @@ CommandInterpreter::executeEnterSingleUser(char* parameters)
ndbout_c("Entering single user mode for node %d failed", nodeId); ndbout_c("Entering single user mode for node %d failed", nodeId);
printError(); printError();
} else { } else {
ndbout_c("Entering single user mode"); ndbout_c("Single user mode entered");
ndbout_c("Access will be granted for API node %d only.", nodeId); ndbout_c("Access is granted for API node %d only.", nodeId);
ndbout_c("Use ALL STATUS to see when single user mode has been entered.");
} }
} }
...@@ -1445,7 +1444,7 @@ CommandInterpreter::executeExitSingleUser(char* parameters) ...@@ -1445,7 +1444,7 @@ CommandInterpreter::executeExitSingleUser(char* parameters)
printError(); printError();
} else { } else {
ndbout_c("Exiting single user mode in progress."); 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.");
} }
} }
......
This diff is collapsed.
...@@ -22,11 +22,11 @@ ...@@ -22,11 +22,11 @@
#include <NdbCondition.h> #include <NdbCondition.h>
#include <mgmapi.h> #include <mgmapi.h>
#include <NdbTCP.h>
#include <ConfigRetriever.hpp>
#include <Vector.hpp> #include <Vector.hpp>
#include <NodeBitmask.hpp> #include <NodeBitmask.hpp>
#include <signaldata/ManagementServer.hpp> #include <signaldata/ManagementServer.hpp>
#include "SignalQueue.hpp"
#include <ndb_version.h> #include <ndb_version.h>
#include <EventLogger.hpp> #include <EventLogger.hpp>
#include <signaldata/EventSubscribeReq.hpp> #include <signaldata/EventSubscribeReq.hpp>
...@@ -213,17 +213,6 @@ public: ...@@ -213,17 +213,6 @@ public:
// COULD_NOT_ALLOCATE_MEMORY, SEND_OR_RECEIVE_FAILED // 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 * Lock configuration
*/ */
...@@ -272,12 +261,12 @@ public: ...@@ -272,12 +261,12 @@ public:
* @param processId: Id of the DB process to stop * @param processId: Id of the DB process to stop
* @return 0 if succeeded, otherwise: as stated above, plus: * @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 * 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 * print version info about a node
...@@ -285,27 +274,18 @@ public: ...@@ -285,27 +274,18 @@ public:
* @param processId: Id of the DB process to stop * @param processId: Id of the DB process to stop
* @return 0 if succeeded, otherwise: as stated above, plus: * @return 0 if succeeded, otherwise: as stated above, plus:
*/ */
int versionNode(int nodeId, bool abort = false, int versionNode(int nodeId, Uint32 &version);
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);
/** /**
* Maintenance on the system * Maintenance on the system
*/ */
int enterSingleUser(int * cnt = 0, Uint32 singleuserNodeId = 0, int enterSingleUser(int * cnt = 0, Uint32 singleuserNodeId = 0);
EnterSingleCallback = 0, void *any = 0);
/** /**
* Resume from maintenance on the system * Resume from maintenance on the system
*/ */
int exitSingleUser(int * cnt = 0, bool abort = false, int exitSingleUser(int * cnt = 0, bool abort = false);
ExitSingleCallback = 0, void *any = 0);
/** /**
* Start DB process. * Start DB process.
...@@ -319,15 +299,14 @@ public: ...@@ -319,15 +299,14 @@ public:
* @param processId: Id of the DB process to start * @param processId: Id of the DB process to start
*/ */
int restartNode(int processId, bool nostart, bool initialStart, int restartNode(int processId, bool nostart, bool initialStart,
bool abort = false, bool abort = false);
StopCallback = 0, void * anyData = 0);
/** /**
* Restart the system * Restart the system
*/ */
int restart(bool nostart, bool initialStart, int restart(bool nostart, bool initialStart,
bool abort = false, bool abort = false,
int * stopCount = 0, StopCallback = 0, void * anyData = 0); int * stopCount = 0);
struct BackupEvent { struct BackupEvent {
enum Event { enum Event {
...@@ -518,6 +497,16 @@ private: ...@@ -518,6 +497,16 @@ private:
//************************************************************************** //**************************************************************************
int setEventReportingLevel(int processId, LogLevel::EventCategory, Uint32); 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 * Check if it is possible to send a signal to a (DB) process
...@@ -608,60 +597,9 @@ private: ...@@ -608,60 +597,9 @@ private:
enum WaitSignalType { enum WaitSignalType {
NO_WAIT, // We don't expect to receive any signal NO_WAIT, // We don't expect to receive any signal
WAIT_SET_VAR, // Accept SET_VAR_CONF and SET_VAR_REF WAIT_SET_VAR, // Accept SET_VAR_CONF and SET_VAR_REF
WAIT_SUBSCRIBE_CONF, // Accept event subscription confirmation WAIT_SUBSCRIBE_CONF // Accept event subscription confirmation
WAIT_STOP,
WAIT_BACKUP_STARTED,
WAIT_BACKUP_COMPLETED,
WAIT_VERSION,
WAIT_NODEFAILURE
}; };
/**
* 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 * This function is called from "outside" of MgmtSrvr
* when a signal is sent to MgmtSrvr. * when a signal is sent to MgmtSrvr.
...@@ -708,31 +646,7 @@ private: ...@@ -708,31 +646,7 @@ private:
class TransporterFacade * theFacade; class TransporterFacade * theFacade;
class SignalQueue m_signalRecvQueue; int sendVersionReq( int processId, Uint32 &version);
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 translateStopRef(Uint32 errCode); int translateStopRef(Uint32 errCode);
bool _isStopThread; bool _isStopThread;
...@@ -753,14 +667,8 @@ private: ...@@ -753,14 +667,8 @@ private:
static void *logLevelThread_C(void *); static void *logLevelThread_C(void *);
void logLevelThreadRun(); void logLevelThreadRun();
struct NdbThread *m_signalRecvThread;
static void *signalRecvThread_C(void *);
void signalRecvThreadRun();
Config *_props; Config *_props;
int send(class NdbApiSignal* signal, Uint32 node, Uint32 node_type);
ConfigRetriever *m_config_retriever; ConfigRetriever *m_config_retriever;
}; };
......
...@@ -23,6 +23,8 @@ ...@@ -23,6 +23,8 @@
#include <ConfigRetriever.hpp> #include <ConfigRetriever.hpp>
#include <ndb_version.h> #include <ndb_version.h>
#if 0 // code must be rewritten to use SignalSender
void void
MgmtSrvr::handle_MGM_LOCK_CONFIG_REQ(NdbApiSignal *signal) { MgmtSrvr::handle_MGM_LOCK_CONFIG_REQ(NdbApiSignal *signal) {
NodeId sender = refToNode(signal->theSendersBlockRef); NodeId sender = refToNode(signal->theSendersBlockRef);
...@@ -221,6 +223,8 @@ MgmtSrvr::unlockConf(bool commit) { ...@@ -221,6 +223,8 @@ MgmtSrvr::unlockConf(bool commit) {
return result; return result;
} }
#endif // code must be rewritten to use SignalSender
/** /**
* Commit the new configuration * Commit the new configuration
*/ */
......
...@@ -20,123 +20,3 @@ ...@@ -20,123 +20,3 @@
// Some kind of reuse should be preferred. // 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;
}
...@@ -1203,7 +1203,11 @@ MgmApiSession::setLogFilter(Parser_t::Context &ctx, ...@@ -1203,7 +1203,11 @@ MgmApiSession::setLogFilter(Parser_t::Context &ctx,
void void
MgmApiSession::configLock(Parser_t::Context &, MgmApiSession::configLock(Parser_t::Context &,
Properties const &) { Properties const &) {
#if 0 // not implemented
int ret = m_mgmsrv.lockConf(); int ret = m_mgmsrv.lockConf();
#else
int ret = -1;
#endif
m_output->println("config lock reply"); m_output->println("config lock reply");
m_output->println("result: %d", ret); m_output->println("result: %d", ret);
m_output->println(""); m_output->println("");
...@@ -1214,7 +1218,11 @@ MgmApiSession::configUnlock(Parser_t::Context &, ...@@ -1214,7 +1218,11 @@ MgmApiSession::configUnlock(Parser_t::Context &,
Properties const &args) { Properties const &args) {
Uint32 commit; Uint32 commit;
args.get("commit", &commit); args.get("commit", &commit);
#if 0 // not implemented
int ret = m_mgmsrv.unlockConf(commit == 1); int ret = m_mgmsrv.unlockConf(commit == 1);
#else
int ret = -1;
#endif
m_output->println("config unlock reply"); m_output->println("config unlock reply");
m_output->println("result: %d", ret); m_output->println("result: %d", ret);
m_output->println(""); m_output->println("");
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment