lib: Remove serverids_exist
authorVolker Lendecke <vl@samba.org>
Tue, 29 Sep 2015 23:14:33 +0000 (01:14 +0200)
committerJeremy Allison <jra@samba.org>
Wed, 30 Sep 2015 21:51:13 +0000 (23:51 +0200)
The only reason for this complex monster was an overload of ctdbd.
When opening files, we unconditionally checked all share modes for
validity. This meant thousands of serverid_exists calls per second
for popular directories. This has long gone, now we only check for
validity if a conflict happens.

The only remaining caller is net serverid wipedbs, an administrative
command. If that loads ctdbd, so be it.

Signed-off-by: Volker Lendecke <vl@samba.org>
Reviewed-by: Jeremy Allison <jra@samba.org>
source3/include/serverid.h
source3/lib/serverid.c
source3/utils/net_serverid.c

index d1d405acf1518226283e3e138177b96992066c13..24ebcbe4b6c757f49a7b40040194dd262ec68a56 100644 (file)
@@ -38,11 +38,6 @@ bool serverid_deregister(const struct server_id id);
  */
 bool serverid_exists(const struct server_id *id);
 
-/*
- * Check existence of a list of server ids
- */
-bool serverids_exist(const struct server_id *ids, int num_ids, bool *results);
-
 /*
  * Walk the list of server_ids registered
  */
index fcc8703324fed798e9ca3e3c1ede6e51af8c250a..4938bbaa02b8d3694f0a93057ed675da8706194c 100644 (file)
@@ -169,29 +169,6 @@ done:
        return ret;
 }
 
-struct serverid_exists_state {
-       const struct server_id *id;
-       bool exists;
-};
-
-static void server_exists_parse(TDB_DATA key, TDB_DATA data, void *priv)
-{
-       struct serverid_exists_state *state =
-               (struct serverid_exists_state *)priv;
-
-       if (data.dsize != sizeof(struct serverid_data)) {
-               state->exists = false;
-               return;
-       }
-
-       /*
-        * Use memcmp, not direct compare. data.dptr might not be
-        * aligned.
-        */
-       state->exists = (memcmp(&state->id->unique_id, data.dptr,
-                               sizeof(state->id->unique_id)) == 0);
-}
-
 static bool serverid_exists_local(const struct server_id *id)
 {
        bool exists = process_exists_by_pid(id->pid);
@@ -228,194 +205,6 @@ bool serverid_exists(const struct server_id *id)
        return false;
 }
 
-bool serverids_exist(const struct server_id *ids, int num_ids, bool *results)
-{
-       int *todo_idx = NULL;
-       struct server_id *todo_ids = NULL;
-       bool *todo_results = NULL;
-       int todo_num = 0;
-       int *remote_idx = NULL;
-       int remote_num = 0;
-       int *verify_idx = NULL;
-       int verify_num = 0;
-       int t, idx;
-       bool result = false;
-       struct db_context *db;
-
-       db = serverid_db();
-       if (db == NULL) {
-               return false;
-       }
-
-       todo_idx = talloc_array(talloc_tos(), int, num_ids);
-       if (todo_idx == NULL) {
-               goto fail;
-       }
-       todo_ids = talloc_array(talloc_tos(), struct server_id, num_ids);
-       if (todo_ids == NULL) {
-               goto fail;
-       }
-       todo_results = talloc_array(talloc_tos(), bool, num_ids);
-       if (todo_results == NULL) {
-               goto fail;
-       }
-
-       remote_idx = talloc_array(talloc_tos(), int, num_ids);
-       if (remote_idx == NULL) {
-               goto fail;
-       }
-       verify_idx = talloc_array(talloc_tos(), int, num_ids);
-       if (verify_idx == NULL) {
-               goto fail;
-       }
-
-       for (idx=0; idx<num_ids; idx++) {
-               results[idx] = false;
-
-               if (server_id_is_disconnected(&ids[idx])) {
-                       continue;
-               }
-
-               if (procid_is_me(&ids[idx])) {
-                       results[idx] = true;
-                       continue;
-               }
-
-               if (procid_is_local(&ids[idx])) {
-                       bool exists = process_exists_by_pid(ids[idx].pid);
-
-                       if (!exists) {
-                               continue;
-                       }
-
-                       if (ids[idx].unique_id == SERVERID_UNIQUE_ID_NOT_TO_VERIFY) {
-                               results[idx] = true;
-                               continue;
-                       }
-
-                       verify_idx[verify_num] = idx;
-                       verify_num += 1;
-                       continue;
-               }
-
-               if (!lp_clustering()) {
-                       continue;
-               }
-
-               remote_idx[remote_num] = idx;
-               remote_num += 1;
-       }
-
-       if (remote_num != 0 &&
-           ctdb_serverids_exist_supported(messaging_ctdbd_connection()))
-       {
-               int old_remote_num = remote_num;
-
-               remote_num = 0;
-               todo_num = 0;
-
-               for (t=0; t<old_remote_num; t++) {
-                       idx = remote_idx[t];
-
-                       if (ids[idx].unique_id == SERVERID_UNIQUE_ID_NOT_TO_VERIFY) {
-                               remote_idx[remote_num] = idx;
-                               remote_num += 1;
-                               continue;
-                       }
-
-                       todo_idx[todo_num] = idx;
-                       todo_ids[todo_num] = ids[idx];
-                       todo_results[todo_num] = false;
-                       todo_num += 1;
-               }
-
-               /*
-                * Note: this only uses CTDB_CONTROL_CHECK_SRVIDS
-                * to verify that the server_id still exists,
-                * which means only the server_id.unique_id and
-                * server_id.vnn are verified, while server_id.pid
-                * is not verified at all.
-                *
-                * TODO: do we want to verify server_id.pid somehow?
-                */
-               if (!ctdb_serverids_exist(messaging_ctdbd_connection(),
-                                         todo_ids, todo_num, todo_results))
-               {
-                       goto fail;
-               }
-
-               for (t=0; t<todo_num; t++) {
-                       idx = todo_idx[t];
-
-                       results[idx] = todo_results[t];
-               }
-       }
-
-       if (remote_num != 0) {
-               todo_num = 0;
-
-               for (t=0; t<remote_num; t++) {
-                       idx = remote_idx[t];
-                       todo_idx[todo_num] = idx;
-                       todo_ids[todo_num] = ids[idx];
-                       todo_results[todo_num] = false;
-                       todo_num += 1;
-               }
-
-               if (!ctdb_processes_exist(messaging_ctdbd_connection(),
-                                         todo_ids, todo_num,
-                                         todo_results)) {
-                       goto fail;
-               }
-
-               for (t=0; t<todo_num; t++) {
-                       idx = todo_idx[t];
-
-                       if (!todo_results[t]) {
-                               continue;
-                       }
-
-                       if (ids[idx].unique_id == SERVERID_UNIQUE_ID_NOT_TO_VERIFY) {
-                               results[idx] = true;
-                               continue;
-                       }
-
-                       verify_idx[verify_num] = idx;
-                       verify_num += 1;
-               }
-       }
-
-       for (t=0; t<verify_num; t++) {
-               struct serverid_exists_state state;
-               struct serverid_key key;
-               TDB_DATA tdbkey;
-               NTSTATUS status;
-
-               idx = verify_idx[t];
-
-               serverid_fill_key(&ids[idx], &key);
-               tdbkey = make_tdb_data((uint8_t *)&key, sizeof(key));
-
-               state.id = &ids[idx];
-               state.exists = false;
-               status = dbwrap_parse_record(db, tdbkey, server_exists_parse, &state);
-               if (!NT_STATUS_IS_OK(status)) {
-                       results[idx] = false;
-                       continue;
-               }
-               results[idx] = state.exists;
-       }
-
-       result = true;
-fail:
-       TALLOC_FREE(verify_idx);
-       TALLOC_FREE(remote_idx);
-       TALLOC_FREE(todo_results);
-       TALLOC_FREE(todo_ids);
-       TALLOC_FREE(todo_idx);
-       return result;
-}
-
 static bool serverid_rec_parse(const struct db_record *rec,
                               struct server_id *id, uint32_t *msg_flags)
 {
index ae96dc1ce30f45f5decda223ad705cf22657af61..41e09e3d3f8f2bc31b541118e98e14c56f7fb96f 100644 (file)
@@ -401,6 +401,19 @@ static int wipedbs_traverse_set_exists(struct db_record *rec,
        return 0;
 }
 
+static bool serverids_exist(const struct server_id *ids, int num_ids,
+                           bool *results)
+{
+       int i;
+
+       for (i=0; i<num_ids; i++) {
+               results[i] = serverid_exists(&ids[i]);
+       }
+
+       return true;
+}
+
+
 static NTSTATUS wipedbs_check_server_exists(struct wipedbs_state *state)
 {
        NTSTATUS status;