mirror of
https://github.com/samba-team/samba.git
synced 2025-01-08 21:18:16 +03:00
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 db32a0e5ea
)
This commit is contained in:
parent
3f199828e1
commit
7aaf3f5868
@ -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):
|
||||
@ -195,6 +196,8 @@ class dbcheck(object):
|
||||
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
|
||||
@ -207,6 +210,8 @@ class dbcheck(object):
|
||||
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
|
||||
@ -224,6 +229,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
|
||||
|
@ -180,6 +180,15 @@ check_expected_before_values() {
|
||||
return 0
|
||||
}
|
||||
|
||||
# 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 $@
|
||||
@ -300,6 +309,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
|
||||
|
Loading…
Reference in New Issue
Block a user