summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDianna Hohensee <dianna.hohensee@10gen.com>2016-02-05 16:31:21 -0500
committerDianna Hohensee <dianna.hohensee@10gen.com>2016-02-08 09:21:42 -0500
commita6903e29adf6a674711a4cbcd8f4cf3b9bd66432 (patch)
treed2f4f1b5773bd35059de089362446a8532218818
parent183a1d8af1d1d3d256732606609bfec49ae92dc4 (diff)
downloadmongo-a6903e29adf6a674711a4cbcd8f4cf3b9bd66432.tar.gz
SERVER-22498 fix migration session id multiversion failure
-rw-r--r--src/mongo/db/s/migration_session_id.cpp4
-rw-r--r--src/mongo/db/s/migration_session_id.h2
-rw-r--r--src/mongo/db/s/migration_source_manager.cpp11
3 files changed, 14 insertions, 3 deletions
diff --git a/src/mongo/db/s/migration_session_id.cpp b/src/mongo/db/s/migration_session_id.cpp
index 25a0bea7aeb..0e2234efdd4 100644
--- a/src/mongo/db/s/migration_session_id.cpp
+++ b/src/mongo/db/s/migration_session_id.cpp
@@ -92,4 +92,8 @@ std::string MigrationSessionId::toString() const {
return (_sessionId ? *_sessionId : "");
}
+bool MigrationSessionId::isEmpty() const {
+ return !_sessionId;
+}
+
} // namespace mongo
diff --git a/src/mongo/db/s/migration_session_id.h b/src/mongo/db/s/migration_session_id.h
index dbfde922c88..a16733e1dbe 100644
--- a/src/mongo/db/s/migration_session_id.h
+++ b/src/mongo/db/s/migration_session_id.h
@@ -73,6 +73,8 @@ public:
std::string toString() const;
+ bool isEmpty() const;
+
private:
MigrationSessionId();
explicit MigrationSessionId(std::string sessionId);
diff --git a/src/mongo/db/s/migration_source_manager.cpp b/src/mongo/db/s/migration_source_manager.cpp
index 642bcc6cf1f..043d72a9644 100644
--- a/src/mongo/db/s/migration_source_manager.cpp
+++ b/src/mongo/db/s/migration_source_manager.cpp
@@ -326,7 +326,10 @@ bool MigrationSourceManager::transferMods(OperationContext* txn,
return false;
}
- if (!_sessionId->matches(sessionId)) {
+ // TODO after 3.4 release, !sessionId.isEmpty() can be removed: versions >= 3.2 will
+ // all have sessionId implemented. (two more instances below).
+ // A mongod version < v3.2 will not have sessionId, in which case it is empty and ignored.
+ if (!sessionId.isEmpty() && !_sessionId->matches(sessionId)) {
errmsg = str::stream() << "requested migration session id " << sessionId.toString()
<< " does not match active session id "
<< _sessionId->toString();
@@ -482,7 +485,8 @@ bool MigrationSourceManager::clone(OperationContext* txn,
return false;
}
- if (!_sessionId->matches(sessionId)) {
+ // A mongod version < v3.2 will not have sessionId, in which case it is empty and ignored.
+ if (!sessionId.isEmpty() && !_sessionId->matches(sessionId)) {
errmsg = str::stream() << "requested migration session id " << sessionId.toString()
<< " does not match active session id "
<< _sessionId->toString();
@@ -512,7 +516,8 @@ bool MigrationSourceManager::clone(OperationContext* txn,
return false;
}
- if (!_sessionId->matches(sessionId)) {
+ // A mongod version < v3.2 will not have sessionId, in which case it is empty and ignored.
+ if (!sessionId.isEmpty() && !_sessionId->matches(sessionId)) {
errmsg = str::stream() << "migration session id changed from " << sessionId.toString()
<< " to " << _sessionId->toString()
<< " while initial clone was active";