Currently there is a lot of duplication of code to initialise and change the state of internal services as the state of replication changes. Just a few examples of this are the ShardServerCatalogCacheLoader, ClusterIdentityLoader and the Balancer.
Instead of having everything in the ReplicationCoordinatorExternalState, this ticket proposes to have a global registry of replication-aware services (where global means for a single MongoD process), on which developers can register their service implementations. The service implementations will override a strict set of virtual functions corresponding to the state transitions of the replica set. These state transitions will have pre-defined rules of what locks are held, what can be done under them (for example no blocking I/O during step-down), etc.
The interface of the registry should be similar to ServiceContext::ConstructorActionRegisterer so that services are automatically registered as the node starts-up.
As part of this ticket, at least one service (perhaps the Sharding Balancer) should be converted to use this framework.