[SCM] Samba Shared Repository - branch master updated

Douglas Bagnall dbagnall at samba.org
Wed Aug 31 08:54:03 UTC 2016


The branch, master has been updated
       via  0958010 ldb: Avoid multiple tiny allocations during full DB scan
       via  198471f ldb: Avoid cost of talloc_free() for unmatched messages
       via  45373b9 docs: Explain that "reset on zero vc" is an SMB1 feature
       via  af79484 autobuild: disable abi check on O3 build
       via  1d0dd5b selftest/wscript: format perftest as json
       via  dfac53c selftest: add an option to specify the test list
       via  e908873 make perftest: for performance testing
       via  288efc5 Add AD DC performance tests
       via  85b4a3e filter-subunit: default to empty affixes, saving verbose checks
       via  809f4c7 subunithelper: use set for efficient inclusion test
       via  6c391e1 selftest: allow tests.py scripts to run independently
       via  dda1b74 blackbox tests: add timestamps for subunit tests
       via  db85692 autobuild --restrict-tests to test a restricted set
       via  25efdf3 autobuild: remove unused argument
      from  91a2eb0 s3: modules: vfs_acl_common - Add Ralph's copyright.

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


- Log -----------------------------------------------------------------
commit 09580103fe30896c61e173c836aa4ca525cc6243
Author: Andrew Bartlett <abartlet at samba.org>
Date:   Tue Aug 23 11:38:26 2016 +1200

    ldb: Avoid multiple tiny allocations during full DB scan
    
    LDB_UNPACK_DATA_FLAG_NO_VALUES_ALLOC allows us to consolidate some of these allocations
    
    Signed-off-by: Andrew Bartlett <abartlet at samba.org>
    Reviewed-by: Douglas Bagnall <douglas.bagnall at catalyst.net.nz>
    
    Autobuild-User(master): Douglas Bagnall <dbagnall at samba.org>
    Autobuild-Date(master): Wed Aug 31 10:53:09 CEST 2016 on sn-devel-144

commit 198471f9edfb9da2ee5b54e60a46d208f58ca2e4
Author: Andrew Bartlett <abartlet at samba.org>
Date:   Fri Aug 26 09:58:38 2016 +1200

    ldb: Avoid cost of talloc_free() for unmatched messages
    
    Instead, we pay the cost of allocating a copy of the whole message once
    and we pay the cost of allocating a "struct ldb_val" that will not be used
    for each element in that message.
    
    This differes from the approach of ldb_unpack_data_only_attr_list()
    in that we need not allocate each value for a message that we do not
    return, so is more efficient for large multi-valued attributes and
    un-indexed or poorly indexed searches
    
    Signed-off-by: Andrew Bartlett <abartlet at samba.org>
    Reviewed-by: Douglas Bagnall <douglas.bagnall at catalyst.net.nz>

commit 45373b988d65c31e74af67a40888553c41d15532
Author: Andrew Bartlett <abartlet at samba.org>
Date:   Tue Aug 16 12:21:59 2016 +1200

    docs: Explain that "reset on zero vc" is an SMB1 feature
    
    Signed-off-by: Andrew Bartlett <abartlet at samba.org>
    Reviewed-by: Douglas Bagnall <douglas.bagnall at catalyst.net.nz>

commit af7948495f31199e560f8fc49b5fc508564a0e09
Author: Douglas Bagnall <douglas.bagnall at catalyst.net.nz>
Date:   Fri Aug 26 12:07:34 2016 +1200

    autobuild: disable abi check on O3 build
    
    Signed-off-by: Douglas Bagnall <douglas.bagnall at catalyst.net.nz>
    Reviewed-by: Garming Sam <garming at catalyst.net.nz>

commit 1d0dd5bf5eef4ceedb4c99bd1de8042f26201bb8
Author: Douglas Bagnall <douglas.bagnall at catalyst.net.nz>
Date:   Thu Aug 4 15:35:46 2016 +1200

    selftest/wscript: format perftest as json
    
    This makes it easier to use with common web-based graphing systems.
    
    Signed-off-by: Douglas Bagnall <douglas.bagnall at catalyst.net.nz>
    Reviewed-by: Garming Sam <garming at catalyst.net.nz>

commit dfac53cd40d8f44cebcf15d9aceba5b4a8106b2a
Author: Douglas Bagnall <douglas.bagnall at catalyst.net.nz>
Date:   Wed Aug 31 14:56:25 2016 +1200

    selftest: add an option to specify the test list
    
    This can be used to override the default test lists used by
    `make test` and `make perftest`. This tests can either be
    programmatically generated (as is done for the defaults -- see
    selftest/tests.py for an example), or from a static list. For the
    generated lists, append a pipe symbol:
    
        make test TEST_LIST='/bin/sh /tmp/tests.sh|'
    
    and omit the pipe for a static list:
    
        make test TEST_LIST='/tmp/tests.txt'
    
    There are likely other useful modes of operation -- see `perldoc open`
    for the wondrous details.
    
    Signed-off-by: Douglas Bagnall <douglas.bagnall at catalyst.net.nz>
    Reviewed-by: Garming Sam <garming at catalyst.net.nz>

commit e908873757171db5b65296c5c3cdefe7d0fb0c01
Author: Douglas Bagnall <douglas.bagnall at catalyst.net.nz>
Date:   Wed Aug 17 10:56:50 2016 +1200

    make perftest: for performance testing
    
    This runs a selection of subunit tests and reduces the output to only
    the time it takes to run each test.
    
    The tests are listed in selftest/perf_tests.py.
    
    Signed-off-by: Douglas Bagnall <douglas.bagnall at catalyst.net.nz>
    Reviewed-by: Garming Sam <garming at catalyst.net.nz>

commit 288efc55608e7d465f68d782790cf485defb79b6
Author: Douglas Bagnall <douglas.bagnall at catalyst.net.nz>
Date:   Wed Aug 17 10:56:39 2016 +1200

    Add AD DC performance tests
    
    These test a variety of simple AD DC operations.
    
    These tests are NOT independent of each other and must be run in the
    right order (alphabetically, which is guaranteed by Python's unittest
    module) -- the running of each test is part of the set-up for later
    modules. This means we have to subvert unittest a bit, but it saves
    hours of repeated set-up.
    
    These tests are not intended to push edge cases, but to hammer common
    operations that should work on all versions of Samba. The tests have
    been tested back to Samba 4.0.26.
    
    Signed-off-by: Douglas Bagnall <douglas.bagnall at catalyst.net.nz>
    Reviewed-by: Garming Sam <garming at catalyst.net.nz>

commit 85b4a3ea613b2f2b531551787f764c940bcf3f83
Author: Douglas Bagnall <douglas.bagnall at catalyst.net.nz>
Date:   Tue Aug 2 11:00:27 2016 +1200

    filter-subunit: default to empty affixes, saving verbose checks
    
    Signed-off-by: Douglas Bagnall <douglas.bagnall at catalyst.net.nz>
    Reviewed-by: Garming Sam <garming at catalyst.net.nz>

commit 809f4c718af00909bbce46ddde6a2688a88e73fc
Author: Douglas Bagnall <douglas.bagnall at catalyst.net.nz>
Date:   Tue Aug 2 10:27:05 2016 +1200

    subunithelper: use set for efficient inclusion test
    
    Signed-off-by: Douglas Bagnall <douglas.bagnall at catalyst.net.nz>
    Reviewed-by: Garming Sam <garming at catalyst.net.nz>

commit 6c391e18a47782a78e035f3e35a41710d8424105
Author: Douglas Bagnall <douglas.bagnall at catalyst.net.nz>
Date:   Fri Jul 29 10:57:52 2016 +1200

    selftest: allow tests.py scripts to run independently
    
    These generate lists of test commands. Usually they are run in special
    environments, but they should work from the command line. This
    restores the intended behaviour.
    
    Signed-off-by: Douglas Bagnall <douglas.bagnall at catalyst.net.nz>
    Reviewed-by: Garming Sam <garming at catalyst.net.nz>

commit dda1b74ea10a45d9a810b2a982e93cfb13dfeaba
Author: Douglas Bagnall <douglas.bagnall at catalyst.net.nz>
Date:   Wed Aug 3 16:03:57 2016 +1200

    blackbox tests: add timestamps for subunit tests
    
    There is the icky thing with sed because some kinds of `date` don't
    have sub-second resolution, which we really want.
    
    Another way to do it would be:
    
       python -c "import datetime; print datetime.datetime.utcnow().strftime('time: %Y-%m-%d %H:%M:%S.%fZ')"
    
    which should be universal, but is a little slower.
    
    Signed-off-by: Douglas Bagnall <douglas.bagnall at catalyst.net.nz>
    Reviewed-by: Andrew Bartlett <abartlet at samba.org>
    Reviewed-by: Garming Sam <garming at catalyst.net.nz>

commit db85692e4cd41499b5c4ec3220ae36da77afa2ef
Author: Douglas Bagnall <douglas.bagnall at catalyst.net.nz>
Date:   Wed Jul 27 14:28:04 2016 +1200

    autobuild --restrict-tests to test a restricted set
    
    This allows autobuild to be used as a test framework for running
    particular Samba tests in a cloud environment.
    
    Signed-off-by: Douglas Bagnall <douglas.bagnall at catalyst.net.nz>
    Reviewed-by: Garming Sam <garming at catalyst.net.nz>

commit 25efdf330bf91e7995c4d53a25713f2eaa364c0b
Author: Douglas Bagnall <douglas.bagnall at catalyst.net.nz>
Date:   Wed Jul 27 14:09:08 2016 +1200

    autobuild: remove unused argument
    
    The "tasklist" parameter is the same as the global "tasks" variable,
    but only the latter is used.
    
    Signed-off-by: Douglas Bagnall <douglas.bagnall at catalyst.net.nz>
    Reviewed-by: Garming Sam <garming at catalyst.net.nz>

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

Summary of changes:
 Makefile                                       |   3 +
 docs-xml/smbdotconf/misc/resetonzerovc.xml     |   7 +-
 lib/ldb/common/ldb_pack.c                      |  25 +-
 lib/ldb/include/ldb_module.h                   |  16 +-
 lib/ldb/ldb_tdb/ldb_index.c                    |  12 +-
 lib/ldb/ldb_tdb/ldb_search.c                   | 157 ++++++++----
 lib/ldb/ldb_tdb/ldb_tdb.h                      |   4 +-
 script/autobuild.py                            |  27 +-
 selftest/filter-subunit                        |  39 ++-
 selftest/format-subunit-json                   |  54 ++++
 selftest/perf_tests.py                         |  26 ++
 selftest/subunithelper.py                      |  83 +++++-
 selftest/tests.py                              |   1 +
 selftest/wscript                               |  28 +-
 source3/selftest/tests.py                      |   1 +
 source4/dsdb/tests/python/ad_dc_performance.py | 338 +++++++++++++++++++++++++
 source4/torture/ldb/ldb.c                      |  18 ++
 testprogs/blackbox/subunit.sh                  |  11 +
 18 files changed, 762 insertions(+), 88 deletions(-)
 create mode 100644 selftest/format-subunit-json
 create mode 100644 selftest/perf_tests.py
 create mode 100644 source4/dsdb/tests/python/ad_dc_performance.py


Changeset truncated at 500 lines:

diff --git a/Makefile b/Makefile
index 95681ae..5cc9077 100644
--- a/Makefile
+++ b/Makefile
@@ -16,6 +16,9 @@ uninstall:
 test:
 	$(WAF) test $(TEST_OPTIONS)
 
+perftest:
+	$(WAF) test --perf-test $(TEST_OPTIONS)
+
 help:
 	@echo NOTE: to run extended waf options use $(WAF_BINARY) or modify your PATH
 	$(WAF) --help
diff --git a/docs-xml/smbdotconf/misc/resetonzerovc.xml b/docs-xml/smbdotconf/misc/resetonzerovc.xml
index f2ad85d..a991733 100644
--- a/docs-xml/smbdotconf/misc/resetonzerovc.xml
+++ b/docs-xml/smbdotconf/misc/resetonzerovc.xml
@@ -4,7 +4,7 @@
                  xmlns:samba="http://www.samba.org/samba/DTD/samba-doc">
 <description>
 	<para>
-	This boolean option controls whether an incoming session setup
+	This boolean option controls whether an incoming SMB1 session setup
 	should kill other connections coming from the same IP. This matches
         the default Windows 2003 behaviour.
 
@@ -17,8 +17,9 @@
 	kills all other connections coming from the same IP. This way the
 	locked files are accessible again.
 
-	Please be aware that enabling this option will kill connections behind
-	a masquerading router.
+	Please be aware that enabling this option will kill
+	connections behind a masquerading router, and will not trigger
+	for clients that only use SMB2 or SMB3.
 
 	</para>
 </description>
diff --git a/lib/ldb/common/ldb_pack.c b/lib/ldb/common/ldb_pack.c
index 7e6dd2d..a63dd58 100644
--- a/lib/ldb/common/ldb_pack.c
+++ b/lib/ldb/common/ldb_pack.c
@@ -233,6 +233,7 @@ int ldb_unpack_data_only_attr_list_flags(struct ldb_context *ldb,
 	unsigned int nelem = 0;
 	size_t len;
 	unsigned int found = 0;
+	struct ldb_val *ldb_val_single_array = NULL;
 
 	if (list == NULL) {
 		list_size = 0;
@@ -313,6 +314,26 @@ int ldb_unpack_data_only_attr_list_flags(struct ldb_context *ldb,
 		goto failed;
 	}
 
+	/*
+	 * In typical use, most values are single-valued.  This makes
+	 * it quite expensive to allocate an array of ldb_val for each
+	 * of these, just to then hold the pointer to the data buffer
+	 * (in the LDB_UNPACK_DATA_FLAG_NO_DATA_ALLOC we don't
+	 * allocate the data).  So with
+	 * LDB_UNPACK_DATA_FLAG_NO_VALUES_ALLOC we allocate this ahead
+	 * of time and use it for the single values where possible.
+	 * (This is used the the normal search case, but not in the
+	 * index case because of caller requirements).
+	 */
+	if (flags & LDB_UNPACK_DATA_FLAG_NO_VALUES_ALLOC) {
+		ldb_val_single_array = talloc_array(message->elements, struct ldb_val,
+						    message->num_elements);
+		if (ldb_val_single_array == NULL) {
+			errno = ENOMEM;
+			goto failed;
+		}
+	}
+
 	for (i=0;i<message->num_elements;i++) {
 		const char *attr = NULL;
 		size_t attr_len;
@@ -396,7 +417,9 @@ int ldb_unpack_data_only_attr_list_flags(struct ldb_context *ldb,
 		p += attr_len + 1;
 		element->num_values = pull_uint32(p, 0);
 		element->values = NULL;
-		if (element->num_values != 0) {
+		if ((flags & LDB_UNPACK_DATA_FLAG_NO_VALUES_ALLOC) && element->num_values == 1) {
+			element->values = &ldb_val_single_array[nelem];
+		} else if (element->num_values != 0) {
 			element->values = talloc_array(message->elements,
 						       struct ldb_val,
 						       element->num_values);
diff --git a/lib/ldb/include/ldb_module.h b/lib/ldb/include/ldb_module.h
index 1c48590..833d5a8 100644
--- a/lib/ldb/include/ldb_module.h
+++ b/lib/ldb/include/ldb_module.h
@@ -412,8 +412,15 @@ int ldb_unpack_data(struct ldb_context *ldb,
  * Giving a NULL list (or a list_size of 0) unpacks all the attributes.
  *
  * Flags allow control of allocation, so that if
- * LDB_UNPACK_DATA_FLAG_NO_DATA_ALLOC is specified, then values are
- * not allocate, instead they point into the supplier constant buffer.
+ * LDB_UNPACK_DATA_FLAG_NO_DATA_ALLOC is specified, then data in values are
+ * not allocated, instead they point into the supplier constant buffer.
+ *
+ * If LDB_UNPACK_DATA_FLAG_NO_VALUES_ALLOC is specified, then values
+ * array are not allocated individually (for single-valued
+ * attributes), instead they point into a single buffer per message.
+ *
+ * LDB_UNPACK_DATA_FLAG_NO_VALUES_ALLOC is only valid when
+ * LDB_UNPACK_DATA_FLAG_NO_DATA_ALLOC is also specified.
  *
  * Likewise if LDB_UNPACK_DATA_FLAG_NO_DN is specified, the DN is omitted.
  */
@@ -425,7 +432,8 @@ int ldb_unpack_data_only_attr_list_flags(struct ldb_context *ldb,
 					 unsigned int flags,
 					 unsigned int *nb_elements_in_db);
 
-#define LDB_UNPACK_DATA_FLAG_NO_DATA_ALLOC 0x0001
-#define LDB_UNPACK_DATA_FLAG_NO_DN         0x0002
+#define LDB_UNPACK_DATA_FLAG_NO_DATA_ALLOC   0x0001
+#define LDB_UNPACK_DATA_FLAG_NO_DN           0x0002
+#define LDB_UNPACK_DATA_FLAG_NO_VALUES_ALLOC 0x0004
 
 #endif
diff --git a/lib/ldb/ldb_tdb/ldb_index.c b/lib/ldb/ldb_tdb/ldb_index.c
index 392b4a7..7924172 100644
--- a/lib/ldb/ldb_tdb/ldb_index.c
+++ b/lib/ldb/ldb_tdb/ldb_index.c
@@ -931,6 +931,7 @@ static int ltdb_index_filter(const struct dn_list *dn_list,
 {
 	struct ldb_context *ldb;
 	struct ldb_message *msg;
+	struct ldb_message *filtered_msg;
 	unsigned int i;
 
 	ldb = ldb_module_get_ctx(ac->module);
@@ -951,7 +952,9 @@ static int ltdb_index_filter(const struct dn_list *dn_list,
 			return LDB_ERR_OPERATIONS_ERROR;
 		}
 
-		ret = ltdb_search_dn1(ac->module, dn, msg, 0);
+		ret = ltdb_search_dn1(ac->module, dn, msg,
+				      LDB_UNPACK_DATA_FLAG_NO_DATA_ALLOC|
+				      LDB_UNPACK_DATA_FLAG_NO_VALUES_ALLOC);
 		talloc_free(dn);
 		if (ret == LDB_ERR_NO_SUCH_OBJECT) {
 			/* the record has disappeared? yes, this can happen */
@@ -977,14 +980,15 @@ static int ltdb_index_filter(const struct dn_list *dn_list,
 		}
 
 		/* filter the attributes that the user wants */
-		ret = ltdb_filter_attrs(msg, ac->attrs);
+		ret = ltdb_filter_attrs(ac, msg, ac->attrs, &filtered_msg);
+
+		talloc_free(msg);
 
 		if (ret == -1) {
-			talloc_free(msg);
 			return LDB_ERR_OPERATIONS_ERROR;
 		}
 
-		ret = ldb_module_send_entry(ac->req, msg, NULL);
+		ret = ldb_module_send_entry(ac->req, filtered_msg, NULL);
 		if (ret != LDB_SUCCESS) {
 			/* Regardless of success or failure, the msg
 			 * is the callbacks responsiblity, and should
diff --git a/lib/ldb/ldb_tdb/ldb_search.c b/lib/ldb/ldb_tdb/ldb_search.c
index 133e5d4..373855f 100644
--- a/lib/ldb/ldb_tdb/ldb_search.c
+++ b/lib/ldb/ldb_tdb/ldb_search.c
@@ -385,81 +385,144 @@ int ltdb_add_attr_results(struct ldb_module *module,
 
 /*
   filter the specified list of attributes from a message
-  removing not requested attrs.
+  removing not requested attrs from the new message constructed.
+
+  The reason this makes a new message is that the old one may not be
+  individually allocated, which is what our callers expect.
+
  */
-int ltdb_filter_attrs(struct ldb_message *msg, const char * const *attrs)
+int ltdb_filter_attrs(TALLOC_CTX *mem_ctx,
+		      const struct ldb_message *msg, const char * const *attrs,
+		      struct ldb_message **filtered_msg)
 {
 	unsigned int i;
-	int keep_all = 0;
-	struct ldb_message_element *el2;
+	bool keep_all = false;
+	bool add_dn = false;
 	uint32_t num_elements;
+	uint32_t elements_size;
+	struct ldb_message *msg2;
+
+	msg2 = ldb_msg_new(mem_ctx);
+	if (msg2 == NULL) {
+		goto failed;
+	}
+
+	msg2->dn = ldb_dn_copy(msg2, msg->dn);
+	if (msg2->dn == NULL) {
+		goto failed;
+	}
 
 	if (attrs) {
 		/* check for special attrs */
 		for (i = 0; attrs[i]; i++) {
-			if (strcmp(attrs[i], "*") == 0) {
-				keep_all = 1;
+			int cmp = strcmp(attrs[i], "*");
+			if (cmp == 0) {
+				keep_all = true;
 				break;
 			}
-
-			if (ldb_attr_cmp(attrs[i], "distinguishedName") == 0) {
-				if (msg_add_distinguished_name(msg) != 0) {
-					return -1;
-				}
+			cmp = ldb_attr_cmp(attrs[i], "distinguishedName");
+			if (cmp == 0) {
+				add_dn = true;
 			}
 		}
 	} else {
-		keep_all = 1;
+		keep_all = true;
 	}
-	
+
 	if (keep_all) {
-		if (msg_add_distinguished_name(msg) != 0) {
+		add_dn = true;
+		elements_size = msg->num_elements + 1;
+
+	/* Shortcuts for the simple cases */
+	} else if (add_dn && i == 1) {
+		if (msg_add_distinguished_name(msg2) != 0) {
 			return -1;
 		}
+		*filtered_msg = msg2;
+		return 0;
+	} else if (i == 0) {
+		*filtered_msg = msg2;
 		return 0;
-	}
 
-	el2 = talloc_array(msg, struct ldb_message_element, msg->num_elements);
-	if (el2 == NULL) {
-		return -1;
+	/* Otherwise we are copying at most as many element as we have attributes */
+	} else {
+		elements_size = i;
 	}
+
+	msg2->elements = talloc_array(msg2, struct ldb_message_element,
+				      elements_size);
+	if (msg2->elements == NULL) goto failed;
+
 	num_elements = 0;
 
 	for (i = 0; i < msg->num_elements; i++) {
+		struct ldb_message_element *el = &msg->elements[i];
+		struct ldb_message_element *el2 = &msg2->elements[num_elements];
 		unsigned int j;
-		int found = 0;
-		
-		for (j = 0; attrs[j]; j++) {
-			if (ldb_attr_cmp(msg->elements[i].name, attrs[j]) == 0) {
-				found = 1;
-				break;
+
+		if (keep_all == false) {
+			bool found = false;
+			for (j = 0; attrs[j]; j++) {
+				int cmp = ldb_attr_cmp(el->name, attrs[j]);
+				if (cmp == 0) {
+					found = true;
+					break;
+				}
+			}
+			if (found == false) {
+				continue;
+			}
+		}
+		*el2 = *el;
+		el2->name = talloc_strdup(msg2->elements, el->name);
+		if (el2->name == NULL) {
+			goto failed;
+		}
+		el2->values = talloc_array(msg2->elements, struct ldb_val, el->num_values);
+		if (el2->values == NULL) {
+			goto failed;
+		}
+		for (j=0;j<el->num_values;j++) {
+			el2->values[j] = ldb_val_dup(el2->values, &el->values[j]);
+			if (el2->values[j].data == NULL && el->values[j].length != 0) {
+				goto failed;
 			}
 		}
+		num_elements++;
 
-		if (found) {
-			el2[num_elements] = msg->elements[i];
-			talloc_steal(el2, el2[num_elements].name);
-			talloc_steal(el2, el2[num_elements].values);
-			num_elements++;
+		/* Pidginhole principle: we can't have more elements
+		 * than the number of attributes if they are unique in
+		 * the DB */
+		if (num_elements > elements_size) {
+			goto failed;
 		}
 	}
 
-	talloc_free(msg->elements);
+	msg2->num_elements = num_elements;
 
-	if (num_elements > 0) {
-		msg->elements = talloc_realloc(msg, el2, struct ldb_message_element,
-					       num_elements);
-	} else {
-		msg->elements = talloc_array(msg, struct ldb_message_element, 0);
-		talloc_free(el2);
+	if (add_dn) {
+		if (msg_add_distinguished_name(msg2) != 0) {
+			return -1;
+		}
 	}
-	if (msg->elements == NULL) {
-		return -1;
+
+	if (msg2->num_elements > 0) {
+		msg2->elements = talloc_realloc(msg2, msg2->elements,
+						struct ldb_message_element,
+						msg2->num_elements);
+		if (msg2->elements == NULL) {
+			return -1;
+		}
+	} else {
+		talloc_free(msg2->elements);
+		msg2->elements = NULL;
 	}
 
-	msg->num_elements = num_elements;
+	*filtered_msg = msg2;
 
 	return 0;
+failed:
+	return -1;
 }
 
 /*
@@ -469,13 +532,14 @@ static int search_func(struct tdb_context *tdb, TDB_DATA key, TDB_DATA data, voi
 {
 	struct ldb_context *ldb;
 	struct ltdb_context *ac;
-	struct ldb_message *msg;
+	struct ldb_message *msg, *filtered_msg;
 	const struct ldb_val val = {
 		.data = data.dptr,
 		.length = data.dsize,
 	};
 	int ret;
 	bool matched;
+	unsigned int nb_elements_in_db;
 
 	ac = talloc_get_type(state, struct ltdb_context);
 	ldb = ldb_module_get_ctx(ac->module);
@@ -492,7 +556,12 @@ static int search_func(struct tdb_context *tdb, TDB_DATA key, TDB_DATA data, voi
 	}
 
 	/* unpack the record */
-	ret = ldb_unpack_data(ldb, &val, msg);
+	ret = ldb_unpack_data_only_attr_list_flags(ldb, &val,
+						   msg,
+						   NULL, 0,
+						   LDB_UNPACK_DATA_FLAG_NO_DATA_ALLOC|
+						   LDB_UNPACK_DATA_FLAG_NO_VALUES_ALLOC,
+						   &nb_elements_in_db);
 	if (ret == -1) {
 		talloc_free(msg);
 		ac->error = LDB_ERR_OPERATIONS_ERROR;
@@ -523,15 +592,15 @@ static int search_func(struct tdb_context *tdb, TDB_DATA key, TDB_DATA data, voi
 	}
 
 	/* filter the attributes that the user wants */
-	ret = ltdb_filter_attrs(msg, ac->attrs);
+	ret = ltdb_filter_attrs(ac, msg, ac->attrs, &filtered_msg);
+	talloc_free(msg);
 
 	if (ret == -1) {
-		talloc_free(msg);
 		ac->error = LDB_ERR_OPERATIONS_ERROR;
 		return -1;
 	}
 
-	ret = ldb_module_send_entry(ac->req, msg, NULL);
+	ret = ldb_module_send_entry(ac->req, filtered_msg, NULL);
 	if (ret != LDB_SUCCESS) {
 		ac->request_terminated = true;
 		/* the callback failed, abort the operation */
diff --git a/lib/ldb/ldb_tdb/ldb_tdb.h b/lib/ldb/ldb_tdb/ldb_tdb.h
index 7390a04..b5b78a9 100644
--- a/lib/ldb/ldb_tdb/ldb_tdb.h
+++ b/lib/ldb/ldb_tdb/ldb_tdb.h
@@ -109,7 +109,9 @@ int ltdb_add_attr_results(struct ldb_module *module,
 			  const char * const attrs[], 
 			  unsigned int *count, 
 			  struct ldb_message ***res);
-int ltdb_filter_attrs(struct ldb_message *msg, const char * const *attrs);
+int ltdb_filter_attrs(TALLOC_CTX *mem_ctx,
+		      const struct ldb_message *msg, const char * const *attrs,
+		      struct ldb_message **filtered_msg);
 int ltdb_search(struct ltdb_context *ctx);
 
 /* The following definitions come from lib/ldb/ldb_tdb/ldb_tdb.c  */
diff --git a/script/autobuild.py b/script/autobuild.py
index 419fe1a..b435790 100755
--- a/script/autobuild.py
+++ b/script/autobuild.py
@@ -28,6 +28,7 @@ builddirs = {
     "samba-ctdb" : ".",
     "samba-libs"  : ".",
     "samba-static"  : ".",
+    "samba-test-only"  : ".",
     "ldb"     : "lib/ldb",
     "tdb"     : "lib/tdb",
     "talloc"  : "lib/talloc",
@@ -75,6 +76,10 @@ tasks = {
                 ("check-clean-tree", "script/clean-source-tree.sh", "text/plain"),
                 ("clean", "make clean", "text/plain") ],
 
+    "samba-test-only" : [ ("configure", "./configure.developer --with-selftest-prefix=./bin/ab  --abi-check-disable" + samba_configure_params, "text/plain"),
+                          ("make", "make -j", "text/plain"),
+                          ("test", "make test FAIL_IMMEDIATELY=1 TESTS=${TESTS}", "text/plain") ],
+
     # Test cross-compile infrastructure
     "samba-xc" : [ ("configure-native", "./configure.developer --with-selftest-prefix=./bin/ab" + samba_configure_params, "text/plain"),
                    ("configure-cross-execute", "./configure.developer -b ./bin-xe --cross-compile --cross-execute=script/identity_cc.sh" \
@@ -85,7 +90,7 @@ tasks = {
 
     # test build with -O3 -- catches extra warnings and bugs
     "samba-o3" : [ ("random-sleep", "../script/random-sleep.sh 60 600", "text/plain"),
-                   ("configure", "ADDITIONAL_CFLAGS='-O3' ./configure.developer --with-selftest-prefix=./bin/ab" + samba_configure_params, "text/plain"),
+                   ("configure", "ADDITIONAL_CFLAGS='-O3' ./configure.developer --with-selftest-prefix=./bin/ab --abi-check-disable" + samba_configure_params, "text/plain"),
                    ("make", "make -j", "text/plain"),
                    ("test", "make quicktest FAIL_IMMEDIATELY=1 TESTS='\(ad_dc\)'", "text/plain"),
                    ("install", "make install", "text/plain"),
@@ -278,6 +283,7 @@ class builder(object):
         self.cmd = self.cmd.replace("${PREFIX}", "--prefix=%s" % self.prefix)
         self.cmd = self.cmd.replace("${EXTRA_PYTHON}", "%s" % extra_python)
         self.cmd = self.cmd.replace("${PREFIX_DIR}", "%s" % self.prefix)
+        self.cmd = self.cmd.replace("${TESTS}", options.restrict_tests)
 #        if self.output_mime_type == "text/x-subunit":
 #            self.cmd += " | %s --immediate" % (os.path.join(os.path.dirname(__file__), "selftest/format-subunit"))
         print '%s: [%s] Running %s' % (self.name, self.stage, self.cmd)
@@ -292,13 +298,16 @@ class builder(object):
 class buildlist(object):
     '''handle build of multiple directories'''
 
-    def __init__(self, tasklist, tasknames, rebase_url, rebase_branch="master"):
+    def __init__(self, tasknames, rebase_url, rebase_branch="master"):
         global tasks
         self.tlist = []
         self.tail_proc = None
         self.retry = None
         if tasknames == []:
-            tasknames = defaulttasks
+            if options.restrict_tests:
+                tasknames = ["samba-test-only"]
+            else:
+                tasknames = defaulttasks
         else:
             # If we are only running one test,
             # do not sleep randomly to wait for it to start
@@ -555,6 +564,8 @@ parser.add_option("", "--log-base", help="location where the logs can be found (
                   default=gitroot, type='str')
 parser.add_option("", "--attach-logs", help="Attach logs to mails sent on success/failure?",
                   default=False, action="store_true")
+parser.add_option("", "--restrict-tests", help="run as make test with this TESTS= regex",
+                  default='')
 
 def send_email(subject, text, log_tar):
     outer = MIMEMultipart()
@@ -599,6 +610,10 @@ A summary of the autobuild process is here:
   %s/autobuild.log
 ''' % (platform.node(), elapsed_minutes, failed_task, errstr, log_base)
 
+    if options.restrict_tests:
+        text += """
+The build was restricted to tests matching %s\n""" % options.restrict_tests
+
     if failed_task != 'rebase':
         text += '''
 You can see logs of the failed task here:
@@ -650,6 +665,10 @@ Your autobuild on %s has succeeded after %.1f minutes.
 
 ''' % (platform.node(), elapsed_time / 60.)
 
+    if options.restrict_tests:


-- 
Samba Shared Repository



More information about the samba-cvs mailing list