[SCM] Samba Shared Repository - branch master updated

Andrew Tridgell tridge at samba.org
Mon Sep 6 20:57:59 MDT 2010


The branch, master has been updated
       via  73c3932 s4-ldapserver: serialise ldap server operations
       via  a8bac4a s4-packet: make packet_recv_disable() a lot more efficient
       via  cad0219 s4-process: fixed the thread process model so it compiles
      from  e5e5a11 Add unique IP address binding for client connections (EPM and ncacn_ip_tcp levels)

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


- Log -----------------------------------------------------------------
commit 73c3932b2d0dac784a0605abf6e532dba5514a01
Author: Andrew Tridgell <tridge at samba.org>
Date:   Tue Sep 7 11:57:44 2010 +1000

    s4-ldapserver: serialise ldap server operations
    
    This ensures that two ldap server operations cannot happen in parallel
    by using packet_recv_disable() and packet_recv_enable() to disable
    other interfaces during ldap calls.
    
    This prevents problems caused by parallel ldap operations where
    transactions could overlap.

commit a8bac4a09a4a81c280c62fb4dcdbd0e61c782479
Author: Andrew Tridgell <tridge at samba.org>
Date:   Tue Sep 7 11:55:47 2010 +1000

    s4-packet: make packet_recv_disable() a lot more efficient
    
    this avoids doing an epoll system call when we want to prevent receipt
    of packets on a socket, unless there actually is a packet to receive.

commit cad0219e69d2acc766583083c0738c2b9ea3901f
Author: Andrew Tridgell <tridge at samba.org>
Date:   Tue Sep 7 11:25:42 2010 +1000

    s4-process: fixed the thread process model so it compiles
    
    it doesn't actually work, but at least it now compiles

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

Summary of changes:
 source4/ldap_server/ldap_server.c |   53 +++++++++++++++++++++++++++++++++++++
 source4/ldap_server/ldap_server.h |    7 +++++
 source4/lib/stream/packet.c       |    8 ++++-
 source4/smbd/process_thread.c     |    3 +-
 4 files changed, 68 insertions(+), 3 deletions(-)


Changeset truncated at 500 lines:

diff --git a/source4/ldap_server/ldap_server.c b/source4/ldap_server/ldap_server.c
index 946e1bf..e975590 100644
--- a/source4/ldap_server/ldap_server.c
+++ b/source4/ldap_server/ldap_server.c
@@ -132,6 +132,32 @@ static void ldapsrv_process_message(struct ldapsrv_connection *conn,
 }
 
 /*
+  disable packets on other sockets while processing this one
+ */
+static void ldapsrv_disable_recv(struct ldapsrv_connection *conn)
+{
+	struct ldapsrv_packet_interfaces *p;
+	for (p=conn->service->packet_interfaces; p; p=p->next) {
+		if (p->packet != conn->packet) {
+			packet_recv_disable(p->packet);
+		}
+	}
+}
+
+/*
+  disable packets on other sockets while processing this one
+ */
+static void ldapsrv_enable_recv(struct ldapsrv_connection *conn)
+{
+	struct ldapsrv_packet_interfaces *p;
+	for (p=conn->service->packet_interfaces; p; p=p->next) {
+		if (p->packet != conn->packet) {
+			packet_recv_enable(p->packet);
+		}
+	}
+}
+
+/*
   decode/process data
 */
 static NTSTATUS ldapsrv_decode(void *private_data, DATA_BLOB blob)
@@ -162,7 +188,13 @@ static NTSTATUS ldapsrv_decode(void *private_data, DATA_BLOB blob)
 	talloc_steal(conn, msg);
 	asn1_free(asn1);
 
+	/* disable messages on other sockets while processing this one */
+	ldapsrv_disable_recv(conn);
+
 	ldapsrv_process_message(conn, msg);
+
+	ldapsrv_enable_recv(conn);
+
 	return NT_STATUS_OK;
 }
 
@@ -325,6 +357,15 @@ failed:
 }
 
 /*
+  remove a packet interface from the service level list
+ */
+static int packet_interface_destructor(struct ldapsrv_packet_interfaces *packet_interface)
+{
+	DLIST_REMOVE(packet_interface->service->packet_interfaces, packet_interface);
+	return 0;
+}
+
+/*
   initialise a server_context from a open socket and register a event handler
   for reading from that socket
 */
@@ -397,6 +438,18 @@ static void ldapsrv_accept(struct stream_connection *c,
 	/* Ensure we don't get packets until the database is ready below */
 	packet_recv_disable(conn->packet);
 
+	/* add to the service level list of packet interfaces, to
+	 * allow us to serialise between connections
+	 */
+	conn->packet_interface = talloc(conn, struct ldapsrv_packet_interfaces);
+	if (conn->packet_interface == NULL) {
+		ldapsrv_terminate_connection(conn, "out of memory");
+	}
+	conn->packet_interface->service = ldapsrv_service;
+	conn->packet_interface->packet = conn->packet;
+	DLIST_ADD(conn->service->packet_interfaces, conn->packet_interface);
+	talloc_set_destructor(conn->packet_interface, packet_interface_destructor);
+
 	server_credentials = cli_credentials_init(conn);
 	if (!server_credentials) {
 		stream_terminate_connection(c, "Failed to init server credentials\n");
diff --git a/source4/ldap_server/ldap_server.h b/source4/ldap_server/ldap_server.h
index 8b45285..0fb8d2f 100644
--- a/source4/ldap_server/ldap_server.h
+++ b/source4/ldap_server/ldap_server.h
@@ -50,6 +50,8 @@ struct ldapsrv_connection {
 		struct tevent_timer *ite;
 		struct tevent_timer *te;
 	} limits;
+
+	struct ldapsrv_packet_interfaces *packet_interface;
 };
 
 struct ldapsrv_call {
@@ -66,6 +68,11 @@ struct ldapsrv_call {
 struct ldapsrv_service {
 	struct tls_params *tls_params;
 	struct task_server *task;
+	struct ldapsrv_packet_interfaces {
+		struct ldapsrv_packet_interfaces *next, *prev;
+		struct packet_context *packet;
+		struct ldapsrv_service *service;
+	} *packet_interfaces;
 };
 
 #include "ldap_server/proto.h"
diff --git a/source4/lib/stream/packet.c b/source4/lib/stream/packet.c
index 251d951..9834370 100644
--- a/source4/lib/stream/packet.c
+++ b/source4/lib/stream/packet.c
@@ -42,6 +42,7 @@ struct packet_context {
 	bool serialise;
 	int processing;
 	bool recv_disable;
+	bool recv_need_enable;
 	bool nofree;
 
 	bool busy;
@@ -256,6 +257,7 @@ _PUBLIC_ void packet_recv(struct packet_context *pc)
 	}
 
 	if (pc->recv_disable) {
+		pc->recv_need_enable = true;
 		EVENT_FD_NOT_READABLE(pc->fde);
 		return;
 	}
@@ -464,7 +466,6 @@ next_partial:
 */
 _PUBLIC_ void packet_recv_disable(struct packet_context *pc)
 {
-	EVENT_FD_NOT_READABLE(pc->fde);
 	pc->recv_disable = true;
 }
 
@@ -473,7 +474,10 @@ _PUBLIC_ void packet_recv_disable(struct packet_context *pc)
 */
 _PUBLIC_ void packet_recv_enable(struct packet_context *pc)
 {
-	EVENT_FD_READABLE(pc->fde);
+	if (pc->recv_need_enable) {
+		pc->recv_need_enable = false;
+		EVENT_FD_READABLE(pc->fde);
+	}
 	pc->recv_disable = false;
 	if (pc->num_read != 0 && pc->packet_size >= pc->num_read) {
 		event_add_timed(pc->ev, pc, timeval_zero(), packet_next_event, pc);
diff --git a/source4/smbd/process_thread.c b/source4/smbd/process_thread.c
index c047d23..b169a79 100644
--- a/source4/smbd/process_thread.c
+++ b/source4/smbd/process_thread.c
@@ -29,6 +29,7 @@
 #endif
 #include "system/wait.h"
 #include "system/filesys.h"
+#include "system/time.h"
 #include "lib/events/events.h"
 #include "lib/util/dlinklist.h"
 #include "lib/util/mutex.h"
@@ -317,7 +318,7 @@ static int thread_rwlock_lock_read(smb_rwlock_t *rwlockP, const char *name)
 	pthread_rwlock_t *rwlock = (pthread_rwlock_t *)rwlockP->rwlock;
 	int rc;
 	double t;
-	struct time tp1;
+	struct timespec tp1;
 	/* Test below is ONLY for debugging */
 	if ((rc = pthread_rwlock_tryrdlock(rwlock))) {
 		if (rc == EBUSY) {


-- 
Samba Shared Repository


More information about the samba-cvs mailing list