final boolean isSyncFromOldVersion = message.type() == Type.REQUEST_2;
final KeyMap640Keys keysMap = message.keyMap640Keys(0);
final Map<Number640, Data> retVal = new HashMap<Number640, Data>();
for (Map.Entry<Number640, Collection<Number160>> entry : keysMap.keysMap().entrySet()) {
Data data = storageLayer.get(entry.getKey());
if(entry.getValue().size() != 1) {
continue;
}
if (data != null) {
// found, check if same
if (entry.getValue().iterator().next().equals(data.hash())) {
retVal.put(entry.getKey(), new Data().flag1());
LOG.debug("no sync required");
} else {
// get the checksums
// TODO: don't copy data, toBytes does a copy!
List<Checksum> checksums = RSync.checksums(data.toBytes(), blockSize);
AlternativeCompositeByteBuf abuf = AlternativeCompositeByteBuf.compBuffer();
DataBuffer dataBuffer = SyncUtils.encodeChecksum(checksums, entry.getKey().versionKey(), data.hash(), abuf);
retVal.put(entry.getKey(), new Data(dataBuffer));
LOG.debug("sync required hash = {}", data.hash());
}
} else {
if(isSyncFromOldVersion) {
//TODO: the client could send us his history to figure out what the latest version in this history is
Entry<Number640, Data> latest = storageLayer.
get(entry.getKey().minVersionKey(), entry.getKey().maxVersionKey(), 1, false).lastEntry();
// TODO: don't copy data, toBytes does a copy!
List<Checksum> checksums = RSync.checksums(latest.getValue().toBytes(), blockSize);
AlternativeCompositeByteBuf abuf = AlternativeCompositeByteBuf.compBuffer();
DataBuffer dataBuffer = SyncUtils.encodeChecksum(checksums, latest.getKey().versionKey(),
latest.getValue().hash(), abuf);
retVal.put(entry.getKey(), new Data(dataBuffer));
LOG.debug("sync required for version");
} else {
// not found
retVal.put(entry.getKey(), new Data().flag2());
LOG.debug("copy required, not found on this peer {}", entry.getKey());
}
}
}
responseMessage.setDataMap(new DataMap(retVal));