summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndreas Heck <aheck@gmx.de>2013-05-22 17:23:37 +0200
committerDan Pasette <dan@10gen.com>2013-08-01 23:43:32 -0400
commite1656eda9f044dab3207703994d13c5de91e9c71 (patch)
tree8f9b73fa8c7ff53dfe9a3dfc0522fabe59e7cf33
parent9a7944042ca58ed776a501cd02910bc384ce4a6c (diff)
downloadmongo-e1656eda9f044dab3207703994d13c5de91e9c71.tar.gz
SERVER-9481 Fixes fluctuating between ROLLBACK and SECONDARY when ROLLBACK is impossible
Only leave ROLLBACK when successful and go to FATAL when ROLLBACK is impossible because we are not willing to rollback so much data Signed-off-by: Matt Dannenberg <matt.dannenberg@10gen.com>
-rw-r--r--src/mongo/db/repl/rs_rollback.cpp12
-rw-r--r--src/mongo/db/repl/rs_sync.cpp5
2 files changed, 12 insertions, 5 deletions
diff --git a/src/mongo/db/repl/rs_rollback.cpp b/src/mongo/db/repl/rs_rollback.cpp
index 8c8e89c20c6..a94e4603f60 100644
--- a/src/mongo/db/repl/rs_rollback.cpp
+++ b/src/mongo/db/repl/rs_rollback.cpp
@@ -68,7 +68,12 @@ namespace mongo {
class rsfatal : public std::exception {
public:
- virtual const char* what() const throw() { return "replica set fatal exception"; }
+ rsfatal(const char* m = "replica set fatal exception") {
+ msg = m;
+ }
+ virtual const char* what() const throw() { return msg; }
+ private:
+ const char *msg;
};
struct DocID {
@@ -230,7 +235,7 @@ namespace mongo {
log() << "replSet info rollback diff in end of log times: " << diff << " seconds" << rsLog;
if( diff > 1800 ) {
log() << "replSet rollback too long a time period for a rollback." << rsLog;
- throw "error not willing to roll back more than 30 minutes of data";
+ throw rsfatal("rollback error: not willing to roll back more than 30 minutes of data");
}
}
@@ -641,7 +646,8 @@ namespace mongo {
sethbmsg(string("rollback 2 error ") + p);
return 10;
}
- catch( rsfatal& ) {
+ catch( rsfatal& e ) {
+ sethbmsg(string(e.what()));
_fatal();
return 2;
}
diff --git a/src/mongo/db/repl/rs_sync.cpp b/src/mongo/db/repl/rs_sync.cpp
index f1c531b1c7d..5ea66deef5b 100644
--- a/src/mongo/db/repl/rs_sync.cpp
+++ b/src/mongo/db/repl/rs_sync.cpp
@@ -587,8 +587,9 @@ namespace replset {
lock rsLock( this );
Lock::GlobalWrite writeLock;
- // make sure we're not primary, secondary, or fatal already
- if (box.getState().primary() || box.getState().secondary() || box.getState().fatal()) {
+ // make sure we're not primary, secondary, rollback, or fatal already
+ if (box.getState().primary() || box.getState().secondary() ||
+ box.getState().rollback() || box.getState().fatal()) {
return false;
}