}
numEdits++;
switch (opcode) {
case OP_ADD: {
UTF8 name = new UTF8();
ArrayWritable aw = null;
Writable writables[];
// version 0 does not support per file replication
if (logVersion >= 0)
name.readFields(in); // read name only
else { // other versions do
// get name and replication
aw = new ArrayWritable(UTF8.class);
aw.readFields(in);
writables = aw.get();
if (-4 <= logVersion && writables.length != 2 ||
-7 <= logVersion && logVersion < -4 && writables.length != 3||
logVersion < -7 && writables.length != 4) {
throw new IOException("Incorrect data format." +
" logVersion is " + logVersion +
" but writables.length is " +
writables.length + ". ");
}
name = (UTF8) writables[0];
replication = Short.parseShort(
((UTF8)writables[1]).toString());
replication = adjustReplication(replication);
if (logVersion < -4) {
mtime = Long.parseLong(((UTF8)writables[2]).toString());
}
if (logVersion < -7) {
blockSize = Long.parseLong(((UTF8)writables[3]).toString());
}
}
// get blocks
aw = new ArrayWritable(Block.class);
aw.readFields(in);
writables = aw.get();
Block blocks[] = new Block[writables.length];
System.arraycopy(writables, 0, blocks, 0, blocks.length);
// Older versions of HDFS does not store the block size in inode.
// If the file has more than one block, use the size of the
// first block as the blocksize. Otherwise use the default
// block size.
if (-8 <= logVersion && blockSize == 0) {
if (blocks.length > 1) {
blockSize = blocks[0].getNumBytes();
} else {
long first = ((blocks.length == 1)? blocks[0].getNumBytes(): 0);
blockSize = Math.max(fsNamesys.getDefaultBlockSize(), first);
}
}
// add to the file tree
fsDir.unprotectedAddFile(name.toString(), blocks, replication,
mtime, blockSize);
break;
}
case OP_SET_REPLICATION: {
UTF8 src = new UTF8();
UTF8 repl = new UTF8();
src.readFields(in);
repl.readFields(in);
replication = adjustReplication(fromLogReplication(repl));
fsDir.unprotectedSetReplication(src.toString(),
replication,
null);
break;
}
case OP_RENAME: {
UTF8 src = null;
UTF8 dst = null;
if (logVersion >= -4) {
src = new UTF8();
dst = new UTF8();
src.readFields(in);
dst.readFields(in);
} else {
ArrayWritable aw = null;
Writable writables[];
aw = new ArrayWritable(UTF8.class);
aw.readFields(in);
writables = aw.get();
if (writables.length != 3) {
throw new IOException("Incorrect data format. "
+ "Mkdir operation.");
}
src = (UTF8) writables[0];
dst = (UTF8) writables[1];
timestamp = Long.parseLong(((UTF8)writables[2]).toString());
}
fsDir.unprotectedRenameTo(src.toString(), dst.toString(), timestamp);
break;
}
case OP_DELETE: {
UTF8 src = null;
if (logVersion >= -4) {
src = new UTF8();
src.readFields(in);
} else {
ArrayWritable aw = null;
Writable writables[];
aw = new ArrayWritable(UTF8.class);
aw.readFields(in);
writables = aw.get();
if (writables.length != 2) {
throw new IOException("Incorrect data format. "
+ "delete operation.");
}
src = (UTF8) writables[0];
timestamp = Long.parseLong(((UTF8)writables[1]).toString());
}
fsDir.unprotectedDelete(src.toString(), timestamp);
break;
}
case OP_MKDIR: {
UTF8 src = null;
if (logVersion >= -4) {
src = new UTF8();
src.readFields(in);
} else {
ArrayWritable aw = null;
Writable writables[];
aw = new ArrayWritable(UTF8.class);
aw.readFields(in);
writables = aw.get();
if (writables.length != 2) {
throw new IOException("Incorrect data format. "
+ "Mkdir operation.");
}
src = (UTF8) writables[0];