[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