2019-06-07 06:02:26 +08:00
|
|
|
/*
|
2019-09-26 14:19:42 +08:00
|
|
|
* RestoreWorkerInterface.actor.h
|
2019-06-07 06:02:26 +08:00
|
|
|
*
|
|
|
|
* This source file is part of the FoundationDB open source project
|
|
|
|
*
|
|
|
|
* Copyright 2013-2018 Apple Inc. and the FoundationDB project authors
|
|
|
|
*
|
|
|
|
* 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
|
|
|
|
*
|
|
|
|
* http://www.apache.org/licenses/LICENSE-2.0
|
|
|
|
*
|
|
|
|
* 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.
|
|
|
|
*/
|
|
|
|
|
|
|
|
// This file declare and define the interface for RestoreWorker and restore roles
|
|
|
|
// which are RestoreMaster, RestoreLoader, and RestoreApplier
|
|
|
|
|
|
|
|
#pragma once
|
2019-09-26 15:18:37 +08:00
|
|
|
#if defined(NO_INTELLISENSE) && !defined(FDBCLIENT_RESTORE_WORKER_INTERFACE_ACTOR_G_H)
|
|
|
|
#define FDBCLIENT_RESTORE_WORKER_INTERFACE_ACTOR_G_H
|
|
|
|
#include "fdbclient/RestoreWorkerInterface.actor.g.h"
|
2019-09-26 15:39:31 +08:00
|
|
|
#elif !defined(FDBCLIENT_RESTORE_WORKER_INTERFACE_ACTOR_H)
|
|
|
|
#define FDBCLIENT_RESTORE_WORKER_INTERFACE_ACTOR_H
|
2019-06-07 06:02:26 +08:00
|
|
|
|
|
|
|
#include <sstream>
|
|
|
|
#include "flow/Stats.h"
|
2019-07-26 01:46:11 +08:00
|
|
|
#include "flow/flow.h"
|
2019-06-07 06:02:26 +08:00
|
|
|
#include "fdbrpc/fdbrpc.h"
|
|
|
|
#include "fdbrpc/Locality.h"
|
|
|
|
#include "fdbclient/FDBTypes.h"
|
|
|
|
#include "fdbclient/CommitTransaction.h"
|
|
|
|
#include "fdbserver/CoordinationInterface.h"
|
|
|
|
#include "fdbserver/Knobs.h"
|
|
|
|
#include "fdbserver/RestoreUtil.h"
|
2019-09-26 14:19:42 +08:00
|
|
|
#include "flow/actorcompiler.h" // This must be the last #include.
|
2019-06-07 06:02:26 +08:00
|
|
|
|
2019-08-03 07:09:38 +08:00
|
|
|
class RestoreConfigFR;
|
2019-06-07 06:02:26 +08:00
|
|
|
|
|
|
|
struct RestoreCommonReply;
|
|
|
|
struct RestoreRecruitRoleRequest;
|
|
|
|
struct RestoreSysInfoRequest;
|
|
|
|
struct RestoreLoadFileRequest;
|
|
|
|
struct RestoreVersionBatchRequest;
|
2019-11-13 08:28:09 +08:00
|
|
|
struct RestoreSendMutationsToAppliersRequest;
|
2019-12-11 09:22:51 +08:00
|
|
|
struct RestoreSendVersionedMutationsRequest;
|
2019-06-07 06:02:26 +08:00
|
|
|
struct RestoreSysInfo;
|
|
|
|
struct RestoreApplierInterface;
|
|
|
|
|
2019-07-25 07:59:05 +08:00
|
|
|
// RestoreSysInfo includes information each (type of) restore roles should know.
|
|
|
|
// At this moment, it only include appliers. We keep the name for future extension.
|
|
|
|
// TODO: If it turns out this struct only has appliers in the final version, we will rename it to a more specific name, e.g., AppliersMap
|
2019-06-07 06:02:26 +08:00
|
|
|
struct RestoreSysInfo {
|
2019-07-26 01:46:11 +08:00
|
|
|
constexpr static FileIdentifier file_identifier = 68098739;
|
2019-06-07 06:02:26 +08:00
|
|
|
std::map<UID, RestoreApplierInterface> appliers;
|
|
|
|
|
|
|
|
RestoreSysInfo() = default;
|
2019-07-25 07:59:05 +08:00
|
|
|
explicit RestoreSysInfo(const std::map<UID, RestoreApplierInterface> appliers) : appliers(appliers) {}
|
2019-06-07 06:02:26 +08:00
|
|
|
|
|
|
|
template <class Ar>
|
|
|
|
void serialize(Ar& ar) {
|
|
|
|
serializer(ar, appliers);
|
|
|
|
}
|
|
|
|
};
|
|
|
|
|
|
|
|
struct RestoreWorkerInterface {
|
2019-07-26 01:46:11 +08:00
|
|
|
constexpr static FileIdentifier file_identifier = 99601798;
|
2019-06-07 06:02:26 +08:00
|
|
|
UID interfID;
|
|
|
|
|
|
|
|
RequestStream<RestoreSimpleRequest> heartbeat;
|
|
|
|
RequestStream<RestoreRecruitRoleRequest> recruitRole;
|
|
|
|
RequestStream<RestoreSimpleRequest> terminateWorker;
|
|
|
|
|
2019-08-02 08:00:13 +08:00
|
|
|
bool operator==(RestoreWorkerInterface const& r) const { return id() == r.id(); }
|
|
|
|
bool operator!=(RestoreWorkerInterface const& r) const { return id() != r.id(); }
|
2019-06-07 06:02:26 +08:00
|
|
|
|
2019-08-02 08:00:13 +08:00
|
|
|
UID id() const { return interfID; } // cmd.getEndpoint().token;
|
2019-06-07 06:02:26 +08:00
|
|
|
|
|
|
|
NetworkAddress address() const { return recruitRole.getEndpoint().addresses.address; }
|
|
|
|
|
|
|
|
void initEndpoints() {
|
2019-08-02 08:00:13 +08:00
|
|
|
heartbeat.getEndpoint(TaskPriority::LoadBalancedEndpoint);
|
|
|
|
recruitRole.getEndpoint(TaskPriority::LoadBalancedEndpoint); // Q: Why do we need this?
|
|
|
|
terminateWorker.getEndpoint(TaskPriority::LoadBalancedEndpoint);
|
2019-06-07 06:02:26 +08:00
|
|
|
|
2019-07-26 01:46:11 +08:00
|
|
|
interfID = deterministicRandom()->randomUniqueID();
|
2019-06-07 06:02:26 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
template <class Ar>
|
2019-08-02 08:00:13 +08:00
|
|
|
void serialize(Ar& ar) {
|
2019-07-25 07:59:05 +08:00
|
|
|
serializer(ar, interfID, heartbeat, recruitRole, terminateWorker);
|
2019-06-07 06:02:26 +08:00
|
|
|
}
|
|
|
|
};
|
|
|
|
|
|
|
|
struct RestoreRoleInterface {
|
2019-07-26 01:46:11 +08:00
|
|
|
constexpr static FileIdentifier file_identifier = 62531339;
|
2019-06-07 06:02:26 +08:00
|
|
|
UID nodeID;
|
|
|
|
RestoreRole role;
|
|
|
|
|
2019-08-02 08:00:13 +08:00
|
|
|
RestoreRoleInterface() { role = RestoreRole::Invalid; }
|
2019-06-07 06:02:26 +08:00
|
|
|
|
2019-08-02 08:00:13 +08:00
|
|
|
explicit RestoreRoleInterface(RestoreRoleInterface const& interf) : nodeID(interf.nodeID), role(interf.role){};
|
2019-06-07 06:02:26 +08:00
|
|
|
|
|
|
|
UID id() const { return nodeID; }
|
|
|
|
|
|
|
|
std::string toString() {
|
|
|
|
std::stringstream ss;
|
|
|
|
ss << "Role:" << getRoleStr(role) << " interfID:" << nodeID.toString();
|
|
|
|
return ss.str();
|
|
|
|
}
|
|
|
|
|
|
|
|
template <class Ar>
|
2019-08-02 08:00:13 +08:00
|
|
|
void serialize(Ar& ar) {
|
2019-06-07 06:02:26 +08:00
|
|
|
serializer(ar, nodeID, role);
|
|
|
|
}
|
|
|
|
};
|
|
|
|
|
|
|
|
struct RestoreLoaderInterface : RestoreRoleInterface {
|
2019-07-26 01:46:11 +08:00
|
|
|
constexpr static FileIdentifier file_identifier = 84244651;
|
|
|
|
|
2019-06-07 06:02:26 +08:00
|
|
|
RequestStream<RestoreSimpleRequest> heartbeat;
|
2019-07-25 07:59:05 +08:00
|
|
|
RequestStream<RestoreSysInfoRequest> updateRestoreSysInfo;
|
2019-06-07 06:02:26 +08:00
|
|
|
RequestStream<RestoreLoadFileRequest> loadFile;
|
2019-11-13 08:28:09 +08:00
|
|
|
RequestStream<RestoreSendMutationsToAppliersRequest> sendMutations;
|
2019-06-07 06:02:26 +08:00
|
|
|
RequestStream<RestoreVersionBatchRequest> initVersionBatch;
|
2019-11-13 08:28:09 +08:00
|
|
|
RequestStream<RestoreSimpleRequest> collectRestoreRoleInterfaces;
|
2019-06-07 06:02:26 +08:00
|
|
|
RequestStream<RestoreVersionBatchRequest> finishRestore;
|
|
|
|
|
2019-08-02 08:00:13 +08:00
|
|
|
bool operator==(RestoreWorkerInterface const& r) const { return id() == r.id(); }
|
|
|
|
bool operator!=(RestoreWorkerInterface const& r) const { return id() != r.id(); }
|
2019-06-07 06:02:26 +08:00
|
|
|
|
2019-08-02 08:00:13 +08:00
|
|
|
RestoreLoaderInterface() {
|
2019-06-07 06:02:26 +08:00
|
|
|
role = RestoreRole::Loader;
|
2019-07-26 01:46:11 +08:00
|
|
|
nodeID = deterministicRandom()->randomUniqueID();
|
2019-06-07 06:02:26 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
NetworkAddress address() const { return heartbeat.getEndpoint().addresses.address; }
|
|
|
|
|
|
|
|
void initEndpoints() {
|
2019-08-02 08:00:13 +08:00
|
|
|
heartbeat.getEndpoint(TaskPriority::LoadBalancedEndpoint);
|
|
|
|
updateRestoreSysInfo.getEndpoint(TaskPriority::LoadBalancedEndpoint);
|
|
|
|
loadFile.getEndpoint(TaskPriority::LoadBalancedEndpoint);
|
2019-11-13 08:28:09 +08:00
|
|
|
sendMutations.getEndpoint(TaskPriority::LoadBalancedEndpoint);
|
2019-08-02 08:00:13 +08:00
|
|
|
initVersionBatch.getEndpoint(TaskPriority::LoadBalancedEndpoint);
|
|
|
|
collectRestoreRoleInterfaces.getEndpoint(TaskPriority::LoadBalancedEndpoint);
|
|
|
|
finishRestore.getEndpoint(TaskPriority::LoadBalancedEndpoint);
|
2019-06-07 06:02:26 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
template <class Ar>
|
2019-08-02 08:00:13 +08:00
|
|
|
void serialize(Ar& ar) {
|
2019-11-13 09:17:00 +08:00
|
|
|
serializer(ar, *(RestoreRoleInterface*)this, heartbeat, updateRestoreSysInfo, loadFile, sendMutations,
|
|
|
|
initVersionBatch, collectRestoreRoleInterfaces, finishRestore);
|
2019-06-07 06:02:26 +08:00
|
|
|
}
|
|
|
|
};
|
|
|
|
|
|
|
|
struct RestoreApplierInterface : RestoreRoleInterface {
|
2019-07-26 01:46:11 +08:00
|
|
|
constexpr static FileIdentifier file_identifier = 54253048;
|
|
|
|
|
2019-06-07 06:02:26 +08:00
|
|
|
RequestStream<RestoreSimpleRequest> heartbeat;
|
2019-12-11 09:22:51 +08:00
|
|
|
RequestStream<RestoreSendVersionedMutationsRequest> sendMutationVector;
|
2019-06-07 06:02:26 +08:00
|
|
|
RequestStream<RestoreVersionBatchRequest> applyToDB;
|
|
|
|
RequestStream<RestoreVersionBatchRequest> initVersionBatch;
|
|
|
|
RequestStream<RestoreSimpleRequest> collectRestoreRoleInterfaces;
|
|
|
|
RequestStream<RestoreVersionBatchRequest> finishRestore;
|
|
|
|
|
2019-08-02 08:00:13 +08:00
|
|
|
bool operator==(RestoreWorkerInterface const& r) const { return id() == r.id(); }
|
|
|
|
bool operator!=(RestoreWorkerInterface const& r) const { return id() != r.id(); }
|
2019-06-07 06:02:26 +08:00
|
|
|
|
|
|
|
RestoreApplierInterface() {
|
|
|
|
role = RestoreRole::Applier;
|
2019-07-26 01:46:11 +08:00
|
|
|
nodeID = deterministicRandom()->randomUniqueID();
|
2019-06-07 06:02:26 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
NetworkAddress address() const { return heartbeat.getEndpoint().addresses.address; }
|
|
|
|
|
|
|
|
void initEndpoints() {
|
2019-08-02 08:00:13 +08:00
|
|
|
heartbeat.getEndpoint(TaskPriority::LoadBalancedEndpoint);
|
|
|
|
sendMutationVector.getEndpoint(TaskPriority::LoadBalancedEndpoint);
|
|
|
|
applyToDB.getEndpoint(TaskPriority::LoadBalancedEndpoint);
|
|
|
|
initVersionBatch.getEndpoint(TaskPriority::LoadBalancedEndpoint);
|
|
|
|
collectRestoreRoleInterfaces.getEndpoint(TaskPriority::LoadBalancedEndpoint);
|
|
|
|
finishRestore.getEndpoint(TaskPriority::LoadBalancedEndpoint);
|
2019-06-07 06:02:26 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
template <class Ar>
|
2019-08-02 08:00:13 +08:00
|
|
|
void serialize(Ar& ar) {
|
|
|
|
serializer(ar, *(RestoreRoleInterface*)this, heartbeat, sendMutationVector, applyToDB, initVersionBatch,
|
|
|
|
collectRestoreRoleInterfaces, finishRestore);
|
2019-06-07 06:02:26 +08:00
|
|
|
}
|
|
|
|
|
2019-08-02 08:00:13 +08:00
|
|
|
std::string toString() { return nodeID.toString(); }
|
2019-06-07 06:02:26 +08:00
|
|
|
};
|
|
|
|
|
2019-12-20 08:50:39 +08:00
|
|
|
// RestoreAsset uniquely identifies the work unit done by restore roles;
|
|
|
|
// It is used to ensure exact-once processing on restore loader and applier;
|
|
|
|
// By combining all RestoreAssets across all verstion batches, restore should process all mutations in
|
|
|
|
// backup range and log files up to the target restore version.
|
|
|
|
struct RestoreAsset {
|
|
|
|
Version beginVersion, endVersion; // Only use mutation in [begin, end) versions;
|
|
|
|
KeyRange range; // Only use mutations in range
|
|
|
|
|
|
|
|
int fileIndex;
|
2019-12-23 09:16:40 +08:00
|
|
|
std::string filename;
|
2019-12-20 08:50:39 +08:00
|
|
|
int64_t offset;
|
|
|
|
int64_t len;
|
|
|
|
|
2020-01-06 09:54:44 +08:00
|
|
|
UID uid;
|
|
|
|
|
2020-01-08 04:46:51 +08:00
|
|
|
RestoreAsset() = default;
|
2019-12-20 08:50:39 +08:00
|
|
|
|
|
|
|
bool operator==(const RestoreAsset& r) const {
|
2019-12-23 09:16:40 +08:00
|
|
|
return fileIndex == r.fileIndex && filename == r.filename && offset == r.offset && len == r.len &&
|
|
|
|
beginVersion == r.beginVersion && endVersion == r.endVersion && range == r.range;
|
2019-12-20 08:50:39 +08:00
|
|
|
}
|
|
|
|
bool operator!=(const RestoreAsset& r) const {
|
2019-12-23 09:16:40 +08:00
|
|
|
return fileIndex != r.fileIndex || filename != r.filename || offset != r.offset || len != r.len ||
|
|
|
|
beginVersion != r.beginVersion || endVersion != r.endVersion || range != r.range;
|
2019-12-20 08:50:39 +08:00
|
|
|
}
|
|
|
|
bool operator<(const RestoreAsset& r) const {
|
2019-12-23 09:16:40 +08:00
|
|
|
return std::make_tuple(fileIndex, filename, offset, len, beginVersion, endVersion, range.begin, range.end) <
|
|
|
|
std::make_tuple(r.fileIndex, r.filename, r.offset, r.len, r.beginVersion, r.endVersion, r.range.begin,
|
|
|
|
r.range.end);
|
2019-12-20 08:50:39 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
template <class Ar>
|
|
|
|
void serialize(Ar& ar) {
|
2020-01-06 09:54:44 +08:00
|
|
|
serializer(ar, beginVersion, endVersion, range, filename, fileIndex, offset, len, uid);
|
2019-12-20 08:50:39 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
std::string toString() {
|
|
|
|
std::stringstream ss;
|
2020-01-08 03:50:29 +08:00
|
|
|
ss << "UID:" << uid.toString() << " begin:" << beginVersion << " end:" << endVersion
|
|
|
|
<< " range:" << range.toString() << " filename:" << filename << " fileIndex:" << fileIndex
|
|
|
|
<< " offset:" << offset << " len:" << len;
|
2019-12-20 08:50:39 +08:00
|
|
|
return ss.str();
|
|
|
|
}
|
2019-12-23 09:16:40 +08:00
|
|
|
|
2020-01-06 09:54:44 +08:00
|
|
|
// RestoreAsset and VersionBatch both use endVersion as exclusive in version range
|
2019-12-23 09:16:40 +08:00
|
|
|
bool isInVersionRange(Version commitVersion) const {
|
|
|
|
return commitVersion >= beginVersion && commitVersion < endVersion;
|
|
|
|
}
|
2019-12-20 08:50:39 +08:00
|
|
|
};
|
|
|
|
|
2019-06-07 06:02:26 +08:00
|
|
|
struct LoadingParam {
|
2019-07-26 01:46:11 +08:00
|
|
|
constexpr static FileIdentifier file_identifier = 17023837;
|
|
|
|
|
2019-06-07 06:02:26 +08:00
|
|
|
bool isRangeFile;
|
|
|
|
Key url;
|
2020-01-10 03:31:27 +08:00
|
|
|
Optional<Version> rangeVersion; // range file's version
|
2019-12-20 08:50:39 +08:00
|
|
|
|
2019-06-07 06:02:26 +08:00
|
|
|
int64_t blockSize;
|
2019-12-20 08:50:39 +08:00
|
|
|
RestoreAsset asset;
|
2019-06-07 06:02:26 +08:00
|
|
|
|
2019-12-04 04:58:11 +08:00
|
|
|
LoadingParam() = default;
|
|
|
|
|
2019-06-07 06:02:26 +08:00
|
|
|
// TODO: Compare all fields for loadingParam
|
2019-12-20 08:50:39 +08:00
|
|
|
bool operator==(const LoadingParam& r) const { return isRangeFile == r.isRangeFile && asset == r.asset; }
|
|
|
|
bool operator!=(const LoadingParam& r) const { return isRangeFile != r.isRangeFile || asset != r.asset; }
|
2019-08-02 08:00:13 +08:00
|
|
|
bool operator<(const LoadingParam& r) const {
|
2019-12-20 08:50:39 +08:00
|
|
|
return (isRangeFile < r.isRangeFile) || (isRangeFile == r.isRangeFile && asset < r.asset);
|
2019-06-07 06:02:26 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
template <class Ar>
|
|
|
|
void serialize(Ar& ar) {
|
2020-01-08 04:46:51 +08:00
|
|
|
serializer(ar, isRangeFile, url, rangeVersion, blockSize, asset);
|
2019-06-07 06:02:26 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
std::string toString() {
|
|
|
|
std::stringstream str;
|
2020-01-08 04:46:51 +08:00
|
|
|
str << "isRangeFile:" << isRangeFile << " url:" << url.toString()
|
2020-01-10 03:31:27 +08:00
|
|
|
<< " rangeVersion:" << (rangeVersion.present() ? rangeVersion.get() : -1) << " blockSize:" << blockSize
|
|
|
|
<< " RestoreAsset:" << asset.toString();
|
2019-06-07 06:02:26 +08:00
|
|
|
return str.str();
|
|
|
|
}
|
|
|
|
};
|
|
|
|
|
|
|
|
struct RestoreRecruitRoleReply : TimedRequest {
|
2019-07-26 01:46:11 +08:00
|
|
|
constexpr static FileIdentifier file_identifier = 30310092;
|
|
|
|
|
2019-06-07 06:02:26 +08:00
|
|
|
UID id;
|
|
|
|
RestoreRole role;
|
|
|
|
Optional<RestoreLoaderInterface> loader;
|
|
|
|
Optional<RestoreApplierInterface> applier;
|
|
|
|
|
|
|
|
RestoreRecruitRoleReply() = default;
|
2019-08-02 08:00:13 +08:00
|
|
|
explicit RestoreRecruitRoleReply(UID id, RestoreRole role, RestoreLoaderInterface const& loader)
|
|
|
|
: id(id), role(role), loader(loader) {}
|
|
|
|
explicit RestoreRecruitRoleReply(UID id, RestoreRole role, RestoreApplierInterface const& applier)
|
|
|
|
: id(id), role(role), applier(applier) {}
|
2019-06-07 06:02:26 +08:00
|
|
|
|
2019-08-02 08:00:13 +08:00
|
|
|
template <class Ar>
|
|
|
|
void serialize(Ar& ar) {
|
2019-06-07 06:02:26 +08:00
|
|
|
serializer(ar, id, role, loader, applier);
|
|
|
|
}
|
|
|
|
|
|
|
|
std::string toString() {
|
|
|
|
std::stringstream ss;
|
|
|
|
ss << "roleInterf role:" << getRoleStr(role) << " replyID:" << id.toString();
|
|
|
|
if (loader.present()) {
|
2019-08-02 08:00:13 +08:00
|
|
|
ss << "loader:" << loader.get().toString();
|
2019-06-07 06:02:26 +08:00
|
|
|
}
|
|
|
|
if (applier.present()) {
|
|
|
|
ss << "applier:" << applier.get().toString();
|
|
|
|
}
|
2019-08-02 08:00:13 +08:00
|
|
|
|
2019-06-07 06:02:26 +08:00
|
|
|
return ss.str();
|
|
|
|
}
|
|
|
|
};
|
|
|
|
|
|
|
|
struct RestoreRecruitRoleRequest : TimedRequest {
|
2019-07-26 01:46:11 +08:00
|
|
|
constexpr static FileIdentifier file_identifier = 87022360;
|
|
|
|
|
2019-06-07 06:02:26 +08:00
|
|
|
RestoreRole role;
|
|
|
|
int nodeIndex; // Each role is a node
|
|
|
|
|
|
|
|
ReplyPromise<RestoreRecruitRoleReply> reply;
|
|
|
|
|
2019-08-02 08:00:13 +08:00
|
|
|
RestoreRecruitRoleRequest() : role(RestoreRole::Invalid) {}
|
|
|
|
explicit RestoreRecruitRoleRequest(RestoreRole role, int nodeIndex) : role(role), nodeIndex(nodeIndex) {}
|
2019-06-07 06:02:26 +08:00
|
|
|
|
2019-08-02 08:00:13 +08:00
|
|
|
template <class Ar>
|
|
|
|
void serialize(Ar& ar) {
|
2019-06-07 06:02:26 +08:00
|
|
|
serializer(ar, role, nodeIndex, reply);
|
|
|
|
}
|
|
|
|
|
|
|
|
std::string printable() {
|
|
|
|
std::stringstream ss;
|
2019-08-02 08:00:13 +08:00
|
|
|
ss << "RestoreRecruitRoleRequest Role:" << getRoleStr(role) << " NodeIndex:" << nodeIndex;
|
2019-06-07 06:02:26 +08:00
|
|
|
return ss.str();
|
|
|
|
}
|
|
|
|
|
2019-08-02 08:00:13 +08:00
|
|
|
std::string toString() { return printable(); }
|
2019-06-07 06:02:26 +08:00
|
|
|
};
|
|
|
|
|
|
|
|
struct RestoreSysInfoRequest : TimedRequest {
|
2019-07-26 01:46:11 +08:00
|
|
|
constexpr static FileIdentifier file_identifier = 75960741;
|
|
|
|
|
2019-06-07 06:02:26 +08:00
|
|
|
RestoreSysInfo sysInfo;
|
|
|
|
|
|
|
|
ReplyPromise<RestoreCommonReply> reply;
|
|
|
|
|
|
|
|
RestoreSysInfoRequest() = default;
|
|
|
|
explicit RestoreSysInfoRequest(RestoreSysInfo sysInfo) : sysInfo(sysInfo) {}
|
|
|
|
|
|
|
|
template <class Ar>
|
|
|
|
void serialize(Ar& ar) {
|
|
|
|
serializer(ar, sysInfo, reply);
|
|
|
|
}
|
|
|
|
|
|
|
|
std::string toString() {
|
|
|
|
std::stringstream ss;
|
2019-08-02 08:00:13 +08:00
|
|
|
ss << "RestoreSysInfoRequest";
|
2019-06-07 06:02:26 +08:00
|
|
|
return ss.str();
|
|
|
|
}
|
|
|
|
};
|
|
|
|
|
2019-12-03 06:33:31 +08:00
|
|
|
struct RestoreLoadFileReply : TimedRequest {
|
|
|
|
constexpr static FileIdentifier file_identifier = 34077902;
|
|
|
|
|
|
|
|
LoadingParam param;
|
2019-12-05 03:22:44 +08:00
|
|
|
MutationsVec samples; // sampled mutations
|
2019-12-03 06:33:31 +08:00
|
|
|
|
|
|
|
RestoreLoadFileReply() = default;
|
2019-12-05 03:22:44 +08:00
|
|
|
explicit RestoreLoadFileReply(LoadingParam param, MutationsVec samples) : param(param), samples(samples) {}
|
2019-12-03 06:33:31 +08:00
|
|
|
|
|
|
|
template <class Ar>
|
|
|
|
void serialize(Ar& ar) {
|
|
|
|
serializer(ar, param, samples);
|
|
|
|
}
|
|
|
|
|
|
|
|
std::string toString() {
|
|
|
|
std::stringstream ss;
|
2019-12-05 09:11:40 +08:00
|
|
|
ss << "LoadingParam:" << param.toString() << " samples.size:" << samples.size();
|
2019-12-03 06:33:31 +08:00
|
|
|
return ss.str();
|
|
|
|
}
|
|
|
|
};
|
|
|
|
|
2019-06-07 06:02:26 +08:00
|
|
|
// Sample_Range_File and Assign_Loader_Range_File, Assign_Loader_Log_File
|
|
|
|
struct RestoreLoadFileRequest : TimedRequest {
|
2019-07-26 01:46:11 +08:00
|
|
|
constexpr static FileIdentifier file_identifier = 26557364;
|
|
|
|
|
2019-06-07 06:02:26 +08:00
|
|
|
LoadingParam param;
|
|
|
|
|
2019-12-03 06:33:31 +08:00
|
|
|
ReplyPromise<RestoreLoadFileReply> reply;
|
2019-06-07 06:02:26 +08:00
|
|
|
|
|
|
|
RestoreLoadFileRequest() = default;
|
2019-12-21 14:24:32 +08:00
|
|
|
explicit RestoreLoadFileRequest(LoadingParam& param) : param(param){};
|
2019-06-07 06:02:26 +08:00
|
|
|
|
2019-08-02 08:00:13 +08:00
|
|
|
template <class Ar>
|
|
|
|
void serialize(Ar& ar) {
|
2019-06-07 06:02:26 +08:00
|
|
|
serializer(ar, param, reply);
|
|
|
|
}
|
|
|
|
|
|
|
|
std::string toString() {
|
|
|
|
std::stringstream ss;
|
2019-08-02 08:00:13 +08:00
|
|
|
ss << "RestoreLoadFileRequest param:" << param.toString();
|
2019-06-07 06:02:26 +08:00
|
|
|
return ss.str();
|
|
|
|
}
|
|
|
|
};
|
|
|
|
|
2019-11-13 08:28:09 +08:00
|
|
|
struct RestoreSendMutationsToAppliersRequest : TimedRequest {
|
|
|
|
constexpr static FileIdentifier file_identifier = 68827305;
|
|
|
|
|
|
|
|
std::map<Key, UID> rangeToApplier;
|
2019-11-13 10:23:14 +08:00
|
|
|
bool useRangeFile; // Send mutations parsed from range file?
|
2019-11-13 08:28:09 +08:00
|
|
|
|
|
|
|
ReplyPromise<RestoreCommonReply> reply;
|
|
|
|
|
|
|
|
RestoreSendMutationsToAppliersRequest() = default;
|
2019-11-13 10:23:14 +08:00
|
|
|
explicit RestoreSendMutationsToAppliersRequest(std::map<Key, UID> rangeToApplier, bool useRangeFile)
|
|
|
|
: rangeToApplier(rangeToApplier), useRangeFile(useRangeFile) {}
|
2019-11-13 08:28:09 +08:00
|
|
|
|
|
|
|
template <class Ar>
|
|
|
|
void serialize(Ar& ar) {
|
2019-11-13 10:23:14 +08:00
|
|
|
serializer(ar, rangeToApplier, useRangeFile, reply);
|
2019-11-13 08:28:09 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
std::string toString() {
|
|
|
|
std::stringstream ss;
|
2019-11-13 10:23:14 +08:00
|
|
|
ss << "RestoreSendMutationsToAppliersRequest keyToAppliers.size:" << rangeToApplier.size()
|
|
|
|
<< " useRangeFile:" << useRangeFile;
|
2019-11-13 08:28:09 +08:00
|
|
|
return ss.str();
|
|
|
|
}
|
|
|
|
};
|
|
|
|
|
2019-12-11 09:22:51 +08:00
|
|
|
struct RestoreSendVersionedMutationsRequest : TimedRequest {
|
2019-07-26 01:46:11 +08:00
|
|
|
constexpr static FileIdentifier file_identifier = 69764565;
|
|
|
|
|
2019-12-20 08:50:39 +08:00
|
|
|
RestoreAsset asset; // Unique identifier for the current restore asset
|
|
|
|
|
2019-06-07 06:02:26 +08:00
|
|
|
Version prevVersion, version; // version is the commitVersion of the mutation vector.
|
|
|
|
bool isRangeFile;
|
2019-12-05 09:11:40 +08:00
|
|
|
MutationsVec mutations; // All mutations at the same version parsed by one loader
|
2019-06-07 06:02:26 +08:00
|
|
|
|
|
|
|
ReplyPromise<RestoreCommonReply> reply;
|
|
|
|
|
2019-12-11 09:22:51 +08:00
|
|
|
RestoreSendVersionedMutationsRequest() = default;
|
2019-12-23 09:16:40 +08:00
|
|
|
explicit RestoreSendVersionedMutationsRequest(const RestoreAsset& asset, Version prevVersion, Version version,
|
2019-12-20 08:50:39 +08:00
|
|
|
bool isRangeFile, MutationsVec mutations)
|
|
|
|
: asset(asset), prevVersion(prevVersion), version(version), isRangeFile(isRangeFile), mutations(mutations) {}
|
2019-06-07 06:02:26 +08:00
|
|
|
|
|
|
|
std::string toString() {
|
|
|
|
std::stringstream ss;
|
2019-12-20 08:50:39 +08:00
|
|
|
ss << "RestoreAsset:" << asset.toString() << " prevVersion:" << prevVersion << " version:" << version
|
2019-10-17 11:30:11 +08:00
|
|
|
<< " isRangeFile:" << isRangeFile << " mutations.size:" << mutations.size();
|
2019-06-07 06:02:26 +08:00
|
|
|
return ss.str();
|
|
|
|
}
|
|
|
|
|
2019-08-02 08:00:13 +08:00
|
|
|
template <class Ar>
|
|
|
|
void serialize(Ar& ar) {
|
2019-12-20 08:50:39 +08:00
|
|
|
serializer(ar, asset, prevVersion, version, isRangeFile, mutations, reply);
|
2019-06-07 06:02:26 +08:00
|
|
|
}
|
|
|
|
};
|
|
|
|
|
|
|
|
struct RestoreVersionBatchRequest : TimedRequest {
|
2019-07-26 01:46:11 +08:00
|
|
|
constexpr static FileIdentifier file_identifier = 13018413;
|
|
|
|
|
2019-06-07 06:02:26 +08:00
|
|
|
int batchID;
|
|
|
|
|
|
|
|
ReplyPromise<RestoreCommonReply> reply;
|
|
|
|
|
|
|
|
RestoreVersionBatchRequest() = default;
|
|
|
|
explicit RestoreVersionBatchRequest(int batchID) : batchID(batchID) {}
|
|
|
|
|
2019-08-02 08:00:13 +08:00
|
|
|
template <class Ar>
|
|
|
|
void serialize(Ar& ar) {
|
2019-06-07 06:02:26 +08:00
|
|
|
serializer(ar, batchID, reply);
|
|
|
|
}
|
|
|
|
|
|
|
|
std::string toString() {
|
|
|
|
std::stringstream ss;
|
2019-08-02 08:00:13 +08:00
|
|
|
ss << "RestoreVersionBatchRequest BatchID:" << batchID;
|
2019-06-07 06:02:26 +08:00
|
|
|
return ss.str();
|
|
|
|
}
|
|
|
|
};
|
|
|
|
|
|
|
|
struct RestoreRequest {
|
2019-07-26 01:46:11 +08:00
|
|
|
constexpr static FileIdentifier file_identifier = 49589770;
|
|
|
|
|
2019-08-02 08:00:13 +08:00
|
|
|
// Database cx;
|
2019-06-07 06:02:26 +08:00
|
|
|
int index;
|
|
|
|
Key tagName;
|
|
|
|
Key url;
|
|
|
|
bool waitForComplete;
|
|
|
|
Version targetVersion;
|
|
|
|
bool verbose;
|
|
|
|
KeyRange range;
|
|
|
|
Key addPrefix;
|
|
|
|
Key removePrefix;
|
|
|
|
bool lockDB;
|
|
|
|
UID randomUid;
|
|
|
|
|
|
|
|
std::vector<int> restoreRequests;
|
2019-08-02 08:00:13 +08:00
|
|
|
// Key restoreTag;
|
2019-06-07 06:02:26 +08:00
|
|
|
|
2019-08-02 08:00:13 +08:00
|
|
|
ReplyPromise<struct RestoreCommonReply> reply;
|
2019-06-07 06:02:26 +08:00
|
|
|
|
2019-12-11 14:55:40 +08:00
|
|
|
RestoreRequest() = default;
|
2019-08-02 08:00:13 +08:00
|
|
|
explicit RestoreRequest(const int index, const Key& tagName, const Key& url, bool waitForComplete,
|
|
|
|
Version targetVersion, bool verbose, const KeyRange& range, const Key& addPrefix,
|
|
|
|
const Key& removePrefix, bool lockDB, const UID& randomUid)
|
|
|
|
: index(index), tagName(tagName), url(url), waitForComplete(waitForComplete), targetVersion(targetVersion),
|
|
|
|
verbose(verbose), range(range), addPrefix(addPrefix), removePrefix(removePrefix), lockDB(lockDB),
|
|
|
|
randomUid(randomUid) {}
|
2019-06-07 06:02:26 +08:00
|
|
|
|
|
|
|
template <class Ar>
|
|
|
|
void serialize(Ar& ar) {
|
2019-08-02 08:00:13 +08:00
|
|
|
serializer(ar, index, tagName, url, waitForComplete, targetVersion, verbose, range, addPrefix, removePrefix,
|
2019-12-11 14:55:40 +08:00
|
|
|
lockDB, randomUid, restoreRequests, reply);
|
2019-06-07 06:02:26 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
std::string toString() const {
|
|
|
|
std::stringstream ss;
|
2019-08-02 08:00:13 +08:00
|
|
|
ss << "index:" << std::to_string(index) << " tagName:" << tagName.contents().toString()
|
|
|
|
<< " url:" << url.contents().toString() << " waitForComplete:" << std::to_string(waitForComplete)
|
|
|
|
<< " targetVersion:" << std::to_string(targetVersion) << " verbose:" << std::to_string(verbose)
|
|
|
|
<< " range:" << range.toString() << " addPrefix:" << addPrefix.contents().toString()
|
|
|
|
<< " removePrefix:" << removePrefix.contents().toString() << " lockDB:" << std::to_string(lockDB)
|
|
|
|
<< " randomUid:" << randomUid.toString();
|
2019-06-07 06:02:26 +08:00
|
|
|
return ss.str();
|
|
|
|
}
|
|
|
|
};
|
|
|
|
|
|
|
|
std::string getRoleStr(RestoreRole role);
|
|
|
|
|
|
|
|
////--- Interface functions
|
2019-09-26 14:19:42 +08:00
|
|
|
ACTOR Future<Void> _restoreWorker(Database cx, LocalityData locality);
|
|
|
|
ACTOR Future<Void> restoreWorker(Reference<ClusterConnectionFile> ccf, LocalityData locality);
|
2019-06-07 06:02:26 +08:00
|
|
|
|
2019-09-26 14:19:42 +08:00
|
|
|
#include "flow/unactorcompiler.h"
|
|
|
|
#endif
|