static final int MAX_TRANSFERS_PER_PEER = 2;
public void handleFetchDependency(Message m, final PeerNode source) {
File data;
final ShortBuffer buf = (ShortBuffer)m.getObject(DMT.EXPECTED_HASH);
long length = m.getLong(DMT.FILE_LENGTH);
long uid = m.getLong(DMT.UID);
synchronized(dependencies) {
data = dependencies.get(buf);
}
boolean fail = !incrementDependencies(source);
FileRandomAccessBuffer raf;
final BulkTransmitter bt;
try {
if(data != null)
raf = new FileRandomAccessBuffer(data, true);
else {
Logger.error(this, "Dependency with hash "+HexUtil.bytesToHex(buf.getData())+" not found!");
fail = true;
raf = null;
}
} catch(IOException e) {
Logger.error(this, "Peer " + source + " asked us for the dependency with hash "+HexUtil.bytesToHex(buf.getData())+" jar, we have downloaded it but " +
(e instanceof FileNotFoundException ? "don't have the file" : "can't read the file")+
" even though we did have it when we checked!: " + e, e);
raf = null;
fail = true;
}
PartiallyReceivedBulk prb;
if(raf != null) {
long thisLength = raf.size();
prb = new PartiallyReceivedBulk(updateManager.node.getUSM(), thisLength,
Node.PACKET_SIZE, raf, true);
if(length != thisLength) {
fail = true;
}
} else {
prb = new PartiallyReceivedBulk(updateManager.node.getUSM(), 0,
Node.PACKET_SIZE, new ByteArrayRandomAccessBuffer(new byte[0]), true);
fail = true;
}
try {
bt = new BulkTransmitter(prb, source, uid, false, updateManager.ctr, true);
} catch(DisconnectedException e) {
Logger.error(this, "Peer " + source + " asked us for the dependency with hash "+HexUtil.bytesToHex(buf.getData())+" jar then disconnected", e);
raf.close();
decrementDependencies(source);
return;
}
if(fail) {
cancelSend(source, uid);
decrementDependencies(source);
} else {
final FileRandomAccessBuffer r = raf;
updateManager.node.executor.execute(new Runnable() {
@Override
public void run() {
source.incrementUOMSends();
try {
bt.send();
} catch (DisconnectedException e) {
Logger.normal(this, "Disconnected while sending dependency with hash "+HexUtil.bytesToHex(buf.getData())+" to "+source);
} finally {
source.decrementUOMSends();
decrementDependencies(source);
r.close();
}