[SCM] Samba Shared Repository - branch master updated
Stefan Metzmacher
metze at samba.org
Fri Aug 24 07:55:02 MDT 2012
The branch, master has been updated
via ced27e1 s3:lib: make sure we don't try to send messages to server_id's marked as disconnected
via 1f7eac9 s3:lib: remove unused processes_exist()
via 9529301 s3:lib: readd the CTDB_CONTROL_CHECK_SRVIDS optimization to serverids_exist()
via 18c6757 s3:lib: only loop over the server_ids we need to verify in serverids_exist()
via 6c3c25b s3:lib: use server_id_is_disconnected() in serverids_exist()
via dc7d0f6 s3:lib: inline processes_exist() into serverids_exist()
via 84b5a5c s3:lib: SERVERID_UNIQUE_ID_NOT_TO_VERIFY only means not to verify the 'unique_id' part
via 95f3662 lib/util: don't SMB_ASSERT() in process_exists_by_pid()
via 0b5e354 s3:lib: implement process_exists() as wrapper of serverid_exists()
via 774c284 s3:g_lock: use serverid_exists() with SERVERID_UNIQUE_ID_NOT_TO_VERIFY
via 99b134a s3:lib: implement serverid_exists() as wrapper of serverids_exist()
via 6145329 s3:lib: remove CTDB_CONTROL_CHECK_SRVIDS optimization in serverids_exist() for now
from f83521a lib/param: fix usage of 'write list = +Group'
http://gitweb.samba.org/?p=samba.git;a=shortlog;h=master
- Log -----------------------------------------------------------------
commit ced27e1c5de491b4bac6c7817e72816ab075ef32
Author: Stefan Metzmacher <metze at samba.org>
Date: Tue Aug 21 14:14:40 2012 +0200
s3:lib: make sure we don't try to send messages to server_id's marked as disconnected
metze
Autobuild-User(master): Stefan Metzmacher <metze at samba.org>
Autobuild-Date(master): Fri Aug 24 15:54:48 CEST 2012 on sn-devel-104
commit 1f7eac907a04361abf89b12ab03284cf57fec0f5
Author: Stefan Metzmacher <metze at samba.org>
Date: Wed Aug 22 13:30:22 2012 +0200
s3:lib: remove unused processes_exist()
metze
commit 9529301503c043aaf8d3c39d3b0f014aaa0cc123
Author: Stefan Metzmacher <metze at samba.org>
Date: Fri Aug 24 09:05:06 2012 +0200
s3:lib: readd the CTDB_CONTROL_CHECK_SRVIDS optimization to serverids_exist()
metze
commit 18c6757dbb7ee0e6a4be15b0f2a3fec1f94ba518
Author: Stefan Metzmacher <metze at samba.org>
Date: Thu Aug 23 09:03:36 2012 +0200
s3:lib: only loop over the server_ids we need to verify in serverids_exist()
metze
commit 6c3c25b5c1e4981687556b7a8e56c8460d69deb4
Author: Stefan Metzmacher <metze at samba.org>
Date: Wed Aug 22 17:52:56 2012 +0200
s3:lib: use server_id_is_disconnected() in serverids_exist()
metze
commit dc7d0f688317593ffa58badcc0ed7b10b2047c5e
Author: Stefan Metzmacher <metze at samba.org>
Date: Wed Aug 22 13:28:49 2012 +0200
s3:lib: inline processes_exist() into serverids_exist()
metze
commit 84b5a5cbcd5e1c9ff984cd37b35a67707ceb430b
Author: Stefan Metzmacher <metze at samba.org>
Date: Tue Aug 21 12:57:28 2012 +0200
s3:lib: SERVERID_UNIQUE_ID_NOT_TO_VERIFY only means not to verify the 'unique_id' part
It doesn't mean the the server_id is always valid.
metze
commit 95f3662bbd587af24c2ff5411318e9d466412ee9
Author: Stefan Metzmacher <metze at samba.org>
Date: Wed Aug 22 17:52:01 2012 +0200
lib/util: don't SMB_ASSERT() in process_exists_by_pid()
Just return false...
metze
commit 0b5e354080ae1990b1f8acc470bfbad3f92868b8
Author: Stefan Metzmacher <metze at samba.org>
Date: Wed Aug 22 12:36:22 2012 +0200
s3:lib: implement process_exists() as wrapper of serverid_exists()
The changes the behavior of process_exists() it checks the pid.unique_id
now, if it's not SERVERID_UNIQUE_ID_NOT_TO_VERIFY.
metze
commit 774c28416bd05c66f398dfbc999cff0e209b3620
Author: Stefan Metzmacher <metze at samba.org>
Date: Wed Aug 22 12:35:29 2012 +0200
s3:g_lock: use serverid_exists() with SERVERID_UNIQUE_ID_NOT_TO_VERIFY
metze
commit 99b134adbe6b02388665c3b34f00b6723f6a1120
Author: Stefan Metzmacher <metze at samba.org>
Date: Wed Aug 22 12:07:02 2012 +0200
s3:lib: implement serverid_exists() as wrapper of serverids_exist()
metze
commit 6145329fcd7463279b3c497a7a5db5f4f6bd991e
Author: Stefan Metzmacher <metze at samba.org>
Date: Wed Aug 22 12:02:43 2012 +0200
s3:lib: remove CTDB_CONTROL_CHECK_SRVIDS optimization in serverids_exist() for now
This will be readded...
metze
-----------------------------------------------------------------------
Summary of changes:
lib/util/util.c | 4 +-
source3/lib/g_lock.c | 11 ++-
source3/lib/messages.c | 4 +
source3/lib/serverid.c | 214 +++++++++++++++++++++++++++++++++++++-----------
source3/lib/util.c | 86 +-------------------
5 files changed, 184 insertions(+), 135 deletions(-)
Changeset truncated at 500 lines:
diff --git a/lib/util/util.c b/lib/util/util.c
index 100d3d8..b50d28a 100644
--- a/lib/util/util.c
+++ b/lib/util/util.c
@@ -286,7 +286,9 @@ _PUBLIC_ bool process_exists_by_pid(pid_t pid)
{
/* Doing kill with a non-positive pid causes messages to be
* sent to places we don't want. */
- SMB_ASSERT(pid > 0);
+ if (pid <= 0) {
+ return false;
+ }
return(kill(pid,0) == 0 || errno != ESRCH);
}
diff --git a/source3/lib/g_lock.c b/source3/lib/g_lock.c
index 4535b35..fbd9022 100644
--- a/source3/lib/g_lock.c
+++ b/source3/lib/g_lock.c
@@ -29,6 +29,7 @@
#include "../lib/util/tevent_ntstatus.h"
#include "system/select.h"
#include "messages.h"
+#include "serverid.h"
struct g_lock_ctx {
struct db_context *db;
@@ -124,8 +125,16 @@ static NTSTATUS g_lock_trylock(struct db_record *rec, struct server_id self,
goto done;
}
if (g_lock_conflicts(type, locks[i].lock_type)) {
+ struct server_id pid = locks[i].pid;
- if (process_exists(locks[i].pid)) {
+ /*
+ * As the serverid_exists might recurse into
+ * the g_lock code, we use
+ * SERVERID_UNIQUE_ID_NOT_TO_VERIFY to avoid the loop
+ */
+ pid.unique_id = SERVERID_UNIQUE_ID_NOT_TO_VERIFY;
+
+ if (serverid_exists(&pid)) {
status = NT_STATUS_LOCK_NOT_GRANTED;
goto done;
}
diff --git a/source3/lib/messages.c b/source3/lib/messages.c
index 6a18e4f..cd763e7 100644
--- a/source3/lib/messages.c
+++ b/source3/lib/messages.c
@@ -351,6 +351,10 @@ NTSTATUS messaging_send(struct messaging_context *msg_ctx,
struct server_id server, uint32_t msg_type,
const DATA_BLOB *data)
{
+ if (server_id_is_disconnected(&server)) {
+ return NT_STATUS_INVALID_PARAMETER_MIX;
+ }
+
#ifdef CLUSTER_SUPPORT
if (!procid_is_local(&server)) {
return msg_ctx->remote->send_fn(msg_ctx, server,
diff --git a/source3/lib/serverid.c b/source3/lib/serverid.c
index 3c5402e..cb49520 100644
--- a/source3/lib/serverid.c
+++ b/source3/lib/serverid.c
@@ -251,89 +251,205 @@ static void server_exists_parse(TDB_DATA key, TDB_DATA data, void *priv)
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;
- }
+ bool result = false;
+ bool ok = false;
- if (!process_exists(*id)) {
+ ok = serverids_exist(id, 1, &result);
+ if (!ok) {
return false;
}
- if (id->unique_id == SERVERID_UNIQUE_ID_NOT_TO_VERIFY) {
- return true;
- }
+ return result;
+}
+
+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;
}
- serverid_fill_key(id, &key);
- tdbkey = make_tdb_data((uint8_t *)&key, sizeof(key));
-
- state.id = id;
- state.exists = 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;
+ }
- status = dbwrap_parse_record(db, tdbkey, server_exists_parse, &state);
- if (!NT_STATUS_IS_OK(status)) {
- return false;
+ 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;
}
- return state.exists;
-}
-bool serverids_exist(const struct server_id *ids, int num_ids, bool *results)
-{
- struct db_context *db;
- int i;
+ 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;
+ }
#ifdef HAVE_CTDB_CONTROL_CHECK_SRVIDS_DECL
- if (lp_clustering()) {
- return ctdb_serverids_exist(messaging_ctdbd_connection(),
- ids, num_ids, results);
+ if (remote_num != 0) {
+ 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];
+ }
}
#endif
- if (!processes_exist(ids, num_ids, results)) {
- return false;
- }
- db = serverid_db();
- if (db == NULL) {
- return false;
+ 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;
+ }
+
+#ifdef CLUSTER_SUPPORT
+ if (!ctdb_processes_exist(messaging_ctdbd_connection(),
+ todo_ids, todo_num,
+ todo_results)) {
+ goto fail;
+ }
+#endif
+
+ 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 (i=0; i<num_ids; i++) {
+ for (t=0; t<verify_num; t++) {
struct serverid_exists_state state;
struct serverid_key key;
TDB_DATA tdbkey;
NTSTATUS status;
- if (ids[i].unique_id == SERVERID_UNIQUE_ID_NOT_TO_VERIFY) {
- results[i] = true;
- continue;
- }
- if (!results[i]) {
- continue;
- }
+ idx = verify_idx[t];
- serverid_fill_key(&ids[i], &key);
+ serverid_fill_key(&ids[idx], &key);
tdbkey = make_tdb_data((uint8_t *)&key, sizeof(key));
- state.id = &ids[i];
+ state.id = &ids[idx];
state.exists = false;
status = dbwrap_parse_record(db, tdbkey, server_exists_parse, &state);
if (!NT_STATUS_IS_OK(status)) {
- results[i] = false;
+ results[idx] = false;
continue;
}
- results[i] = state.exists;
+ results[idx] = state.exists;
}
- return true;
+
+ 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,
diff --git a/source3/lib/util.c b/source3/lib/util.c
index 242fb10..5ffce58 100644
--- a/source3/lib/util.c
+++ b/source3/lib/util.c
@@ -30,6 +30,7 @@
#include "messages.h"
#include <ccan/hash/hash.h>
#include "libcli/security/security.h"
+#include "serverid.h"
#ifdef HAVE_SYS_PRCTL_H
#include <sys/prctl.h>
@@ -706,92 +707,9 @@ char *automount_lookup(TALLOC_CTX *ctx, const char *user_name)
#endif /* WITH_NISPLUS_HOME */
#endif
-/****************************************************************************
- Check if a process exists. Does this work on all unixes?
-****************************************************************************/
-
bool process_exists(const struct server_id pid)
{
- if (procid_is_me(&pid)) {
- return True;
- }
-
- if (procid_is_local(&pid)) {
- return (kill(pid.pid,0) == 0 || errno != ESRCH);
- }
-
-#ifdef CLUSTER_SUPPORT
- return ctdbd_process_exists(messaging_ctdbd_connection(),
- pid.vnn, pid.pid);
-#else
- return False;
-#endif
-}
-
-bool processes_exist(const struct server_id *pids, int num_pids,
- bool *results)
-{
- struct server_id *remote_pids = NULL;
- int *remote_idx = NULL;
- bool *remote_results = NULL;
- int i, num_remote_pids;
- bool result = false;
-
- remote_pids = talloc_array(talloc_tos(), struct server_id, num_pids);
- if (remote_pids == NULL) {
- goto fail;
- }
- remote_idx = talloc_array(talloc_tos(), int, num_pids);
- if (remote_idx == NULL) {
- goto fail;
- }
- remote_results = talloc_array(talloc_tos(), bool, num_pids);
- if (remote_results == NULL) {
- goto fail;
- }
-
- num_remote_pids = 0;
-
- for (i=0; i<num_pids; i++) {
- if (procid_is_me(&pids[i])) {
- results[i] = true;
- continue;
- }
- if (procid_is_local(&pids[i])) {
- results[i] = ((kill(pids[i].pid,0) == 0) ||
- (errno != ESRCH));
- continue;
- }
-
- remote_pids[num_remote_pids] = pids[i];
- remote_idx[num_remote_pids] = i;
- num_remote_pids += 1;
- }
-
- if (num_remote_pids != 0) {
-#ifdef CLUSTER_SUPPORT
- if (!ctdb_processes_exist(messaging_ctdbd_connection(),
- remote_pids, num_remote_pids,
- remote_results)) {
- goto fail;
- }
-#else
- for (i=0; i<num_remote_pids; i++) {
- remote_results[i] = false;
- }
-#endif
-
- for (i=0; i<num_remote_pids; i++) {
- results[remote_idx[i]] = remote_results[i];
- }
- }
-
- result = true;
-fail:
- TALLOC_FREE(remote_results);
- TALLOC_FREE(remote_idx);
- TALLOC_FREE(remote_pids);
- return result;
+ return serverid_exists(&pid);
}
/*******************************************************************
--
Samba Shared Repository
More information about the samba-cvs
mailing list