diff --git a/include/maxscale/config.hh b/include/maxscale/config.hh index 98deca3dd..9f72106eb 100644 --- a/include/maxscale/config.hh +++ b/include/maxscale/config.hh @@ -85,63 +85,66 @@ class SERVICE; */ extern const char CN_ACCOUNT[]; extern const char CN_ADDRESS[]; -extern const char CN_ARG_MAX[]; -extern const char CN_ARG_MIN[]; extern const char CN_ADMIN_AUTH[]; extern const char CN_ADMIN_ENABLED[]; -extern const char CN_ADMIN_LOG_AUTH_FAILURES[]; extern const char CN_ADMIN_HOST[]; +extern const char CN_ADMIN_LOG_AUTH_FAILURES[]; extern const char CN_ADMIN_PORT[]; -extern const char CN_ADMIN_SSL_KEY[]; -extern const char CN_ADMIN_SSL_CERT[]; extern const char CN_ADMIN_SSL_CA_CERT[]; +extern const char CN_ADMIN_SSL_CERT[]; +extern const char CN_ADMIN_SSL_KEY[]; +extern const char CN_ARG_MAX[]; +extern const char CN_ARG_MIN[]; extern const char CN_ARGUMENTS[]; extern const char CN_ATTRIBUTES[]; -extern const char CN_AUTHENTICATOR[]; -extern const char CN_AUTHENTICATOR_DIAGNOSTICS[]; -extern const char CN_AUTHENTICATOR_OPTIONS[]; extern const char CN_AUTH_ALL_SERVERS[]; extern const char CN_AUTH_CONNECT_TIMEOUT[]; extern const char CN_AUTH_READ_TIMEOUT[]; extern const char CN_AUTH_WRITE_TIMEOUT[]; +extern const char CN_AUTHENTICATOR_DIAGNOSTICS[]; +extern const char CN_AUTHENTICATOR_OPTIONS[]; +extern const char CN_AUTHENTICATOR[]; extern const char CN_AUTO[]; -extern const char CN_CACHE[]; extern const char CN_CACHE_SIZE[]; -extern const char CN_CLASSIFY[]; +extern const char CN_CACHE[]; extern const char CN_CLASSIFICATION[]; +extern const char CN_CLASSIFY[]; extern const char CN_CONNECTION_TIMEOUT[]; -extern const char CN_DUMP_LAST_STATEMENTS[]; extern const char CN_DATA[]; extern const char CN_DEFAULT[]; extern const char CN_DESCRIPTION[]; extern const char CN_DISK_SPACE_THRESHOLD[]; +extern const char CN_DUMP_LAST_STATEMENTS[]; extern const char CN_ENABLE_ROOT_USER[]; +extern const char CN_EXTRA_PORT[]; extern const char CN_FIELDS[]; -extern const char CN_FILTERS[]; -extern const char CN_FILTER[]; extern const char CN_FILTER_DIAGNOSTICS[]; +extern const char CN_FILTER[]; +extern const char CN_FILTERS[]; +extern const char CN_FORCE[]; extern const char CN_FUNCTIONS[]; extern const char CN_GATEWAY[]; extern const char CN_HAS_WHERE_CLAUSE[]; extern const char CN_HITS[]; extern const char CN_ID[]; extern const char CN_INET[]; +extern const char CN_LINKS[]; extern const char CN_LISTENER[]; extern const char CN_LISTENERS[]; extern const char CN_LOCALHOST_MATCH_WILDCARD_HOST[]; extern const char CN_LOG_AUTH_WARNINGS[]; extern const char CN_LOG_THROTTLING[]; -extern const char CN_MAXSCALE[]; extern const char CN_MAX_CONNECTIONS[]; extern const char CN_MAX_RETRY_INTERVAL[]; +extern const char CN_MAXSCALE[]; extern const char CN_META[]; extern const char CN_METHOD[]; +extern const char CN_MODULE_COMMAND[]; extern const char CN_MODULE[]; extern const char CN_MODULES[]; -extern const char CN_MODULE_COMMAND[]; -extern const char CN_MONITORS[]; -extern const char CN_MONITOR[]; extern const char CN_MONITOR_DIAGNOSTICS[]; +extern const char CN_MONITOR[]; +extern const char CN_MONITORS[]; extern const char CN_MS_TIMESTAMP[]; extern const char CN_NAME[]; extern const char CN_NON_BLOCKING_POLLS[]; @@ -153,47 +156,45 @@ extern const char CN_PASSIVE[]; extern const char CN_PASSWORD[]; extern const char CN_POLL_SLEEP[]; extern const char CN_PORT[]; -extern const char CN_EXTRA_PORT[]; extern const char CN_PROTOCOL[]; -extern const char CN_QUERY_CLASSIFIER[]; extern const char CN_QUERY_CLASSIFIER_ARGS[]; extern const char CN_QUERY_CLASSIFIER_CACHE_SIZE[]; +extern const char CN_QUERY_CLASSIFIER[]; extern const char CN_QUERY_RETRIES[]; extern const char CN_QUERY_RETRY_TIMEOUT[]; extern const char CN_RELATIONSHIPS[]; -extern const char CN_LINKS[]; extern const char CN_REQUIRED[]; extern const char CN_RETAIN_LAST_STATEMENTS[]; extern const char CN_RETRY_ON_FAILURE[]; -extern const char CN_ROUTER[]; extern const char CN_ROUTER_DIAGNOSTICS[]; extern const char CN_ROUTER_OPTIONS[]; +extern const char CN_ROUTER[]; extern const char CN_SELF[]; -extern const char CN_SERVERS[]; extern const char CN_SERVER[]; -extern const char CN_SERVICES[]; +extern const char CN_SERVERS[]; extern const char CN_SERVICE[]; -extern const char CN_SESSIONS[]; +extern const char CN_SERVICES[]; extern const char CN_SESSION_TRACK_TRX_STATE[]; +extern const char CN_SESSIONS[]; extern const char CN_SKIP_PERMISSION_CHECKS[]; extern const char CN_SOCKET[]; -extern const char CN_STATE[]; -extern const char CN_SSL[]; extern const char CN_SSL_CA_CERT[]; -extern const char CN_SSL_CERT[]; extern const char CN_SSL_CERT_VERIFY_DEPTH[]; -extern const char CN_SSL_VERIFY_PEER_CERTIFICATE[]; +extern const char CN_SSL_CERT[]; extern const char CN_SSL_KEY[]; +extern const char CN_SSL_VERIFY_PEER_CERTIFICATE[]; extern const char CN_SSL_VERSION[]; +extern const char CN_SSL[]; +extern const char CN_STATE[]; extern const char CN_STATEMENT[]; extern const char CN_STATEMENTS[]; extern const char CN_STRIP_DB_ESC[]; extern const char CN_SUBSTITUTE_VARIABLES[]; -extern const char CN_THREADS[]; extern const char CN_THREAD_STACK_SIZE[]; +extern const char CN_THREADS[]; extern const char CN_TICKS[]; -extern const char CN_TYPE[]; extern const char CN_TYPE_MASK[]; +extern const char CN_TYPE[]; extern const char CN_UNIX[]; extern const char CN_USER[]; extern const char CN_USERS[]; @@ -201,6 +202,7 @@ extern const char CN_VERSION_STRING[]; extern const char CN_WEIGHTBY[]; extern const char CN_WRITEQ_HIGH_WATER[]; extern const char CN_WRITEQ_LOW_WATER[]; +extern const char CN_YES[]; /* * Global configuration items that are read (or pre_parsed) to be available for diff --git a/maxctrl/lib/set.js b/maxctrl/lib/set.js index af230b93f..72fc75836 100644 --- a/maxctrl/lib/set.js +++ b/maxctrl/lib/set.js @@ -17,6 +17,12 @@ exports.desc = 'Set object state' exports.handler = function() {} exports.builder = function(yargs) { yargs + .group(['force'], 'Set options:') + .option('force', { + describe: 'Forcefully close all connections to the target server', + type: 'boolean', + default: false + }) .command('server ', 'Set server state', function(yargs) { return yargs.epilog('If is monitored by a monitor, this command should ' + 'only be used to set the server into the `maintenance` state. ' + @@ -27,6 +33,9 @@ exports.builder = function(yargs) { .usage('Usage: set server ') }, function(argv) { var target = 'servers/' + argv.server + '/set?state=' + argv.state + if (argv.force) { + target += '&force=yes' + } maxctrl(argv, function(host) { return doRequest(host, target, null, {method: 'PUT'}) }) diff --git a/server/core/config.cc b/server/core/config.cc index d841b09d1..9a461dfad 100644 --- a/server/core/config.cc +++ b/server/core/config.cc @@ -72,17 +72,17 @@ using maxscale::Monitor; const char CN_ACCOUNT[] = "account"; const char CN_ADDRESS[] = "address"; -const char CN_ARG_MAX[] = "arg_max"; -const char CN_ARG_MIN[] = "arg_min"; const char CN_ADMIN_AUTH[] = "admin_auth"; const char CN_ADMIN_ENABLED[] = "admin_enabled"; -const char CN_ADMIN_LOG_AUTH_FAILURES[] = "admin_log_auth_failures"; const char CN_ADMIN_HOST[] = "admin_host"; +const char CN_ADMIN_LOG_AUTH_FAILURES[] = "admin_log_auth_failures"; const char CN_ADMIN_PORT[] = "admin_port"; -const char CN_ADMIN_SSL_KEY[] = "admin_ssl_key"; -const char CN_ADMIN_SSL_CERT[] = "admin_ssl_cert"; const char CN_ADMIN_SSL_CA_CERT[] = "admin_ssl_ca_cert"; +const char CN_ADMIN_SSL_CERT[] = "admin_ssl_cert"; +const char CN_ADMIN_SSL_KEY[] = "admin_ssl_key"; const char CN_ARGUMENTS[] = "arguments"; +const char CN_ARG_MAX[] = "arg_max"; +const char CN_ARG_MIN[] = "arg_min"; const char CN_ATTRIBUTES[] = "attributes"; const char CN_AUTHENTICATOR[] = "authenticator"; const char CN_AUTHENTICATOR_DIAGNOSTICS[] = "authenticator_diagnostics"; @@ -94,8 +94,8 @@ const char CN_AUTH_WRITE_TIMEOUT[] = "auth_write_timeout"; const char CN_AUTO[] = "auto"; const char CN_CACHE[] = "cache"; const char CN_CACHE_SIZE[] = "cache_size"; -const char CN_CLASSIFY[] = "classify"; const char CN_CLASSIFICATION[] = "classification"; +const char CN_CLASSIFY[] = "classify"; const char CN_CLUSTER[] = "cluster"; const char CN_CONNECTION_TIMEOUT[] = "connection_timeout"; const char CN_DATA[] = "data"; @@ -104,19 +104,23 @@ const char CN_DESCRIPTION[] = "description"; const char CN_DISK_SPACE_THRESHOLD[] = "disk_space_threshold"; const char CN_DUMP_LAST_STATEMENTS[] = "dump_last_statements"; const char CN_ENABLE_ROOT_USER[] = "enable_root_user"; +const char CN_EXTRA_PORT[] = "extra_port"; const char CN_FIELDS[] = "fields"; const char CN_FILTERS[] = "filters"; const char CN_FILTER[] = "filter"; const char CN_FILTER_DIAGNOSTICS[] = "filter_diagnostics"; +const char CN_FORCE[] = "force"; const char CN_FUNCTIONS[] = "functions"; const char CN_GATEWAY[] = "gateway"; const char CN_HAS_WHERE_CLAUSE[] = "has_where_clause"; const char CN_HITS[] = "hits"; const char CN_ID[] = "id"; const char CN_INET[] = "inet"; -const char CN_LISTENER[] = "listener"; +const char CN_LINKS[] = "links"; const char CN_LISTENERS[] = "listeners"; +const char CN_LISTENER[] = "listener"; const char CN_LOCALHOST_MATCH_WILDCARD_HOST[] = "localhost_match_wildcard_host"; +const char CN_LOCAL_ADDRESS[] = "local_address"; const char CN_LOG_AUTH_WARNINGS[] = "log_auth_warnings"; const char CN_LOG_THROTTLING[] = "log_throttling"; const char CN_MAXSCALE[] = "maxscale"; @@ -124,8 +128,8 @@ const char CN_MAX_CONNECTIONS[] = "max_connections"; const char CN_MAX_RETRY_INTERVAL[] = "max_retry_interval"; const char CN_META[] = "meta"; const char CN_METHOD[] = "method"; -const char CN_MODULE[] = "module"; const char CN_MODULES[] = "modules"; +const char CN_MODULE[] = "module"; const char CN_MODULE_COMMAND[] = "module_command"; const char CN_MONITORS[] = "monitors"; const char CN_MONITOR[] = "monitor"; @@ -141,7 +145,6 @@ const char CN_PASSIVE[] = "passive"; const char CN_PASSWORD[] = "password"; const char CN_POLL_SLEEP[] = "poll_sleep"; const char CN_PORT[] = "port"; -const char CN_EXTRA_PORT[] = "extra_port"; const char CN_PROTOCOL[] = "protocol"; const char CN_QUERY_CLASSIFIER[] = "query_classifier"; const char CN_QUERY_CLASSIFIER_ARGS[] = "query_classifier_args"; @@ -149,8 +152,6 @@ const char CN_QUERY_CLASSIFIER_CACHE_SIZE[] = "query_classifier_cache_size"; const char CN_QUERY_RETRIES[] = "query_retries"; const char CN_QUERY_RETRY_TIMEOUT[] = "query_retry_timeout"; const char CN_RELATIONSHIPS[] = "relationships"; -const char CN_LINKS[] = "links"; -const char CN_LOCAL_ADDRESS[] = "local_address"; const char CN_REQUIRED[] = "required"; const char CN_RETAIN_LAST_STATEMENTS[] = "retain_last_statements"; const char CN_RETRY_ON_FAILURE[] = "retry_on_failure"; @@ -167,16 +168,16 @@ const char CN_SESSION_TRACK_TRX_STATE[] = "session_track_trx_state"; const char CN_SKIP_PERMISSION_CHECKS[] = "skip_permission_checks"; const char CN_SOCKET[] = "socket"; const char CN_SQL_MODE[] = "sql_mode"; -const char CN_STATE[] = "state"; -const char CN_STATEMENT[] = "statement"; -const char CN_STATEMENTS[] = "statements"; const char CN_SSL[] = "ssl"; const char CN_SSL_CA_CERT[] = "ssl_ca_cert"; const char CN_SSL_CERT[] = "ssl_cert"; const char CN_SSL_CERT_VERIFY_DEPTH[] = "ssl_cert_verify_depth"; -const char CN_SSL_VERIFY_PEER_CERTIFICATE[] = "ssl_verify_peer_certificate"; const char CN_SSL_KEY[] = "ssl_key"; +const char CN_SSL_VERIFY_PEER_CERTIFICATE[] = "ssl_verify_peer_certificate"; const char CN_SSL_VERSION[] = "ssl_version"; +const char CN_STATEMENTS[] = "statements"; +const char CN_STATEMENT[] = "statement"; +const char CN_STATE[] = "state"; const char CN_STRIP_DB_ESC[] = "strip_db_esc"; const char CN_SUBSTITUTE_VARIABLES[] = "substitute_variables"; const char CN_THREADS[] = "threads"; @@ -185,13 +186,14 @@ const char CN_TICKS[] = "ticks"; const char CN_TYPE[] = "type"; const char CN_TYPE_MASK[] = "type_mask"; const char CN_UNIX[] = "unix"; -const char CN_USER[] = "user"; const char CN_USERS[] = "users"; const char CN_USERS_REFRESH_TIME[] = "users_refresh_time"; +const char CN_USER[] = "user"; const char CN_VERSION_STRING[] = "version_string"; const char CN_WEIGHTBY[] = "weightby"; const char CN_WRITEQ_HIGH_WATER[] = "writeq_high_water"; const char CN_WRITEQ_LOW_WATER[] = "writeq_low_water"; +const char CN_YES[] = "yes"; extern const char CN_LOGDIR[] = "logdir"; diff --git a/server/core/resource.cc b/server/core/resource.cc index 4084050a2..e1a5baa0b 100644 --- a/server/core/resource.cc +++ b/server/core/resource.cc @@ -787,6 +787,11 @@ HttpResponse cb_set_server(const HttpRequest& request) string errmsg; if (mxs::server_set_status(server, opt, &errmsg)) { + if (status_is_in_maint(opt) && request.get_option(CN_FORCE) == CN_YES) + { + dcb_hangup_foreach(server); + } + return HttpResponse(MHD_HTTP_NO_CONTENT); } else