along with this program; if not, see <http://www.gnu.org/licenses/>.
*/
#include "includes.h"
-#include "lib/events/events.h"
+#include "lib/tevent/tevent.h"
#include "lib/tdb/include/tdb.h"
#include "system/network.h"
#include "system/filesys.h"
switch (opcode) {
case CTDB_CONTROL_PROCESS_EXISTS: {
CHECK_CONTROL_DATA_SIZE(sizeof(pid_t));
- return kill(*(pid_t *)indata.dptr, 0);
+ return ctdb_control_process_exists(ctdb, *(pid_t *)indata.dptr);
}
case CTDB_CONTROL_SET_DEBUG: {
}
case CTDB_CONTROL_STATISTICS: {
+ int i;
CHECK_CONTROL_DATA_SIZE(0);
ctdb->statistics.memory_used = talloc_total_size(NULL);
- ctdb->statistics.frozen = (ctdb->freeze_mode == CTDB_FREEZE_FROZEN);
+ ctdb->statistics.frozen = 0;
+ for (i=1; i<= NUM_DB_PRIORITIES; i++) {
+ if (ctdb->freeze_mode[i] == CTDB_FREEZE_FROZEN) {
+ ctdb->statistics.frozen = 1;
+ }
+ }
ctdb->statistics.recovering = (ctdb->recovery_mode == CTDB_RECOVERY_ACTIVE);
+ ctdb->statistics.statistics_current_time = timeval_current();
+
outdata->dptr = (uint8_t *)&ctdb->statistics;
outdata->dsize = sizeof(ctdb->statistics);
return 0;
case CTDB_CONTROL_STATISTICS_RESET: {
CHECK_CONTROL_DATA_SIZE(0);
ZERO_STRUCT(ctdb->statistics);
+ ctdb->statistics.statistics_start_time = timeval_current();
return 0;
}
return ctdb_control_push_db(ctdb, indata);
case CTDB_CONTROL_GET_RECMODE: {
- return ctdb->recovery_mode;
+ int i;
+ if (ctdb->recovery_mode == CTDB_RECOVERY_ACTIVE) {
+ return CTDB_RECOVERY_ACTIVE;
+ }
+ for (i=1; i<=NUM_DB_PRIORITIES; i++) {
+ if (ctdb->freeze_mode[i] == CTDB_FREEZE_FROZEN) {
+ return CTDB_RECOVERY_ACTIVE;
+ }
+ }
+ return CTDB_RECOVERY_NORMAL;
}
case CTDB_CONTROL_SET_RECMASTER: {
case CTDB_CONTROL_THAW:
CHECK_CONTROL_DATA_SIZE(0);
- return ctdb_control_thaw(ctdb);
+ return ctdb_control_thaw(ctdb, (uint32_t)c->srvid);
case CTDB_CONTROL_SET_RECMODE:
CHECK_CONTROL_DATA_SIZE(sizeof(uint32_t));
if (ctdb->methods != NULL) {
ctdb->methods->shutdown(ctdb);
}
- ctdb_event_script(ctdb, "shutdown");
+ ctdb_event_script(ctdb, CTDB_EVENT_SHUTDOWN);
DEBUG(DEBUG_NOTICE,("Received SHUTDOWN command. Stopping CTDB daemon.\n"));
exit(0);
return ctdb_control_startup(ctdb, srcnode);
case CTDB_CONTROL_TCP_ADD:
- CHECK_CONTROL_DATA_SIZE(sizeof(struct ctdb_control_tcp_vnn));
- return ctdb_control_tcp_add(ctdb, indata);
+ CHECK_CONTROL_DATA_SIZE(sizeof(struct ctdb_tcp_connection));
+ return ctdb_control_tcp_add(ctdb, indata, false);
+
+ case CTDB_CONTROL_TCP_ADD_DELAYED_UPDATE:
+ CHECK_CONTROL_DATA_SIZE(sizeof(struct ctdb_tcp_connection));
+ return ctdb_control_tcp_add(ctdb, indata, true);
+
+ case CTDB_CONTROL_TCP_REMOVE:
+ CHECK_CONTROL_DATA_SIZE(sizeof(struct ctdb_tcp_connection));
+ return ctdb_control_tcp_remove(ctdb, indata);
case CTDB_CONTROL_SET_TUNABLE:
return ctdb_control_set_tunable(ctdb, indata);
case CTDB_CONTROL_TRANS2_FINISHED:
return ctdb_control_trans2_finished(ctdb, c);
- case CTDB_CONTROL_RECD_PING:
- CHECK_CONTROL_DATA_SIZE(0);
- return ctdb_control_recd_ping(ctdb);
-
- case CTDB_CONTROL_EVENT_SCRIPT_INIT:
- CHECK_CONTROL_DATA_SIZE(0);
- return ctdb_control_event_script_init(ctdb);
+ case CTDB_CONTROL_TRANS2_ACTIVE:
+ CHECK_CONTROL_DATA_SIZE(sizeof(uint32_t));
+ return ctdb_control_trans2_active(ctdb, c, *(uint32_t *)indata.dptr);
- case CTDB_CONTROL_EVENT_SCRIPT_START:
- return ctdb_control_event_script_start(ctdb, indata);
-
- case CTDB_CONTROL_EVENT_SCRIPT_STOP:
- CHECK_CONTROL_DATA_SIZE(sizeof(int32_t));
- return ctdb_control_event_script_stop(ctdb, indata);
+ case CTDB_CONTROL_TRANS3_COMMIT:
+ return ctdb_control_trans3_commit(ctdb, c, indata, async_reply);
- case CTDB_CONTROL_EVENT_SCRIPT_FINISHED:
+ case CTDB_CONTROL_RECD_PING:
CHECK_CONTROL_DATA_SIZE(0);
- return ctdb_control_event_script_finished(ctdb);
+ return ctdb_control_recd_ping(ctdb);
- case CTDB_CONTROL_EVENT_SCRIPT_DISABLED:
- return ctdb_control_event_script_disabled(ctdb, indata);
-
case CTDB_CONTROL_GET_EVENT_SCRIPT_STATUS:
- CHECK_CONTROL_DATA_SIZE(0);
- return ctdb_control_get_event_script_status(ctdb, outdata);
+ CHECK_CONTROL_DATA_SIZE(sizeof(uint32_t));
+ return ctdb_control_get_event_script_status(ctdb, *(uint32_t *)indata.dptr, outdata);
case CTDB_CONTROL_RECD_RECLOCK_LATENCY:
CHECK_CONTROL_DATA_SIZE(sizeof(double));
- ctdb_reclock_latency(ctdb, "recd reclock", &ctdb->statistics.reclock.recd, *((double *)indata.dptr));
+ CTDB_UPDATE_RECLOCK_LATENCY(ctdb, "recd reclock", reclock.recd, *((double *)indata.dptr));
return 0;
case CTDB_CONTROL_GET_RECLOCK_FILE:
CHECK_CONTROL_DATA_SIZE(0);
}
if (indata.dsize > 0) {
ctdb->recovery_lock_file = talloc_strdup(ctdb, discard_const(indata.dptr));
+ ctdb->tunable.verify_recovery_lock = 1;
}
return 0;
+
case CTDB_CONTROL_STOP_NODE:
CHECK_CONTROL_DATA_SIZE(0);
return ctdb_control_stop_node(ctdb, c, async_reply);
CHECK_CONTROL_DATA_SIZE(0);
return ctdb_control_get_ban_state(ctdb, outdata);
+ case CTDB_CONTROL_SET_DB_PRIORITY:
+ CHECK_CONTROL_DATA_SIZE(sizeof(struct ctdb_db_priority));
+ return ctdb_control_set_db_priority(ctdb, indata);
+
+ case CTDB_CONTROL_GET_DB_PRIORITY: {
+ uint32_t db_id;
+ struct ctdb_db_context *ctdb_db;
+
+ CHECK_CONTROL_DATA_SIZE(sizeof(db_id));
+ db_id = *(uint32_t *)indata.dptr;
+ ctdb_db = find_ctdb_db(ctdb, db_id);
+ if (ctdb_db == NULL) return -1;
+ return ctdb_db->priority;
+ }
+
+ case CTDB_CONTROL_TRANSACTION_CANCEL:
+ CHECK_CONTROL_DATA_SIZE(0);
+ return ctdb_control_transaction_cancel(ctdb);
+
+ case CTDB_CONTROL_REGISTER_NOTIFY:
+ return ctdb_control_register_notify(ctdb, client_id, indata);
+
+ case CTDB_CONTROL_DEREGISTER_NOTIFY:
+ CHECK_CONTROL_DATA_SIZE(sizeof(struct ctdb_client_notify_deregister));
+ return ctdb_control_deregister_notify(ctdb, client_id, indata);
+
+ case CTDB_CONTROL_GET_LOG:
+ CHECK_CONTROL_DATA_SIZE(sizeof(struct ctdb_get_log_addr));
+ return ctdb_control_get_log(ctdb, indata);
+
+ case CTDB_CONTROL_CLEAR_LOG:
+ return ctdb_control_clear_log(ctdb);
+
+ case CTDB_CONTROL_GET_DB_SEQNUM:
+ CHECK_CONTROL_DATA_SIZE(sizeof(uint64_t));
+ return ctdb_control_get_db_seqnum(ctdb, indata, outdata);
+
+ case CTDB_CONTROL_DB_SET_HEALTHY:
+ CHECK_CONTROL_DATA_SIZE(sizeof(uint32_t));
+ return ctdb_control_db_set_healthy(ctdb, indata);
+
+ case CTDB_CONTROL_DB_GET_HEALTH:
+ CHECK_CONTROL_DATA_SIZE(sizeof(uint32_t));
+ return ctdb_control_db_get_health(ctdb, indata, outdata);
+
+ case CTDB_CONTROL_GET_PUBLIC_IP_INFO:
+ CHECK_CONTROL_DATA_SIZE(sizeof(ctdb_sock_addr));
+ return ctdb_control_get_public_ip_info(ctdb, c, indata, outdata);
+
+ case CTDB_CONTROL_GET_IFACES:
+ CHECK_CONTROL_DATA_SIZE(0);
+ return ctdb_control_get_ifaces(ctdb, c, outdata);
+
+ case CTDB_CONTROL_SET_IFACE_LINK_STATE:
+ CHECK_CONTROL_DATA_SIZE(sizeof(struct ctdb_control_iface_info));
+ return ctdb_control_set_iface_link(ctdb, c, indata);
+
+ case CTDB_CONTROL_GET_STAT_HISTORY:
+ CHECK_CONTROL_DATA_SIZE(0);
+ return ctdb_control_get_stat_history(ctdb, c, outdata);
+
default:
DEBUG(DEBUG_CRIT,(__location__ " Unknown CTDB control opcode %u\n", opcode));
return -1;
struct ctdb_control_state *state = talloc_get_type(private_data, struct ctdb_control_state);
TALLOC_CTX *tmp_ctx = talloc_new(ev);
- state->ctdb->statistics.timeouts.control++;
+ CTDB_INCREMENT_STAT(state->ctdb, timeouts.control);
talloc_steal(tmp_ctx, state);
size_t len;
if (ctdb->methods == NULL) {
- DEBUG(DEBUG_ERR,(__location__ " Failed to send control. Transport is DOWN\n"));
+ DEBUG(DEBUG_INFO,(__location__ " Failed to send control. Transport is DOWN\n"));
return -1;
}