From: Arvin Schnell Date: Tue, 3 May 2011 13:17:35 +0000 (+0200) Subject: - added callbacks for rollback errors X-Git-Tag: v0.1.3~393 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=8df0aa98cddf0f22c1b040b089cb97500c53e9fd;p=thirdparty%2Fsnapper.git - added callbacks for rollback errors --- diff --git a/snapper/File.cc b/snapper/File.cc index 0f2e780e..9df7e963 100644 --- a/snapper/File.cc +++ b/snapper/File.cc @@ -386,15 +386,30 @@ namespace snapper switch (fs.st_mode & S_IFMT) { case S_IFDIR: { - rmdir(getAbsolutePath(LOC_SYSTEM).c_str()); + if (rmdir(getAbsolutePath(LOC_SYSTEM).c_str()) != 0) + { + y2err("rmdir failed for " << getAbsolutePath(LOC_SYSTEM)); + if (getSnapper()->getRollbackCallback()) + getSnapper()->getRollbackCallback()->deleteError(name); + } } break; case S_IFREG: { - unlink(getAbsolutePath(LOC_SYSTEM).c_str()); + if (unlink(getAbsolutePath(LOC_SYSTEM).c_str()) != 0) + { + y2err("unlink failed for " << getAbsolutePath(LOC_SYSTEM)); + if (getSnapper()->getRollbackCallback()) + getSnapper()->getRollbackCallback()->deleteError(name); + } } break; case S_IFLNK: { - unlink(getAbsolutePath(LOC_SYSTEM).c_str()); + if (unlink(getAbsolutePath(LOC_SYSTEM).c_str()) != 0) + { + y2err("unlink failed for " << getAbsolutePath(LOC_SYSTEM)); + if (getSnapper()->getRollbackCallback()) + getSnapper()->getRollbackCallback()->deleteError(name); + } } break; } } @@ -457,12 +472,22 @@ namespace snapper if (getPreToPostStatus() & PERMISSIONS) { - chmod(getAbsolutePath(LOC_SYSTEM).c_str(), fs.st_mode); + if (chmod(getAbsolutePath(LOC_SYSTEM).c_str(), fs.st_mode) != 0) + { + y2err("chmod failed for " << getAbsolutePath(LOC_SYSTEM)); + if (getSnapper()->getRollbackCallback()) + getSnapper()->getRollbackCallback()->modifyError(name); + } } if (getPreToPostStatus() & (USER | GROUP)) { - lchown(getAbsolutePath(LOC_SYSTEM).c_str(), fs.st_uid, fs.st_gid); + if (lchown(getAbsolutePath(LOC_SYSTEM).c_str(), fs.st_uid, fs.st_gid) != 0) + { + y2err("lchown failed for " << getAbsolutePath(LOC_SYSTEM)); + if (getSnapper()->getRollbackCallback()) + getSnapper()->getRollbackCallback()->modifyError(name); + } } } diff --git a/snapper/Snapper.h b/snapper/Snapper.h index d2b9db4b..60a731b8 100644 --- a/snapper/Snapper.h +++ b/snapper/Snapper.h @@ -58,6 +58,10 @@ namespace snapper virtual void createInfo(const string& name) = 0; virtual void modifyInfo(const string& name) = 0; virtual void deleteInfo(const string& name) = 0; + + virtual void createError(const string& name) = 0; + virtual void modifyError(const string& name) = 0; + virtual void deleteError(const string& name) = 0; }; diff --git a/testsuite-real/.gitignore b/testsuite-real/.gitignore index b9089f27..f8693eac 100644 --- a/testsuite-real/.gitignore +++ b/testsuite-real/.gitignore @@ -4,3 +4,4 @@ permissions1 permissions2 owner1 owner2 +error1 diff --git a/testsuite-real/Makefile.am b/testsuite-real/Makefile.am index 5f7837bb..46f12ccd 100644 --- a/testsuite-real/Makefile.am +++ b/testsuite-real/Makefile.am @@ -10,7 +10,7 @@ LDADD = ../snapper/libsnapper.la noinst_SCRIPTS = run-all -noinst_PROGRAMS = simple1 permissions1 permissions2 owner1 owner2 +noinst_PROGRAMS = simple1 permissions1 permissions2 owner1 owner2 error1 simple1_SOURCES = simple1.cc common.h common.cc @@ -20,5 +20,7 @@ permissions2_SOURCES = permissions2.cc common.h common.cc owner1_SOURCES = owner1.cc common.h common.cc owner2_SOURCES = owner2.cc common.h common.cc +error1_SOURCES = error1.cc common.h common.cc + EXTRA_DIST = $(noinst_SCRIPTS) diff --git a/testsuite-real/common.cc b/testsuite-real/common.cc index 309fb34e..4faec8b5 100644 --- a/testsuite-real/common.cc +++ b/testsuite-real/common.cc @@ -27,6 +27,8 @@ Snapper* sh = NULL; Snapshots::iterator first; Snapshots::iterator second; +unsigned int numCreateErrors, numModifyErrors, numDeleteErrors; + struct CompareCallbackImpl : public CompareCallback { @@ -42,9 +44,13 @@ struct RollbackCallbackImpl : public RollbackCallback void start() { cout << "running rollback..." << endl; } void stop() { cout << "rollback done" << endl; } - void createInfo(const string& name) { cout << "create " << name << endl; } - void modifyInfo(const string& name) { cout << "modify " << name << endl; } - void deleteInfo(const string& name) { cout << "delete " << name << endl; } + void createInfo(const string& name) { cout << "creating " << name << endl; } + void modifyInfo(const string& name) { cout << "modifying " << name << endl; } + void deleteInfo(const string& name) { cout << "deleting " << name << endl; } + + void createError(const string& name) { cout << "failed to create " << name << endl; numCreateErrors++; } + void modifyError(const string& name) { cout << "failed to modify " << name << endl; numModifyErrors++; } + void deleteError(const string& name) { cout << "failed to delete " << name << endl; numDeleteErrors++; } }; RollbackCallbackImpl rollback_callback_impl; @@ -101,6 +107,8 @@ check_rollback_statistics(unsigned int numCreate, unsigned int numModify, unsign void rollback() { + numCreateErrors = numModifyErrors = numDeleteErrors = 0; + Comparison comparison(sh, first, second); Files& files = comparison.getFiles(); @@ -111,6 +119,15 @@ rollback() } +void +check_rollback_errors(unsigned int numCreate, unsigned int numModify, unsigned int numDelete) +{ + check_equal(numCreateErrors, numCreate); + check_equal(numModifyErrors, numModify); + check_equal(numDeleteErrors, numDelete); +} + + void check_first() { diff --git a/testsuite-real/common.h b/testsuite-real/common.h index c0679812..9983ceda 100644 --- a/testsuite-real/common.h +++ b/testsuite-real/common.h @@ -49,6 +49,8 @@ void second_snapshot(); void check_rollback_statistics(unsigned int numCreate, unsigned int numModify, unsigned int numDelete); void rollback(); +void check_rollback_errors(unsigned int numCreate, unsigned int numModify, + unsigned int numDelete); void check_first(); void run_command(const char* command); diff --git a/testsuite-real/error1.cc b/testsuite-real/error1.cc new file mode 100644 index 00000000..4a7a4def --- /dev/null +++ b/testsuite-real/error1.cc @@ -0,0 +1,30 @@ + +#include +#include + +#include "common.h" + +using namespace std; + + +int +main() +{ + setup(); + + first_snapshot(); + + run_command("mkdir not-empty"); + + second_snapshot(); + + run_command("touch not-empty/bad"); + + check_rollback_statistics(0, 0, 1); + + rollback(); + + check_rollback_errors(0, 0, 1); + + exit(EXIT_SUCCESS); +} diff --git a/testsuite-real/owner1.cc b/testsuite-real/owner1.cc index cd967827..fe362ab7 100644 --- a/testsuite-real/owner1.cc +++ b/testsuite-real/owner1.cc @@ -33,6 +33,8 @@ main() rollback(); + check_rollback_errors(0, 0, 0); + check_first(); exit(EXIT_SUCCESS); diff --git a/testsuite-real/owner2.cc b/testsuite-real/owner2.cc index d8d41244..65b25d2f 100644 --- a/testsuite-real/owner2.cc +++ b/testsuite-real/owner2.cc @@ -28,6 +28,8 @@ main() rollback(); + check_rollback_errors(0, 0, 0); + check_first(); exit(EXIT_SUCCESS); diff --git a/testsuite-real/permissions1.cc b/testsuite-real/permissions1.cc index a88cbd85..c392dc88 100644 --- a/testsuite-real/permissions1.cc +++ b/testsuite-real/permissions1.cc @@ -34,6 +34,8 @@ main() rollback(); + check_rollback_errors(0, 0, 0); + check_first(); exit(EXIT_SUCCESS); diff --git a/testsuite-real/permissions2.cc b/testsuite-real/permissions2.cc index c95a7805..da611249 100644 --- a/testsuite-real/permissions2.cc +++ b/testsuite-real/permissions2.cc @@ -28,6 +28,8 @@ main() rollback(); + check_rollback_errors(0, 0, 0); + check_first(); exit(EXIT_SUCCESS); diff --git a/testsuite-real/run-all b/testsuite-real/run-all index 8b516aa6..5df763ce 100755 --- a/testsuite-real/run-all +++ b/testsuite-real/run-all @@ -28,3 +28,5 @@ run permissions2 run owner1 run owner2 +run error1 + diff --git a/testsuite-real/simple1.cc b/testsuite-real/simple1.cc index e9087bc0..21abcbf2 100644 --- a/testsuite-real/simple1.cc +++ b/testsuite-real/simple1.cc @@ -32,6 +32,8 @@ main() rollback(); + check_rollback_errors(0, 0, 0); + check_first(); exit(EXIT_SUCCESS); diff --git a/tools/snapper.cc b/tools/snapper.cc index 7de47e11..567d2122 100644 --- a/tools/snapper.cc +++ b/tools/snapper.cc @@ -706,12 +706,16 @@ CompareCallbackImpl compare_callback_impl; struct RollbackCallbackImpl : public RollbackCallback { - void start() { if (!verbose) cout << "running rollback..." << flush; } - void stop() { if (!verbose) cout << " done" << endl; } + void start() { cout << "running rollback..." << endl; } + void stop() { cout << "rollback done" << endl; } - void createInfo(const string& name) { if (verbose) cout << "create " << name << endl; } - void modifyInfo(const string& name) { if (verbose) cout << "modify " << name << endl; } - void deleteInfo(const string& name) { if (verbose) cout << "delete " << name << endl; } + void createInfo(const string& name) { if (verbose) cout << "creating " << name << endl; } + void modifyInfo(const string& name) { if (verbose) cout << "modifying " << name << endl; } + void deleteInfo(const string& name) { if (verbose) cout << "deleting " << name << endl; } + + void createError(const string& name) { cerr << "failed to create " << name << endl; } + void modifyError(const string& name) { cerr << "failed to modify " << name << endl; } + void deleteError(const string& name) { cerr << "failed to delete " << name << endl; } }; RollbackCallbackImpl rollback_callback_impl;