Ratio implementation for client

pull/86/head
Louis Royer 5 years ago
parent c60fdedf80
commit f33b91dccd

@ -1,5 +1,7 @@
package clientP2P; package clientP2P;
import java.util.Map;
import java.util.HashMap;
import java.util.List; import java.util.List;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Arrays; import java.util.Arrays;
@ -24,6 +26,7 @@ import remoteException.ProtocolRemoteError;
import remoteException.NotFound; import remoteException.NotFound;
import remoteException.InternalRemoteError; import remoteException.InternalRemoteError;
import remoteException.NotATracker; import remoteException.NotATracker;
import remoteException.UnknownHost;
import protocolP2P.HashAlgorithm; import protocolP2P.HashAlgorithm;
import protocolP2P.HashResponse; import protocolP2P.HashResponse;
import protocolP2P.HashRequest; import protocolP2P.HashRequest;
@ -32,6 +35,7 @@ import protocolP2P.FilePart;
import protocolP2P.SizeRequest; import protocolP2P.SizeRequest;
import protocolP2P.SizeResponse; import protocolP2P.SizeResponse;
import protocolP2P.ProtocolP2PPacket; import protocolP2P.ProtocolP2PPacket;
import protocolP2P.UpdateRatio;
import clientP2P.ClientDownloadPart; import clientP2P.ClientDownloadPart;
import tools.HostItem; import tools.HostItem;
import tools.Logger; import tools.Logger;
@ -49,6 +53,7 @@ public abstract class ClientDownload extends ServeErrors implements Runnable {
protected String filename; protected String filename;
protected byte[] hash512; protected byte[] hash512;
protected List<ClientDownloadPart> sockList = new ArrayList<ClientDownloadPart>(); protected List<ClientDownloadPart> sockList = new ArrayList<ClientDownloadPart>();
protected Map<HostItem, Long> ratioUpdater = new HashMap<>();
protected List<Long> offsetsToAsk = new ArrayList<Long>(); protected List<Long> offsetsToAsk = new ArrayList<Long>();
protected List<Long> offsetsPending = new ArrayList<Long>(); protected List<Long> offsetsPending = new ArrayList<Long>();
protected boolean stop; protected boolean stop;
@ -59,6 +64,7 @@ public abstract class ClientDownload extends ServeErrors implements Runnable {
protected boolean success = false; protected boolean success = false;
protected Logger logger; protected Logger logger;
protected HostItem client; protected HostItem client;
protected HostItem tracker;
/** Constructor with parameters: filename, list of hosts, parts subdirectory and dirStorage /** Constructor with parameters: filename, list of hosts, parts subdirectory and dirStorage
* @param filename name of file to download * @param filename name of file to download
@ -67,14 +73,16 @@ public abstract class ClientDownload extends ServeErrors implements Runnable {
* @param dirStorage directory to write assembled file * @param dirStorage directory to write assembled file
* @param logger Logger * @param logger Logger
* @param client HostItem of the application * @param client HostItem of the application
* @param tracker HostItem of the tracker
*/ */
public ClientDownload(String filename, List<HostItem> hostList, String partsSubdir, String dirStorage, Logger logger, HostItem client) { public ClientDownload(String filename, List<HostItem> hostList, String partsSubdir, String dirStorage, Logger logger, HostItem client, HostItem tracker) {
this.partsSubdir = partsSubdir; this.partsSubdir = partsSubdir;
this.dirStorage = dirStorage; this.dirStorage = dirStorage;
this.filename = filename; this.filename = filename;
this.hostList = hostList; this.hostList = hostList;
this.logger = logger; this.logger = logger;
this.client = client; this.client = client;
this.tracker = tracker;
this.stop = false; this.stop = false;
} }
@ -165,6 +173,7 @@ public abstract class ClientDownload extends ServeErrors implements Runnable {
} catch (InterruptedException e) { } catch (InterruptedException e) {
throw new InternalError(); throw new InternalError();
} }
ratioUpdater.put(c.getServer(), c.getReceivedBytesCount());
} }
writeLog("Task check status: " + offsetsToAsk.size() + " to asks, " + offsetsPending.size() + " pending", LogLevel.Info); writeLog("Task check status: " + offsetsToAsk.size() + " to asks, " + offsetsPending.size() + " pending", LogLevel.Info);
if (offsetsToAsk.isEmpty() && offsetsPending.isEmpty()) { if (offsetsToAsk.isEmpty() && offsetsPending.isEmpty()) {
@ -180,6 +189,25 @@ public abstract class ClientDownload extends ServeErrors implements Runnable {
} }
} }
/** Send Ratio update to the tracker
*/
public void sendRatioUpdate() {
for(HostItem server: ratioUpdater.keySet()) {
Long r = ratioUpdater.get(server);
if (r != null) {
long rl = r.longValue();
if (rl != 0) {
try {
ProtocolP2PPacket<?> d = createProtocolP2PPacket(new UpdateRatio(client, server, rl));
d.sendRequest(getHostItemSocket(tracker));
} catch (Exception e) {
writeLog(e, LogLevel.Error);
}
}
}
}
}
/** Get hashsum from server. /** Get hashsum from server.
* @param hostItem server to ask hash * @param hostItem server to ask hash
* @return hash512sum * @return hash512sum
@ -350,7 +378,6 @@ public abstract class ClientDownload extends ServeErrors implements Runnable {
while(!stop) { while(!stop) {
assignTasks(); assignTasks();
checkTasksStatus(); checkTasksStatus();
} }
} }
writeLog("Reassembling file parts.", LogLevel.Info); writeLog("Reassembling file parts.", LogLevel.Info);

@ -35,6 +35,7 @@ import tools.HostItem;
* @version 1.0 * @version 1.0
*/ */
public abstract class ClientDownloadPart extends ServeErrors implements Runnable { public abstract class ClientDownloadPart extends ServeErrors implements Runnable {
protected long receivedBytesCount;
protected List<Long> toDoTasks; protected List<Long> toDoTasks;
protected List<Long> pendingTasks; protected List<Long> pendingTasks;
protected List<Long> tasksDone; protected List<Long> tasksDone;
@ -48,6 +49,7 @@ public abstract class ClientDownloadPart extends ServeErrors implements Runnable
protected ClientDownload manager; protected ClientDownload manager;
protected Logger logger; protected Logger logger;
protected HostItem client; protected HostItem client;
private HostItem server;
/** Constructor with filename, socket, and part subdir /** Constructor with filename, socket, and part subdir
* @param filename name of file to download * @param filename name of file to download
@ -55,13 +57,15 @@ public abstract class ClientDownloadPart extends ServeErrors implements Runnable
* @param partsSubdir directory to store .part files * @param partsSubdir directory to store .part files
* @param logger Logger * @param logger Logger
* @param client HostItem of the application * @param client HostItem of the application
* @param server HostItem of the server application
*/ */
public ClientDownloadPart(ClientDownload manager, String filename, String partsSubdir, Logger logger, HostItem client) { public ClientDownloadPart(ClientDownload manager, String filename, String partsSubdir, Logger logger, HostItem client, HostItem server) {
this.manager = manager; this.manager = manager;
this.partsSubdir = partsSubdir; this.partsSubdir = partsSubdir;
this.filename = filename; this.filename = filename;
this.logger = logger; this.logger = logger;
this.client = client; this.client = client;
this.server = server;
stop = false; stop = false;
failed = false; failed = false;
pendingTasks = new ArrayList<>(); pendingTasks = new ArrayList<>();
@ -69,6 +73,22 @@ public abstract class ClientDownloadPart extends ServeErrors implements Runnable
tasksDone = new ArrayList<>(); tasksDone = new ArrayList<>();
noTask = true; noTask = true;
tasksListsLock = false; tasksListsLock = false;
receivedBytesCount = 0;
}
/** receivedBytesCount getter
* @return receivedBytesCount
*/
public Long getReceivedBytesCount() {
return Long.valueOf(receivedBytesCount);
}
/** Server getter
* @return server
*/
public HostItem getServer() {
return server;
} }
/** True if thread has failed to get a file. /** True if thread has failed to get a file.
@ -271,8 +291,10 @@ public abstract class ClientDownloadPart extends ServeErrors implements Runnable
} }
Long offset = Long.valueOf(fp.getOffset()); Long offset = Long.valueOf(fp.getOffset());
if (pendingTasks.contains(offset)) { if (pendingTasks.contains(offset)) {
byte[] partialContent = fp.getPartialContent();
try { try {
Files.write(new File(partsSubdir + filename + "_" + offset + ".part").toPath(), fp.getPartialContent()); Files.write(new File(partsSubdir + filename + "_" + offset + ".part").toPath(), partialContent);
receivedBytesCount += partialContent.length;
} catch (IOException e) { } catch (IOException e) {
writeLog("cannot write file (" + partsSubdir + filename + "_" + offset + ".part)", LogLevel.Error); writeLog("cannot write file (" + partsSubdir + filename + "_" + offset + ".part)", LogLevel.Error);
} }

@ -44,9 +44,10 @@ public class ClientDownloadPartTCP extends ClientDownloadPart {
* @param partsSubdir directory to store .part files * @param partsSubdir directory to store .part files
* @param logger Logger * @param logger Logger
* @param client HostItem of the application * @param client HostItem of the application
* @param server HostItem of the server application
*/ */
public ClientDownloadPartTCP(ClientDownload manager, String filename, Socket socket, String partsSubdir, Logger logger, HostItem client) { public ClientDownloadPartTCP(ClientDownload manager, String filename, Socket socket, String partsSubdir, Logger logger, HostItem client, HostItem server) {
super(manager, filename, partsSubdir, logger, client); super(manager, filename, partsSubdir, logger, client, server);
this.socket = socket; this.socket = socket;
} }

@ -44,9 +44,10 @@ public class ClientDownloadPartUDP extends ClientDownloadPart {
* @param partsSubdir directory to store .part files * @param partsSubdir directory to store .part files
* @param logger Logger * @param logger Logger
* @param client HostItem of the application * @param client HostItem of the application
* @param server HostItem of the server application
*/ */
public ClientDownloadPartUDP(ClientDownload manager, String filename, DatagramSocket socket, String partsSubdir, Logger logger, HostItem client) { public ClientDownloadPartUDP(ClientDownload manager, String filename, DatagramSocket socket, String partsSubdir, Logger logger, HostItem client, HostItem server) {
super(manager, filename, partsSubdir, logger, client); super(manager, filename, partsSubdir, logger, client, server);
this.socket = socket; this.socket = socket;
} }

@ -51,16 +51,17 @@ public class ClientDownloadTCP extends ClientDownload {
* @param dirStorage directory to write assembled file * @param dirStorage directory to write assembled file
* @param logger Logger * @param logger Logger
* @param client HostItem of the application * @param client HostItem of the application
* @param tracker HostItem of the tracker
*/ */
public ClientDownloadTCP(String filename, List<HostItem> hostList, String partsSubdir, String dirStorage, Logger logger, HostItem client) { public ClientDownloadTCP(String filename, List<HostItem> hostList, String partsSubdir, String dirStorage, Logger logger, HostItem client, HostItem tracker) {
super(filename, hostList, partsSubdir, dirStorage, logger, client); super(filename, hostList, partsSubdir, dirStorage, logger, client, tracker);
} }
/** Create a clientDownloadPart /** Create a clientDownloadPart
* @param hostItem Hostitem of the server * @param hostItem Hostitem of the server
*/ */
protected ClientDownloadPart createDownloadPart(HostItem hostItem) { protected ClientDownloadPart createDownloadPart(HostItem hostItem) {
return (ClientDownloadPart)new ClientDownloadPartTCP((ClientDownload)this, filename, hostItem.getTCPSocket(), partsSubdir, logger, client); return (ClientDownloadPart)new ClientDownloadPartTCP((ClientDownload)this, filename, hostItem.getTCPSocket(), partsSubdir, logger, client, hostItem);
} }
/** Close HostItem socket /** Close HostItem socket

@ -51,16 +51,17 @@ public class ClientDownloadUDP extends ClientDownload {
* @param dirStorage directory to write assembled file * @param dirStorage directory to write assembled file
* @param logger Logger * @param logger Logger
* @param client HostItem of the application * @param client HostItem of the application
* @param tracker HostItem of the tracker
*/ */
public ClientDownloadUDP(String filename, List<HostItem> hostList, String partsSubdir, String dirStorage, Logger logger, HostItem client) { public ClientDownloadUDP(String filename, List<HostItem> hostList, String partsSubdir, String dirStorage, Logger logger, HostItem client, HostItem tracker) {
super(filename, hostList, partsSubdir, dirStorage, logger, client); super(filename, hostList, partsSubdir, dirStorage, logger, client, tracker);
} }
/** Create a clientDownloadPart /** Create a clientDownloadPart
* @param hostItem Hostitem of the server * @param hostItem Hostitem of the server
*/ */
protected ClientDownloadPart createDownloadPart(HostItem hostItem) { protected ClientDownloadPart createDownloadPart(HostItem hostItem) {
return (ClientDownloadPart)new ClientDownloadPartUDP((ClientDownload)this, filename, hostItem.getUDPSocket(), partsSubdir, logger, client); return (ClientDownloadPart)new ClientDownloadPartUDP((ClientDownload)this, filename, hostItem.getUDPSocket(), partsSubdir, logger, client, tracker);
} }
/** Implementation of writeLog /** Implementation of writeLog

@ -210,6 +210,8 @@ public abstract class ClientManagement extends ServeErrors implements Runnable {
line += "\n"; line += "\n";
writeLog(line, LogLevel.Info); writeLog(line, LogLevel.Info);
throw new InternalError(); throw new InternalError();
} else {
downLoader.sendRatioUpdate();
} }
} else { } else {
throw new InternalError(); throw new InternalError();

@ -34,7 +34,7 @@ public class ClientManagementTCP extends ClientManagement {
* @param filename Name of the file to download * @param filename Name of the file to download
*/ */
protected void initDownloader(String filename) { protected void initDownloader(String filename) {
downLoader = (ClientDownload) new ClientDownloadTCP(filename, hostList, partsSubdir, baseDirectory, logger, client); downLoader = (ClientDownload) new ClientDownloadTCP(filename, hostList, partsSubdir, baseDirectory, logger, client, tracker);
} }

@ -33,7 +33,7 @@ public class ClientManagementUDP extends ClientManagement {
* @param filename Name of the file to download * @param filename Name of the file to download
*/ */
protected void initDownloader(String filename) { protected void initDownloader(String filename) {
downLoader = (ClientDownload) new ClientDownloadUDP(filename, hostList, partsSubdir, baseDirectory, logger, client); downLoader = (ClientDownload) new ClientDownloadUDP(filename, hostList, partsSubdir, baseDirectory, logger, client, tracker);
} }
/** Implementation of writeLog /** Implementation of writeLog

@ -170,6 +170,7 @@ public abstract class TrackerManagement extends ServeErrors implements Runnable
HostItem updateRatioServer = updateRatio.getServer(); HostItem updateRatioServer = updateRatio.getServer();
HostItem updateRatioClient = updateRatio.getClient(); HostItem updateRatioClient = updateRatio.getClient();
long ratioSize = updateRatio.getDataSize(); long ratioSize = updateRatio.getDataSize();
writeLog("Ratio += " + ratioSize + ", client: " + updateRatioClient + " / server: " + updateRatioServer, LogLevel.Debug);
if (!ratioDown.containsKey(updateRatioClient) || ! ratioUp.containsKey(updateRatioServer)) { if (!ratioDown.containsKey(updateRatioClient) || ! ratioUp.containsKey(updateRatioServer)) {
sendUnknownHost(pd); sendUnknownHost(pd);
} else { } else {

Loading…
Cancel
Save