The branch, master has been updated
       via  a448699 torture3: Add a little gencache_parse load test
       via  8f3be3d Exit with ctdb_fatal if serverids_exist fails
       via  aaaff84 dbwrap_ctdb: open locally with TDB_VOLATILE if requested
       via  b8ae6f8 s3:smbd: let default_sys_recvfile() and sys_recvfile() cope 
with non-blocking sockets.
      from  ec4496b unix_msg: Simplify unix_msg_send a bit

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


- Log -----------------------------------------------------------------
commit a448699b7dcb310e4d47d9d9e7ef0291b6c3760f
Author: Volker Lendecke <v...@samba.org>
Date:   Mon Mar 10 15:43:19 2014 +0100

    torture3: Add a little gencache_parse load test
    
    Signed-off-by: Volker Lendecke <v...@samba.org>
    Reviewed-by: Christof Schmitt <c...@samba.org>
    Reviewed-by: Michael Adam <ob...@samba.org>
    
    Autobuild-User(master): Michael Adam <ob...@samba.org>
    Autobuild-Date(master): Sat May 24 16:16:43 CEST 2014 on sn-devel-104

commit 8f3be3dcff8c42a93be3c0841b34250c795fb1c4
Author: Volker Lendecke <v...@samba.org>
Date:   Thu Jul 4 14:22:28 2013 +0200

    Exit with ctdb_fatal if serverids_exist fails
    
    The only reason why this could fail is a severe ctdb communications
    problem. The normal way to deal with this is ctdb_fatal. This avoids a
    confusing panic in get_share_mode_lock when ctdb is shutdown while this
    call happens.
    
    Signed-off-by: Volker Lendecke <v...@samba.org>
    Reviewed-by: Christof Schmitt <c...@samba.org>
    Reviewed-by: Michael Adam <ob...@samba.org>

commit aaaff84b44dc211cf678b98320c55ca0e6eb3a46
Author: Volker Lendecke <v...@samba.org>
Date:   Mon Mar 17 12:21:28 2014 +0100

    dbwrap_ctdb: open locally with TDB_VOLATILE if requested
    
    Signed-off-by: Volker Lendecke <v...@samba.org>
    Reviewed-by: Christof Schmitt <c...@samba.org>
    Reviewed-by: Michael Adam <ob...@samba.org>

commit b8ae6f8f57271fd4b8c57d5b800930b8558c1b4a
Author: Jeremy Allison <j...@samba.org>
Date:   Tue Apr 15 12:43:06 2014 -0700

    s3:smbd: let default_sys_recvfile() and sys_recvfile() cope with 
non-blocking sockets.
    
    default_sys_recvfile() and splice() recvfile were not
    written to cope with non-blocking sockets.
    
    When either the socket read() or splice() return
    -1 with errno EWOULDBLOCK or EAGAIN, if no bytes have been
    processed yet, return -1 and let the caller set
    blocking and retry. If bytes have been processed,
    just return them as a short read and let the
    caller retry with the remaining needed reads.
    
    Signed-off-by: Jeremy Allison <j...@samba.org>
    Reviewed-by: Michael Adam <ob...@samba.org>

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

Summary of changes:
 source3/lib/ctdbd_conn.c         |    8 +++---
 source3/lib/dbwrap/dbwrap_ctdb.c |    2 +-
 source3/lib/recvfile.c           |   46 ++++++++++++++++++++++++++++++++++++-
 source3/torture/torture.c        |   24 +++++++++++++++++++
 4 files changed, 73 insertions(+), 7 deletions(-)


Changeset truncated at 500 lines:

diff --git a/source3/lib/ctdbd_conn.c b/source3/lib/ctdbd_conn.c
index fae3f90..35845ed 100644
--- a/source3/lib/ctdbd_conn.c
+++ b/source3/lib/ctdbd_conn.c
@@ -1166,7 +1166,6 @@ bool ctdb_serverids_exist(struct ctdbd_connection *conn,
        NTSTATUS status;
        struct ctdb_vnn_list *vnns = NULL;
        unsigned num_vnns;
-       bool result = false;
 
        if (!ctdb_collect_vnns(talloc_tos(), pids, num_pids,
                               &vnns, &num_vnns)) {
@@ -1303,10 +1302,11 @@ bool ctdb_serverids_exist(struct ctdbd_connection *conn,
                num_received += 1;
        }
 
-       result = true;
-fail:
        TALLOC_FREE(vnns);
-       return result;
+       return true;
+fail:
+       cluster_fatal("serverids_exist failed");
+       return false;
 #endif /* HAVE_CTDB_CONTROL_CHECK_SRVIDS_DECL */
 }
 
diff --git a/source3/lib/dbwrap/dbwrap_ctdb.c b/source3/lib/dbwrap/dbwrap_ctdb.c
index 7cf90ce..ca33c8f 100644
--- a/source3/lib/dbwrap/dbwrap_ctdb.c
+++ b/source3/lib/dbwrap/dbwrap_ctdb.c
@@ -1616,7 +1616,7 @@ struct db_context *db_open_ctdb(TALLOC_CTX *mem_ctx,
        result->lock_order = lock_order;
 
        /* only pass through specific flags */
-       tdb_flags &= TDB_SEQNUM;
+       tdb_flags &= TDB_SEQNUM|TDB_VOLATILE;
 
        /* honor permissions if user has specified O_CREAT */
        if (open_flags & O_CREAT) {
diff --git a/source3/lib/recvfile.c b/source3/lib/recvfile.c
index 500a7e4..bffe07f 100644
--- a/source3/lib/recvfile.c
+++ b/source3/lib/recvfile.c
@@ -75,8 +75,33 @@ static ssize_t default_sys_recvfile(int fromfd,
                ssize_t read_ret;
                size_t toread = MIN(bufsize,count - total);
 
-               /* Read from socket - ignore EINTR. */
-               read_ret = sys_read(fromfd, buffer, toread);
+               /*
+                * Read from socket - ignore EINTR.
+                * Can't use sys_read() as that also
+                * ignores EAGAIN and EWOULDBLOCK.
+                */
+               do {
+                       read_ret = read(fromfd, buffer, toread);
+               } while (read_ret == -1 && errno == EINTR);
+
+#if defined(EWOULDBLOCK)
+               if (read_ret == -1 && (errno == EAGAIN || errno == 
EWOULDBLOCK)) {
+#else
+               if (read_ret == -1 && (errno == EAGAIN)) {
+#endif
+                       /*
+                        * fromfd socket is in non-blocking mode.
+                        * If we already read some and wrote
+                        * it successfully, return that.
+                        * Only return -1 if this is the first read
+                        * attempt. Caller will handle both cases.
+                        */
+                       if (total_written != 0) {
+                               return total_written;
+                       }
+                       return -1;
+               }
+
                if (read_ret <= 0) {
                        /* EOF or socket error. */
                        return -1;
@@ -184,6 +209,23 @@ ssize_t sys_recvfile(int fromfd,
                                return default_sys_recvfile(fromfd, tofd,
                                                            offset, count);
                        }
+#if defined(EWOULDBLOCK)
+                       if (errno == EAGAIN || errno == EWOULDBLOCK) {
+#else
+                       if (errno == EAGAIN) {
+#endif
+                               /*
+                                * fromfd socket is in non-blocking mode.
+                                * If we already read some and wrote
+                                * it successfully, return that.
+                                * Only return -1 if this is the first read
+                                * attempt. Caller will handle both cases.
+                                */
+                               if (total_written != 0) {
+                                       return total_written;
+                               }
+                               return -1;
+                       }
                        break;
                }
 
diff --git a/source3/torture/torture.c b/source3/torture/torture.c
index 95d8b33..cea9089 100644
--- a/source3/torture/torture.c
+++ b/source3/torture/torture.c
@@ -8119,12 +8119,26 @@ static bool run_local_base64(int dummy)
        return ret;
 }
 
+static void parse_fn(time_t timeout, DATA_BLOB blob, void *private_data)
+{
+       return;
+}
+
 static bool run_local_gencache(int dummy)
 {
        char *val;
        time_t tm;
        DATA_BLOB blob;
        char v;
+       struct memcache *mem;
+       int i;
+
+       mem = memcache_init(NULL, 0);
+       if (mem == NULL) {
+               d_printf("%s: memcache_init failed\n", __location__);
+               return false;
+       }
+       memcache_set_global(mem);
 
        if (!gencache_set("foo", "bar", time(NULL) + 1000)) {
                d_printf("%s: gencache_set() failed\n", __location__);
@@ -8136,6 +8150,16 @@ static bool run_local_gencache(int dummy)
                return False;
        }
 
+       for (i=0; i<1000000; i++) {
+               gencache_parse("foo", parse_fn, NULL);
+       }
+
+       if (!gencache_get("foo", talloc_tos(), &val, &tm)) {
+               d_printf("%s: gencache_get() failed\n", __location__);
+               return False;
+       }
+       TALLOC_FREE(val);
+
        if (!gencache_get("foo", talloc_tos(), &val, &tm)) {
                d_printf("%s: gencache_get() failed\n", __location__);
                return False;


-- 
Samba Shared Repository

Reply via email to