/* * TLogInterface.h * * 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. */ #ifndef FDBSERVER_TLOGINTERFACE_H #define FDBSERVER_TLOGINTERFACE_H #pragma once #include "fdbclient/FDBTypes.h" #include "fdbclient/CommitTransaction.h" #include "fdbclient/MutationList.h" #include "fdbclient/StorageServerInterface.h" #include struct TLogInterface { constexpr static FileIdentifier file_identifier = 16308510; enum { LocationAwareLoadBalance = 1 }; enum { AlwaysFresh = 1 }; LocalityData filteredLocality; UID uniqueID; UID sharedTLogID; RequestStream< struct TLogPeekRequest > peekMessages; RequestStream< struct TLogPopRequest > popMessages; RequestStream< struct TLogCommitRequest > commit; RequestStream< ReplyPromise< struct TLogLockResult > > lock; // first stage of database recovery RequestStream< struct TLogQueuingMetricsRequest > getQueuingMetrics; RequestStream< struct TLogConfirmRunningRequest > confirmRunning; // used for getReadVersion requests from client RequestStream> waitFailure; RequestStream< struct TLogRecoveryFinishedRequest > recoveryFinished; RequestStream< struct TLogDisablePopRequest> disablePopRequest; RequestStream< struct TLogEnablePopRequest> enablePopRequest; RequestStream< struct TLogSnapRequest> snapRequest; TLogInterface() {} explicit TLogInterface(const LocalityData& locality) : uniqueID( deterministicRandom()->randomUniqueID() ), filteredLocality(locality) { sharedTLogID = uniqueID; } TLogInterface(UID sharedTLogID, const LocalityData& locality) : uniqueID( deterministicRandom()->randomUniqueID() ), sharedTLogID(sharedTLogID), filteredLocality(locality) {} TLogInterface(UID uniqueID, UID sharedTLogID, const LocalityData& locality) : uniqueID(uniqueID), sharedTLogID(sharedTLogID), filteredLocality(locality) {} UID id() const { return uniqueID; } UID getSharedTLogID() const { return sharedTLogID; } std::string toString() const { return id().shortString(); } bool operator == ( TLogInterface const& r ) const { return id() == r.id(); } NetworkAddress address() const { return peekMessages.getEndpoint().getPrimaryAddress(); } Optional secondaryAddress() const { return peekMessages.getEndpoint().addresses.secondaryAddress; } void initEndpoints() { std::vector> streams; streams.push_back(peekMessages.getReceiver(TaskPriority::TLogPeek)); streams.push_back(popMessages.getReceiver(TaskPriority::TLogPop)); streams.push_back(commit.getReceiver(TaskPriority::TLogCommit)); streams.push_back(lock.getReceiver()); streams.push_back(getQueuingMetrics.getReceiver(TaskPriority::TLogQueuingMetrics)); streams.push_back(confirmRunning.getReceiver(TaskPriority::TLogConfirmRunning)); streams.push_back(waitFailure.getReceiver()); streams.push_back(recoveryFinished.getReceiver()); streams.push_back(disablePopRequest.getReceiver()); streams.push_back(enablePopRequest.getReceiver()); streams.push_back(snapRequest.getReceiver()); FlowTransport::transport().addEndpoints(streams); } template void serialize( Ar& ar ) { if constexpr (!is_fb_function) { ASSERT(ar.isDeserializing || uniqueID != UID()); } serializer(ar, uniqueID, sharedTLogID, filteredLocality, peekMessages); if( Ar::isDeserializing ) { popMessages = RequestStream< struct TLogPopRequest >( peekMessages.getEndpoint().getAdjustedEndpoint(1) ); commit = RequestStream< struct TLogCommitRequest >( peekMessages.getEndpoint().getAdjustedEndpoint(2) ); lock = RequestStream< ReplyPromise< struct TLogLockResult > >( peekMessages.getEndpoint().getAdjustedEndpoint(3) ); getQueuingMetrics = RequestStream< struct TLogQueuingMetricsRequest >( peekMessages.getEndpoint().getAdjustedEndpoint(4) ); confirmRunning = RequestStream< struct TLogConfirmRunningRequest >( peekMessages.getEndpoint().getAdjustedEndpoint(5) ); waitFailure = RequestStream< ReplyPromise >( peekMessages.getEndpoint().getAdjustedEndpoint(6) ); recoveryFinished = RequestStream< struct TLogRecoveryFinishedRequest >( peekMessages.getEndpoint().getAdjustedEndpoint(7) ); disablePopRequest = RequestStream< struct TLogDisablePopRequest >( peekMessages.getEndpoint().getAdjustedEndpoint(8) ); enablePopRequest = RequestStream< struct TLogEnablePopRequest >( peekMessages.getEndpoint().getAdjustedEndpoint(9) ); snapRequest = RequestStream< struct TLogSnapRequest >( peekMessages.getEndpoint().getAdjustedEndpoint(10) ); } } }; struct TLogRecoveryFinishedRequest { constexpr static FileIdentifier file_identifier = 8818668; ReplyPromise reply; TLogRecoveryFinishedRequest() {} template void serialize( Ar& ar ) { serializer(ar, reply); } }; struct TLogLockResult { constexpr static FileIdentifier file_identifier = 11822027; Version end; Version knownCommittedVersion; template void serialize( Ar& ar ) { serializer(ar, end, knownCommittedVersion); } }; struct TLogConfirmRunningRequest { constexpr static FileIdentifier file_identifier = 10929130; Optional debugID; ReplyPromise reply; TLogConfirmRunningRequest() {} TLogConfirmRunningRequest( Optional debugID ) : debugID(debugID) {} template void serialize( Ar& ar ) { serializer(ar, debugID, reply); } }; struct VersionUpdateRef { Version version; MutationListRef mutations; bool isPrivateData; VersionUpdateRef() : isPrivateData(false), version(invalidVersion) {} VersionUpdateRef( Arena& to, const VersionUpdateRef& from ) : version(from.version), mutations( to, from.mutations ), isPrivateData( from.isPrivateData ) {} int totalSize() const { return mutations.totalSize(); } int expectedSize() const { return mutations.expectedSize(); } template void serialize( Ar& ar ) { serializer(ar, version, mutations, isPrivateData); } }; struct VerUpdateRef { Version version; VectorRef mutations; bool isPrivateData; VerUpdateRef() : isPrivateData(false), version(invalidVersion) {} VerUpdateRef( Arena& to, const VerUpdateRef& from ) : version(from.version), mutations( to, from.mutations ), isPrivateData( from.isPrivateData ) {} int expectedSize() const { return mutations.expectedSize(); } template void serialize( Ar& ar ) { serializer(ar, version, mutations, isPrivateData); } }; struct TLogPeekReply { constexpr static FileIdentifier file_identifier = 11365689; Arena arena; StringRef messages; Version end; Optional popped; Version maxKnownVersion; Version minKnownCommittedVersion; Optional begin; bool onlySpilled = false; template void serialize(Ar& ar) { serializer(ar, arena, messages, end, popped, maxKnownVersion, minKnownCommittedVersion, begin, onlySpilled); } }; struct TLogPeekRequest { constexpr static FileIdentifier file_identifier = 11001131; Arena arena; Version begin; Tag tag; bool returnIfBlocked; bool onlySpilled; Optional> sequence; ReplyPromise reply; TLogPeekRequest( Version begin, Tag tag, bool returnIfBlocked, bool onlySpilled, Optional> sequence = Optional>() ) : begin(begin), tag(tag), returnIfBlocked(returnIfBlocked), sequence(sequence), onlySpilled(onlySpilled) {} TLogPeekRequest() {} template void serialize(Ar& ar) { serializer(ar, arena, begin, tag, returnIfBlocked, onlySpilled, sequence, reply); } }; struct TLogPopRequest { constexpr static FileIdentifier file_identifier = 5556423; Arena arena; Version to; Version durableKnownCommittedVersion; Tag tag; ReplyPromise reply; TLogPopRequest( Version to, Version durableKnownCommittedVersion, Tag tag ) : to(to), durableKnownCommittedVersion(durableKnownCommittedVersion), tag(tag) {} TLogPopRequest() {} template void serialize(Ar& ar) { serializer(ar, arena, to, durableKnownCommittedVersion, tag, reply); } }; struct TagMessagesRef { Tag tag; VectorRef messageOffsets; TagMessagesRef() {} TagMessagesRef(Arena &a, const TagMessagesRef &from) : tag(from.tag), messageOffsets(a, from.messageOffsets) {} size_t expectedSize() const { return messageOffsets.expectedSize(); } template void serialize(Ar& ar) { serializer(ar, tag, messageOffsets); } }; struct TLogCommitReply { constexpr static FileIdentifier file_identifier = 3; Version version; TLogCommitReply() = default; explicit TLogCommitReply(Version version) : version(version) {} template void serialize(Ar& ar) { serializer(ar, version); } }; struct TLogCommitRequest { constexpr static FileIdentifier file_identifier = 4022206; Arena arena; Version prevVersion, version, knownCommittedVersion, minKnownCommittedVersion; StringRef messages;// Each message prefixed by a 4-byte length ReplyPromise reply; Optional debugID; TLogCommitRequest() {} TLogCommitRequest( const Arena& a, Version prevVersion, Version version, Version knownCommittedVersion, Version minKnownCommittedVersion, StringRef messages, Optional debugID ) : arena(a), prevVersion(prevVersion), version(version), knownCommittedVersion(knownCommittedVersion), minKnownCommittedVersion(minKnownCommittedVersion), messages(messages), debugID(debugID) {} template void serialize( Ar& ar ) { serializer(ar, prevVersion, version, knownCommittedVersion, minKnownCommittedVersion, messages, reply, arena, debugID); } }; struct TLogQueuingMetricsReply { constexpr static FileIdentifier file_identifier = 12206626; double localTime; int64_t instanceID; // changes if bytesDurable and bytesInput reset int64_t bytesDurable, bytesInput; StorageBytes storageBytes; Version v; // committed version template void serialize(Ar& ar) { serializer(ar, localTime, instanceID, bytesDurable, bytesInput, storageBytes, v); } }; struct TLogQueuingMetricsRequest { constexpr static FileIdentifier file_identifier = 7798476; ReplyPromise reply; template void serialize(Ar& ar) { serializer(ar, reply); } }; struct TLogDisablePopRequest { constexpr static FileIdentifier file_identifier = 4022806; Arena arena; UID snapUID; ReplyPromise reply; Optional debugID; TLogDisablePopRequest() = default; TLogDisablePopRequest(const UID uid) : snapUID(uid) {} template void serialize(Ar& ar) { serializer(ar, snapUID, reply, arena, debugID); } }; struct TLogEnablePopRequest { constexpr static FileIdentifier file_identifier = 4022809; Arena arena; UID snapUID; ReplyPromise reply; Optional debugID; TLogEnablePopRequest() = default; TLogEnablePopRequest(const UID uid) : snapUID(uid) {} template void serialize(Ar& ar) { serializer(ar, snapUID, reply, arena, debugID); } }; struct TLogSnapRequest { constexpr static FileIdentifier file_identifier = 8184128; ReplyPromise reply; Arena arena; StringRef snapPayload; UID snapUID; StringRef role; TLogSnapRequest(StringRef snapPayload, UID snapUID, StringRef role) : snapPayload(snapPayload), snapUID(snapUID), role(role) {} TLogSnapRequest() = default; template void serialize(Ar& ar) { serializer(ar, reply, snapPayload, snapUID, role, arena); } }; #endif