1
0
mirror of https://github.com/mariadb-corporation/mariadb-columnstore-engine.git synced 2025-04-18 21:44:02 +03:00
Denis Khalikov 3fcb9b66f5 MCOL-5555 Add support for startreadonly command.
This patch adds support for `startreadonly` command which waits
until all active cpimport jobs are done and then puts controller node to readonly
mode.
2023-10-16 16:11:12 +03:00

203 lines
3.7 KiB
C++

/* Copyright (C) 2014 InfiniDB, Inc.
This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License
as published by the Free Software Foundation; version 2 of
the License.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
MA 02110-1301, USA. */
/*****************************************************************************
* $Id: dbrmctl.cpp 1823 2013-01-21 14:13:09Z rdempsey $
*
****************************************************************************/
#include <unistd.h>
#include <iostream>
using namespace std;
#include "IDBPolicy.h"
#include "brm.h"
using namespace messageqcpp;
using namespace BRM;
DBRM dbrm(true);
namespace
{
bool vflg;
void usage(char* c)
{
cerr << "Usage: " << c
<< " [-vh] status | halt | resume | readonly | readwrite | reload | startreadonly | "
"forceclearcpimportjobs"
<< endl;
exit(1);
}
void errMsg(int err)
{
switch (err)
{
case ERR_OK:
cout << "OK.";
if (vflg)
{
if (dbrm.getSystemReady() > 0)
cout << " (and the system is ready)";
else
cout << " (but the system is not ready)";
}
cout << endl;
break;
case ERR_NETWORK: cout << "Failure: an unspecific communication error." << endl; break;
case ERR_TIMEOUT: cout << "Failure: controller node timed out." << endl; break;
case ERR_READONLY: cout << "DBRM is currently Read Only!" << endl; break;
case 20: cout << "System is ready" << endl; break;
case 21: cout << "System is not ready" << endl; break;
default: cout << "Failure: an unexpected error (" << err << ")" << endl; break;
}
}
void do_halt()
{
int err;
err = dbrm.halt();
errMsg(err);
}
void do_resume()
{
int err;
err = dbrm.resume();
errMsg(err);
}
void do_reload()
{
int err;
err = dbrm.forceReload();
errMsg(err);
}
void set_readonly(bool b)
{
int err;
err = dbrm.setReadOnly(b);
errMsg(err);
}
void do_status()
{
int err;
err = dbrm.isReadWrite();
errMsg(err);
}
void start_readonly()
{
int err;
err = dbrm.startReadOnly();
errMsg(err);
}
void force_clear_cpimport_jobs()
{
int err;
err = dbrm.forceClearCpimportJobs();
errMsg(err);
}
void do_sysstatus()
{
int err;
bool ready = dbrm.getSystemReady() > 0 ? true : false;
if (ready)
err = 20;
else
err = 21;
errMsg(err);
}
} // namespace
int main(int argc, char** argv)
{
int c;
vflg = false;
opterr = 0;
while ((c = getopt(argc, argv, "vh")) != EOF)
switch (c)
{
case 'v': vflg = true; break;
case 'h':
case '?':
default:
usage(argv[0]);
return (c == 'h' ? 0 : 1);
break;
}
string cmd;
if ((argc - optind) < 1)
usage(argv[0]);
idbdatafile::IDBPolicy::configIDBPolicy();
cmd = argv[optind++];
if (cmd == "status")
do_status();
else if (cmd == "halt")
do_halt();
else if (cmd == "resume")
do_resume();
else if (cmd == "readonly")
set_readonly(true);
else if (cmd == "readwrite")
set_readonly(false);
else if (cmd == "reload")
do_reload();
else if (cmd == "startreadonly")
start_readonly();
else if (cmd == "forceclearcpimportjobs")
force_clear_cpimport_jobs();
else if (cmd == "sysstatus")
do_sysstatus();
else
usage(argv[0]);
return 0;
}