Project

General

Profile

Statistics
| Revision:

root / DistributedBackupService / src / protocols / Backup.java

History | View | Annotate | Download (2.13 KB)

1
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
}