[SERVER-30249] Mongos does not attach operationTime to the results if the keys are not available Created: 20/Jul/17  Updated: 30/Oct/23  Resolved: 31/Jul/17

Status: Closed
Project: Core Server
Component/s: Sharding
Affects Version/s: None
Fix Version/s: 3.5.11

Type: Bug Priority: Major - P3
Reporter: Misha Tyulenev Assignee: Misha Tyulenev
Resolution: Fixed Votes: 0
Labels: PM-221
Remaining Estimate: Not Specified
Time Spent: Not Specified
Original Estimate: Not Specified

Issue Links:
Documented
is documented by DOCS-10654 Docs for SERVER-30249: Mongos does no... Closed
Backwards Compatibility: Fully Compatible
Operating System: ALL
Sprint: Sharding 2017-07-31, Sharding 2017-08-21
Participants:

 Description   

Currently mongos does not return operationTime until the signing keys become available. This prevents sessions to be causally consistent as the keys are not available instantaneously.

Note:
returning just operationTime even if there are no keys as it does not require keys introduces issues related to a multi-shard execution without gossiping logical time. Its ok for a single RS as it does not need to gossip the clusterTime as its always matches the oplog time

Suggested implementation will block in mongos initialization until keys are available if its accessing a sharded cluster

1.
in initializeSharding: https://github.com/mongodb/mongo/blob/r3.5.10/src/mongo/s/server.cpp#L190
add a blocking call until keys are available:

status = waitForSigningKeys(opCtx);
    if (!status.isOK()) {
        return status;
    }

2.
implement waitForSigningKeys as (very similar to waitForShardRegistryReload)

Status waitForSigningKeys(OperationContext* opCtx) {
    while (true) {
        auto stopStatus = opCtx->checkForInterruptNoAssert();
        if (!stopStatus.isOK()) {
            return stopStatus;
        }
 
        try {
           auto logicalTimeValidator = LogicalTimeValidator::get(opCtx)
           
            if (logicalTimeValidator->shouldGossipLogicalTime()) {
                return Status::OK();
            }
            sleepFor(kRetryInterval);
            continue;
        } catch (const DBException& ex) {
            Status status = ex.toStatus();
            warning()
                << "Error waiting for signing keys, sleeping for 2 seconds and trying again"
                << causedBy(status);
            sleepFor(kRetryInterval);
            continue;
        }
    }
}



 Comments   
Comment by Githook User [ 31/Jul/17 ]

Author:

{'email': 'misha@mongodb.com', 'username': 'mikety', 'name': 'Misha Tyulenev'}

Message: SERVER-30249 wait for the signing keys to be available in mongos at startup
Branch: master
https://github.com/mongodb/mongo/commit/c9638cd6bcb85f6f5371ca92226d37aecf3d045b

Generated at Thu Feb 08 04:23:09 UTC 2024 using Jira 9.7.1#970001-sha1:2222b88b221c4928ef0de3161136cc90c8356a66.