The branch, master has been updated
       via  22c5699 lib: Fix server_id_db_set_exclusive
       via  2c12b51 lib: Add "pid/unique" format for server_id_from_string
       via  a4f6450 lib: Fix server_id_from_string
       via  8044e2d lib: Add server_id_str_buf_unique
       via  620b746 lib: Remove ctdb_serverids_exist
       via  103658d lib: Remove serverids_exist
       via  b542ce7 lib: Use messaging_dgm_get_unique in serverid_exists
       via  c793fb8 lib: Use serverid_exists in server_id_db_check_exclusive
       via  37f01c8 messages_dgm: Add messaging_dgm_get_unique
       via  beb7c6b net: Add "serverid exists"
       via  e119f95 net: Fix some tiny memleaks
       via  348dd41 s3:lib:interface: break an overly long line
       via  d8b2421 s4-scripting: fix minor indent issue for hresult generation.
       via  f5109df s4-scripting: fix wrong indent that caused gen_ntstatus.py 
to fail.
       via  dea49cc ldb: Fix CID 1034781 Unsigned compared against 0
      from  edd18f7 messages_dgm: Fix an incorrect cast

https://git.samba.org/?p=samba.git;a=shortlog;h=master


- Log -----------------------------------------------------------------
commit 22c5699751d8a7b3eda33260c7ec9f0a8771d25b
Author: Volker Lendecke <[email protected]>
Date:   Tue Sep 29 20:24:10 2015 +0200

    lib: Fix server_id_db_set_exclusive
    
    For server_id_db_set_exclusive we need to store the unique id along
    with the vnn:pid combo. I had tested all this just with some
    smbtorture and net command tests, all of which have a unique id of
    zero. When trying to exclusively register "notify-daemon" when smbd
    is running, this fails because serverid_exists only tests with zero
    unique id. notifyd does have a non-zero unique id, so server_id_exists
    will think the existing notifyd is another non-samba process that
    happened to claim notifyd's pid.
    
    Signed-off-by: Volker Lendecke <[email protected]>
    Reviewed-by: Jeremy Allison <[email protected]>
    
    Autobuild-User(master): Jeremy Allison <[email protected]>
    Autobuild-Date(master): Thu Oct  1 02:53:58 CEST 2015 on sn-devel-104

commit 2c12b516a98778baf6a0aa06c70e94bded1b48ed
Author: Volker Lendecke <[email protected]>
Date:   Tue Sep 29 20:16:56 2015 +0200

    lib: Add "pid/unique" format for server_id_from_string
    
    Signed-off-by: Volker Lendecke <[email protected]>
    Reviewed-by: Jeremy Allison <[email protected]>

commit a4f64500a5c3c89aae0c6eb15e994898d0ce38e7
Author: Volker Lendecke <[email protected]>
Date:   Tue Sep 29 20:08:48 2015 +0200

    lib: Fix server_id_from_string
    
    sscanf overwrites vars as numbers come in. So the first sscanf will
    overwrite "vnn", although it can't scan the whole thing. This leads
    to the string "1234" return .vnn=1234, pid=1234. Bad.
    
    While there, save the temp variables. The SCNu32/64 thingies look
    ugly, but it's actually c99.
    
    Signed-off-by: Volker Lendecke <[email protected]>
    Reviewed-by: Jeremy Allison <[email protected]>

commit 8044e2dcc074ade554150ebc11b60d91db025f63
Author: Volker Lendecke <[email protected]>
Date:   Tue Sep 29 04:03:52 2015 +0200

    lib: Add server_id_str_buf_unique
    
    A representation including the unique id
    
    Signed-off-by: Volker Lendecke <[email protected]>
    Reviewed-by: Jeremy Allison <[email protected]>

commit 620b7467adebb756e6658c6901232755a8c62d17
Author: Volker Lendecke <[email protected]>
Date:   Wed Sep 30 01:27:00 2015 +0200

    lib: Remove ctdb_serverids_exist
    
    Signed-off-by: Volker Lendecke <[email protected]>
    Reviewed-by: Jeremy Allison <[email protected]>

commit 103658ddd0992d00f5a4b1411dcb808d035cb917
Author: Volker Lendecke <[email protected]>
Date:   Wed Sep 30 01:14:33 2015 +0200

    lib: Remove serverids_exist
    
    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 <[email protected]>
    Reviewed-by: Jeremy Allison <[email protected]>

commit b542ce7db394de3023b95288b0c40c4533c02cb1
Author: Volker Lendecke <[email protected]>
Date:   Wed Sep 30 01:11:08 2015 +0200

    lib: Use messaging_dgm_get_unique in serverid_exists
    
    This is a relevant change: I was experimenting with
    server_id_db_set_exclusive() in "net" and got failures all over the
    place. The main reason was that "net" by default does not do a
    serverid_register. With messaging_dgm we have the process' unique
    id available via the lockfile contents. Using open/read/close is a
    bit slower than local tdb access, but this version is safe for all
    processes which have done messaging_init()
    
    Signed-off-by: Volker Lendecke <[email protected]>
    Reviewed-by: Jeremy Allison <[email protected]>

commit c793fb8a66e6837b2d2bc1f2f2d3ec5bc1edee84
Author: Volker Lendecke <[email protected]>
Date:   Wed Sep 30 01:01:46 2015 +0200

    lib: Use serverid_exists in server_id_db_check_exclusive
    
    If there's another process around there will typically be at most
    one process. So there is no real need to run the plural version of
    serverid_exists.
    
    Signed-off-by: Volker Lendecke <[email protected]>
    Reviewed-by: Jeremy Allison <[email protected]>

commit 37f01c869de14e0f0e6d609e2b8f3448167c11db
Author: Volker Lendecke <[email protected]>
Date:   Wed Sep 30 00:31:17 2015 +0200

    messages_dgm: Add messaging_dgm_get_unique
    
    To be able to read, we need to open the lockfile O_RDWR instead of O_WRONLY
    
    Signed-off-by: Volker Lendecke <[email protected]>
    Reviewed-by: Jeremy Allison <[email protected]>

commit beb7c6b9411cb02d873b5ce1b4210dc2a775e93d
Author: Volker Lendecke <[email protected]>
Date:   Tue Sep 29 23:39:46 2015 +0200

    net: Add "serverid exists"
    
    Signed-off-by: Volker Lendecke <[email protected]>
    Reviewed-by: Jeremy Allison <[email protected]>

commit e119f95532710f0c8d65cfb3dca54145c942e12c
Author: Volker Lendecke <[email protected]>
Date:   Tue Sep 29 20:42:58 2015 +0200

    net: Fix some tiny memleaks
    
    Signed-off-by: Volker Lendecke <[email protected]>
    Reviewed-by: Jeremy Allison <[email protected]>

commit 348dd41871527768ac4b5386183930837e187976
Author: Michael Adam <[email protected]>
Date:   Tue Sep 22 01:27:48 2015 +0200

    s3:lib:interface: break an overly long line
    
    Signed-off-by: Michael Adam <[email protected]>
    Reviewed-by: Jeremy Allison <[email protected]>

commit d8b2421767fbfdb84572702cb77309550d27dc27
Author: Günther Deschner <[email protected]>
Date:   Wed Sep 30 08:27:04 2015 +0200

    s4-scripting: fix minor indent issue for hresult generation.
    
    Guenther
    
    Signed-off-by: Günther Deschner <[email protected]>
    Reviewed-by: Jeremy Allison <[email protected]>

commit f5109dfcdb47432bc85ec3058d4f0f2b4fd15700
Author: Günther Deschner <[email protected]>
Date:   Wed Sep 30 08:14:06 2015 +0200

    s4-scripting: fix wrong indent that caused gen_ntstatus.py to fail.
    
    Verified it now works again with:
    
    ./source4/scripting/bin/gen_ntstatus.py libcli/util/ntstatus.h 
MS-ERREF-2.3.1.NTSTATUS libcli/util/nterr.c
    
    MS-ERREF-2.3.1.NTSTATUS as the copied content from
    https://msdn.microsoft.com/en-us/library/cc704588.aspx.
    
    Guenther
    
    Signed-off-by: Günther Deschner <[email protected]>
    Reviewed-by: Jeremy Allison <[email protected]>

commit dea49cc7c07bb1206cf8600eeb9fa699c1ca0d75
Author: Volker Lendecke <[email protected]>
Date:   Tue Aug 18 22:25:25 2015 +0200

    ldb: Fix CID 1034781 Unsigned compared against 0
    
    Signed-off-by: Volker Lendecke <[email protected]>
    Reviewed-by: Jeremy Allison <[email protected]>

-----------------------------------------------------------------------

Summary of changes:
 lib/ldb/common/ldb_controls.c         |   6 +-
 lib/util/samba_util.h                 |   1 +
 lib/util/server_id.c                  | 110 ++++++++++++---
 lib/util/server_id_db.c               |  23 ++--
 source3/include/ctdbd_conn.h          |   4 -
 source3/include/serverid.h            |   5 -
 source3/lib/ctdb_dummy.c              |  13 +-
 source3/lib/ctdbd_conn.c              | 243 ----------------------------------
 source3/lib/interface.c               |   4 +-
 source3/lib/messages_dgm.c            |  62 ++++++++-
 source3/lib/messages_dgm.h            |   1 +
 source3/lib/server_id_db_util.c       |   9 +-
 source3/lib/serverid.c                | 231 +++-----------------------------
 source3/utils/net.c                   |   4 +-
 source3/utils/net_serverid.c          |  44 ++++++
 source4/scripting/bin/gen_hresult.py  |   2 +-
 source4/scripting/bin/gen_ntstatus.py |  30 +++--
 17 files changed, 262 insertions(+), 530 deletions(-)


Changeset truncated at 500 lines:

diff --git a/lib/ldb/common/ldb_controls.c b/lib/ldb/common/ldb_controls.c
index 097ae20..8747d53 100644
--- a/lib/ldb/common/ldb_controls.c
+++ b/lib/ldb/common/ldb_controls.c
@@ -492,7 +492,7 @@ struct ldb_control *ldb_parse_control_from_string(struct 
ldb_context *ldb, TALLO
                p = &(control_strings[sizeof(LDB_CONTROL_DIRSYNC_NAME)]);
                ret = sscanf(p, "%d:%u:%d:%1023[^$]", &crit, &flags, 
&max_attrs, cookie);
 
-               if ((ret < 3) || (crit < 0) || (crit > 1) || (flags < 0) || 
(max_attrs < 0)) {
+               if ((ret < 3) || (crit < 0) || (crit > 1) || (max_attrs < 0)) {
                        error_string = talloc_asprintf(mem_ctx, "invalid 
dirsync control syntax\n");
                        error_string = talloc_asprintf_append(error_string, " 
syntax: crit(b):flags(n):max_attrs(n)[:cookie(o)]\n");
                        error_string = talloc_asprintf_append(error_string, "   
note: b = boolean, n = number, o = b64 binary blob");
@@ -598,7 +598,7 @@ struct ldb_control *ldb_parse_control_from_string(struct 
ldb_context *ldb, TALLO
 
                p = &(control_strings[sizeof(LDB_CONTROL_SD_FLAGS_NAME)]);
                ret = sscanf(p, "%d:%u", &crit, &secinfo_flags);
-               if ((ret != 2) || (crit < 0) || (crit > 1) || (secinfo_flags < 
0) || (secinfo_flags > 0xF)) {
+               if ((ret != 2) || (crit < 0) || (crit > 1) || (secinfo_flags > 
0xF)) {
                        error_string = talloc_asprintf(mem_ctx, "invalid 
sd_flags control syntax\n");
                        error_string = talloc_asprintf_append(error_string, " 
syntax: crit(b):secinfo_flags(n)\n");
                        error_string = talloc_asprintf_append(error_string, "   
note: b = boolean, n = number");
@@ -625,7 +625,7 @@ struct ldb_control *ldb_parse_control_from_string(struct 
ldb_context *ldb, TALLO
 
                p = &(control_strings[sizeof(LDB_CONTROL_SEARCH_OPTIONS_NAME)]);
                ret = sscanf(p, "%d:%u", &crit, &search_options);
-               if ((ret != 2) || (crit < 0) || (crit > 1) || (search_options < 
0) || (search_options > 0xF)) {
+               if ((ret != 2) || (crit < 0) || (crit > 1) || (search_options > 
0xF)) {
                        error_string = talloc_asprintf(mem_ctx, "invalid 
search_options control syntax\n");
                        error_string = talloc_asprintf_append(error_string, " 
syntax: crit(b):search_options(n)\n");
                        error_string = talloc_asprintf_append(error_string, "   
note: b = boolean, n = number");
diff --git a/lib/util/samba_util.h b/lib/util/samba_util.h
index 496923c..d2868d7 100644
--- a/lib/util/samba_util.h
+++ b/lib/util/samba_util.h
@@ -847,6 +847,7 @@ struct server_id;
 
 struct server_id_buf { char buf[48]; }; /* probably a bit too large ... */
 char *server_id_str_buf(struct server_id id, struct server_id_buf *dst);
+size_t server_id_str_buf_unique(struct server_id id, char *buf, size_t buflen);
 
 bool server_id_same_process(const struct server_id *p1,
                            const struct server_id *p2);
diff --git a/lib/util/server_id.c b/lib/util/server_id.c
index 60b5235..83a262d 100644
--- a/lib/util/server_id.c
+++ b/lib/util/server_id.c
@@ -65,14 +65,36 @@ char *server_id_str_buf(struct server_id id, struct 
server_id_buf *dst)
        return dst->buf;
 }
 
+size_t server_id_str_buf_unique(struct server_id id, char *buf, size_t buflen)
+{
+       struct server_id_buf idbuf;
+       char unique_buf[21];    /* 2^64 is 18446744073709551616, 20 chars */
+       size_t idlen, unique_len, needed;
+
+       server_id_str_buf(id, &idbuf);
+
+       idlen = strlen(idbuf.buf);
+       unique_len = snprintf(unique_buf, sizeof(unique_buf), "%"PRIu64,
+                             id.unique_id);
+       needed = idlen + unique_len + 2;
+
+       if (buflen >= needed) {
+               memcpy(buf, idbuf.buf, idlen);
+               buf[idlen] = '/';
+               memcpy(buf + idlen + 1, unique_buf, unique_len+1);
+       }
+
+       return needed;
+}
+
 struct server_id server_id_from_string(uint32_t local_vnn,
                                       const char *pid_string)
 {
+       struct server_id templ = {
+               .vnn = NONCLUSTER_VNN, .pid = UINT64_MAX
+       };
        struct server_id result;
-       unsigned long long pid;
-       unsigned int vnn, task_id = 0;
-
-       ZERO_STRUCT(result);
+       int ret;
 
        /*
         * We accept various forms with 1, 2 or 3 component forms
@@ -80,27 +102,73 @@ struct server_id server_id_from_string(uint32_t local_vnn,
         * we want backwards compatibility for scripts that may call
         * smbclient.
         */
-       if (sscanf(pid_string, "%u:%llu.%u", &vnn, &pid, &task_id) == 3) {
-               result.vnn = vnn;
-               result.pid = pid;
-               result.task_id = task_id;
-       } else if (sscanf(pid_string, "%u:%llu", &vnn, &pid) == 2) {
-               result.vnn = vnn;
-               result.pid = pid;
-       } else if (sscanf(pid_string, "%llu.%u", &pid, &task_id) == 2) {
+
+       result = templ;
+       ret = sscanf(pid_string, "%"SCNu32":%"SCNu64".%"SCNu32"/%"SCNu64,
+                    &result.vnn, &result.pid, &result.task_id,
+                    &result.unique_id);
+       if (ret == 4) {
+               return result;
+       }
+
+       result = templ;
+       ret = sscanf(pid_string, "%"SCNu32":%"SCNu64".%"SCNu32,
+                    &result.vnn, &result.pid, &result.task_id);
+       if (ret == 3) {
+               return result;
+       }
+
+       result = templ;
+       ret = sscanf(pid_string, "%"SCNu32":%"SCNu64"/%"SCNu64,
+                    &result.vnn, &result.pid, &result.unique_id);
+       if (ret == 3) {
+               return result;
+       }
+
+       result = templ;
+       ret = sscanf(pid_string, "%"SCNu32":%"SCNu64,
+                    &result.vnn, &result.pid);
+       if (ret == 2) {
+               return result;
+       }
+
+       result = templ;
+       ret = sscanf(pid_string, "%"SCNu64".%"SCNu32"/%"SCNu64,
+                    &result.pid, &result.task_id, &result.unique_id);
+       if (ret == 3) {
+               result.vnn = local_vnn;
+               return result;
+       }
+
+       result = templ;
+       ret = sscanf(pid_string, "%"SCNu64".%"SCNu32,
+                    &result.pid, &result.task_id);
+       if (ret == 2) {
                result.vnn = local_vnn;
-               result.pid = pid;
-               result.task_id = task_id;
-       } else if (sscanf(pid_string, "%llu", &pid) == 1) {
+               return result;
+       }
+
+       result = templ;
+       ret = sscanf(pid_string, "%"SCNu64"/%"SCNu64,
+                    &result.pid, &result.unique_id);
+       if (ret == 2) {
                result.vnn = local_vnn;
-               result.pid = pid;
-       } else if (strcmp(pid_string, "disconnected") ==0) {
+               return result;
+       }
+
+       result = templ;
+       ret = sscanf(pid_string, "%"SCNu64, &result.pid);
+       if (ret == 1) {
+               result.vnn = local_vnn;
+               return result;
+       }
+
+       if (strcmp(pid_string, "disconnected") == 0) {
                server_id_set_disconnected(&result);
-       } else {
-               result.vnn = NONCLUSTER_VNN;
-               result.pid = UINT64_MAX;
+               return result;
        }
-       return result;
+
+       return templ;
 }
 
 /**
diff --git a/lib/util/server_id_db.c b/lib/util/server_id_db.c
index 0874129..1e65ce2 100644
--- a/lib/util/server_id_db.c
+++ b/lib/util/server_id_db.c
@@ -93,8 +93,7 @@ static int server_id_db_destructor(struct server_id_db *db)
 int server_id_db_add(struct server_id_db *db, const char *name)
 {
        struct tdb_context *tdb = db->tdb->tdb;
-       struct server_id_buf buf;
-       TDB_DATA key, data;
+       TDB_DATA key;
        char *n;
        int ret;
 
@@ -110,10 +109,17 @@ int server_id_db_add(struct server_id_db *db, const char 
*name)
 
        key = string_term_tdb_data(name);
 
-       server_id_str_buf(db->pid, &buf);
-       data = string_term_tdb_data(buf.buf);
+       {
+               size_t idlen = server_id_str_buf_unique(db->pid, NULL, 0);
+               char idbuf[idlen];
+
+               server_id_str_buf_unique(db->pid, idbuf, idlen);
+
+               ret = tdb_append(
+                       tdb, key,
+                       (TDB_DATA) { .dptr = (uint8_t *)idbuf, .dsize = idlen 
});
+       }
 
-       ret = tdb_append(tdb, key, data);
        if (ret != 0) {
                enum TDB_ERROR err = tdb_error(tdb);
                strv_delete(&db->names, strv_find(db->names, name));
@@ -127,14 +133,15 @@ int server_id_db_prune_name(struct server_id_db *db, 
const char *name,
                            struct server_id server)
 {
        struct tdb_context *tdb = db->tdb->tdb;
-       struct server_id_buf buf;
+       size_t idbuf_len = server_id_str_buf_unique(server, NULL, 0);
+       char idbuf[idbuf_len];
        TDB_DATA key;
        uint8_t *data;
        char *ids, *id;
        int ret;
 
        key = string_term_tdb_data(name);
-       server_id_str_buf(server, &buf);
+       server_id_str_buf_unique(server, idbuf, idbuf_len);
 
        ret = tdb_chainlock(tdb, key);
        if (ret == -1) {
@@ -150,7 +157,7 @@ int server_id_db_prune_name(struct server_id_db *db, const 
char *name,
 
        ids = (char *)data;
 
-       id = strv_find(ids, buf.buf);
+       id = strv_find(ids, idbuf);
        if (id == NULL) {
                tdb_chainunlock(tdb, key);
                TALLOC_FREE(data);
diff --git a/source3/include/ctdbd_conn.h b/source3/include/ctdbd_conn.h
index b60a0e5..9f7ec9f 100644
--- a/source3/include/ctdbd_conn.h
+++ b/source3/include/ctdbd_conn.h
@@ -47,10 +47,6 @@ bool ctdbd_process_exists(struct ctdbd_connection *conn, 
uint32_t vnn,
 bool ctdb_processes_exist(struct ctdbd_connection *conn,
                          const struct server_id *pids, int num_pids,
                          bool *results);
-bool ctdb_serverids_exist_supported(struct ctdbd_connection *conn);
-bool ctdb_serverids_exist(struct ctdbd_connection *conn,
-                         const struct server_id *pids, unsigned num_pids,
-                         bool *results);
 
 char *ctdbd_dbpath(struct ctdbd_connection *conn,
                   TALLOC_CTX *mem_ctx, uint32_t db_id);
diff --git a/source3/include/serverid.h b/source3/include/serverid.h
index d1d405a..24ebcbe 100644
--- a/source3/include/serverid.h
+++ b/source3/include/serverid.h
@@ -39,11 +39,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
  */
 bool serverid_traverse(int (*fn)(struct db_record *rec,
diff --git a/source3/lib/ctdb_dummy.c b/source3/lib/ctdb_dummy.c
index df05de7..2d1f6de 100644
--- a/source3/lib/ctdb_dummy.c
+++ b/source3/lib/ctdb_dummy.c
@@ -63,21 +63,14 @@ const char *lp_ctdbd_socket(void)
        return "";
 }
 
-bool ctdb_serverids_exist_supported(struct ctdbd_connection *conn)
-{
-       return false;
-}
-
-bool ctdb_serverids_exist(struct ctdbd_connection *conn,
-                         const struct server_id *pids, unsigned num_pids,
+bool ctdb_processes_exist(struct ctdbd_connection *conn,
+                         const struct server_id *pids, int num_pids,
                          bool *results)
 {
        return false;
 }
 
-bool ctdb_processes_exist(struct ctdbd_connection *conn,
-                         const struct server_id *pids, int num_pids,
-                         bool *results)
+bool ctdbd_process_exists(struct ctdbd_connection *conn, uint32_t vnn, pid_t 
pid)
 {
        return false;
 }
diff --git a/source3/lib/ctdbd_conn.c b/source3/lib/ctdbd_conn.c
index 1acce12..9aec517 100644
--- a/source3/lib/ctdbd_conn.c
+++ b/source3/lib/ctdbd_conn.c
@@ -856,249 +856,6 @@ fail:
        return result;
 }
 
-struct ctdb_vnn_list {
-       uint32_t vnn;
-       uint32_t reqid;
-       unsigned num_srvids;
-       unsigned num_filled;
-       uint64_t *srvids;
-       unsigned *pid_indexes;
-};
-
-/*
- * Get a list of all vnns mentioned in a list of
- * server_ids. vnn_indexes tells where in the vnns array we have to
- * place the pids.
- */
-static bool ctdb_collect_vnns(TALLOC_CTX *mem_ctx,
-                             const struct server_id *pids, unsigned num_pids,
-                             struct ctdb_vnn_list **pvnns,
-                             unsigned *pnum_vnns)
-{
-       struct ctdb_vnn_list *vnns = NULL;
-       unsigned *vnn_indexes = NULL;
-       unsigned i, num_vnns = 0;
-
-       vnn_indexes = talloc_array(mem_ctx, unsigned, num_pids);
-       if (vnn_indexes == NULL) {
-               DEBUG(1, ("talloc_array failed\n"));
-               goto fail;
-       }
-
-       for (i=0; i<num_pids; i++) {
-               unsigned j;
-               uint32_t vnn = pids[i].vnn;
-
-               for (j=0; j<num_vnns; j++) {
-                       if (vnn == vnns[j].vnn) {
-                               break;
-                       }
-               }
-               vnn_indexes[i] = j;
-
-               if (j < num_vnns) {
-                       /*
-                        * Already in the array
-                        */
-                       vnns[j].num_srvids += 1;
-                       continue;
-               }
-               vnns = talloc_realloc(mem_ctx, vnns, struct ctdb_vnn_list,
-                                     num_vnns+1);
-               if (vnns == NULL) {
-                       DEBUG(1, ("talloc_realloc failed\n"));
-                       goto fail;
-               }
-               vnns[num_vnns].vnn = vnn;
-               vnns[num_vnns].num_srvids = 1;
-               vnns[num_vnns].num_filled = 0;
-               num_vnns += 1;
-       }
-       for (i=0; i<num_vnns; i++) {
-               struct ctdb_vnn_list *vnn = &vnns[i];
-
-               vnn->srvids = talloc_array(vnns, uint64_t, vnn->num_srvids);
-               if (vnn->srvids == NULL) {
-                       DEBUG(1, ("talloc_array failed\n"));
-                       goto fail;
-               }
-               vnn->pid_indexes = talloc_array(vnns, unsigned,
-                                               vnn->num_srvids);
-               if (vnn->pid_indexes == NULL) {
-                       DEBUG(1, ("talloc_array failed\n"));
-                       goto fail;
-               }
-       }
-       for (i=0; i<num_pids; i++) {
-               struct ctdb_vnn_list *vnn = &vnns[vnn_indexes[i]];
-               vnn->srvids[vnn->num_filled] = pids[i].unique_id;
-               vnn->pid_indexes[vnn->num_filled] = i;
-               vnn->num_filled += 1;
-       }
-
-       TALLOC_FREE(vnn_indexes);
-       *pvnns = vnns;
-       *pnum_vnns = num_vnns;
-       return true;
-fail:
-       TALLOC_FREE(vnns);
-       TALLOC_FREE(vnn_indexes);
-       return false;
-}
-
-bool ctdb_serverids_exist_supported(struct ctdbd_connection *conn)
-{
-       return true;
-}
-
-bool ctdb_serverids_exist(struct ctdbd_connection *conn,
-                         const struct server_id *pids, unsigned num_pids,
-                         bool *results)
-{
-       unsigned i, num_received;
-       struct ctdb_vnn_list *vnns = NULL;
-       unsigned num_vnns;
-
-       if (!ctdb_collect_vnns(talloc_tos(), pids, num_pids,
-                              &vnns, &num_vnns)) {
-               DEBUG(1, ("ctdb_collect_vnns failed\n"));
-               goto fail;
-       }
-
-       for (i=0; i<num_vnns; i++) {
-               struct ctdb_vnn_list *vnn = &vnns[i];
-               struct ctdb_req_control req;
-               struct iovec iov[2];
-               ssize_t nwritten;
-
-               vnn->reqid = ctdbd_next_reqid(conn);
-
-               ZERO_STRUCT(req);
-
-               DEBUG(10, ("Requesting VNN %d, reqid=%d, num_srvids=%u\n",
-                          (int)vnn->vnn, (int)vnn->reqid, vnn->num_srvids));
-
-               req.hdr.length = offsetof(struct ctdb_req_control, data);
-               req.hdr.ctdb_magic   = CTDB_MAGIC;
-               req.hdr.ctdb_version = CTDB_PROTOCOL;
-               req.hdr.operation    = CTDB_REQ_CONTROL;
-               req.hdr.reqid        = vnn->reqid;
-               req.hdr.destnode     = vnn->vnn;
-               req.opcode           = CTDB_CONTROL_CHECK_SRVIDS;
-               req.srvid            = 0;
-               req.datalen          = sizeof(uint64_t) * vnn->num_srvids;
-               req.hdr.length      += req.datalen;
-               req.flags            = 0;
-
-               DEBUG(10, ("ctdbd_control: Sending ctdb packet\n"));
-               ctdb_packet_dump(&req.hdr);
-
-               iov[0].iov_base = &req;
-               iov[0].iov_len = offsetof(struct ctdb_req_control, data);
-               iov[1].iov_base = vnn->srvids;
-               iov[1].iov_len = req.datalen;
-
-               nwritten = write_data_iov(conn->fd, iov, ARRAY_SIZE(iov));
-               if (nwritten == -1) {
-                       DEBUG(10, ("write_data_iov failed: %s\n",
-                                  strerror(errno)));
-                       goto fail;
-               }
-       }
-
-       num_received = 0;
-
-       while (num_received < num_vnns) {
-               struct ctdb_req_header *hdr;
-               struct ctdb_reply_control *reply;
-               struct ctdb_vnn_list *vnn;
-               uint32_t reqid;
-               uint8_t *reply_data;
-               int ret;
-
-               ret = ctdb_read_req(conn, 0, talloc_tos(), &hdr);
-               if (ret != 0) {
-                       DEBUG(10, ("ctdb_read_req failed: %s\n",
-                                  strerror(ret)));
-                       goto fail;
-               }
-
-               if (hdr->operation != CTDB_REPLY_CONTROL) {
-                       DEBUG(1, ("Received invalid reply %u\n",
-                                 (unsigned)hdr->operation));
-                       goto fail;
-               }
-               reply = (struct ctdb_reply_control *)hdr;
-
-               reqid = reply->hdr.reqid;
-
-               DEBUG(10, ("Received reqid %d\n", (int)reqid));
-
-               for (i=0; i<num_vnns; i++) {
-                       if (reqid == vnns[i].reqid) {
-                               break;
-                       }
-               }
-               if (i == num_vnns) {
-                       DEBUG(1, ("Received unknown reqid number %u\n",
-                                 (unsigned)reqid));
-                       goto fail;
-               }
-
-               DEBUG(10, ("Found index %u\n", i));
-


-- 
Samba Shared Repository

Reply via email to