# IGNITE-418: Applied fix from Ivan V.. The problem was with block size handling as we use it to distinguish between files and directories (which is not very correct, honestly).
Project: http://git-wip-us.apache.org/repos/asf/incubator-ignite/repo Commit: http://git-wip-us.apache.org/repos/asf/incubator-ignite/commit/acf140c4 Tree: http://git-wip-us.apache.org/repos/asf/incubator-ignite/tree/acf140c4 Diff: http://git-wip-us.apache.org/repos/asf/incubator-ignite/diff/acf140c4 Branch: refs/heads/ignite-410 Commit: acf140c40369e659c963f0b0665105dcdcb74203 Parents: dab66dc Author: vozerov-gridgain <voze...@gridgain.com> Authored: Tue Mar 10 16:54:15 2015 +0300 Committer: vozerov-gridgain <voze...@gridgain.com> Committed: Tue Mar 10 16:58:37 2015 +0300 ---------------------------------------------------------------------- .../ignite/internal/processors/igfs/IgfsFileImpl.java | 7 +++++++ .../ignite/internal/processors/igfs/IgfsFileInfo.java | 3 ++- .../ignite/internal/processors/igfs/IgfsImpl.java | 4 ++-- .../fs/IgniteHadoopIgfsSecondaryFileSystem.java | 5 ++--- .../ignite/hadoop/fs/v1/IgniteHadoopFileSystem.java | 14 +++++++++++--- .../ignite/hadoop/fs/v2/IgniteHadoopFileSystem.java | 8 +++++--- 6 files changed, 29 insertions(+), 12 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/acf140c4/modules/core/src/main/java/org/apache/ignite/internal/processors/igfs/IgfsFileImpl.java ---------------------------------------------------------------------- diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/igfs/IgfsFileImpl.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/igfs/IgfsFileImpl.java index dc1248c..fddfa20 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/igfs/IgfsFileImpl.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/igfs/IgfsFileImpl.java @@ -77,6 +77,9 @@ public final class IgfsFileImpl implements IgfsFile, Externalizable { if (info.isFile()) { blockSize = info.blockSize(); + + assert blockSize > 0; // By contract file must have blockSize > 0, while directory's blockSize == 0. + len = info.length(); grpBlockSize = info.affinityKey() == null ? globalGrpBlockSize : @@ -107,6 +110,10 @@ public final class IgfsFileImpl implements IgfsFile, Externalizable { blockSize = entry.blockSize(); + // By contract file must have blockSize > 0, while directory's blockSize == 0: + assert entry.isFile() == (blockSize > 0); + assert entry.isDirectory() == (blockSize == 0); + grpBlockSize = entry.affinityKey() == null ? globalGrpSize : entry.length() == 0 ? globalGrpSize : entry.length(); http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/acf140c4/modules/core/src/main/java/org/apache/ignite/internal/processors/igfs/IgfsFileInfo.java ---------------------------------------------------------------------- diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/igfs/IgfsFileInfo.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/igfs/IgfsFileInfo.java index e88503b..de7d077 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/igfs/IgfsFileInfo.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/igfs/IgfsFileInfo.java @@ -189,7 +189,8 @@ public final class IgfsFileInfo implements Externalizable { * @param evictExclude Evict exclude flag. */ IgfsFileInfo(int blockSize, long len, boolean evictExclude, @Nullable Map<String, String> props) { - this(false, null, blockSize, len, null, null, props, null, true, System.currentTimeMillis(), evictExclude); + this(blockSize == 0, // NB The contract is: (blockSize == null) <=> isDirectory() + null, blockSize, len, null, null, props, null, true, System.currentTimeMillis(), evictExclude); } /** http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/acf140c4/modules/core/src/main/java/org/apache/ignite/internal/processors/igfs/IgfsImpl.java ---------------------------------------------------------------------- diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/igfs/IgfsImpl.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/igfs/IgfsImpl.java index abbfe1e..9ccb2a9 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/igfs/IgfsImpl.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/igfs/IgfsImpl.java @@ -1018,8 +1018,8 @@ public final class IgfsImpl implements IgfsEx { Collection<IgfsFile> children = secondaryFs.listFiles(path); for (IgfsFile child : children) { - IgfsFileInfo fsInfo = new IgfsFileInfo(cfg.getBlockSize(), child.length(), - evictExclude(path, false), child.properties()); + IgfsFileInfo fsInfo = new IgfsFileInfo( + child.blockSize(), child.length(), evictExclude(path, false), child.properties()); files.add(new IgfsFileImpl(child.path(), fsInfo, data.groupBlockSize())); } http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/acf140c4/modules/hadoop/src/main/java/org/apache/ignite/hadoop/fs/IgniteHadoopIgfsSecondaryFileSystem.java ---------------------------------------------------------------------- diff --git a/modules/hadoop/src/main/java/org/apache/ignite/hadoop/fs/IgniteHadoopIgfsSecondaryFileSystem.java b/modules/hadoop/src/main/java/org/apache/ignite/hadoop/fs/IgniteHadoopIgfsSecondaryFileSystem.java index 3a7464c..11003a5 100644 --- a/modules/hadoop/src/main/java/org/apache/ignite/hadoop/fs/IgniteHadoopIgfsSecondaryFileSystem.java +++ b/modules/hadoop/src/main/java/org/apache/ignite/hadoop/fs/IgniteHadoopIgfsSecondaryFileSystem.java @@ -40,7 +40,6 @@ import static org.apache.ignite.internal.processors.igfs.IgfsEx.*; * Adapter to use any Hadoop file system {@link FileSystem} as {@link IgfsSecondaryFileSystem}. */ public class IgniteHadoopIgfsSecondaryFileSystem implements IgfsSecondaryFileSystem, AutoCloseable { - /** Hadoop file system. */ private final FileSystem fileSys; @@ -345,7 +344,8 @@ public class IgniteHadoopIgfsSecondaryFileSystem implements IgfsSecondaryFileSys } @Override public int blockSize() { - return (int)status.getBlockSize(); + // By convention directory has blockSize == 0, while file has blockSize > 0: + return isDirectory() ? 0 : (int)status.getBlockSize(); } @Override public long groupBlockSize() { @@ -384,7 +384,6 @@ public class IgniteHadoopIgfsSecondaryFileSystem implements IgfsSecondaryFileSys return props; } }; - } catch (FileNotFoundException ignore) { return null; http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/acf140c4/modules/hadoop/src/main/java/org/apache/ignite/hadoop/fs/v1/IgniteHadoopFileSystem.java ---------------------------------------------------------------------- diff --git a/modules/hadoop/src/main/java/org/apache/ignite/hadoop/fs/v1/IgniteHadoopFileSystem.java b/modules/hadoop/src/main/java/org/apache/ignite/hadoop/fs/v1/IgniteHadoopFileSystem.java index 93c0df4..41ef3e5 100644 --- a/modules/hadoop/src/main/java/org/apache/ignite/hadoop/fs/v1/IgniteHadoopFileSystem.java +++ b/modules/hadoop/src/main/java/org/apache/ignite/hadoop/fs/v1/IgniteHadoopFileSystem.java @@ -694,12 +694,20 @@ public class IgniteHadoopFileSystem extends FileSystem { return secondaryFs.rename(toSecondary(src), toSecondary(dst)); } else { - // Will throw exception if failed. - rmtClient.rename(srcPath, dstPath); - if (clientLog.isLogEnabled()) clientLog.logRename(srcPath, mode, dstPath); + try { + rmtClient.rename(srcPath, dstPath); + } + catch (IOException ioe) { + // Log the exception before rethrowing since it may be ignored: + LOG.warn("Failed to rename [srcPath=" + srcPath + ", dstPath=" + dstPath + ", mode=" + mode + ']', + ioe); + + throw ioe; + } + return true; } } http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/acf140c4/modules/hadoop/src/main/java/org/apache/ignite/hadoop/fs/v2/IgniteHadoopFileSystem.java ---------------------------------------------------------------------- diff --git a/modules/hadoop/src/main/java/org/apache/ignite/hadoop/fs/v2/IgniteHadoopFileSystem.java b/modules/hadoop/src/main/java/org/apache/ignite/hadoop/fs/v2/IgniteHadoopFileSystem.java index 70ad99f..5dac047 100644 --- a/modules/hadoop/src/main/java/org/apache/ignite/hadoop/fs/v2/IgniteHadoopFileSystem.java +++ b/modules/hadoop/src/main/java/org/apache/ignite/hadoop/fs/v2/IgniteHadoopFileSystem.java @@ -587,11 +587,13 @@ public class IgniteHadoopFileSystem extends AbstractFileSystem implements Closea secondaryFs.renameInternal(toSecondary(src), toSecondary(dst)); } + else { + if (clientLog.isLogEnabled()) + clientLog.logRename(srcPath, modeRslvr.resolveMode(srcPath), dstPath); - rmtClient.rename(srcPath, dstPath); + rmtClient.rename(srcPath, dstPath); + } - if (clientLog.isLogEnabled()) - clientLog.logRename(srcPath, modeRslvr.resolveMode(srcPath), dstPath); } finally { leaveBusy();