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