[SAMBA4][PATCH] don't try to resolv ipaddr-strings into an ip-address

tridge at samba.org tridge at samba.org
Tue Sep 13 01:22:30 GMT 2005


Metze,

Here is a implemention of composite_trigger_done(). This allows your
earlier patch to work (and I include that patch here) plus it allows
us to remove some of the other ad-hoc checks for is_ipaddress().

I have also added a LOCAL-RESOLVE test

Cheers, Tridge

==== Patch <composite_trigger> level 1
Source: a953eb74-4aff-0310-a63c-855d20285ebb:/local/samba4:12403
Target: 0c0555d6-39d7-0310-84fc-f1cc0bd64818:/branches/SAMBA_4_0:10193
        (svn+ssh://svn.samba.org/home/svn/samba)
Log:
 r12399 at blu:  tridge | 2005-09-13 11:01:48 +1000
 a local name resolution tester, used to measure the overhead of async
 name resolution
 
 r12402 at blu:  tridge | 2005-09-13 11:11:31 +1000
 added a composite_trigger_done() call that allows a composite function
 to cause an event to happen immediately. This allows metzes patch for
 recognising IPs in resolve_name() to work, and also allows us to
 remove some of the other code where we currently do specific checks
 for is_ipaddress().
 

=== source/lib/socket/connect.c
==================================================================
--- source/lib/socket/connect.c	(revision 10193)
+++ source/lib/socket/connect.c	(patch composite_trigger level 1)
@@ -36,11 +36,6 @@
 {
 	struct nbt_name name;
 
-	if (is_ipaddress(address) || strcasecmp("localhost", address) == 0) {
-		*ret_address = address;
-		return NT_STATUS_OK;
-	}
-
 	name.name = address;
 	name.scope = NULL;
 	name.type = NBT_NAME_CLIENT;
=== source/libcli/resolve/resolve.c
==================================================================
--- source/libcli/resolve/resolve.c	(revision 10193)
+++ source/libcli/resolve/resolve.c	(patch composite_trigger level 1)
@@ -144,6 +144,15 @@
 		c->event_ctx = talloc_reference(c, event_ctx);
 	}
 
+	if (is_ipaddress(state->name.name) || 
+	    strcasecmp(state->name.name, "localhost") == 0) {
+		struct ipv4_addr ip = interpret_addr2(state->name.name);
+		state->reply_addr = talloc_strdup(state, sys_inet_ntoa(ip));
+		if (!state->reply_addr) goto failed;
+		composite_trigger_done(c);
+		return c;
+	}
+
 	state->req = setup_next_method(c);
 	if (state->req == NULL) goto failed;
 	
=== source/libcli/composite/composite.c
==================================================================
--- source/libcli/composite/composite.c	(revision 10193)
+++ source/libcli/composite/composite.c	(patch composite_trigger level 1)
@@ -44,3 +44,27 @@
 }
 
 
+/* 
+   callback from composite_trigger_done() 
+*/
+static void composite_trigger(struct event_context *ev, struct timed_event *te,
+			      struct timeval t, void *ptr)
+{
+	struct composite_context *c = talloc_get_type(ptr, struct composite_context);
+	c->state = SMBCLI_REQUEST_DONE;
+	if (c->async.fn) {
+		c->async.fn(c);
+	}
+}
+
+
+/*
+  trigger an immediate 'done' event on a composite context
+  this is used when the composite code works out that the call
+  can be completed without waiting for any external event
+*/
+void composite_trigger_done(struct composite_context *c)
+{
+	/* a zero timeout means immediate */
+	event_add_timed(c->event_ctx, c, timeval_zero(), composite_trigger, c);
+}
=== source/libcli/composite/connect.c
==================================================================
--- source/libcli/composite/connect.c	(revision 10193)
+++ source/libcli/composite/connect.c	(patch composite_trigger level 1)
@@ -352,17 +352,9 @@
 	c->event_ctx = talloc_reference(c, state->sock->event.ctx);
 	c->private = state;
 
-	/* if the destination is an IP address, then skip the name resolution part */
-	if (is_ipaddress(io->in.dest_host)) {
-		state->stage = CONNECT_SOCKET;
-		state->creq = smbcli_sock_connect_send(state->sock, io->in.dest_host, 
-						       state->io->in.port, 
-						       io->in.dest_host);
-	} else {
-		state->stage = CONNECT_RESOLVE;
-		make_nbt_name_server(&name, io->in.dest_host);
-		state->creq = resolve_name_send(&name, c->event_ctx, lp_name_resolve_order());
-	}
+	state->stage = CONNECT_RESOLVE;
+	make_nbt_name_server(&name, io->in.dest_host);
+	state->creq = resolve_name_send(&name, c->event_ctx, lp_name_resolve_order());
 
 	if (state->creq == NULL) goto failed;
 	state->creq->async.private = c;
=== source/torture/torture.c
==================================================================
--- source/torture/torture.c	(revision 10193)
+++ source/torture/torture.c	(patch composite_trigger level 1)
@@ -2324,6 +2324,7 @@
 	{"LOCAL-IDTREE", torture_local_idtree, 0},
 	{"LOCAL-SOCKET", torture_local_socket, 0},
 	{"LOCAL-PAC", torture_pac, 0},
+	{"LOCAL-RESOLVE", torture_local_resolve, 0},
 
 	/* COM (Component Object Model) testers */
 	{"COM-SIMPLE", torture_com_simple, 0 },
=== source/torture/local/resolve.c
==================================================================
--- source/torture/local/resolve.c	(revision 10193)
+++ source/torture/local/resolve.c	(patch composite_trigger level 1)
@@ -0,0 +1,87 @@
+/* 
+   Unix SMB/CIFS implementation.
+
+   local test for async resolve code
+
+   Copyright (C) Andrew Tridgell 2004
+   
+   This program is free software; you can redistribute it and/or modify
+   it under the terms of the GNU General Public License as published by
+   the Free Software Foundation; either version 2 of the License, or
+   (at your option) any later version.
+   
+   This program is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU General Public License for more details.
+   
+   You should have received a copy of the GNU General Public License
+   along with this program; if not, write to the Free Software
+   Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+*/
+
+#include "includes.h"
+#include "lib/events/events.h"
+#include "librpc/gen_ndr/nbt.h"
+
+static BOOL test_async_resolve(TALLOC_CTX *mem_ctx)
+{
+	struct nbt_name n;
+	struct event_context *ev = event_context_find(mem_ctx);
+	int timelimit = lp_parm_int(-1, "torture", "timelimit", 10);
+	const char *host = lp_parm_string(-1, "torture", "host");
+	int count = 0;
+	struct timeval tv = timeval_current();
+
+	ZERO_STRUCT(n);
+	n.name = host;
+
+	printf("Testing async resolve of localhost for %d seconds\n", timelimit);
+	while (timeval_elapsed(&tv) < timelimit) {
+		const char *s;
+		struct composite_context *c = resolve_name_host_send(&n, ev);
+		NTSTATUS status = resolve_name_host_recv(c, mem_ctx, &s);
+		if (!NT_STATUS_IS_OK(status)) {
+			printf("async resolve failed - %s\n", nt_errstr(status));
+			return False;
+		}
+		count++;
+	}
+
+	printf("async rate of %.1f resolves/sec\n", count/timeval_elapsed(&tv));
+	return True;
+}
+
+/*
+  test resolution using sync method
+*/
+static BOOL test_sync_resolve(TALLOC_CTX *mem_ctx)
+{
+	int timelimit = lp_parm_int(-1, "torture", "timelimit", 10);
+	struct timeval tv = timeval_current();
+	int count = 0;
+	const char *host = lp_parm_string(-1, "torture", "host");
+
+	printf("Testing sync resolve of localhost for %d seconds\n", timelimit);
+	while (timeval_elapsed(&tv) < timelimit) {
+		sys_inet_ntoa(interpret_addr2(host));
+		count++;
+	}
+	
+	printf("sync rate of %.1f resolves/sec\n", count/timeval_elapsed(&tv));
+	return True;
+}
+
+
+BOOL torture_local_resolve(void) 
+{
+	TALLOC_CTX *mem_ctx = talloc_init("torture_local_irpc");
+	BOOL ret = True;
+
+	ret &= test_sync_resolve(mem_ctx);
+	ret &= test_async_resolve(mem_ctx);
+
+	talloc_free(mem_ctx);
+
+	return ret;
+}
=== source/torture/config.mk
==================================================================
--- source/torture/config.mk	(revision 10193)
+++ source/torture/config.mk	(patch composite_trigger level 1)
@@ -146,7 +146,8 @@
 		torture/local/binding_string.o \
 		torture/local/idtree.o \
 		torture/local/socket.o \
-		torture/local/irpc.o
+		torture/local/irpc.o \
+		torture/local/resolve.o
 REQUIRED_SUBSYSTEMS = \
 		LIBSMB \
 		MESSAGING

==== BEGIN SVK PATCH BLOCK ====
Version: svk 1.04 (linux)

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
==== END SVK PATCH BLOCK ====


More information about the samba-technical mailing list