1
0
mirror of https://github.com/samba-team/samba.git synced 2025-01-27 14:04:05 +03:00

dbcheck: check_object() caches of lower case attr names

The construct `'name' in map(str.lower, attrs)` is doubly inefficient,
because not only is it running the lower() function too often, it is
searching linearly in a temporary iterator for membership.

So we make a set, and use that.

Signed-off-by: Douglas Bagnall <douglas.bagnall@catalyst.net.nz>
Reviewed-by: Noel Power <npower@samba.org>
This commit is contained in:
Douglas Bagnall 2020-12-04 12:57:57 +13:00 committed by Noel Power
parent 25a94fa474
commit 6b4ff45805

View File

@ -2226,18 +2226,22 @@ newSuperior: %s""" % (str(from_dn), str(to_rdn), str(to_base)))
else:
# make a local copy to modify
attrs = list(attrs)
if "dn" in map(str.lower, attrs):
lc_attrs = set(x.lower() for x in attrs)
if ("dn" in lc_attrs or
"distinguishedname" in lc_attrs or
dn.get_rdn_name().lower() in lc_attrs):
attrs.append("name")
if "distinguishedname" in map(str.lower, attrs):
attrs.append("name")
if str(dn.get_rdn_name()).lower() in map(str.lower, attrs):
attrs.append("name")
if 'name' in map(str.lower, attrs):
lc_attrs.add('name')
if 'name' in lc_attrs:
attrs.append(dn.get_rdn_name())
attrs.append("isDeleted")
attrs.append("systemFlags")
need_replPropertyMetaData = False
if '*' in attrs:
if '*' in lc_attrs:
need_replPropertyMetaData = True
else:
for a in attrs:
@ -2252,6 +2256,9 @@ newSuperior: %s""" % (str(from_dn), str(to_rdn), str(to_base)))
attrs.append("replPropertyMetaData")
attrs.append("objectGUID")
# recalculate lc_attrs, becuase we might have added some
lc_attrs = set(x.lower() for x in attrs)
try:
sd_flags = 0
sd_flags |= security.SECINFO_OWNER
@ -2517,11 +2524,11 @@ newSuperior: %s""" % (str(from_dn), str(to_rdn), str(to_base)))
error_count += 1
self.err_wrong_instancetype(obj, calculated_instancetype)
if not got_objectclass and ("*" in attrs or "objectclass" in map(str.lower, attrs)):
if not got_objectclass and ("*" in lc_attrs or "objectclass" in lc_attrs):
error_count += 1
self.err_missing_objectclass(dn)
if ("*" in attrs or "name" in map(str.lower, attrs)):
if ("*" in lc_attrs or "name" in lc_attrs):
if name_val is None:
error_count += 1
self.report("ERROR: Not fixing missing 'name' on '%s'" % (str(obj.dn)))
@ -2583,7 +2590,7 @@ newSuperior: %s""" % (str(from_dn), str(to_rdn), str(to_base)))
self.fix_metadata(obj, att)
if self.is_fsmo_role(dn):
if "fSMORoleOwner" not in obj and ("*" in attrs or "fsmoroleowner" in map(str.lower, attrs)):
if "fSMORoleOwner" not in obj and ("*" in lc_attrs or "fsmoroleowner" in lc_attrs):
self.err_no_fsmoRoleOwner(obj)
error_count += 1
@ -2604,7 +2611,7 @@ newSuperior: %s""" % (str(from_dn), str(to_rdn), str(to_base)))
else:
raise
if dn in self.deleted_objects_containers and '*' in attrs:
if dn in self.deleted_objects_containers and '*' in lc_attrs:
if self.is_deleted_deleted_objects(obj):
self.err_deleted_deleted_objects(obj)
error_count += 1
@ -2632,7 +2639,7 @@ newSuperior: %s""" % (str(from_dn), str(to_rdn), str(to_base)))
if dn == self.server_ref_dn:
# Check we have a valid RID Set
if "*" in attrs or "ridsetreferences" in map(str.lower, attrs):
if "*" in lc_attrs or "ridsetreferences" in lc_attrs:
if "rIDSetReferences" not in obj:
# NO RID SET reference
# We are RID master, allocate it.