2017-05-26 04:48:44 +08:00
/*
* SystemData . h
*
* 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 .
*/
# ifndef FDBCLIENT_SYSTEMDATA_H
# define FDBCLIENT_SYSTEMDATA_H
# pragma once
// Functions and constants documenting the organization of the reserved keyspace in the database beginning with "\xFF"
2018-10-20 01:30:13 +08:00
# include "fdbclient/FDBTypes.h"
# include "fdbclient/StorageServerInterface.h"
2019-09-26 15:18:37 +08:00
# include "fdbclient/RestoreWorkerInterface.actor.h"
2019-09-04 06:50:21 +08:00
2019-05-10 11:55:44 +08:00
struct RestoreLoaderInterface ;
struct RestoreApplierInterface ;
struct RestoreMasterInterface ;
2017-05-26 04:48:44 +08:00
extern const KeyRangeRef normalKeys ; // '' to systemKeys.begin
extern const KeyRangeRef systemKeys ; // [FF] to [FF][FF]
extern const KeyRangeRef nonMetadataSystemKeys ; // [FF][00] to [FF][01]
extern const KeyRangeRef allKeys ; // '' to systemKeys.end
2020-04-09 04:38:12 +08:00
extern const KeyRangeRef specialKeys ; // [FF][FF] to [FF][FF][FF], some client functions are exposed through FDB calls using these special keys, see pr#2662
2017-05-26 04:48:44 +08:00
extern const KeyRef afterAllKeys ;
// "\xff/keyServers/[[begin]]" := "[[vector<serverID>, vector<serverID>]]"
2017-07-27 04:45:11 +08:00
extern const KeyRangeRef keyServersKeys , keyServersKeyServersKeys ;
2017-05-26 04:48:44 +08:00
extern const KeyRef keyServersPrefix , keyServersEnd , keyServersKeyServersKey ;
const Key keyServersKey ( const KeyRef & k ) ;
const KeyRef keyServersKey ( const KeyRef & k , Arena & arena ) ;
const Value keyServersValue (
const vector < UID > & src ,
const vector < UID > & dest = vector < UID > ( ) ) ;
void decodeKeyServersValue ( const ValueRef & value ,
vector < UID > & src , vector < UID > & dest ) ;
2019-11-13 05:01:29 +08:00
// "\xff/storageCache/[[begin]]" := "[[vector<uint16_t>]]"
extern const KeyRangeRef storageCacheKeys ;
extern const KeyRef storageCachePrefix ;
const Key storageCacheKey ( const KeyRef & k ) ;
const Value storageCacheValue ( const vector < uint16_t > & serverIndices ) ;
void decodeStorageCacheValue ( const ValueRef & value , vector < uint16_t > & serverIndices ) ;
2017-05-26 04:48:44 +08:00
// "\xff/serverKeys/[[serverID]]/[[begin]]" := "" | "1" | "2"
extern const KeyRef serverKeysPrefix ;
extern const ValueRef serverKeysTrue , serverKeysFalse ;
const Key serverKeysKey ( UID serverID , const KeyRef & keys ) ;
const Key serverKeysPrefixFor ( UID serverID ) ;
UID serverKeysDecodeServer ( const KeyRef & key ) ;
bool serverHasKey ( ValueRef storedValue ) ;
2020-04-09 03:43:25 +08:00
extern const KeyRangeRef conflictingKeysRange ;
2020-03-25 00:48:03 +08:00
extern const ValueRef conflictingKeysTrue , conflictingKeysFalse ;
2019-11-13 05:01:29 +08:00
extern const KeyRef cacheKeysPrefix ;
const Key cacheKeysKey ( uint16_t idx , const KeyRef & key ) ;
const Key cacheKeysPrefixFor ( uint16_t idx ) ;
uint16_t cacheKeysDecodeIndex ( const KeyRef & key ) ;
KeyRef cacheKeysDecodeKey ( const KeyRef & key ) ;
extern const KeyRef cacheChangeKey ;
extern const KeyRangeRef cacheChangeKeys ;
extern const KeyRef cacheChangePrefix ;
const Key cacheChangeKeyFor ( uint16_t idx ) ;
uint16_t cacheChangeKeyDecodeIndex ( const KeyRef & key ) ;
2017-05-26 04:48:44 +08:00
extern const KeyRangeRef serverTagKeys ;
extern const KeyRef serverTagPrefix ;
2017-08-04 07:16:36 +08:00
extern const KeyRangeRef serverTagMaxKeys ;
2017-05-26 04:48:44 +08:00
extern const KeyRangeRef serverTagConflictKeys ;
extern const KeyRef serverTagConflictPrefix ;
2018-01-29 03:52:54 +08:00
extern const KeyRangeRef serverTagHistoryKeys ;
extern const KeyRef serverTagHistoryPrefix ;
2017-05-26 04:48:44 +08:00
const Key serverTagKeyFor ( UID serverID ) ;
2018-01-29 03:52:54 +08:00
const Key serverTagHistoryKeyFor ( UID serverID ) ;
const KeyRange serverTagHistoryRangeFor ( UID serverID ) ;
const KeyRange serverTagHistoryRangeBefore ( UID serverID , Version version ) ;
2017-05-26 04:48:44 +08:00
const Value serverTagValue ( Tag ) ;
UID decodeServerTagKey ( KeyRef const & ) ;
2018-01-29 03:52:54 +08:00
Version decodeServerTagHistoryKey ( KeyRef const & ) ;
2017-05-26 04:48:44 +08:00
Tag decodeServerTagValue ( ValueRef const & ) ;
const Key serverTagConflictKeyFor ( Tag ) ;
2017-08-04 07:16:36 +08:00
// "\xff/tagLocalityList/[[datacenterID]]" := "[[tagLocality]]"
extern const KeyRangeRef tagLocalityListKeys ;
extern const KeyRef tagLocalityListPrefix ;
const Key tagLocalityListKeyFor ( Optional < Value > dcID ) ;
const Value tagLocalityListValue ( int8_t const & ) ;
Optional < Value > decodeTagLocalityListKey ( KeyRef const & ) ;
int8_t decodeTagLocalityListValue ( ValueRef const & ) ;
2018-04-09 12:24:05 +08:00
2018-11-12 04:37:53 +08:00
// "\xff\x02/datacenterReplicas/[[datacenterID]]" := "[[replicas]]"
2018-04-09 12:24:05 +08:00
extern const KeyRangeRef datacenterReplicasKeys ;
extern const KeyRef datacenterReplicasPrefix ;
const Key datacenterReplicasKeyFor ( Optional < Value > dcID ) ;
const Value datacenterReplicasValue ( int const & ) ;
Optional < Value > decodeDatacenterReplicasKey ( KeyRef const & ) ;
int decodeDatacenterReplicasValue ( ValueRef const & ) ;
2017-08-04 07:16:36 +08:00
2018-11-13 10:42:29 +08:00
// "\xff\x02/tLogDatacenters/[[datacenterID]]"
2018-11-12 04:37:53 +08:00
extern const KeyRangeRef tLogDatacentersKeys ;
extern const KeyRef tLogDatacentersPrefix ;
const Key tLogDatacentersKeyFor ( Optional < Value > dcID ) ;
Optional < Value > decodeTLogDatacentersKey ( KeyRef const & ) ;
2018-06-15 10:36:02 +08:00
extern const KeyRef primaryDatacenterKey ;
2017-05-26 04:48:44 +08:00
// "\xff/serverList/[[serverID]]" := "[[StorageServerInterface]]"
// Storage servers are listed here when they are recruited - always before assigning them keys
// Storage servers removed from here are never replaced. The same fdbserver, if re-recruited, will always
// have a new ID. When removed from here, a storage server may release all resources and destroy itself.
extern const KeyRangeRef serverListKeys ;
extern const KeyRef serverListPrefix ;
const Key serverListKeyFor ( UID serverID ) ;
const Value serverListValue ( StorageServerInterface const & ) ;
UID decodeServerListKey ( KeyRef const & ) ;
StorageServerInterface decodeServerListValue ( ValueRef const & ) ;
// "\xff/processClass/[[processID]]" := "[[ProcessClass]]"
// Contains a mapping from processID to processClass
extern const KeyRangeRef processClassKeys ;
extern const KeyRef processClassPrefix ;
extern const KeyRef processClassChangeKey ;
extern const KeyRef processClassVersionKey ;
extern const ValueRef processClassVersionValue ;
const Key processClassKeyFor ( StringRef processID ) ;
const Value processClassValue ( ProcessClass const & ) ;
Key decodeProcessClassKey ( KeyRef const & ) ;
ProcessClass decodeProcessClassValue ( ValueRef const & ) ;
UID decodeProcessClassKeyOld ( KeyRef const & key ) ;
// "\xff/conf/[[option]]" := "value"
extern const KeyRangeRef configKeys ;
extern const KeyRef configKeysPrefix ;
// "\xff/conf/excluded/1.2.3.4" := ""
// "\xff/conf/excluded/1.2.3.4:4000" := ""
// These are inside configKeysPrefix since they represent a form of configuration and they are convenient
// to track in the same way by the tlog and recovery process, but they are ignored by the DatabaseConfiguration
// class.
extern const KeyRef excludedServersPrefix ;
extern const KeyRangeRef excludedServersKeys ;
extern const KeyRef excludedServersVersionKey ; // The value of this key shall be changed by any transaction that modifies the excluded servers list
const AddressExclusion decodeExcludedServersKey ( KeyRef const & key ) ; // where key.startsWith(excludedServersPrefix)
std : : string encodeExcludedServersKey ( AddressExclusion const & ) ;
2019-07-31 02:45:32 +08:00
extern const KeyRef failedServersPrefix ;
extern const KeyRangeRef failedServersKeys ;
extern const KeyRef failedServersVersionKey ; // The value of this key shall be changed by any transaction that modifies the failed servers list
const AddressExclusion decodeFailedServersKey ( KeyRef const & key ) ; // where key.startsWith(failedServersPrefix)
std : : string encodeFailedServersKey ( AddressExclusion const & ) ;
2017-05-26 04:48:44 +08:00
// "\xff/workers/[[processID]]" := ""
// Asynchronously updated by the cluster controller, this is a list of fdbserver processes that have joined the cluster
// and are currently (recently) available
extern const KeyRangeRef workerListKeys ;
extern const KeyRef workerListPrefix ;
const Key workerListKeyFor ( StringRef processID ) ;
const Value workerListValue ( ProcessData const & ) ;
Key decodeWorkerListKey ( KeyRef const & ) ;
ProcessData decodeWorkerListValue ( ValueRef const & ) ;
2019-07-30 01:37:42 +08:00
// "\xff/backupProgress/[[workerID]]" := "[[WorkerBackupStatus]]"
2019-05-24 07:06:23 +08:00
extern const KeyRangeRef backupProgressKeys ;
extern const KeyRef backupProgressPrefix ;
const Key backupProgressKeyFor ( UID workerID ) ;
2019-07-30 01:37:42 +08:00
const Value backupProgressValue ( const WorkerBackupStatus & status ) ;
2019-05-24 07:06:23 +08:00
UID decodeBackupProgressKey ( const KeyRef & key ) ;
2019-07-30 01:37:42 +08:00
WorkerBackupStatus decodeBackupProgressValue ( const ValueRef & value ) ;
2019-05-24 07:06:23 +08:00
2020-01-22 08:57:30 +08:00
// "\xff/backupStarted" := "[[vector<UID,Version1>]]"
2020-01-05 06:33:50 +08:00
extern const KeyRef backupStartedKey ;
2020-01-22 08:57:30 +08:00
Value encodeBackupStartedValue ( const std : : vector < std : : pair < UID , Version > > & ids ) ;
std : : vector < std : : pair < UID , Version > > decodeBackupStartedValue ( const ValueRef & value ) ;
2020-01-05 06:33:50 +08:00
2017-05-26 04:48:44 +08:00
extern const KeyRef coordinatorsKey ;
extern const KeyRef logsKey ;
2017-09-08 08:41:20 +08:00
extern const KeyRef minRequiredCommitVersionKey ;
2017-05-26 04:48:44 +08:00
const Value logsValue ( const vector < std : : pair < UID , NetworkAddress > > & logs , const vector < std : : pair < UID , NetworkAddress > > & oldLogs ) ;
std : : pair < vector < std : : pair < UID , NetworkAddress > > , vector < std : : pair < UID , NetworkAddress > > > decodeLogsValue ( const ValueRef & value ) ;
// The "global keys" are send to each storage server any time they are changed
extern const KeyRef globalKeysPrefix ;
extern const KeyRef lastEpochEndKey ;
extern const KeyRef lastEpochEndPrivateKey ;
2019-02-19 06:30:51 +08:00
extern const KeyRef killStorageKey ;
extern const KeyRef killStoragePrivateKey ;
2018-11-09 07:44:03 +08:00
extern const KeyRef rebootWhenDurableKey ;
extern const KeyRef rebootWhenDurablePrivateKey ;
2019-02-19 06:40:30 +08:00
extern const KeyRef primaryLocalityKey ;
extern const KeyRef primaryLocalityPrivateKey ;
2017-05-26 04:48:44 +08:00
extern const KeyRef fastLoggingEnabled ;
extern const KeyRef fastLoggingEnabledPrivateKey ;
extern const KeyRef moveKeysLockOwnerKey , moveKeysLockWriteKey ;
extern const KeyRef dataDistributionModeKey ;
extern const UID dataDistributionModeLock ;
// Log Range constant variables
// \xff/logRanges/[16-byte UID][begin key] := serialize( make_pair([end key], [destination key prefix]), IncludeVersion() )
extern const KeyRangeRef logRangesRange ;
// Returns the encoded key comprised of begin key and log uid
Key logRangesEncodeKey ( KeyRef keyBegin , UID logUid ) ;
// Returns the start key and optionally the logRange Uid
KeyRef logRangesDecodeKey ( KeyRef key , UID * logUid = NULL ) ;
// Returns the end key and optionally the key prefix
Key logRangesDecodeValue ( KeyRef keyValue , Key * destKeyPrefix = NULL ) ;
// Returns the encoded key value comprised of the end key and destination prefix
2018-02-21 05:22:31 +08:00
Key logRangesEncodeValue ( KeyRef keyEnd , KeyRef destPath ) ;
2017-05-26 04:48:44 +08:00
// Returns a key prefixed with the specified key with
// the given uid encoded at the end
Key uidPrefixKey ( KeyRef keyPrefix , UID logUid ) ;
2017-12-21 08:54:57 +08:00
/// Apply mutations constant variables
// applyMutationsEndRange.end defines the highest version for which we have mutations that we can
// apply to our database as part of a DR/restore operation.
2017-05-26 04:48:44 +08:00
// \xff/applyMutationsEnd/[16-byte UID] := serialize( endVersion, Unversioned() )
extern const KeyRangeRef applyMutationsEndRange ;
2017-12-21 08:54:57 +08:00
// applyMutationsBeginRange.begin defines the highest version of what has already been applied by a
// DR/restore to the database, and thus also what version is of the next mutation that needs to be
// applied to the database.
2017-05-26 04:48:44 +08:00
// \xff/applyMutationsBegin/[16-byte UID] := serialize( beginVersion, Unversioned() )
extern const KeyRangeRef applyMutationsBeginRange ;
// \xff/applyMutationsAddPrefix/[16-byte UID] := addPrefix
extern const KeyRangeRef applyMutationsAddPrefixRange ;
// \xff/applyMutationsRemovePrefix/[16-byte UID] := removePrefix
extern const KeyRangeRef applyMutationsRemovePrefixRange ;
extern const KeyRangeRef applyMutationsKeyVersionMapRange ;
extern const KeyRangeRef applyMutationsKeyVersionCountRange ;
2017-09-30 12:14:08 +08:00
// FdbClient Info prefix
2017-05-26 04:48:44 +08:00
extern const KeyRangeRef fdbClientInfoPrefixRange ;
2017-09-30 12:14:08 +08:00
extern const KeyRef fdbClientInfoTxnSampleRate ;
extern const KeyRef fdbClientInfoTxnSizeLimit ;
2017-05-26 04:48:44 +08:00
2019-06-21 12:38:45 +08:00
// Consistency Check settings
extern const KeyRef fdbShouldConsistencyCheckBeSuspended ;
2019-01-19 08:18:34 +08:00
// Request latency measurement key
extern const KeyRef latencyBandConfigKey ;
2017-05-26 04:48:44 +08:00
2017-09-26 03:40:24 +08:00
// Keyspace to maintain wall clock to version map
extern const KeyRangeRef timeKeeperPrefixRange ;
2017-09-28 07:31:38 +08:00
extern const KeyRef timeKeeperVersionKey ;
2017-09-29 04:13:24 +08:00
extern const KeyRef timeKeeperDisableKey ;
2017-05-26 04:48:44 +08:00
// Layer status metadata prefix
extern const KeyRangeRef layerStatusMetaPrefixRange ;
// Backup agent status root
extern const KeyRangeRef backupStatusPrefixRange ;
// Key range reserved by file backup agent to storing configuration and state information
extern const KeyRangeRef fileBackupPrefixRange ;
// Key range reserved by file restore agent (currently part of backup agent functionally separate) for storing configuration and state information
extern const KeyRangeRef fileRestorePrefixRange ;
// Key range reserved by database backup agent to storing configuration and state information
extern const KeyRangeRef databaseBackupPrefixRange ;
2018-02-21 05:22:31 +08:00
extern const KeyRef destUidLookupPrefix ;
extern const KeyRef backupLatestVersionsPrefix ;
2017-05-26 04:48:44 +08:00
// Key range reserved by backup agent to storing mutations
extern const KeyRangeRef backupLogKeys ;
extern const KeyRangeRef applyLogKeys ;
extern const KeyRef backupVersionKey ;
extern const ValueRef backupVersionValue ;
extern const int backupVersion ;
static const int backupLogPrefixBytes = 8 ;
// Use for legacy system support (pre 300)
extern const KeyRef backupEnabledKey ;
extern const KeyRef systemTuplesPrefix ;
extern const KeyRef metricConfChangeKey ;
extern const KeyRangeRef metricConfKeys ;
extern const KeyRef metricConfPrefix ;
//const Key metricConfKey( KeyRef const& prefix, struct MetricNameRef const& name, KeyRef const& key );
//std::pair<struct MetricNameRef, KeyRef> decodeMetricConfKey( KeyRef const& prefix, KeyRef const& key );
extern const KeyRef maxUIDKey ;
extern const KeyRef databaseLockedKey ;
2019-03-01 09:45:00 +08:00
extern const KeyRef metadataVersionKey ;
2019-05-16 01:13:38 +08:00
extern const KeyRef metadataVersionKeyEnd ;
2019-03-01 09:45:00 +08:00
extern const KeyRef metadataVersionRequiredValue ;
2018-08-22 13:15:45 +08:00
extern const KeyRef mustContainSystemMutationsKey ;
2017-05-26 04:48:44 +08:00
2018-10-02 01:43:53 +08:00
// Key range reserved for storing changes to monitor conf files
extern const KeyRangeRef monitorConfKeys ;
2019-06-05 13:17:08 +08:00
// Fast restore
2018-10-10 09:47:28 +08:00
extern const KeyRef restoreLeaderKey ;
2018-10-16 09:19:51 +08:00
extern const KeyRangeRef restoreWorkersKeys ;
2019-06-05 13:17:08 +08:00
extern const KeyRef restoreStatusKey ; // To be used when we measure fast restore performance
2018-11-30 02:31:47 +08:00
extern const KeyRef restoreRequestTriggerKey ;
extern const KeyRef restoreRequestDoneKey ;
extern const KeyRangeRef restoreRequestKeys ;
2019-10-11 08:18:34 +08:00
extern const KeyRangeRef restoreApplierKeys ;
extern const KeyRef restoreApplierTxnValue ;
2020-01-15 06:18:41 +08:00
const Key restoreApplierKeyFor ( UID const & applierID , int64_t batchIndex , Version version ) ;
std : : tuple < UID , int64_t , Version > decodeRestoreApplierKey ( ValueRef const & key ) ;
2019-08-02 08:00:13 +08:00
const Key restoreWorkerKeyFor ( UID const & workerID ) ;
const Value restoreWorkerInterfaceValue ( RestoreWorkerInterface const & server ) ;
RestoreWorkerInterface decodeRestoreWorkerInterfaceValue ( ValueRef const & value ) ;
const Value restoreRequestTriggerValue ( UID randomUID , int const numRequests ) ;
2019-10-27 05:29:05 +08:00
int decodeRestoreRequestTriggerValue ( ValueRef const & value ) ;
2019-08-02 08:00:13 +08:00
const Value restoreRequestDoneVersionValue ( Version readVersion ) ;
Version decodeRestoreRequestDoneVersionValue ( ValueRef const & value ) ;
const Key restoreRequestKeyFor ( int const & index ) ;
const Value restoreRequestValue ( RestoreRequest const & server ) ;
RestoreRequest decodeRestoreRequestValue ( ValueRef const & value ) ;
const Key restoreStatusKeyFor ( StringRef statusType ) ;
2019-09-04 06:50:21 +08:00
const Value restoreStatusValue ( double val ) ;
2018-10-10 09:47:28 +08:00
2019-04-02 08:55:13 +08:00
extern const KeyRef healthyZoneKey ;
2019-07-19 04:18:36 +08:00
extern const StringRef ignoreSSFailuresZoneString ;
2019-07-10 07:09:51 +08:00
extern const KeyRef rebalanceDDIgnoreKey ;
2019-04-02 08:55:13 +08:00
const Value healthyZoneValue ( StringRef const & zoneId , Version version ) ;
std : : pair < Key , Version > decodeHealthyZoneValue ( ValueRef const & ) ;
2019-04-26 07:57:39 +08:00
// All mutations done to this range are blindly copied into txnStateStore.
// Used to create artifically large txnStateStore instances in testing.
extern const KeyRangeRef testOnlyTxnStateStorePrefixRange ;
2017-05-26 04:48:44 +08:00
# endif