2017-05-26 04:48:44 +08:00
|
|
|
/*
|
2019-02-18 09:38:13 +08:00
|
|
|
* ManagementAPI.actor.h
|
2017-05-26 04:48:44 +08:00
|
|
|
*
|
|
|
|
* This source file is part of the FoundationDB open source project
|
|
|
|
*
|
|
|
|
* Copyright 2013-2018 Apple Inc. and the FoundationDB project authors
|
2018-02-22 02:25:11 +08:00
|
|
|
*
|
2017-05-26 04:48:44 +08:00
|
|
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
|
|
* you may not use this file except in compliance with the License.
|
|
|
|
* You may obtain a copy of the License at
|
2018-02-22 02:25:11 +08:00
|
|
|
*
|
2017-05-26 04:48:44 +08:00
|
|
|
* http://www.apache.org/licenses/LICENSE-2.0
|
2018-02-22 02:25:11 +08:00
|
|
|
*
|
2017-05-26 04:48:44 +08:00
|
|
|
* Unless required by applicable law or agreed to in writing, software
|
|
|
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
|
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
|
|
* See the License for the specific language governing permissions and
|
|
|
|
* limitations under the License.
|
|
|
|
*/
|
|
|
|
|
|
|
|
#pragma once
|
2019-02-18 09:38:13 +08:00
|
|
|
#if defined(NO_INTELLISENSE) && !defined(FDBCLIENT_MANAGEMENT_API_ACTOR_G_H)
|
2021-03-11 02:06:03 +08:00
|
|
|
#define FDBCLIENT_MANAGEMENT_API_ACTOR_G_H
|
|
|
|
#include "fdbclient/ManagementAPI.actor.g.h"
|
2019-02-18 09:38:13 +08:00
|
|
|
#elif !defined(FDBCLIENT_MANAGEMENT_API_ACTOR_H)
|
2021-03-11 02:06:03 +08:00
|
|
|
#define FDBCLIENT_MANAGEMENT_API_ACTOR_H
|
2017-05-26 04:48:44 +08:00
|
|
|
|
|
|
|
/* This file defines "management" interfaces for configuration, coordination changes, and
|
|
|
|
the inclusion and exclusion of servers. It is used to implement fdbcli management commands
|
|
|
|
and by test workloads that simulate such. It isn't exposed to C clients or anywhere outside
|
|
|
|
our code base and doesn't need to be versioned. It doesn't do anything you can't do with the
|
|
|
|
standard API and some knowledge of the contents of the system key space.
|
|
|
|
*/
|
|
|
|
|
|
|
|
#include <string>
|
|
|
|
#include <map>
|
2022-01-29 01:21:15 +08:00
|
|
|
#include "fdbclient/GenericManagementAPI.actor.h"
|
2019-02-18 07:41:16 +08:00
|
|
|
#include "fdbclient/NativeAPI.actor.h"
|
2018-10-20 01:30:13 +08:00
|
|
|
#include "fdbclient/ReadYourWrites.h"
|
|
|
|
#include "fdbclient/DatabaseConfiguration.h"
|
|
|
|
#include "fdbclient/MonitorLeader.h"
|
2019-02-18 09:38:13 +08:00
|
|
|
#include "flow/actorcompiler.h" // has to be last include
|
2017-05-26 04:48:44 +08:00
|
|
|
|
2019-02-18 09:38:13 +08:00
|
|
|
ACTOR Future<DatabaseConfiguration> getDatabaseConfiguration(Database cx);
|
|
|
|
ACTOR Future<Void> waitForFullReplication(Database cx);
|
2018-04-09 12:24:05 +08:00
|
|
|
|
2017-05-26 04:48:44 +08:00
|
|
|
struct IQuorumChange : ReferenceCounted<IQuorumChange> {
|
|
|
|
virtual ~IQuorumChange() {}
|
2021-09-17 08:42:34 +08:00
|
|
|
virtual Future<std::vector<NetworkAddress>> getDesiredCoordinators(Transaction* tr,
|
|
|
|
std::vector<NetworkAddress> oldCoordinators,
|
2021-10-11 11:44:56 +08:00
|
|
|
Reference<IClusterConnectionRecord>,
|
2021-09-17 08:42:34 +08:00
|
|
|
CoordinatorsResult&) = 0;
|
2020-10-16 01:39:38 +08:00
|
|
|
virtual std::string getDesiredClusterKeyName() const { return std::string(); }
|
2017-05-26 04:48:44 +08:00
|
|
|
};
|
|
|
|
|
|
|
|
// Change to use the given set of coordination servers
|
2021-03-11 02:06:03 +08:00
|
|
|
ACTOR Future<Optional<CoordinatorsResult>> changeQuorumChecker(Transaction* tr,
|
|
|
|
Reference<IQuorumChange> change,
|
2021-02-17 05:01:37 +08:00
|
|
|
std::vector<NetworkAddress>* desiredCoordinators);
|
2020-09-28 02:52:18 +08:00
|
|
|
ACTOR Future<CoordinatorsResult> changeQuorum(Database cx, Reference<IQuorumChange> change);
|
2017-05-26 04:48:44 +08:00
|
|
|
Reference<IQuorumChange> autoQuorumChange(int desired = -1);
|
|
|
|
Reference<IQuorumChange> noQuorumChange();
|
2021-09-17 08:42:34 +08:00
|
|
|
Reference<IQuorumChange> specifiedQuorumChange(std::vector<NetworkAddress> const&);
|
2017-05-26 04:48:44 +08:00
|
|
|
Reference<IQuorumChange> nameQuorumChange(std::string const& name, Reference<IQuorumChange> const& other);
|
|
|
|
|
2021-03-11 02:06:03 +08:00
|
|
|
// Exclude the given set of servers from use as state servers. Returns as soon as the change is durable, without
|
|
|
|
// necessarily waiting for the servers to be evacuated. A NetworkAddress with a port of 0 means all servers on the
|
|
|
|
// given IP.
|
2021-09-17 08:42:34 +08:00
|
|
|
ACTOR Future<Void> excludeServers(Database cx, std::vector<AddressExclusion> servers, bool failed = false);
|
|
|
|
void excludeServers(Transaction& tr, std::vector<AddressExclusion>& servers, bool failed = false);
|
2017-05-26 04:48:44 +08:00
|
|
|
|
2021-05-19 14:48:04 +08:00
|
|
|
// Exclude the servers matching the given set of localities from use as state servers. Returns as soon as the change
|
|
|
|
// is durable, without necessarily waiting for the servers to be evacuated.
|
2021-06-17 15:27:26 +08:00
|
|
|
ACTOR Future<Void> excludeLocalities(Database cx, std::unordered_set<std::string> localities, bool failed = false);
|
|
|
|
void excludeLocalities(Transaction& tr, std::unordered_set<std::string> localities, bool failed = false);
|
2021-05-19 14:48:04 +08:00
|
|
|
|
2021-03-11 02:06:03 +08:00
|
|
|
// Remove the given servers from the exclusion list. A NetworkAddress with a port of 0 means all servers on the given
|
|
|
|
// IP. A NetworkAddress() means all servers (don't exclude anything)
|
2021-09-17 08:42:34 +08:00
|
|
|
ACTOR Future<Void> includeServers(Database cx, std::vector<AddressExclusion> servers, bool failed = false);
|
2017-05-26 04:48:44 +08:00
|
|
|
|
2021-05-19 14:48:04 +08:00
|
|
|
// Remove the given localities from the exclusion list.
|
2021-06-05 06:23:04 +08:00
|
|
|
ACTOR Future<Void> includeLocalities(Database cx,
|
2021-09-17 08:42:34 +08:00
|
|
|
std::vector<std::string> localities,
|
2021-06-05 06:23:04 +08:00
|
|
|
bool failed = false,
|
|
|
|
bool includeAll = false);
|
2021-05-19 14:48:04 +08:00
|
|
|
|
2021-03-11 02:06:03 +08:00
|
|
|
// Set the process class of processes with the given address. A NetworkAddress with a port of 0 means all servers on
|
|
|
|
// the given IP.
|
|
|
|
ACTOR Future<Void> setClass(Database cx, AddressExclusion server, ProcessClass processClass);
|
2017-05-26 04:48:44 +08:00
|
|
|
|
|
|
|
// Get the current list of excluded servers
|
2021-09-17 08:42:34 +08:00
|
|
|
ACTOR Future<std::vector<AddressExclusion>> getExcludedServers(Database cx);
|
|
|
|
ACTOR Future<std::vector<AddressExclusion>> getExcludedServers(Transaction* tr);
|
2017-05-26 04:48:44 +08:00
|
|
|
|
2021-05-19 14:48:04 +08:00
|
|
|
// Get the current list of excluded localities
|
2021-09-17 08:42:34 +08:00
|
|
|
ACTOR Future<std::vector<std::string>> getExcludedLocalities(Database cx);
|
|
|
|
ACTOR Future<std::vector<std::string>> getExcludedLocalities(Transaction* tr);
|
2021-05-19 14:48:04 +08:00
|
|
|
|
2021-06-17 15:27:26 +08:00
|
|
|
std::set<AddressExclusion> getAddressesByLocality(const std::vector<ProcessData>& workers, const std::string& locality);
|
2021-05-19 14:48:04 +08:00
|
|
|
|
2019-07-17 09:10:26 +08:00
|
|
|
// Check for the given, previously excluded servers to be evacuated (no longer used for state). If waitForExclusion is
|
|
|
|
// true, this actor returns once it is safe to shut down all such machines without impacting fault tolerance, until and
|
|
|
|
// unless any of them are explicitly included with includeServers()
|
2021-03-11 02:06:03 +08:00
|
|
|
ACTOR Future<std::set<NetworkAddress>> checkForExcludingServers(Database cx,
|
2021-09-17 08:42:34 +08:00
|
|
|
std::vector<AddressExclusion> servers,
|
2019-07-17 09:10:26 +08:00
|
|
|
bool waitForAllExcluded);
|
2020-07-29 04:40:14 +08:00
|
|
|
ACTOR Future<bool> checkForExcludingServersTxActor(ReadYourWritesTransaction* tr,
|
|
|
|
std::set<AddressExclusion>* exclusions,
|
|
|
|
std::set<NetworkAddress>* inProgressExclusion);
|
2017-05-26 04:48:44 +08:00
|
|
|
|
|
|
|
// Gets a list of all workers in the cluster (excluding testers)
|
2021-09-17 08:42:34 +08:00
|
|
|
ACTOR Future<std::vector<ProcessData>> getWorkers(Database cx);
|
|
|
|
ACTOR Future<std::vector<ProcessData>> getWorkers(Transaction* tr);
|
2017-05-26 04:48:44 +08:00
|
|
|
|
2021-03-11 02:06:03 +08:00
|
|
|
ACTOR Future<Void> timeKeeperSetDisable(Database cx);
|
2017-09-29 04:13:24 +08:00
|
|
|
|
2021-03-11 02:06:03 +08:00
|
|
|
ACTOR Future<Void> lockDatabase(Transaction* tr, UID id);
|
|
|
|
ACTOR Future<Void> lockDatabase(Reference<ReadYourWritesTransaction> tr, UID id);
|
|
|
|
ACTOR Future<Void> lockDatabase(Database cx, UID id);
|
2017-05-26 04:48:44 +08:00
|
|
|
|
2021-03-11 02:06:03 +08:00
|
|
|
ACTOR Future<Void> unlockDatabase(Transaction* tr, UID id);
|
|
|
|
ACTOR Future<Void> unlockDatabase(Reference<ReadYourWritesTransaction> tr, UID id);
|
|
|
|
ACTOR Future<Void> unlockDatabase(Database cx, UID id);
|
2017-05-26 04:48:44 +08:00
|
|
|
|
2021-03-11 02:06:03 +08:00
|
|
|
ACTOR Future<Void> checkDatabaseLock(Transaction* tr, UID id);
|
|
|
|
ACTOR Future<Void> checkDatabaseLock(Reference<ReadYourWritesTransaction> tr, UID id);
|
2017-05-26 04:48:44 +08:00
|
|
|
|
2021-10-20 04:56:52 +08:00
|
|
|
ACTOR Future<Void> updateChangeFeed(Transaction* tr, Key rangeID, ChangeFeedStatus status, KeyRange range = KeyRange());
|
|
|
|
ACTOR Future<Void> updateChangeFeed(Reference<ReadYourWritesTransaction> tr,
|
|
|
|
Key rangeID,
|
|
|
|
ChangeFeedStatus status,
|
|
|
|
KeyRange range = KeyRange());
|
|
|
|
ACTOR Future<Void> updateChangeFeed(Database cx, Key rangeID, ChangeFeedStatus status, KeyRange range = KeyRange());
|
|
|
|
|
2020-04-16 11:01:01 +08:00
|
|
|
ACTOR Future<Void> advanceVersion(Database cx, Version v);
|
|
|
|
|
2021-03-11 02:06:03 +08:00
|
|
|
ACTOR Future<int> setDDMode(Database cx, int mode);
|
2017-07-29 09:12:04 +08:00
|
|
|
|
2021-10-11 11:44:56 +08:00
|
|
|
ACTOR Future<Void> forceRecovery(Reference<IClusterConnectionRecord> clusterFile, Standalone<StringRef> dcId);
|
2018-07-01 21:39:04 +08:00
|
|
|
|
2021-03-11 02:06:03 +08:00
|
|
|
ACTOR Future<Void> printHealthyZone(Database cx);
|
2019-07-12 05:53:00 +08:00
|
|
|
ACTOR Future<Void> setDDIgnoreRebalanceSwitch(Database cx, bool ignoreRebalance);
|
2019-07-25 06:32:52 +08:00
|
|
|
ACTOR Future<bool> clearHealthyZone(Database cx, bool printWarning = false, bool clearSSFailureZoneString = false);
|
|
|
|
ACTOR Future<bool> setHealthyZone(Database cx, StringRef zoneId, double seconds, bool printWarning = false);
|
2019-04-02 08:55:13 +08:00
|
|
|
|
2021-03-11 02:06:03 +08:00
|
|
|
ACTOR Future<Void> waitForPrimaryDC(Database cx, StringRef dcId);
|
2018-09-18 09:32:39 +08:00
|
|
|
|
2017-05-26 04:48:44 +08:00
|
|
|
// Gets the cluster connection string
|
2021-03-11 02:06:03 +08:00
|
|
|
ACTOR Future<std::vector<NetworkAddress>> getCoordinators(Database cx);
|
|
|
|
|
|
|
|
void schemaCoverage(std::string const& spath, bool covered = true);
|
|
|
|
bool schemaMatch(json_spirit::mValue const& schema,
|
|
|
|
json_spirit::mValue const& result,
|
|
|
|
std::string& errorStr,
|
|
|
|
Severity sev = SevError,
|
|
|
|
bool checkCoverage = false,
|
|
|
|
std::string path = std::string(),
|
|
|
|
std::string schema_path = std::string());
|
2018-08-17 08:34:59 +08:00
|
|
|
|
2019-02-28 07:40:33 +08:00
|
|
|
// execute payload in 'snapCmd' on all the coordinators, TLogs and
|
|
|
|
// storage nodes
|
2019-09-14 02:50:36 +08:00
|
|
|
ACTOR Future<Void> mgmtSnapCreate(Database cx, Standalone<StringRef> snapCmd, UID snapUID);
|
2019-02-28 07:40:33 +08:00
|
|
|
|
2019-02-18 09:38:13 +08:00
|
|
|
#include "flow/unactorcompiler.h"
|
2018-07-01 21:39:04 +08:00
|
|
|
#endif
|