Add CTDB_CONTROL_CHECK_SRVID
[ctdb.git] / server / ctdb_control.c
index 3cd79f1ad80c9c78ed2a2fcccde84c15d3819128..83e1bd12060327725b76593201a2224c146d6179 100644 (file)
@@ -17,7 +17,7 @@
    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"
@@ -108,6 +108,8 @@ static int32_t ctdb_control_dispatch(struct ctdb_context *ctdb,
                        }
                }
                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;
@@ -128,6 +130,7 @@ static int32_t ctdb_control_dispatch(struct ctdb_context *ctdb,
        case CTDB_CONTROL_STATISTICS_RESET: {
                CHECK_CONTROL_DATA_SIZE(0);
                ZERO_STRUCT(ctdb->statistics);
+               ctdb->statistics.statistics_start_time = timeval_current();
                return 0;
        }
 
@@ -218,10 +221,10 @@ static int32_t ctdb_control_dispatch(struct ctdb_context *ctdb,
        }
 
        case CTDB_CONTROL_DB_ATTACH:
-               return ctdb_control_db_attach(ctdb, indata, outdata, srvid, false);
+         return ctdb_control_db_attach(ctdb, indata, outdata, srvid, false, client_id, c, async_reply);
 
        case CTDB_CONTROL_DB_ATTACH_PERSISTENT:
-               return ctdb_control_db_attach(ctdb, indata, outdata, srvid, true);
+         return ctdb_control_db_attach(ctdb, indata, outdata, srvid, true, client_id, c, async_reply);
 
        case CTDB_CONTROL_SET_CALL: {
                struct ctdb_control_set_call *sc = 
@@ -250,6 +253,9 @@ static int32_t ctdb_control_dispatch(struct ctdb_context *ctdb,
        case CTDB_CONTROL_DEREGISTER_SRVID:
                return daemon_deregister_message_handler(ctdb, client_id, srvid);
 
+       case CTDB_CONTROL_CHECK_SRVIDS:
+               return daemon_check_srvids(ctdb, indata, outdata);
+
        case CTDB_CONTROL_ENABLE_SEQNUM:
                CHECK_CONTROL_DATA_SIZE(sizeof(uint32_t));
                return ctdb_ltdb_enable_seqnum(ctdb, *(uint32_t *)indata.dptr);
@@ -331,8 +337,16 @@ static int32_t ctdb_control_dispatch(struct ctdb_context *ctdb,
                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);
@@ -450,7 +464,7 @@ static int32_t ctdb_control_dispatch(struct ctdb_context *ctdb,
 
        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);
@@ -589,6 +603,19 @@ static int32_t ctdb_control_dispatch(struct ctdb_context *ctdb,
                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);
+
+       case CTDB_CONTROL_SCHEDULE_FOR_DELETION: {
+               struct ctdb_control_schedule_for_deletion *d;
+               size_t size = offsetof(struct ctdb_control_schedule_for_deletion, key);
+               CHECK_CONTROL_MIN_DATA_SIZE(size);
+               d = (struct ctdb_control_schedule_for_deletion *)indata.dptr;
+               size += d->keylen;
+               CHECK_CONTROL_DATA_SIZE(size);
+               return ctdb_control_schedule_for_deletion(ctdb, indata);
+       }
        default:
                DEBUG(DEBUG_CRIT,(__location__ " Unknown CTDB control opcode %u\n", opcode));
                return -1;
@@ -709,7 +736,7 @@ static void ctdb_control_timeout(struct event_context *ev, struct timed_event *t
        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);
 
@@ -735,7 +762,7 @@ int ctdb_daemon_send_control(struct ctdb_context *ctdb, uint32_t destnode,
        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;
        }