parent
133b9ac416
commit
18bac81896
@ -1,2 +1,2 @@
|
|||||||
SOURCES/ldb-2.7.2.tar.gz
|
SOURCES/ldb-2.8.0.tar.gz
|
||||||
SOURCES/ldb.keyring
|
SOURCES/ldb.keyring
|
||||||
|
@ -1,2 +1,2 @@
|
|||||||
94c3957196f0e4c2f88af159a92a5adb08fd15c9 SOURCES/ldb-2.7.2.tar.gz
|
cf5c3d8a15c0666cc980a8cf7227ae711664f5a3 SOURCES/ldb-2.8.0.tar.gz
|
||||||
8ac6d09878c4218fb8e365fcf5a877a621dd40f9 SOURCES/ldb.keyring
|
8ac6d09878c4218fb8e365fcf5a877a621dd40f9 SOURCES/ldb.keyring
|
||||||
|
@ -1,182 +0,0 @@
|
|||||||
From d4e0a07a24c16b38de58c14a38b418c63106ad09 Mon Sep 17 00:00:00 2001
|
|
||||||
From: Lukas Slebodnik <lslebodn@fedoraproject.org>
|
|
||||||
Date: Sat, 24 Aug 2019 16:46:30 +0200
|
|
||||||
Subject: [PATCH] [PATCH] wafsamba: Fix few SyntaxWarnings caused by regular
|
|
||||||
expressions
|
|
||||||
|
|
||||||
./buildtools/wafsamba/samba_utils.py:258: SyntaxWarning: invalid escape sequence \$
|
|
||||||
lst = re.split('(\$\{\w+\})', string)
|
|
||||||
./buildtools/wafsamba/samba_utils.py:261: SyntaxWarning: invalid escape sequence \$
|
|
||||||
if re.match('\$\{\w+\}', v):
|
|
||||||
./buildtools/wafsamba/samba_cross.py:80: SyntaxWarning: invalid escape sequence \(
|
|
||||||
m = re.match('\(\s*(-?\d+)\s*,\s*\"(.*)\"\s*\)', ans)
|
|
||||||
./buildtools/wafsamba/samba_conftests.py:400: SyntaxWarning: invalid escape sequence \s
|
|
||||||
m = re.search('MAN%sEXT\s+=\s+(\w+)' % section, man)
|
|
||||||
./buildtools/wafsamba/samba_abi.py:24: SyntaxWarning: invalid escape sequence \$
|
|
||||||
sig = re.sub('^\$[0-9]+\s=\s\{(.+)\}$', r'\1', sig)
|
|
||||||
./buildtools/wafsamba/samba_abi.py:25: SyntaxWarning: invalid escape sequence \$
|
|
||||||
sig = re.sub('^\$[0-9]+\s=\s\{(.+)\}(\s0x[0-9a-f]+\s<\w+>)+$', r'\1', sig)
|
|
||||||
./buildtools/wafsamba/samba_abi.py:26: SyntaxWarning: invalid escape sequence \$
|
|
||||||
sig = re.sub('^\$[0-9]+\s=\s(0x[0-9a-f]+)\s?(<\w+>)?$', r'\1', sig)
|
|
||||||
./buildtools/wafsamba/samba_abi.py:33: SyntaxWarning: invalid escape sequence \*
|
|
||||||
m = m.replace('*', '\*')
|
|
||||||
./buildtools/wafsamba/samba_abi.py:44: SyntaxWarning: invalid escape sequence \s
|
|
||||||
sig = re.sub(',\s\.\.\.', '', sig)
|
|
||||||
./buildtools/wafsamba/samba_headers.py:22: SyntaxWarning: invalid escape sequence \s
|
|
||||||
re_header = re.compile('^\s*#\s*include[ \t]*"([^"]+)"', re.I | re.M)
|
|
||||||
./buildtools/wafsamba/symbols.py:122: SyntaxWarning: invalid escape sequence \[
|
|
||||||
re_sharedlib = re.compile(b'Shared library: \[(.*)\]')
|
|
||||||
./buildtools/wafsamba/symbols.py:124: SyntaxWarning: invalid escape sequence \[
|
|
||||||
re_rpath = re.compile(b'Library (rpath|runpath): \[(.*)\]')
|
|
||||||
./buildtools/wafsamba/pkgconfig.py:12: SyntaxWarning: invalid escape sequence \w
|
|
||||||
a = re.split('(@\w+@)', s)
|
|
||||||
./buildtools/wafsamba/pkgconfig.py:17: SyntaxWarning: invalid escape sequence \w
|
|
||||||
if re.match('@\w+@', v):
|
|
||||||
./buildtools/wafsamba/configure_file.py:16: SyntaxWarning: invalid escape sequence \w
|
|
||||||
a = re.split('(@\w+@)', s)
|
|
||||||
./buildtools/wafsamba/configure_file.py:19: SyntaxWarning: invalid escape sequence \w
|
|
||||||
if re.match('@\w+@', v):
|
|
||||||
---
|
|
||||||
buildtools/wafsamba/configure_file.py | 4 ++--
|
|
||||||
buildtools/wafsamba/pkgconfig.py | 4 ++--
|
|
||||||
buildtools/wafsamba/samba_abi.py | 12 ++++++------
|
|
||||||
buildtools/wafsamba/samba_conftests.py | 2 +-
|
|
||||||
buildtools/wafsamba/samba_cross.py | 2 +-
|
|
||||||
buildtools/wafsamba/samba_headers.py | 2 +-
|
|
||||||
buildtools/wafsamba/samba_utils.py | 4 ++--
|
|
||||||
buildtools/wafsamba/symbols.py | 4 ++--
|
|
||||||
8 files changed, 17 insertions(+), 17 deletions(-)
|
|
||||||
|
|
||||||
diff --git a/buildtools/wafsamba/configure_file.py b/buildtools/wafsamba/configure_file.py
|
|
||||||
index 6ad43546249fba7b4c0a037035e8574e7a9d2753..98a58a4604513e3633317e73299c1c9280c250d2 100644
|
|
||||||
--- a/buildtools/wafsamba/configure_file.py
|
|
||||||
+++ b/buildtools/wafsamba/configure_file.py
|
|
||||||
@@ -13,10 +13,10 @@ def subst_at_vars(task):
|
|
||||||
s = task.inputs[0].read()
|
|
||||||
|
|
||||||
# split on the vars
|
|
||||||
- a = re.split('(@\w+@)', s)
|
|
||||||
+ a = re.split(r'(@\w+@)', s)
|
|
||||||
out = []
|
|
||||||
for v in a:
|
|
||||||
- if re.match('@\w+@', v):
|
|
||||||
+ if re.match(r'@\w+@', v):
|
|
||||||
vname = v[1:-1]
|
|
||||||
if not vname in task.env and vname.upper() in task.env:
|
|
||||||
vname = vname.upper()
|
|
||||||
diff --git a/buildtools/wafsamba/pkgconfig.py b/buildtools/wafsamba/pkgconfig.py
|
|
||||||
index b83d5f382a58352bb3318b594aa2b45fc02d87d5..b77bd618c8903789c7ba9e64a6972a4e080f1821 100644
|
|
||||||
--- a/buildtools/wafsamba/pkgconfig.py
|
|
||||||
+++ b/buildtools/wafsamba/pkgconfig.py
|
|
||||||
@@ -9,12 +9,12 @@ def subst_at_vars(task):
|
|
||||||
|
|
||||||
s = task.inputs[0].read()
|
|
||||||
# split on the vars
|
|
||||||
- a = re.split('(@\w+@)', s)
|
|
||||||
+ a = re.split(r'(@\w+@)', s)
|
|
||||||
out = []
|
|
||||||
done_var = {}
|
|
||||||
back_sub = [ ('PREFIX', '${prefix}'), ('EXEC_PREFIX', '${exec_prefix}')]
|
|
||||||
for v in a:
|
|
||||||
- if re.match('@\w+@', v):
|
|
||||||
+ if re.match(r'@\w+@', v):
|
|
||||||
vname = v[1:-1]
|
|
||||||
if not vname in task.env and vname.upper() in task.env:
|
|
||||||
vname = vname.upper()
|
|
||||||
diff --git a/buildtools/wafsamba/samba_abi.py b/buildtools/wafsamba/samba_abi.py
|
|
||||||
index 5e7686da3d68b1ebcd842b8a319a5997fa9cf600..761667fcfe1f3937be22c8261b45dcb3979ae4cd 100644
|
|
||||||
--- a/buildtools/wafsamba/samba_abi.py
|
|
||||||
+++ b/buildtools/wafsamba/samba_abi.py
|
|
||||||
@@ -21,16 +21,16 @@ version_key = lambda x: list(map(int, x.split(".")))
|
|
||||||
def normalise_signature(sig):
|
|
||||||
'''normalise a signature from gdb'''
|
|
||||||
sig = sig.strip()
|
|
||||||
- sig = re.sub('^\$[0-9]+\s=\s\{(.+)\}$', r'\1', sig)
|
|
||||||
- sig = re.sub('^\$[0-9]+\s=\s\{(.+)\}(\s0x[0-9a-f]+\s<\w+>)+$', r'\1', sig)
|
|
||||||
- sig = re.sub('^\$[0-9]+\s=\s(0x[0-9a-f]+)\s?(<\w+>)?$', r'\1', sig)
|
|
||||||
- sig = re.sub('0x[0-9a-f]+', '0xXXXX', sig)
|
|
||||||
+ sig = re.sub(r'^\$[0-9]+\s=\s\{(.+)\}$', r'\1', sig)
|
|
||||||
+ sig = re.sub(r'^\$[0-9]+\s=\s\{(.+)\}(\s0x[0-9a-f]+\s<\w+>)+$', r'\1', sig)
|
|
||||||
+ sig = re.sub(r'^\$[0-9]+\s=\s(0x[0-9a-f]+)\s?(<\w+>)?$', r'\1', sig)
|
|
||||||
+ sig = re.sub(r'0x[0-9a-f]+', '0xXXXX', sig)
|
|
||||||
sig = re.sub('", <incomplete sequence (\\\\[a-z0-9]+)>', r'\1"', sig)
|
|
||||||
|
|
||||||
for t in abi_type_maps:
|
|
||||||
# we need to cope with non-word characters in mapped types
|
|
||||||
m = t
|
|
||||||
- m = m.replace('*', '\*')
|
|
||||||
+ m = m.replace('*', r'\*')
|
|
||||||
if m[-1].isalnum() or m[-1] == '_':
|
|
||||||
m += '\\b'
|
|
||||||
if m[0].isalnum() or m[0] == '_':
|
|
||||||
@@ -41,7 +41,7 @@ def normalise_signature(sig):
|
|
||||||
|
|
||||||
def normalise_varargs(sig):
|
|
||||||
'''cope with older versions of gdb'''
|
|
||||||
- sig = re.sub(',\s\.\.\.', '', sig)
|
|
||||||
+ sig = re.sub(r',\s\.\.\.', '', sig)
|
|
||||||
return sig
|
|
||||||
|
|
||||||
|
|
||||||
diff --git a/buildtools/wafsamba/samba_conftests.py b/buildtools/wafsamba/samba_conftests.py
|
|
||||||
index ef632ba903369e4211991f17a3b204bcd96c3a2f..63e50567860ff890b00b0ce6c7607c917b7329d1 100644
|
|
||||||
--- a/buildtools/wafsamba/samba_conftests.py
|
|
||||||
+++ b/buildtools/wafsamba/samba_conftests.py
|
|
||||||
@@ -397,7 +397,7 @@ WriteMakefile(
|
|
||||||
|
|
||||||
if section:
|
|
||||||
man = Utils.readf(os.path.join(bdir,'Makefile'))
|
|
||||||
- m = re.search('MAN%sEXT\s+=\s+(\w+)' % section, man)
|
|
||||||
+ m = re.search(r'MAN%sEXT\s+=\s+(\w+)' % section, man)
|
|
||||||
if not m:
|
|
||||||
conf.end_msg('not found', color='YELLOW')
|
|
||||||
return
|
|
||||||
diff --git a/buildtools/wafsamba/samba_headers.py b/buildtools/wafsamba/samba_headers.py
|
|
||||||
index a268c011c5d8e406e0d763554c55668cfb5388bc..c8bee19010978a04460b0637fcc8fd484a699ea8 100644
|
|
||||||
--- a/buildtools/wafsamba/samba_headers.py
|
|
||||||
+++ b/buildtools/wafsamba/samba_headers.py
|
|
||||||
@@ -19,7 +19,7 @@ def header_install_path(header, header_path):
|
|
||||||
return ''
|
|
||||||
|
|
||||||
|
|
||||||
-re_header = re.compile('^\s*#\s*include[ \t]*"([^"]+)"', re.I | re.M)
|
|
||||||
+re_header = re.compile(r'^\s*#\s*include[ \t]*"([^"]+)"', re.I | re.M)
|
|
||||||
|
|
||||||
# a dictionary mapping source header paths to public header paths
|
|
||||||
header_map = {}
|
|
||||||
diff --git a/buildtools/wafsamba/samba_utils.py b/buildtools/wafsamba/samba_utils.py
|
|
||||||
index ad97de1859ba24c4afd5106b4f9694b0dc855643..75c9794ec40f327ef8ccf9aa33fafd6ed6181e3b 100644
|
|
||||||
--- a/buildtools/wafsamba/samba_utils.py
|
|
||||||
+++ b/buildtools/wafsamba/samba_utils.py
|
|
||||||
@@ -255,10 +255,10 @@ def TO_LIST(str, delimiter=None):
|
|
||||||
|
|
||||||
def subst_vars_error(string, env):
|
|
||||||
'''substitute vars, throw an error if a variable is not defined'''
|
|
||||||
- lst = re.split('(\$\{\w+\})', string)
|
|
||||||
+ lst = re.split(r'(\$\{\w+\})', string)
|
|
||||||
out = []
|
|
||||||
for v in lst:
|
|
||||||
- if re.match('\$\{\w+\}', v):
|
|
||||||
+ if re.match(r'\$\{\w+\}', v):
|
|
||||||
vname = v[2:-1]
|
|
||||||
if not vname in env:
|
|
||||||
raise KeyError("Failed to find variable %s in %s in env %s <%s>" % (vname, string, env.__class__, str(env)))
|
|
||||||
diff --git a/buildtools/wafsamba/symbols.py b/buildtools/wafsamba/symbols.py
|
|
||||||
index 3eca3d46bd71cf0780b3c8e36a26b96bd3aa3b83..73e8ca8ce53ef5d956ac58e14a2403dd49f01109 100644
|
|
||||||
--- a/buildtools/wafsamba/symbols.py
|
|
||||||
+++ b/buildtools/wafsamba/symbols.py
|
|
||||||
@@ -119,9 +119,9 @@ def find_ldd_path(bld, libname, binary):
|
|
||||||
|
|
||||||
|
|
||||||
# some regular expressions for parsing readelf output
|
|
||||||
-re_sharedlib = re.compile(b'Shared library: \[(.*)\]')
|
|
||||||
+re_sharedlib = re.compile(r'Shared library: \[(.*)\]')
|
|
||||||
# output from readelf could be `Library rpath` or `Libray runpath`
|
|
||||||
-re_rpath = re.compile(b'Library (rpath|runpath): \[(.*)\]')
|
|
||||||
+re_rpath = re.compile(r'Library (rpath|runpath): \[(.*)\]')
|
|
||||||
|
|
||||||
def get_libs(bld, binname):
|
|
||||||
'''find the list of linked libraries for any binary or library
|
|
||||||
--
|
|
||||||
2.23.0.rc2
|
|
||||||
|
|
@ -1,11 +0,0 @@
|
|||||||
-----BEGIN PGP SIGNATURE-----
|
|
||||||
|
|
||||||
iQEzBAABCgAdFiEEkUejOXGVGO6QEby1R5ORYRMIQCUFAmQkQQAACgkQR5ORYRMI
|
|
||||||
QCVLegf/edHMC2+MZrMuMAbmRPb/cFxzYhHzDLuDyXcW0v6M0TDhu2eRamXk1XT0
|
|
||||||
SFR5ah/qdhC1TeYOMpXhKPTpuvEURKkCK1vLj002djaNy4hEmHUsF7aNFW9Kd2QN
|
|
||||||
2hatsIn9EhPafOppgpJ34oVEF+ta9aA07rDwcRAPiCUq4/IW6qnEieC+zCjVLlTd
|
|
||||||
2+1gfUaC2iUj7g9qkXLg21XRPRwkv8xvpUlJ+SBMphyo6uoBzVzDB+nzOGqpO4n9
|
|
||||||
QAj6iUC0I9faLlXljgeSi+DaM1E5n/slgkl6ko2Chcba6ZtSxKLE69X3RenAu8d3
|
|
||||||
Cf+ATsT5+Ra5CPY2PJv5Z1A2SCHd/w==
|
|
||||||
=ukNT
|
|
||||||
-----END PGP SIGNATURE-----
|
|
@ -0,0 +1,11 @@
|
|||||||
|
-----BEGIN PGP SIGNATURE-----
|
||||||
|
|
||||||
|
iQEzBAABCgAdFiEEkUejOXGVGO6QEby1R5ORYRMIQCUFAmTDr+oACgkQR5ORYRMI
|
||||||
|
QCXfwgf/cAqWCgnnKIT3hvUdL2i2F9edDXTOkBDZ1vxQ8hLO+T8JtWO9F40hEZjH
|
||||||
|
F5R5B2pxBP6T2Nd9NHVbHUqlIpjqqesweTXtabuW60oz5PZ13owpGDWWQKortH5/
|
||||||
|
j49v/ZKHD0NBjVN09AylRgoKQ4kRDtd0rMOAS951aRUcRTFRjK86hnaHPgvQeexy
|
||||||
|
SizGRtHlifnwM/lbgJlLkTDUDNA+7RwXRAv0pvLwYReGFoS8vyUbMOYt1lnoiNas
|
||||||
|
6cz+6yTKknGO7KSE6bjviDahv7Xg04Qy02eI/HYEZ8NG3aJqNsOqPchP4y/JgVv+
|
||||||
|
90FZR2cdZNpTdlZ5TPfihL2/zldXKQ==
|
||||||
|
=H6+4
|
||||||
|
-----END PGP SIGNATURE-----
|
@ -0,0 +1,221 @@
|
|||||||
|
From 1944fcf4b7e5ab4cf580e17031918ba5f441902b Mon Sep 17 00:00:00 2001
|
||||||
|
From: Douglas Bagnall <douglas.bagnall@catalyst.net.nz>
|
||||||
|
Date: Wed, 26 Jun 2024 11:05:49 +1200
|
||||||
|
Subject: [PATCH 1/2] ldb_kv_index: dn_list load sub transaction can re-use
|
||||||
|
keys
|
||||||
|
MIME-Version: 1.0
|
||||||
|
Content-Type: text/plain; charset=UTF-8
|
||||||
|
Content-Transfer-Encoding: 8bit
|
||||||
|
|
||||||
|
We don't want to modify the original list, but we can reuse the keys
|
||||||
|
if we treat them as immutable and don't free them. That makes it a lot
|
||||||
|
quicker if there are many keys (i.e. where an index is useful) and may
|
||||||
|
sub-transactions. In particular, it avoids O(n²) talloc_memdups.
|
||||||
|
|
||||||
|
A removed comment that says "We have to free the top level index
|
||||||
|
memory otherwise we would leak", and this will be addressed in the
|
||||||
|
next commit.
|
||||||
|
|
||||||
|
BUG: https://bugzilla.samba.org/show_bug.cgi?id=15590
|
||||||
|
|
||||||
|
Signed-off-by: Douglas Bagnall <douglas.bagnall@catalyst.net.nz>
|
||||||
|
Reviewed-by: Stefan Metzmacher <metze@samba.org>
|
||||||
|
(cherry picked from commit 5f0198d69843c864f2b98a7c0c6305ad789a68a0)
|
||||||
|
---
|
||||||
|
lib/ldb/ldb_key_value/ldb_kv_index.c | 96 +++++++++++++++++-----------
|
||||||
|
1 file changed, 57 insertions(+), 39 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/lib/ldb/ldb_key_value/ldb_kv_index.c b/lib/ldb/ldb_key_value/ldb_kv_index.c
|
||||||
|
index 3f1a847f2b6..fed1033f492 100644
|
||||||
|
--- a/lib/ldb/ldb_key_value/ldb_kv_index.c
|
||||||
|
+++ b/lib/ldb/ldb_key_value/ldb_kv_index.c
|
||||||
|
@@ -446,34 +446,39 @@ static int ldb_kv_dn_list_load(struct ldb_module *module,
|
||||||
|
* There is an active index sub transaction, and the record was
|
||||||
|
* found in the primary index transaction cache. A copy of the
|
||||||
|
* record needs be taken to prevent the original entry being
|
||||||
|
- * altered, until the index sub transaction is committed.
|
||||||
|
+ * altered, until the index sub transaction is committed, but we
|
||||||
|
+ * don't copy the actual values, just the array of struct ldb_val
|
||||||
|
+ * that points to the values (which are offsets into a GUID array).
|
||||||
|
+ *
|
||||||
|
+ * As a reminder, our primary cache is an in-memory tdb that
|
||||||
|
+ * maps attributes to struct dn_list objects, which point to
|
||||||
|
+ * the actual index, which is an array of struct ldb_val, the
|
||||||
|
+ * contents of which are {.data = <binary GUID>, .length =
|
||||||
|
+ * 16}. The array is sorted by GUID data, and these GUIDs are
|
||||||
|
+ * used to look up index entries in the main database. There
|
||||||
|
+ * are more layers of indirection than necessary, but what
|
||||||
|
+ * makes the index useful is we can use a binary search to
|
||||||
|
+ * find if the array contains a GUID.
|
||||||
|
+ *
|
||||||
|
+ * What we do in a sub-transaction is make a copy of the struct
|
||||||
|
+ * dn_list and the array of struct ldb_val, but *not* of the
|
||||||
|
+ * .data that they point to. This copy is put into a new
|
||||||
|
+ * in-memory tdb which masks the primary cache for the duration
|
||||||
|
+ * of the sub-transaction.
|
||||||
|
+ *
|
||||||
|
+ * In an add operation in a sub-transaction, the new ldb_val
|
||||||
|
+ * is a child of the sub-transaction dn_list, which will
|
||||||
|
+ * become the main dn_list if the transaction succeeds.
|
||||||
|
+ *
|
||||||
|
+ * These acrobatics do not affect read-only operations.
|
||||||
|
*/
|
||||||
|
-
|
||||||
|
- {
|
||||||
|
- struct ldb_val *dns = NULL;
|
||||||
|
- size_t x = 0;
|
||||||
|
-
|
||||||
|
- dns = talloc_array(
|
||||||
|
- list,
|
||||||
|
- struct ldb_val,
|
||||||
|
- list2->count);
|
||||||
|
- if (dns == NULL) {
|
||||||
|
- return LDB_ERR_OPERATIONS_ERROR;
|
||||||
|
- }
|
||||||
|
- for (x = 0; x < list2->count; x++) {
|
||||||
|
- dns[x].length = list2->dn[x].length;
|
||||||
|
- dns[x].data = talloc_memdup(
|
||||||
|
- dns,
|
||||||
|
- list2->dn[x].data,
|
||||||
|
- list2->dn[x].length);
|
||||||
|
- if (dns[x].data == NULL) {
|
||||||
|
- TALLOC_FREE(dns);
|
||||||
|
- return LDB_ERR_OPERATIONS_ERROR;
|
||||||
|
- }
|
||||||
|
- }
|
||||||
|
- list->dn = dns;
|
||||||
|
- list->count = list2->count;
|
||||||
|
+ list->dn = talloc_memdup(list,
|
||||||
|
+ list2->dn,
|
||||||
|
+ talloc_get_size(list2->dn));
|
||||||
|
+ if (list->dn == NULL) {
|
||||||
|
+ return LDB_ERR_OPERATIONS_ERROR;
|
||||||
|
}
|
||||||
|
+ list->count = list2->count;
|
||||||
|
return LDB_SUCCESS;
|
||||||
|
|
||||||
|
/*
|
||||||
|
@@ -3852,9 +3857,7 @@ int ldb_kv_reindex(struct ldb_module *module)
|
||||||
|
* Copy the contents of the nested transaction index cache record to the
|
||||||
|
* transaction index cache.
|
||||||
|
*
|
||||||
|
- * During this 'commit' of the subtransaction to the main transaction
|
||||||
|
- * (cache), care must be taken to free any existing index at the top
|
||||||
|
- * level because otherwise we would leak memory.
|
||||||
|
+ * This is a 'commit' of the subtransaction to the main transaction cache.
|
||||||
|
*/
|
||||||
|
static int ldb_kv_sub_transaction_traverse(
|
||||||
|
struct tdb_context *tdb,
|
||||||
|
@@ -3883,8 +3886,7 @@ static int ldb_kv_sub_transaction_traverse(
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Do we already have an entry in the primary transaction cache
|
||||||
|
- * If so free it's dn_list and replace it with the dn_list from
|
||||||
|
- * the secondary cache
|
||||||
|
+ * If so replace dn_list with the one from the subtransaction.
|
||||||
|
*
|
||||||
|
* The TDB and so the fetched rec contains NO DATA, just a
|
||||||
|
* pointer to data held in memory.
|
||||||
|
@@ -3897,21 +3899,37 @@ static int ldb_kv_sub_transaction_traverse(
|
||||||
|
abort();
|
||||||
|
}
|
||||||
|
/*
|
||||||
|
- * We had this key at the top level. However we made a copy
|
||||||
|
- * at the sub-transaction level so that we could possibly
|
||||||
|
- * roll back. We have to free the top level index memory
|
||||||
|
- * otherwise we would leak
|
||||||
|
+ * We had this key at the top level, and made a copy
|
||||||
|
+ * of the dn list for this sub-transaction level that
|
||||||
|
+ * borrowed the top level GUID data. We can't free the
|
||||||
|
+ * original dn list just yet.
|
||||||
|
+ *
|
||||||
|
+ * In this diagram, ... is the C pointer structure
|
||||||
|
+ * and --- is the talloc structure (::: is both).
|
||||||
|
+ *
|
||||||
|
+ * index_in_top_level ::: dn orig ..............
|
||||||
|
+ * | | :
|
||||||
|
+ * | `--GUID array :
|
||||||
|
+ * | |----- val1 data
|
||||||
|
+ * ldb_kv `----- val2 data
|
||||||
|
+ * | :
|
||||||
|
+ * index_in_subtransaction :: dn copy ..........:
|
||||||
|
+ * | :
|
||||||
|
+ * `------------ new val3 data
|
||||||
|
+ *
|
||||||
|
+ * So we don't free the index_in_top_level dn list yet,
|
||||||
|
+ * because we are (probably) borrowing most of its
|
||||||
|
+ * children.
|
||||||
|
*/
|
||||||
|
- if (index_in_top_level->count > 0) {
|
||||||
|
- TALLOC_FREE(index_in_top_level->dn);
|
||||||
|
- }
|
||||||
|
index_in_top_level->dn
|
||||||
|
= talloc_steal(index_in_top_level,
|
||||||
|
index_in_subtransaction->dn);
|
||||||
|
index_in_top_level->count = index_in_subtransaction->count;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
-
|
||||||
|
+ /*
|
||||||
|
+ * We found no top level index in the cache, so we put one in.
|
||||||
|
+ */
|
||||||
|
index_in_top_level = talloc(ldb_kv->idxptr, struct dn_list);
|
||||||
|
if (index_in_top_level == NULL) {
|
||||||
|
ldb_kv->idxptr->error = LDB_ERR_OPERATIONS_ERROR;
|
||||||
|
--
|
||||||
|
2.46.0
|
||||||
|
|
||||||
|
|
||||||
|
From 70d8b1b2f87cbb16b671d334e46244ba001fbd31 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Douglas Bagnall <douglas.bagnall@catalyst.net.nz>
|
||||||
|
Date: Mon, 22 Jul 2024 22:22:15 +1200
|
||||||
|
Subject: [PATCH 2/2] ldb:kv_index: realloc away old dn list
|
||||||
|
|
||||||
|
We can't just free it, because has the GUID index list as a child, and
|
||||||
|
these are shared by the new dn list (from the subtransaction we are
|
||||||
|
committing). But if the dn list is long and the main transaction is
|
||||||
|
long-lived, we can save a lot of memory by turning this dn list into
|
||||||
|
an almost empty node in the talloc tree. This returns us to roughly
|
||||||
|
the situation we had prior to the last commit.
|
||||||
|
|
||||||
|
For example, with the repro.sh script on bug 15590 in indexes mode
|
||||||
|
with 10000 rules, The last 3 commits use this much memory at the end
|
||||||
|
of an unusually large transaction:
|
||||||
|
|
||||||
|
full talloc report on 'struct ldb_context' (total 4012222 bytes in 90058 blocks)
|
||||||
|
full talloc report on 'struct ldb_context' (total 2405482219 bytes in 90058 blocks)
|
||||||
|
full talloc report on 'struct ldb_context' (total 4282195 bytes in 90058 blocks)
|
||||||
|
|
||||||
|
That is, the last commit increased usage 500 fold, and this commit
|
||||||
|
brings it back to normal.
|
||||||
|
|
||||||
|
BUG: https://bugzilla.samba.org/show_bug.cgi?id=15590
|
||||||
|
|
||||||
|
Signed-off-by: Douglas Bagnall <douglas.bagnall@catalyst.net.nz>
|
||||||
|
Reviewed-by: Stefan Metzmacher <metze@samba.org>
|
||||||
|
(cherry picked from commit 1bf9ede94f0a6b41fb18e880e59a8e390f8c21d3)
|
||||||
|
---
|
||||||
|
lib/ldb/ldb_key_value/ldb_kv_index.c | 6 +++++-
|
||||||
|
1 file changed, 5 insertions(+), 1 deletion(-)
|
||||||
|
|
||||||
|
diff --git a/lib/ldb/ldb_key_value/ldb_kv_index.c b/lib/ldb/ldb_key_value/ldb_kv_index.c
|
||||||
|
index fed1033f492..11bdf00dc08 100644
|
||||||
|
--- a/lib/ldb/ldb_key_value/ldb_kv_index.c
|
||||||
|
+++ b/lib/ldb/ldb_key_value/ldb_kv_index.c
|
||||||
|
@@ -3919,8 +3919,12 @@ static int ldb_kv_sub_transaction_traverse(
|
||||||
|
*
|
||||||
|
* So we don't free the index_in_top_level dn list yet,
|
||||||
|
* because we are (probably) borrowing most of its
|
||||||
|
- * children.
|
||||||
|
+ * children. But we can save memory by discarding the
|
||||||
|
+ * values and keeping it as an almost empty talloc
|
||||||
|
+ * node.
|
||||||
|
*/
|
||||||
|
+ talloc_realloc(index_in_top_level,
|
||||||
|
+ index_in_top_level->dn, struct ldb_val *, 1);
|
||||||
|
index_in_top_level->dn
|
||||||
|
= talloc_steal(index_in_top_level,
|
||||||
|
index_in_subtransaction->dn);
|
||||||
|
--
|
||||||
|
2.46.0
|
||||||
|
|
Loading…
Reference in new issue