root / src / Peers / Control.java @ 2
History | View | Annotate | Download (5.38 KB)
1 |
package Peers; |
---|---|
2 |
|
3 |
import Message.*; |
4 |
import Storage.Chunk; |
5 |
|
6 |
import java.io.Serializable; |
7 |
import java.util.*; |
8 |
import java.util.concurrent.ConcurrentHashMap; |
9 |
import java.util.concurrent.ConcurrentSkipListSet; |
10 |
import java.util.concurrent.TimeUnit; |
11 |
|
12 |
|
13 |
public class Control implements Serializable { |
14 |
|
15 |
// chunkNo + fileid, nÂș of stored
|
16 |
ConcurrentHashMap<String, Integer> storedMessages = new ConcurrentHashMap<>(); |
17 |
|
18 |
//i have saved
|
19 |
ConcurrentHashMap<String, Chunk> repDegrees = new ConcurrentHashMap<>(); |
20 |
|
21 |
ConcurrentHashMap<String, ConcurrentSkipListSet<Chunk>> restoredChunks = new ConcurrentHashMap<>(); |
22 |
|
23 |
|
24 |
ConcurrentHashMap<String, String> backedUpFiles = new ConcurrentHashMap<>(); |
25 |
|
26 |
private Peer peer;
|
27 |
|
28 |
Control(Peer peer) {
|
29 |
this.peer = peer;
|
30 |
} |
31 |
|
32 |
|
33 |
public void putchunkControl(Message message) { |
34 |
if (message.getSenderId() == peer.getId())
|
35 |
return;
|
36 |
|
37 |
try {
|
38 |
|
39 |
Integer a = storedMessages.get(message.getChunkNo().toString() + ";" + message.getFileID()); |
40 |
|
41 |
if (a == null) |
42 |
a = 0;
|
43 |
|
44 |
if (a < message.getRepDegree()) {
|
45 |
Chunk c = new Chunk(message.getChunkNo(), message.getBody(), message.getSenderId(), message.getFileID(),
|
46 |
message.getRepDegree()); |
47 |
if (!peer.getStorage().saveChunk(new Chunk(message.getChunkNo(), message.getBody(), |
48 |
message.getSenderId(), message.getFileID(), message.getRepDegree()), message.getFileID())) |
49 |
return;
|
50 |
repDegrees.put(message.getChunkNo().toString() + ";" + message.getFileID(), c);
|
51 |
Message answer = new StoredMsg(message.getVersion(), peer.getId(), message.getFileID(), message.getChunkNo());
|
52 |
peer.getMc_channel().send(answer); |
53 |
} else return; |
54 |
|
55 |
} catch (Exception e) { |
56 |
|
57 |
// e.printStackTrace();
|
58 |
} |
59 |
|
60 |
} |
61 |
|
62 |
public void getchunkControl(Message message) { |
63 |
|
64 |
if (message.getSenderId() == peer.getId()) {
|
65 |
return;
|
66 |
} |
67 |
|
68 |
|
69 |
HashMap<String, byte[]> chunksInfo = peer.getStorage().getChunks(message.getFileID()); |
70 |
Set<String> key = chunksInfo.keySet(); |
71 |
|
72 |
for (String i : key) { |
73 |
peer.getThreadPool().schedule(() -> { |
74 |
|
75 |
Message ms = new ChunkMsg(message.getVersion(), peer.getId(), message.getFileID(),
|
76 |
Integer.parseInt(i), chunksInfo.get(i));
|
77 |
|
78 |
Chunk tmp = new Chunk(Integer.parseInt(i), chunksInfo.get(i), peer.getId(), message.getFileID()); |
79 |
|
80 |
if (!receivedChunk(message.getFileID(), tmp)) {
|
81 |
peer.getMdr_channel().send(ms); |
82 |
} |
83 |
|
84 |
|
85 |
}, (long) (Math.random() * 400), TimeUnit.MILLISECONDS); |
86 |
|
87 |
|
88 |
} |
89 |
|
90 |
} |
91 |
|
92 |
public void chunkControl(Message message) { |
93 |
if (message.getSenderId() == peer.getId())
|
94 |
return;
|
95 |
|
96 |
try {
|
97 |
Chunk c = new Chunk(message.getChunkNo(), message.getBody(), message.getSenderId(), message.getFileID());
|
98 |
if (!receivedChunk(message.getFileID(), c)) {
|
99 |
|
100 |
|
101 |
if (restoredChunks.get(message.getFileID()) != null) { |
102 |
ConcurrentSkipListSet<Chunk> a = restoredChunks.get(message.getFileID()); |
103 |
a.add(c); |
104 |
restoredChunks.put(message.getFileID(), a); |
105 |
|
106 |
} else {
|
107 |
ConcurrentSkipListSet<Chunk> b = new ConcurrentSkipListSet<Chunk>();
|
108 |
b.add(c); |
109 |
restoredChunks.put(message.getFileID(), b); |
110 |
} |
111 |
} |
112 |
} catch (Exception e) { |
113 |
//e.printStackTrace();
|
114 |
} |
115 |
} |
116 |
|
117 |
public void removedControl(Message message) { |
118 |
|
119 |
|
120 |
} |
121 |
|
122 |
public void deleteControl(Message message) { |
123 |
peer.getStorage().delete(message.getFileID()); |
124 |
storedMessages.remove(message.getFileID()); |
125 |
repDegrees.remove(message.getFileID()); |
126 |
} |
127 |
|
128 |
|
129 |
public void storedControl(Message message) { |
130 |
if (message.getSenderId() == peer.getId()) {
|
131 |
return;
|
132 |
} |
133 |
|
134 |
String key = message.getChunkNo().toString() + ";" + message.getFileID(); |
135 |
|
136 |
if (storedMessages.contains(key)) {
|
137 |
Integer value = storedMessages.remove(key);
|
138 |
storedMessages.put(message.getChunkNo().toString() + ";" + message.getFileID(), value + 1); |
139 |
} else {
|
140 |
storedMessages.put(key, 1);
|
141 |
} |
142 |
} |
143 |
|
144 |
public ConcurrentHashMap<String, Integer> getStoredMessages() { |
145 |
return storedMessages;
|
146 |
} |
147 |
|
148 |
public ConcurrentHashMap<String, ConcurrentSkipListSet<Chunk>> getRestoredChunks() { |
149 |
return restoredChunks;
|
150 |
} |
151 |
|
152 |
private boolean receivedChunk(String fileId, Chunk chunkNo) { |
153 |
if (restoredChunks.get(fileId) != null) |
154 |
return restoredChunks.get(fileId).contains(chunkNo);
|
155 |
else
|
156 |
return false; |
157 |
} |
158 |
|
159 |
public void reduceChunks(long reclaimed) { |
160 |
|
161 |
ArrayList<Chunk> tmpChunks = new ArrayList<>(); |
162 |
Chunk tmpChunk; |
163 |
int lowestRep = 1; |
164 |
|
165 |
for (Chunk i : repDegrees.values()) {
|
166 |
if (i.getRepDegree() >= lowestRep && i.getRepDegree() > 1) { |
167 |
lowestRep = i.getId(); |
168 |
tmpChunk = i; |
169 |
if (i.getInfo().length >= reclaimed)
|
170 |
tmpChunks.add(i); |
171 |
} |
172 |
} |
173 |
|
174 |
|
175 |
} |
176 |
|
177 |
public ConcurrentHashMap<String, String> getBackedUpFiles() { |
178 |
return backedUpFiles;
|
179 |
} |
180 |
|
181 |
} |