/*
* Copyright 2013-2014 eXascale Infolab, University of Fribourg. All rights reserved.
*/
package org.apache.hadoop.hadaps;
import org.apache.hadoop.fs.BlockLocation;
import org.apache.hadoop.fs.FileStatus;
import org.apache.hadoop.fs.FileSystem;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.io.IOException;
class BalancerFile implements Comparable<BalancerFile> {
private static final Logger LOG = LoggerFactory.getLogger(BalancerFile.class);
private FileStatus fileStatus;
private final ParameterFile parameterFile;
private final FileSystem fileSystem;
BalancerFile(FileStatus fileStatus, ParameterFile parameterFile, FileSystem fileSystem) {
if (fileStatus == null) throw new IllegalArgumentException();
if (parameterFile == null) throw new IllegalArgumentException();
if (fileSystem == null) throw new IllegalArgumentException();
this.fileStatus = fileStatus;
this.parameterFile = parameterFile;
this.fileSystem = fileSystem;
}
FileStatus getFileStatus() {
return fileStatus;
}
String getName() {
return fileStatus.getPath().toString();
}
void setProperReplication(boolean verify) throws IOException, InterruptedException {
LOG.info("Setting replication for {} to {}", getName(), parameterFile.getReplication());
fileSystem.setReplication(fileStatus.getPath(), parameterFile.getReplication());
if (verify) {
LOG.info("Verifying replication for {}", getName());
boolean done = false;
while (!done) {
done = true;
// Refresh fileStatus
fileStatus = fileSystem.getFileStatus(fileStatus.getPath());
// For each block location, check number of hosts
BlockLocation[] locations = fileSystem.getFileBlockLocations(fileStatus.getPath(), 0, fileStatus.getLen());
for (BlockLocation location : locations) {
if (location.getHosts().length != parameterFile.getReplication()) {
LOG.info("Waiting for replication to adjust for {}", getName());
done = false;
break;
}
}
if (!done) {
Thread.sleep(1000);
}
}
}
}
@Override
public int compareTo(BalancerFile o) {
if (o == null) throw new IllegalArgumentException();
return this.parameterFile.compareTo(o.parameterFile);
}
@Override
public String toString() {
return String.format("{Replication: %d, Path: %s}", fileStatus.getReplication(), getName());
}
}