package com.scoopit.weedfs.benchmark;
import java.io.InputStream;
import java.security.MessageDigest;
import java.util.List;
import akka.actor.ActorRef;
import akka.actor.Props;
import akka.actor.UntypedActor;
import com.scoopit.weedfs.client.Location;
import com.scoopit.weedfs.client.WeedFSClient;
import com.scoopit.weedfs.client.WeedFSClientBuilder;
import com.scoopit.weedfs.client.WeedFSFile;
public class ReadAndCheckFile extends UntypedActor {
final ActorRef statsActor;
public static Props mkProps(ActorRef statsActor) {
return Props.create(ReadAndCheckFile.class, statsActor);
}
public ReadAndCheckFile(ActorRef statsActor) {
this.statsActor = statsActor;
}
@Override
public void onReceive(Object arg0) throws Exception {
statsActor.tell(StatsCollector.Event.readFile, getSelf());
String fid = (String) arg0;
WeedFSFile file = new WeedFSFile(fid);
WeedFSClient client = WeedFSClientBuilder.createBuilder().setMasterUrl(LoadTest.MASTER_URL).build();
List<Location> locations = client.lookup(file.getVolumeId());
if (locations.size() == 0) {
statsActor.tell(StatsCollector.Event.noLocation, getSelf());
return;
}
InputStream is = client.read(file, locations.get(0));
MessageDigest md5 = MessageDigest.getInstance("MD5");
byte buf[] = new byte[1024];
int n;
while ((n = is.read(buf)) > 0) {
md5.update(buf, 0, n);
}
is.close();
byte[] digest = md5.digest();
byte[] dbDigest = LoadTest.fsDb.get(fid);
for (int i = 0; i < digest.length; i++) {
if (digest[i] != dbDigest[i]) {
statsActor.tell(StatsCollector.Event.wrongChecksum, getSelf());
return;
}
}
}
}