SERVER-49887 we introduced the requireApiVersion parameter which can be enabled at startup with --requireApiVersion, or at runtime with "setParameter". A server with this parameter enabled rejects all commands that lack an "apiVersion" field. This is intended to force external applications to configure their API version.
xuerui.fa and I realized, while discussing
SERVER-53555, that shard or config servers must require apiVersion. Connections internal to the sharded cluster should be marked as "internal client" and be excused from the requireApiVersion rule (once we fix SERVER-53555); however, it seems a likely source of obscure bugs if some connections aren't marked internal and all their commands are rejected.
Let's update mongod so it refuses to start with -
requireApiVersion plus either --shardSvr or --configSvr. And at runtime, if mongod was started with -shardSvr or --configSvr (but not --requireApiVersion), then "setParameter" should refuse to enable requireApiVersion. Let's document that config servers and shards shouldn't be started with requireApiVersion. The intention of requireApiVersion is enforce a rule on external clients, and config servers and shards only talk with internal clients, so they shouldn't be started with requireApiVersion.