summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMark Benvenuto <mark.benvenuto@mongodb.com>2020-05-29 15:04:19 -0400
committerEvergreen Agent <no-reply@evergreen.mongodb.com>2020-06-02 16:49:35 +0000
commit2b79d62349c657fed185af00ba5d93a1032feb69 (patch)
tree3470e53a6f234aa08d61a2d065c0c4611dce9d1e
parent4184f70adbfac60d6d045d9a0df46c11c3033768 (diff)
downloadmongo-2b79d62349c657fed185af00ba5d93a1032feb69.tar.gz
SERVER-48276 ReplSet Free Monitoring URLs inconsistent
(cherry picked from commit 4ec400290afe55c470cb14fbafb79e9f649d7cb1)
-rw-r--r--jstests/free_mon/free_mon_rs_register.js1
-rw-r--r--jstests/free_mon/free_mon_rs_resend.js1
-rw-r--r--jstests/free_mon/libs/free_mon.js19
-rw-r--r--jstests/free_mon/libs/mock_http_server.py8
-rw-r--r--src/mongo/db/free_mon/free_mon_controller.cpp2
-rw-r--r--src/mongo/db/free_mon/free_mon_message.h2
-rw-r--r--src/mongo/db/free_mon/free_mon_processor.cpp34
7 files changed, 50 insertions, 17 deletions
diff --git a/jstests/free_mon/free_mon_rs_register.js b/jstests/free_mon/free_mon_rs_register.js
index b08b2f85409..5c85dfe1c58 100644
--- a/jstests/free_mon/free_mon_rs_register.js
+++ b/jstests/free_mon/free_mon_rs_register.js
@@ -30,6 +30,7 @@ mock_web.waitRegisters(2);
WaitForRegistration(rst.getPrimary());
WaitForRegistration(rst.getSecondary());
+ValidateFreeMonReplicaSet(rst);
const last_register = mock_web.query("last_register");
print(tojson(last_register));
diff --git a/jstests/free_mon/free_mon_rs_resend.js b/jstests/free_mon/free_mon_rs_resend.js
index 9c87cb5bfcb..bdf7602c871 100644
--- a/jstests/free_mon/free_mon_rs_resend.js
+++ b/jstests/free_mon/free_mon_rs_resend.js
@@ -41,6 +41,7 @@ mock_web_sec.waitRegisters(1);
WaitForFreeMonServerStatusState(rst.getPrimary(), 'enabled');
WaitForFreeMonServerStatusState(rst.getSecondary(), 'enabled');
+ValidateFreeMonReplicaSet(rst);
mock_web.waitRegisters(2);
mock_web_sec.waitRegisters(2);
diff --git a/jstests/free_mon/libs/free_mon.js b/jstests/free_mon/libs/free_mon.js
index ee4eaff3ee0..1ff781cf0f1 100644
--- a/jstests/free_mon/libs/free_mon.js
+++ b/jstests/free_mon/libs/free_mon.js
@@ -308,3 +308,22 @@ function WaitForFreeMonServerStatusState(conn, state) {
"', actual: " + tojson(FreeMonGetServerStatus(conn)),
20 * 1000);
}
+
+/**
+ * Validate Free Monitoring Replica Set consistency
+ * WARNING: Not valid if secondary is started with enableFreeMonitoring since it registers before it
+ * joins the replica set.
+ *
+ * @param {object} rst
+ */
+function ValidateFreeMonReplicaSet(rst) {
+ 'use strict';
+
+ const primary_status = FreeMonGetStatus(rst.getPrimary());
+ const primary_url = primary_status.url;
+ const secondary_status = FreeMonGetStatus(rst.getSecondary());
+ const secondary_url = secondary_status.url;
+ assert.eq(primary_url,
+ secondary_url,
+ `DUMP ${tojson(primary_status)} == ${tojson(secondary_status)}`);
+}
diff --git a/jstests/free_mon/libs/mock_http_server.py b/jstests/free_mon/libs/mock_http_server.py
index c5609c8fe35..5245677b33d 100644
--- a/jstests/free_mon/libs/mock_http_server.py
+++ b/jstests/free_mon/libs/mock_http_server.py
@@ -125,15 +125,19 @@ class FreeMonHandler(http.server.BaseHTTPRequestHandler):
'reportingInterval': bson.int64.Int64(1),
})
else:
+ reg_id = 'mock123_' + str(stats.register_calls)
+ if 'id' in decoded_doc:
+ reg_id = decoded_doc['id']
+
data = bson.BSON.encode({
'version':
bson.int64.Int64(1),
'haltMetricsUploading':
False,
'id':
- 'mock123',
+ reg_id,
'informationalURL':
- 'http://www.example.com/123',
+ 'http://www.example.com/' + reg_id,
'message':
'Welcome to the Mock Free Monitoring Endpoint',
'reportingInterval':
diff --git a/src/mongo/db/free_mon/free_mon_controller.cpp b/src/mongo/db/free_mon/free_mon_controller.cpp
index a9de7ca4c49..02760410631 100644
--- a/src/mongo/db/free_mon/free_mon_controller.cpp
+++ b/src/mongo/db/free_mon/free_mon_controller.cpp
@@ -85,7 +85,7 @@ void FreeMonController::registerServerStartup(RegistrationType registrationType,
}
boost::optional<Status> FreeMonController::registerServerCommand(Milliseconds timeout) {
- auto msg = FreeMonRegisterCommandMessage::createNow(std::vector<std::string>());
+ auto msg = FreeMonRegisterCommandMessage::createNow({std::vector<std::string>(), boost::none});
_enqueue(msg);
if (timeout > Milliseconds::min()) {
diff --git a/src/mongo/db/free_mon/free_mon_message.h b/src/mongo/db/free_mon/free_mon_message.h
index 9b7fc83a05b..2f8bab042c6 100644
--- a/src/mongo/db/free_mon/free_mon_message.h
+++ b/src/mongo/db/free_mon/free_mon_message.h
@@ -342,7 +342,7 @@ struct FreeMonWaitablePayloadForMessage {
template <>
struct FreeMonWaitablePayloadForMessage<FreeMonMessageType::RegisterCommand> {
- using payload_type = std::vector<std::string>;
+ using payload_type = std::pair<std::vector<std::string>, boost::optional<std::string>>;
};
template <>
diff --git a/src/mongo/db/free_mon/free_mon_processor.cpp b/src/mongo/db/free_mon/free_mon_processor.cpp
index 8cb57bda42f..09fe3751340 100644
--- a/src/mongo/db/free_mon/free_mon_processor.cpp
+++ b/src/mongo/db/free_mon/free_mon_processor.cpp
@@ -327,7 +327,7 @@ void FreeMonProcessor::doServerRegister(
// If we are asked to register now, then kick off a registration request
const auto regType = msg->getPayload().first;
if (regType == RegistrationType::RegisterOnStart) {
- enqueue(FreeMonRegisterCommandMessage::createNow(msg->getPayload().second));
+ enqueue(FreeMonRegisterCommandMessage::createNow({msg->getPayload().second, boost::none}));
} else {
invariant((regType == RegistrationType::RegisterAfterOnTransitionToPrimary) ||
(regType == RegistrationType::RegisterAfterOnTransitionToPrimaryIfEnabled));
@@ -352,7 +352,8 @@ void FreeMonProcessor::doServerRegister(
// We are standalone or secondary, if we have a registration id, then send a
// registration notification, else wait for the user to register us.
if (state.get().getState() == StorageStateEnum::enabled) {
- enqueue(FreeMonRegisterCommandMessage::createNow(msg->getPayload().second));
+ enqueue(FreeMonRegisterCommandMessage::createNow(
+ {msg->getPayload().second, boost::none}));
}
}
@@ -415,22 +416,26 @@ void FreeMonProcessor::doCommandRegister(Client* client,
FreeMonRegistrationRequest req;
- auto regid = _state->getRegistrationId();
- if (!regid.empty()) {
- req.setId(regid);
+ if (msg->getPayload().second) {
+ req.setId(StringData(msg->getPayload().second.get()));
+ } else {
+ auto regid = _state->getRegistrationId();
+ if (!regid.empty()) {
+ req.setId(regid);
+ }
}
req.setVersion(kMaxProtocolVersion);
req.setLocalTime(client->getServiceContext()->getPreciseClockSource()->now());
- if (!msg->getPayload().empty()) {
+ if (!msg->getPayload().first.empty()) {
// Cache the tags for subsequent retries
- _tags = msg->getPayload();
+ _tags = msg->getPayload().first;
}
if (!_tags.empty()) {
- req.setTags(transformVector(msg->getPayload()));
+ req.setTags(transformVector(msg->getPayload().first));
}
// Collect the data
@@ -675,7 +680,7 @@ void FreeMonProcessor::doAsyncRegisterFail(
// Enqueue a register retry
enqueue(FreeMonRegisterCommandMessage::createWithDeadline(
- _tags, _registrationRetry->getNextDeadline(client)));
+ {_tags, boost::none}, _registrationRetry->getNextDeadline(client)));
}
void FreeMonProcessor::doCommandUnregister(
@@ -838,7 +843,7 @@ void FreeMonProcessor::doAsyncMetricsComplete(
_metricsRetry->reset();
if (resp.getResendRegistration().is_initialized() && resp.getResendRegistration()) {
- enqueue(FreeMonRegisterCommandMessage::createNow(_tags));
+ enqueue(FreeMonRegisterCommandMessage::createNow({_tags, boost::none}));
} else {
// Enqueue next metrics upload
enqueue(FreeMonMessage::createWithDeadline(FreeMonMessageType::MetricsSend,
@@ -894,13 +899,15 @@ void FreeMonProcessor::getStatus(OperationContext* opCtx,
void FreeMonProcessor::doOnTransitionToPrimary(Client* client) {
if (_registerOnTransitionToPrimary == RegistrationType::RegisterAfterOnTransitionToPrimary) {
- enqueue(FreeMonRegisterCommandMessage::createNow(std::vector<std::string>()));
+ enqueue(
+ FreeMonRegisterCommandMessage::createNow({std::vector<std::string>(), boost::none}));
} else if (_registerOnTransitionToPrimary ==
RegistrationType::RegisterAfterOnTransitionToPrimaryIfEnabled) {
readState(client);
if (_state->getState() == StorageStateEnum::enabled) {
- enqueue(FreeMonRegisterCommandMessage::createNow(std::vector<std::string>()));
+ enqueue(FreeMonRegisterCommandMessage::createNow(
+ {std::vector<std::string>(), boost::none}));
}
}
@@ -916,7 +923,8 @@ void FreeMonProcessor::processInMemoryStateChange(const FreeMonStorageState& ori
newState.getState() == StorageStateEnum::enabled) {
// Secondary needs to start registration
- enqueue(FreeMonRegisterCommandMessage::createNow(std::vector<std::string>()));
+ enqueue(FreeMonRegisterCommandMessage::createNow(
+ {std::vector<std::string>(), newState.getRegistrationId().toString()}));
}
}
}