root / src / Peers / Control.java
History | View | Annotate | Download (5.38 KB)
1 | 2 | up20160340 | 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 | } |