summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndrew Bartlett <abartlet@samba.org>2016-08-26 15:53:19 +1200
committerStefan Metzmacher <metze@samba.org>2016-09-06 08:22:17 +0200
commit0ccfa212e431238b6ca1623d4280041872d5126d (patch)
tree0cc849865fe3c475114180a42b4db72675c207bd
parentb005b5b2991583cc9a5d7008a0c71e4933fb9ffc (diff)
downloadsamba-0ccfa212e431238b6ca1623d4280041872d5126d.tar.gz
dbcheck: Abandon dbcheck if we get an error during a transaction
Otherwise, anything that the transaction has already done to the DB will be left in the DB even despite the failure. For example, if a fix wrote to the DB, but then failed a post-write check, then the fix will not be unrolled. This is because we do not have nested transactions in TDB. BUG: https://bugzilla.samba.org/show_bug.cgi?id=12178 Signed-off-by: Andrew Bartlett <abartlet@samba.org> Reviewed-by: Stefan Metzmacher <metze@samba.org> Autobuild-User(master): Stefan Metzmacher <metze@samba.org> Autobuild-Date(master): Mon Aug 29 12:46:21 CEST 2016 on sn-devel-144 (cherry picked from commit db32a0e5ea8f652857e45480cc31ecb1ef884c1a)
-rw-r--r--python/samba/dbchecker.py7
-rwxr-xr-xtestprogs/blackbox/dbcheck-oldrelease.sh10
2 files changed, 17 insertions, 0 deletions
diff --git a/python/samba/dbchecker.py b/python/samba/dbchecker.py
index e904b4afb39..9b0784bb5f2 100644
--- a/python/samba/dbchecker.py
+++ b/python/samba/dbchecker.py
@@ -31,6 +31,7 @@ from samba.common import dsdb_Dn
from samba.dcerpc import security
from samba.descriptor import get_wellknown_sds, get_diff_sds
from samba.auth import system_session, admin_session
+from samba.netcmd import CommandError
class dbcheck(object):
@@ -324,6 +325,8 @@ systemFlags: -1946157056%s""" % (dn, guid_suffix),
controls = controls + ["local_oid:%s:0" % dsdb.DSDB_CONTROL_DBCHECK]
self.samdb.delete(dn, controls=controls)
except Exception, err:
+ if self.in_transaction:
+ raise CommandError("%s : %s" % (msg, err))
self.report("%s : %s" % (msg, err))
return False
return True
@@ -336,6 +339,8 @@ systemFlags: -1946157056%s""" % (dn, guid_suffix),
controls = controls + ["local_oid:%s:0" % dsdb.DSDB_CONTROL_DBCHECK]
self.samdb.modify(m, controls=controls, validate=validate)
except Exception, err:
+ if self.in_transaction:
+ raise CommandError("%s : %s" % (msg, err))
self.report("%s : %s" % (msg, err))
return False
return True
@@ -353,6 +358,8 @@ newSuperior: %s""" % (str(from_dn), str(to_rdn), str(to_base)))
controls = controls + ["local_oid:%s:0" % dsdb.DSDB_CONTROL_DBCHECK]
self.samdb.rename(from_dn, to_dn, controls=controls)
except Exception, err:
+ if self.in_transaction:
+ raise CommandError("%s : %s" % (msg, err))
self.report("%s : %s" % (msg, err))
return False
return True
diff --git a/testprogs/blackbox/dbcheck-oldrelease.sh b/testprogs/blackbox/dbcheck-oldrelease.sh
index 1efea67b56c..dd176cf6cb8 100755
--- a/testprogs/blackbox/dbcheck-oldrelease.sh
+++ b/testprogs/blackbox/dbcheck-oldrelease.sh
@@ -186,6 +186,15 @@ check_expected_before_values() {
}
# This should 'fail', because it returns the number of modified records
+dbcheck_objectclass() {
+ if [ x$RELEASE = x"release-4-1-6-partial-object" ]; then
+ $PYTHON $BINDIR/samba-tool dbcheck --cross-ncs --fix --yes -H tdb://$PREFIX_ABS/${RELEASE}/private/sam.ldb --attrs=objectclass $@
+ else
+ return 1
+ fi
+}
+
+# This should 'fail', because it returns the number of modified records
dbcheck() {
$PYTHON $BINDIR/samba-tool dbcheck --cross-ncs --fix --yes -H tdb://$PREFIX_ABS/${RELEASE}/private/sam.ldb $@
}
@@ -363,6 +372,7 @@ if [ -d $release_dir ]; then
testit "reindex" reindex
testit "current_version_mod" do_current_version_mod
testit "check_expected_before_values" check_expected_before_values
+ testit_expect_failure "dbcheck_objectclass" dbcheck_objectclass
testit_expect_failure "dbcheck" dbcheck
testit "check_expected_after_values" check_expected_after_values
testit "check_forced_duplicate_values" check_forced_duplicate_values