-
Notifications
You must be signed in to change notification settings - Fork 1
/
MP2Node.h
122 lines (105 loc) · 3.09 KB
/
MP2Node.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
/**********************************
* FILE NAME: MP2Node.h
*
* DESCRIPTION: MP2Node class header file
**********************************/
#ifndef MP2NODE_H_
#define MP2NODE_H_
/**
* Header files
*/
#include "stdincludes.h"
#include "EmulNet.h"
#include "Node.h"
#include "HashTable.h"
#include "Log.h"
#include "Params.h"
#include "Message.h"
#include "Queue.h"
const int STABLE = -1;
class transaction {
private:
int id;
int timestamp;
public:
transaction(int trans_id, int timestamp, MessageType mType, string key, string value);
int replyCount;
int successCount;
string key;
string value;
MessageType mType;
int getTime(){ return timestamp;};
};
/**
* CLASS NAME: MP2Node
*
* DESCRIPTION: This class encapsulates all the key-value store functionality
* including:
* 1) Ring
* 2) Stabilization Protocol
* 3) Server side CRUD APIs
* 4) Client side CRUD APIs
*/
class MP2Node {
private:
// Vector holding the next two neighbors in the ring who have my replicas
vector<Node> hasMyReplicas;
// Vector holding the previous two neighbors in the ring whose replicas I have
vector<Node> haveReplicasOf;
// Ring
vector<Node> ring;
// Hash Table
HashTable * ht;
// Member representing this member
Member *memberNode;
// Params object
Params *par;
// Object of EmulNet
EmulNet * emulNet;
// Object of Log
Log * log;
// Transactions
map<int, transaction*> transMap;
// <trans_id, success>
map<int, bool> transComplete;
public:
MP2Node(Member *memberNode, Params *par, EmulNet *emulNet, Log *log, Address *addressOfMember);
Member * getMemberNode() {
return this->memberNode;
}
// ring functionalities
void updateRing();
vector<Node> getMembershipList();
size_t hashFunction(string key);
void findNeighbors();
// client side CRUD APIs
void clientCreate(string key, string value);
void clientRead(string key);
void clientUpdate(string key, string value);
void clientDelete(string key);
// receive messages from Emulnet
bool recvLoop();
static int enqueueWrapper(void *env, char *buff, int size);
// handle messages from receiving queue
void checkMessages();
// coordinator dispatches messages to corresponding nodes
void dispatchMessages(Message message);
// find the addresses of nodes that are responsible for a key
vector<Node> findNodes(string key);
// server
bool createKeyValue(string key, string value, ReplicaType replica, int transID);
string readKey(string key, int transID);
bool updateKeyValue(string key, string value, ReplicaType replica, int transID);
bool deletekey(string key, int transID);
// stabilization protocol - handle multiple failures
void stabilizationProtocol();
// My function
Message constructMsg(MessageType mType, string key, string value = "", bool success = false);
void createTransaction(int trans_id, MessageType mType, string key, string value);
void sendreply(string key, MessageType mType, bool success, Address* fromaddr, int transID, string content = "");
void checkTransMap();
void logOperation(transaction* t, bool isCoordinator, bool success, int transID);
// Destructor
~MP2Node();
};
#endif /* MP2NODE_H_ */