Don't allow changing desriptor if knob is set

This commit is contained in:
Dan Lambright 2021-04-22 13:01:21 -04:00
parent 60d27d05d8
commit 742c22cef2
6 changed files with 53 additions and 12 deletions

View File

@ -32,13 +32,15 @@ const int MAX_CLUSTER_FILE_BYTES = 60000;
constexpr UID WLTOKEN_CLIENTLEADERREG_GETLEADER(-1, 2);
constexpr UID WLTOKEN_CLIENTLEADERREG_OPENDATABASE(-1, 3);
constexpr UID WLTOKEN_CLIENTLEADERREG_DESCRIPTOR_MUTABLE(-1, 4);
constexpr UID WLTOKEN_PROTOCOL_INFO(-1, 10);
constexpr UID WLTOKEN_PROTOCOL_INFO(-1, 11);
// The coordinator interface as exposed to clients
struct ClientLeaderRegInterface {
RequestStream<struct GetLeaderRequest> getLeader;
RequestStream<struct OpenDatabaseCoordRequest> openDatabase;
RequestStream<struct CheckClusterNameMutability> checkClusterNameMutability;
ClientLeaderRegInterface() {}
ClientLeaderRegInterface(NetworkAddress remote);
@ -236,4 +238,28 @@ struct ProtocolInfoRequest {
}
};
struct CheckClusterNameMutabilityReply {
constexpr static FileIdentifier file_identifier = 7784299;
CheckClusterNameMutabilityReply() = default;
explicit CheckClusterNameMutabilityReply(bool value) : value(value) {}
bool value;
template <class Ar>
void serialize(Ar& ar) {
serializer(ar, value);
}
};
struct CheckClusterNameMutability {
constexpr static FileIdentifier file_identifier = 214729;
Key key;
ReplyPromise<CheckClusterNameMutabilityReply> reply;
explicit CheckClusterNameMutability(Key key) : key(key) {}
CheckClusterNameMutability(){}
template <class Ar>
void serialize(Ar& ar) {
serializer(ar, key, reply);
}
};
#endif

View File

@ -1105,6 +1105,7 @@ ACTOR Future<Optional<CoordinatorsResult>> changeQuorumChecker(Transaction* tr,
vector<Future<Optional<LeaderInfo>>> leaderServers;
ClientCoordinators coord(Reference<ClusterConnectionFile>(new ClusterConnectionFile(conn)));
leaderServers.reserve(coord.clientLeaderServers.size());
for (int i = 0; i < coord.clientLeaderServers.size(); i++)
leaderServers.push_back(retryBrokenPromise(coord.clientLeaderServers[i].getLeader,
@ -1188,14 +1189,20 @@ ACTOR Future<CoordinatorsResult> changeQuorum(Database cx, Reference<IQuorumChan
TEST(old.clusterKeyName() != conn.clusterKeyName()); // Quorum change with new name
TEST(old.clusterKeyName() == conn.clusterKeyName()); // Quorum change with unchanged name
vector<Future<Optional<LeaderInfo>>> leaderServers;
ClientCoordinators coord(Reference<ClusterConnectionFile>(new ClusterConnectionFile(conn)));
state vector<Future<Optional<LeaderInfo>>> leaderServers;
state ClientCoordinators coord(Reference<ClusterConnectionFile>(new ClusterConnectionFile(conn)));
if (! change->getDesiredClusterKeyName().empty()) {
CheckClusterNameMutabilityReply mutabilityReply = wait(coord.clientLeaderServers[0].checkClusterNameMutability.getReply(
CheckClusterNameMutability()));
if (! mutabilityReply.value) {
return CoordinatorsResult::BAD_DATABASE_STATE;
}
}
leaderServers.reserve(coord.clientLeaderServers.size());
for (int i = 0; i < coord.clientLeaderServers.size(); i++)
leaderServers.push_back(retryBrokenPromise(coord.clientLeaderServers[i].getLeader,
GetLeaderRequest(coord.clusterKey, UID()),
TaskPriority::CoordinationReply));
choose {
when(wait(waitForAll(leaderServers))) {}
when(wait(delay(5.0))) { return CoordinatorsResult::COORDINATOR_UNREACHABLE; }

View File

@ -380,11 +380,13 @@ ClientCoordinators::ClientCoordinators(Key clusterKey, std::vector<NetworkAddres
ClientLeaderRegInterface::ClientLeaderRegInterface(NetworkAddress remote)
: getLeader(Endpoint({ remote }, WLTOKEN_CLIENTLEADERREG_GETLEADER)),
openDatabase(Endpoint({ remote }, WLTOKEN_CLIENTLEADERREG_OPENDATABASE)) {}
openDatabase(Endpoint({ remote }, WLTOKEN_CLIENTLEADERREG_OPENDATABASE)),
checkClusterNameMutability(Endpoint({ remote }, WLTOKEN_CLIENTLEADERREG_DESCRIPTOR_MUTABLE)) {}
ClientLeaderRegInterface::ClientLeaderRegInterface(INetwork* local) {
getLeader.makeWellKnownEndpoint(WLTOKEN_CLIENTLEADERREG_GETLEADER, TaskPriority::Coordination);
openDatabase.makeWellKnownEndpoint(WLTOKEN_CLIENTLEADERREG_OPENDATABASE, TaskPriority::Coordination);
checkClusterNameMutability.makeWellKnownEndpoint(WLTOKEN_CLIENTLEADERREG_DESCRIPTOR_MUTABLE, TaskPriority::Coordination);
}
// Nominee is the worker among all workers that are considered as leader by a coordinator

View File

@ -51,6 +51,8 @@ constexpr UID WLTOKEN_PING_PACKET(-1, 1);
constexpr int PACKET_LEN_WIDTH = sizeof(uint32_t);
const uint64_t TOKEN_STREAM_FLAG = 1;
const int WLTOKEN_COUNTS = 12;
class EndpointMap : NonCopyable {
public:
// Reserve space for this many wellKnownEndpoints
@ -334,7 +336,7 @@ ACTOR Future<Void> pingLatencyLogger(TransportData* self) {
}
TransportData::TransportData(uint64_t transportId)
: endpoints(/*wellKnownTokenCount*/ 11), endpointNotFoundReceiver(endpoints), pingReceiver(endpoints),
: endpoints(/*wellKnownTokenCount*/ WLTOKEN_COUNTS), endpointNotFoundReceiver(endpoints), pingReceiver(endpoints),
warnAlwaysForLargePacket(true), lastIncompatibleMessage(0), transportId(transportId),
numIncompatibleConnections(0) {
degraded = makeReference<AsyncVar<bool>>(false);

View File

@ -560,6 +560,10 @@ ACTOR Future<Void> leaderServer(LeaderElectionRegInterface interf, OnDemandStore
wait(LeaderRegisterCollection::init(&regs));
loop choose {
when(CheckClusterNameMutability req = waitNext(interf.checkClusterNameMutability.getFuture())) {
CheckClusterNameMutabilityReply rep(SERVER_KNOBS->ENABLE_CROSS_CLUSTER_SUPPORT ? true : false);
req.reply.send(rep);
}
when(OpenDatabaseCoordRequest req = waitNext(interf.openDatabase.getFuture())) {
Optional<LeaderInfo> forward = regs.getForward(req.clusterKey);
if (forward.present()) {

View File

@ -24,12 +24,12 @@
#include "fdbclient/CoordinationInterface.h"
constexpr UID WLTOKEN_LEADERELECTIONREG_CANDIDACY(-1, 4);
constexpr UID WLTOKEN_LEADERELECTIONREG_ELECTIONRESULT(-1, 5);
constexpr UID WLTOKEN_LEADERELECTIONREG_LEADERHEARTBEAT(-1, 6);
constexpr UID WLTOKEN_LEADERELECTIONREG_FORWARD(-1, 7);
constexpr UID WLTOKEN_GENERATIONREG_READ(-1, 8);
constexpr UID WLTOKEN_GENERATIONREG_WRITE(-1, 9);
constexpr UID WLTOKEN_LEADERELECTIONREG_CANDIDACY(-1, 5);
constexpr UID WLTOKEN_LEADERELECTIONREG_ELECTIONRESULT(-1, 6);
constexpr UID WLTOKEN_LEADERELECTIONREG_LEADERHEARTBEAT(-1, 7);
constexpr UID WLTOKEN_LEADERELECTIONREG_FORWARD(-1, 8);
constexpr UID WLTOKEN_GENERATIONREG_READ(-1, 9);
constexpr UID WLTOKEN_GENERATIONREG_WRITE(-1, 10);
struct GenerationRegInterface {
constexpr static FileIdentifier file_identifier = 16726744;