Project

General

Profile

Statistics
| Revision:

root / DistributedBackupService / src / protocols / Backup.java

History | View | Annotate | Download (2.13 KB)

1 1 up20130859
package protocols;
2
3
import server.Peer;
4
import sockets.Socket;
5
import utils.Utils;
6
7
import java.io.IOException;
8
import java.util.Random;
9
import java.util.concurrent.TimeUnit;
10
11
import chunk.Chunk;
12
import handlers.Message;
13
14
import static chunk.FolderManager.makeDir;
15
import static chunk.FolderManager.backupFile;
16
17
public class Backup implements Runnable {
18
19
    private Peer peer;
20
    private Message req;
21
22
    private byte[] data;
23
    private int replication;
24
    private String fileID;
25
    private int chunkNo;
26
    private String version;
27
    private int senderID;
28
    private static int delayLimit;
29
30
    public Backup(Peer peer, Message req) {
31
        this.peer = peer;
32
        this.req = req;
33
34
        System.out.println("BACKUP begins!");
35
    }
36
37
38
    @Override
39
    public void run() {
40
41
        version = req.getVersion();
42
        senderID = req.getSenderID();
43
        fileID = req.getFileID();
44
        chunkNo = req.getChunkNo();
45
        replication = req.getReplicationDegree();
46
        delayLimit = 300;
47
48
        if (senderID == peer.getID()) {
49
                System.out.println("Ignoring backup of own files");
50
            return;
51
        }
52
53
        data = req.getBody();
54
55
        String chunkPathname = peer.getPath("chunks") + "/" + fileID;
56
57
        makeDir(peer.getPath("chunks") + "/" + fileID);
58
59
        boolean success = false;
60
        try {
61
            success = backupFile(Integer.toString(chunkNo), chunkPathname, data);
62
            //save to database
63
            peer.addChunkToFileManager(new Chunk(fileID, chunkNo, replication, data.length));
64
        } catch (IOException e) {
65
            e.printStackTrace();
66
        }
67
68
        if (! success) {
69
                System.out.println("Memory overflow");
70
        } else {
71
            sendMsgStored();
72
        }
73
74
        System.out.println("Finished backup!");
75
    }
76
77
    private void sendMsgStored() {
78
        String[] args = {version, Integer.toString(peer.getID()),fileID, Integer.toString(chunkNo)};
79
80
        Message msg = new Message(Utils.MessageType.STORED, args);
81
82
        Random random = new Random();
83
        peer.sendLateMsg(Socket.SocketType.MC, msg, random.nextInt(delayLimit + 1), TimeUnit.MILLISECONDS);
84
    }
85
}