bool serverid_deregister(struct server_id id) { struct db_context *db; struct serverid_key key; struct db_record *rec; TDB_DATA tdbkey; NTSTATUS status; bool ret = false; db = serverid_db(); if (db == NULL) { return false; } serverid_fill_key(&id, &key); tdbkey = make_tdb_data((uint8_t *)&key, sizeof(key)); rec = dbwrap_fetch_locked(db, talloc_tos(), tdbkey); if (rec == NULL) { DEBUG(1, ("Could not fetch_lock serverid.tdb record\n")); return false; } status = dbwrap_record_delete(rec); if (!NT_STATUS_IS_OK(status)) { DEBUG(1, ("Deleting serverid.tdb record failed: %s\n", nt_errstr(status))); goto done; } ret = true; done: TALLOC_FREE(rec); return ret; }
bool serverid_register_msg_flags(const struct server_id id, bool do_reg, uint32_t msg_flags) { struct db_context *db; struct serverid_key key; struct serverid_data *data; struct db_record *rec; TDB_DATA tdbkey; TDB_DATA value; NTSTATUS status; bool ret = false; db = serverid_db(); if (db == NULL) { return false; } serverid_fill_key(&id, &key); tdbkey = make_tdb_data((uint8_t *)&key, sizeof(key)); rec = dbwrap_fetch_locked(db, talloc_tos(), tdbkey); if (rec == NULL) { DEBUG(1, ("Could not fetch_lock serverid.tdb record\n")); return false; } value = dbwrap_record_get_value(rec); if (value.dsize != sizeof(struct serverid_data)) { DEBUG(1, ("serverid record has unexpected size %d " "(wanted %d)\n", (int)value.dsize, (int)sizeof(struct serverid_data))); goto done; } data = (struct serverid_data *)value.dptr; if (do_reg) { data->msg_flags |= msg_flags; } else { data->msg_flags &= ~msg_flags; } status = dbwrap_record_store(rec, value, 0); if (!NT_STATUS_IS_OK(status)) { DEBUG(1, ("Storing serverid.tdb record failed: %s\n", nt_errstr(status))); goto done; } ret = true; done: TALLOC_FREE(rec); return ret; }
bool serverid_register(const struct server_id id, uint32_t msg_flags) { struct db_context *db; struct serverid_key key; struct serverid_data data; struct db_record *rec; TDB_DATA tdbkey, tdbdata; NTSTATUS status; bool ret = false; db = serverid_db(); if (db == NULL) { return false; } serverid_fill_key(&id, &key); tdbkey = make_tdb_data((uint8_t *)&key, sizeof(key)); rec = dbwrap_fetch_locked(db, talloc_tos(), tdbkey); if (rec == NULL) { DEBUG(1, ("Could not fetch_lock serverid.tdb record\n")); return false; } ZERO_STRUCT(data); data.unique_id = id.unique_id; data.msg_flags = msg_flags; tdbdata = make_tdb_data((uint8_t *)&data, sizeof(data)); status = dbwrap_record_store(rec, tdbdata, 0); if (!NT_STATUS_IS_OK(status)) { DEBUG(1, ("Storing serverid.tdb record failed: %s\n", nt_errstr(status))); goto done; } if (lp_clustering() && ctdb_serverids_exist_supported(messaging_ctdbd_connection())) { register_with_ctdbd(messaging_ctdbd_connection(), id.unique_id, NULL, NULL); } ret = true; done: TALLOC_FREE(rec); return ret; }
bool serverids_exist(const struct server_id *ids, int num_ids, bool *results) { struct db_context *db; int i; #ifdef HAVE_CTDB_CONTROL_CHECK_SRVIDS_DECL if (lp_clustering()) { return ctdb_serverids_exist(messaging_ctdbd_connection(), ids, num_ids, results); } #endif if (!processes_exist(ids, num_ids, results)) { return false; } db = serverid_db(); if (db == NULL) { return false; } for (i=0; i<num_ids; i++) { struct serverid_exists_state state; struct serverid_key key; TDB_DATA tdbkey; if (ids[i].unique_id == SERVERID_UNIQUE_ID_NOT_TO_VERIFY) { results[i] = true; continue; } if (!results[i]) { continue; } serverid_fill_key(&ids[i], &key); tdbkey = make_tdb_data((uint8_t *)&key, sizeof(key)); state.id = &ids[i]; state.exists = false; dbwrap_parse_record(db, tdbkey, server_exists_parse, &state); results[i] = state.exists; } return true; }
bool serverid_exists(const struct server_id *id) { struct db_context *db; struct serverid_exists_state state; struct serverid_key key; TDB_DATA tdbkey; NTSTATUS status; if (procid_is_me(id)) { return true; } if (!process_exists(*id)) { return false; } if (id->unique_id == SERVERID_UNIQUE_ID_NOT_TO_VERIFY) { return true; } db = serverid_db(); if (db == NULL) { return false; } serverid_fill_key(id, &key); tdbkey = make_tdb_data((uint8_t *)&key, sizeof(key)); state.id = id; state.exists = false; status = dbwrap_parse_record(db, tdbkey, server_exists_parse, &state); if (!NT_STATUS_IS_OK(status)) { return false; } return state.exists; }
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; }