1 /*
2  * Copyright (c) 2021 Huawei Device Co., Ltd.
3  * Licensed under the Apache License, Version 2.0 (the "License");
4  * you may not use this file except in compliance with the License.
5  * You may obtain a copy of the License at
6  *
7  *     http://www.apache.org/licenses/LICENSE-2.0
8  *
9  * Unless required by applicable law or agreed to in writing, software
10  * distributed under the License is distributed on an "AS IS" BASIS,
11  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12  * See the License for the specific language governing permissions and
13  * limitations under the License.
14  */
15 
16 #ifndef COMMIT_HISTORY_SYNC_H
17 #define COMMIT_HISTORY_SYNC_H
18 
19 #ifndef OMIT_MULTI_VER
20 #include <map>
21 #include <vector>
22 
23 #include "icommunicator.h"
24 #include "multi_ver_kvdb_sync_interface.h"
25 #include "multi_ver_sync_task_context.h"
26 #include "sync_types.h"
27 #include "version.h"
28 
29 namespace DistributedDB {
30 class CommitHistorySyncRequestPacket {
31 public:
CommitHistorySyncRequestPacket()32     CommitHistorySyncRequestPacket() {};
~CommitHistorySyncRequestPacket()33     ~CommitHistorySyncRequestPacket() {};
34 
35     uint32_t CalculateLen() const;
36 
37     void SetCommitMap(std::map<std::string, MultiVerCommitNode> &inMap);
38 
39     void GetCommitMap(std::map<std::string, MultiVerCommitNode> &outMap) const;
40 
41     void SetVersion(uint32_t version);
42 
43     uint32_t GetVersion() const;
44 
45     void SetReserved(std::vector<uint64_t> &reserved);
46 
47     std::vector<uint64_t> GetReserved() const;
48 
49 private:
50     std::map<std::string, MultiVerCommitNode> commitMap_;
51     uint32_t version_ = SOFTWARE_VERSION_CURRENT;
52     std::vector<uint64_t> reserved_;
53 };
54 
55 class CommitHistorySyncAckPacket {
56 public:
CommitHistorySyncAckPacket()57     CommitHistorySyncAckPacket() : errorCode_(0) {};
~CommitHistorySyncAckPacket()58     ~CommitHistorySyncAckPacket() {};
59 
60     uint32_t CalculateLen() const;
61 
62     void SetData(std::vector<MultiVerCommitNode> &inData);
63 
64     void GetData(std::vector<MultiVerCommitNode> &outData) const;
65 
66     void SetErrorCode(int32_t errCode);
67 
68     void GetErrorCode(int32_t &errCode) const;
69 
70     void SetVersion(uint32_t version);
71 
72     uint32_t GetVersion() const;
73 
74     void SetReserved(std::vector<uint64_t> &reserved);
75 
76     std::vector<uint64_t> GetReserved() const;
77 
78 private:
79     int32_t errorCode_;
80     uint32_t version_ = SOFTWARE_VERSION_CURRENT;
81     std::vector<MultiVerCommitNode> commits_;
82     std::vector<uint64_t> reserved_;
83 };
84 
85 class CommitHistorySync {
86 public:
CommitHistorySync()87     CommitHistorySync() : storagePtr_(nullptr), communicateHandle_(nullptr) {};
88     ~CommitHistorySync();
89     DISABLE_COPY_ASSIGN_MOVE(CommitHistorySync);
90 
91     static int RegisterTransformFunc();
92 
93     int Initialize(MultiVerKvDBSyncInterface *storagePtr, ICommunicator *communicateHandle);
94 
95     static int Serialization(uint8_t *buffer, uint32_t length, const Message *inMsg);
96 
97     static int DeSerialization(const uint8_t *buffer, uint32_t length, Message *inMsg);
98 
99     static uint32_t CalculateLen(const Message *inMsg);
100 
101     void TimeOutCallback(MultiVerSyncTaskContext *context, const Message *message) const;
102 
103     int SyncStart(MultiVerSyncTaskContext *context);
104 
105     int RequestRecvCallback(const MultiVerSyncTaskContext *context, const Message *message);
106 
107     int AckRecvCallback(MultiVerSyncTaskContext *context, const Message *message);
108 
109 private:
110     static int RequestPacketCalculateLen(const Message *inMsg, uint32_t &len);
111 
112     static int RequestPacketSerialization(uint8_t *buffer, uint32_t length, const Message *inMsg);
113 
114     static int RequestPacketDeSerialization(const uint8_t *buffer, uint32_t length, Message *inMsg);
115 
116     static int AckPacketCalculateLen(const Message *inMsg, uint32_t &len);
117 
118     static int AckPacketSerialization(uint8_t *buffer, uint32_t length, const Message *inMsg);
119 
120     static int AckPacketDeSerialization(const uint8_t *buffer, uint32_t length, Message *inMsg);
121 
122     static bool IsPacketValid(const Message *inMsg, uint16_t messageType);
123 
124     int Send(const DeviceID &deviceId, const Message *inMsg);
125 
126     int GetDeviceLatestCommit(std::map<std::string, MultiVerCommitNode> &);
127 
128     int GetCommitTree(const std::map<std::string, MultiVerCommitNode> &, std::vector<MultiVerCommitNode> &);
129 
130     int SendRequestPacket(const MultiVerSyncTaskContext *context,
131         std::map<std::string, MultiVerCommitNode> &commitMap);
132 
133     int SendAckPacket(const MultiVerSyncTaskContext *context, std::vector<MultiVerCommitNode> &commits,
134         int ackCode, const Message *message);
135 
136     int GetLocalDeviceInfo(std::string &deviceInfo);
137 
138     int RunPermissionCheck(const std::string &deviceId) const;
139 
140     MultiVerKvDBSyncInterface *storagePtr_;
141     ICommunicator *communicateHandle_;
142 };
143 }  // namespace DistributedDB
144 
145 #endif
146 #endif