| /* |
| * Licensed to the Apache Software Foundation (ASF) under one or more |
| * contributor license agreements. See the NOTICE file distributed with |
| * this work for additional information regarding copyright ownership. |
| * The ASF licenses this file to You under the Apache License, Version 2.0 |
| * (the "License"); you may not use this file except in compliance with |
| * the License. You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| package org.apache.ignite.internal.processors.igfs; |
| |
| import org.apache.ignite.IgniteException; |
| import org.apache.ignite.igfs.IgfsFile; |
| import org.apache.ignite.igfs.IgfsMode; |
| import org.apache.ignite.igfs.IgfsPath; |
| import org.apache.ignite.igfs.secondary.IgfsSecondaryFileSystem; |
| import org.apache.ignite.internal.IgniteInternalFuture; |
| import org.apache.ignite.internal.util.typedef.F; |
| import org.apache.ignite.internal.util.typedef.T2; |
| import org.apache.ignite.internal.util.typedef.internal.U; |
| |
| import java.util.Collection; |
| import java.util.Iterator; |
| import java.util.Map; |
| import java.util.concurrent.Callable; |
| import java.util.concurrent.CyclicBarrier; |
| |
| import static org.apache.ignite.igfs.IgfsMode.DUAL_ASYNC; |
| import static org.apache.ignite.igfs.IgfsMode.DUAL_SYNC; |
| import static org.apache.ignite.igfs.IgfsMode.PROXY; |
| |
| /** |
| * Tests for IGFS working in mode when remote file system exists: DUAL_SYNC, DUAL_ASYNC. |
| */ |
| @SuppressWarnings("ConstantConditions") |
| public abstract class IgfsDualAbstractSelfTest extends IgfsAbstractSelfTest { |
| /** |
| * Constructor. |
| * |
| * @param mode IGFS mode. |
| */ |
| protected IgfsDualAbstractSelfTest(IgfsMode mode) { |
| super(mode); |
| } |
| |
| /** |
| * Test existence check when the path exists only remotely. |
| * |
| * @throws Exception If failed. |
| */ |
| public void testExistsPathMissing() throws Exception { |
| create(igfsSecondary, paths(DIR), null); |
| |
| assert igfs.exists(DIR); |
| } |
| |
| /** |
| * Test list files routine when the path doesn't exist locally. |
| * |
| * @throws Exception If failed. |
| */ |
| public void testListFilesPathMissing() throws Exception { |
| create(igfsSecondary, paths(DIR, SUBDIR, SUBSUBDIR), paths(FILE)); |
| |
| Collection<IgfsFile> paths = igfs.listFiles(SUBDIR); |
| |
| assert paths != null; |
| assert paths.size() == 2; |
| |
| Iterator<IgfsFile> iter = paths.iterator(); |
| |
| IgfsFile path1 = iter.next(); |
| IgfsFile path2 = iter.next(); |
| |
| assert (SUBSUBDIR.equals(path1.path()) && FILE.equals(path2.path())) || |
| (FILE.equals(path1.path()) && SUBSUBDIR.equals(path2.path())); |
| } |
| |
| /** |
| * Test info routine when the path doesn't exist locally. |
| * |
| * @throws Exception If failed. |
| */ |
| public void testInfoPathMissing() throws Exception { |
| create(igfsSecondary, paths(DIR), null); |
| create(igfs, null, null); |
| |
| IgfsFile info = igfs.info(DIR); |
| |
| assert info != null; |
| |
| assertEquals(DIR, info.path()); |
| } |
| |
| /** |
| * Test rename in case source exists partially and the path being renamed is a file. |
| * |
| * @throws Exception If failed. |
| */ |
| public void testRenameFileSourceMissingPartially() throws Exception { |
| create(igfsSecondary, paths(DIR, SUBDIR), paths(FILE)); |
| create(igfs, paths(DIR), null); |
| |
| igfs.rename(FILE, FILE2); |
| |
| checkExist(igfs, SUBDIR); |
| checkExist(igfs, igfsSecondary, FILE2); |
| checkNotExist(igfs, igfsSecondary, FILE); |
| } |
| |
| /** |
| * Test rename in case source doesn't exist and the path being renamed is a file. |
| * |
| * @throws Exception If failed. |
| */ |
| public void testRenameFileSourceMissing() throws Exception { |
| create(igfsSecondary, paths(DIR, SUBDIR), paths(FILE)); |
| create(igfs, null, null); |
| |
| igfs.rename(FILE, FILE2); |
| |
| checkExist(igfs, DIR, SUBDIR); |
| checkExist(igfs, igfsSecondary, FILE2); |
| checkNotExist(igfs, igfsSecondary, FILE); |
| } |
| |
| /** |
| * Test file rename when parent folder is the root and source is missing. |
| * |
| * @throws Exception If failed. |
| */ |
| public void testRenameFileParentRootSourceMissing() throws Exception { |
| IgfsPath file1 = new IgfsPath("/file1"); |
| IgfsPath file2 = new IgfsPath("/file2"); |
| |
| create(igfsSecondary, null, paths(file1)); |
| create(igfs, null, null); |
| |
| igfs.rename(file1, file2); |
| |
| checkExist(igfs, igfsSecondary, file2); |
| checkNotExist(igfs, igfsSecondary, file1); |
| } |
| |
| /** |
| * Test rename in case source exists partially and the path being renamed is a directory. |
| * |
| * @throws Exception If failed. |
| */ |
| public void testRenameDirectorySourceMissingPartially() throws Exception { |
| create(igfsSecondary, paths(DIR, SUBDIR), null); |
| create(igfs, paths(DIR), null); |
| |
| igfs.rename(SUBDIR, SUBDIR2); |
| |
| checkExist(igfs, igfsSecondary, SUBDIR2); |
| checkNotExist(igfs, igfsSecondary, SUBDIR); |
| } |
| |
| /** |
| * Test rename in case source doesn't exist and the path being renamed is a directory. |
| * |
| * @throws Exception If failed. |
| */ |
| public void testRenameDirectorySourceMissing() throws Exception { |
| create(igfsSecondary, paths(DIR, SUBDIR), null); |
| create(igfs, null, null); |
| |
| igfs.rename(SUBDIR, SUBDIR2); |
| |
| checkExist(igfs, DIR); |
| checkExist(igfs, igfsSecondary, SUBDIR2); |
| checkNotExist(igfs, igfsSecondary, SUBDIR); |
| } |
| |
| /** |
| * Test directory rename when parent folder is the root and source is missing. |
| * |
| * @throws Exception If failed. |
| */ |
| public void testRenameDirectoryParentRootSourceMissing() throws Exception { |
| IgfsPath dir1 = new IgfsPath("/dir1"); |
| IgfsPath dir2 = new IgfsPath("/dir2"); |
| |
| create(igfsSecondary, paths(dir1), null); |
| create(igfs, null, null); |
| |
| igfs.rename(dir1, dir2); |
| |
| checkExist(igfs, igfsSecondary, dir2); |
| checkNotExist(igfs, igfsSecondary, dir1); |
| } |
| |
| /** |
| * Test move in case source exists partially and the path being renamed is a file. |
| * |
| * @throws Exception If failed. |
| */ |
| public void testMoveFileSourceMissingPartially() throws Exception { |
| create(igfsSecondary, paths(DIR, SUBDIR, DIR_NEW, SUBDIR_NEW), paths(FILE)); |
| create(igfs, paths(DIR, DIR_NEW, SUBDIR_NEW), paths(FILE)); |
| |
| igfs.rename(FILE, SUBDIR_NEW); |
| |
| checkExist(igfs, SUBDIR); |
| checkExist(igfs, igfsSecondary, new IgfsPath(SUBDIR_NEW, FILE.name())); |
| checkNotExist(igfs, igfsSecondary, FILE); |
| } |
| |
| /** |
| * Test move in case source doesn't exist and the path being renamed is a file. |
| * |
| * @throws Exception If failed. |
| */ |
| public void testMoveFileSourceMissing() throws Exception { |
| create(igfsSecondary, paths(DIR, SUBDIR, DIR_NEW, SUBDIR_NEW), paths(FILE)); |
| create(igfs, paths(DIR_NEW, SUBDIR_NEW), paths(FILE)); |
| |
| igfs.rename(FILE, SUBDIR_NEW); |
| |
| checkExist(igfs, DIR, SUBDIR); |
| checkExist(igfs, igfsSecondary, new IgfsPath(SUBDIR_NEW, FILE.name())); |
| checkNotExist(igfs, igfsSecondary, FILE); |
| } |
| |
| /** |
| * Test move in case destination exists partially and the path being renamed is a file. |
| * |
| * @throws Exception If failed. |
| */ |
| public void testMoveFileDestinationMissingPartially() throws Exception { |
| create(igfsSecondary, paths(DIR, SUBDIR, DIR_NEW, SUBDIR_NEW), paths(FILE)); |
| create(igfs, paths(DIR, SUBDIR, DIR_NEW), paths(FILE)); |
| |
| igfs.rename(FILE, SUBDIR_NEW); |
| |
| checkExist(igfs, SUBDIR_NEW); |
| checkExist(igfs, igfsSecondary, new IgfsPath(SUBDIR_NEW, FILE.name())); |
| checkNotExist(igfs, igfsSecondary, FILE); |
| } |
| |
| /** |
| * Test move in case destination doesn't exist and the path being renamed is a file. |
| * |
| * @throws Exception If failed. |
| */ |
| public void testMoveFileDestinationMissing() throws Exception { |
| create(igfsSecondary, paths(DIR, SUBDIR, DIR_NEW, SUBDIR_NEW), paths(FILE)); |
| create(igfs, paths(DIR, SUBDIR), paths(FILE)); |
| |
| igfs.rename(FILE, SUBDIR_NEW); |
| |
| checkExist(igfs, DIR_NEW, SUBDIR_NEW); |
| checkExist(igfs, igfsSecondary, new IgfsPath(SUBDIR_NEW, FILE.name())); |
| checkNotExist(igfs, igfsSecondary, FILE); |
| } |
| |
| /** |
| * Test move in case source and destination exist partially and the path being renamed is a file. |
| * |
| * @throws Exception If failed. |
| */ |
| public void testMoveFileSourceAndDestinationMissingPartially() throws Exception { |
| create(igfsSecondary, paths(DIR, SUBDIR, DIR_NEW, SUBDIR_NEW), paths(FILE)); |
| create(igfs, paths(DIR, DIR_NEW), null); |
| |
| igfs.rename(FILE, SUBDIR_NEW); |
| |
| checkExist(igfs, SUBDIR, SUBDIR_NEW); |
| checkExist(igfs, igfsSecondary, new IgfsPath(SUBDIR_NEW, FILE.name())); |
| checkNotExist(igfs, igfsSecondary, FILE); |
| } |
| |
| /** |
| * Test move in case source and destination don't exist and the path being renamed is a file. |
| * |
| * @throws Exception If failed. |
| */ |
| public void testMoveFileSourceAndDestinationMissing() throws Exception { |
| create(igfsSecondary, paths(DIR, SUBDIR, DIR_NEW, SUBDIR_NEW), paths(FILE)); |
| create(igfs, null, null); |
| |
| igfs.rename(FILE, SUBDIR_NEW); |
| |
| checkExist(igfs, DIR, SUBDIR, DIR_NEW, SUBDIR_NEW); |
| checkExist(igfs, igfsSecondary, new IgfsPath(SUBDIR_NEW, FILE.name())); |
| checkNotExist(igfs, igfsSecondary, FILE); |
| } |
| |
| /** |
| * Test file move when destination is the root and source is missing partially. |
| * |
| * @throws Exception If failed. |
| */ |
| public void testMoveFileDestinationRootSourceMissingPartially() throws Exception { |
| create(igfsSecondary, paths(DIR, SUBDIR), paths(FILE)); |
| create(igfs, paths(DIR), null); |
| |
| igfs.rename(FILE, IgfsPath.ROOT); |
| |
| checkExist(igfs, SUBDIR); |
| checkExist(igfs, igfsSecondary, new IgfsPath("/" + FILE.name())); |
| checkNotExist(igfs, igfsSecondary, FILE); |
| } |
| |
| /** |
| * Test file move when destination is the root and source is missing. |
| * |
| * @throws Exception If failed. |
| */ |
| public void testMoveFileDestinationRootSourceMissing() throws Exception { |
| create(igfsSecondary, paths(DIR, SUBDIR), paths(FILE)); |
| create(igfs, null, null); |
| |
| igfs.rename(FILE, IgfsPath.ROOT); |
| |
| checkExist(igfs, DIR, SUBDIR); |
| checkExist(igfs, igfsSecondary, new IgfsPath("/" + FILE.name())); |
| checkNotExist(igfs, igfsSecondary, FILE); |
| } |
| |
| /** |
| * Test file move when source parent is the root and the source is missing. |
| * |
| * @throws Exception If failed. |
| */ |
| public void testMoveFileSourceParentRootSourceMissing() throws Exception { |
| IgfsPath file = new IgfsPath("/" + FILE.name()); |
| |
| create(igfsSecondary, paths(DIR_NEW, SUBDIR_NEW), paths(file)); |
| create(igfs, paths(DIR_NEW, SUBDIR_NEW), null); |
| |
| igfs.rename(file, SUBDIR_NEW); |
| |
| checkExist(igfs, igfsSecondary, new IgfsPath(SUBDIR_NEW, FILE.name())); |
| checkNotExist(igfs, igfsSecondary, file); |
| } |
| |
| /** |
| * Test file move when source parent is the root and destination is missing partially. |
| * |
| * @throws Exception If failed. |
| */ |
| public void testMoveFileSourceParentRootDestinationMissingPartially() throws Exception { |
| IgfsPath file = new IgfsPath("/" + FILE.name()); |
| |
| create(igfsSecondary, paths(DIR_NEW, SUBDIR_NEW), paths(file)); |
| create(igfs, paths(DIR_NEW), null); |
| |
| igfs.rename(file, SUBDIR_NEW); |
| |
| checkExist(igfs, SUBDIR_NEW); |
| checkExist(igfs, igfsSecondary, new IgfsPath(SUBDIR_NEW, FILE.name())); |
| checkNotExist(igfs, igfsSecondary, file); |
| } |
| |
| /** |
| * Test file move when source parent is the root and destination is missing. |
| * |
| * @throws Exception If failed. |
| */ |
| public void testMoveFileSourceParentRootDestinationMissing() throws Exception { |
| IgfsPath file = new IgfsPath("/" + FILE.name()); |
| |
| create(igfsSecondary, paths(DIR_NEW, SUBDIR_NEW), paths(file)); |
| create(igfs, null, null); |
| |
| igfs.rename(file, SUBDIR_NEW); |
| |
| checkExist(igfs, DIR_NEW, SUBDIR_NEW); |
| checkExist(igfs, igfsSecondary, new IgfsPath(SUBDIR_NEW, FILE.name())); |
| checkNotExist(igfs, igfsSecondary, file); |
| } |
| |
| /** |
| * Test move and rename in case source exists partially and the path being renamed is a file. |
| * |
| * @throws Exception If failed. |
| */ |
| public void testMoveRenameFileSourceMissingPartially() throws Exception { |
| create(igfsSecondary, paths(DIR, SUBDIR, DIR_NEW, SUBDIR_NEW), paths(FILE)); |
| create(igfs, paths(DIR, DIR_NEW, SUBDIR_NEW), paths(FILE)); |
| |
| igfs.rename(FILE, FILE_NEW); |
| |
| checkExist(igfs, SUBDIR); |
| checkExist(igfs, igfsSecondary, FILE_NEW); |
| checkNotExist(igfs, igfsSecondary, FILE); |
| } |
| |
| /** |
| * Test move and rename in case source doesn't exist and the path being renamed is a file. |
| * |
| * @throws Exception If failed. |
| */ |
| public void testMoveRenameFileSourceMissing() throws Exception { |
| create(igfsSecondary, paths(DIR, SUBDIR, DIR_NEW, SUBDIR_NEW), paths(FILE)); |
| create(igfs, paths(DIR_NEW, SUBDIR_NEW), paths(FILE)); |
| |
| igfs.rename(FILE, FILE_NEW); |
| |
| checkExist(igfs, DIR, SUBDIR); |
| checkExist(igfs, igfsSecondary, FILE_NEW); |
| checkNotExist(igfs, igfsSecondary, FILE); |
| } |
| |
| /** |
| * Test move and rename in case destination exists partially and the path being renamed is a file. |
| * |
| * @throws Exception If failed. |
| */ |
| public void testMoveRenameFileDestinationMissingPartially() throws Exception { |
| create(igfsSecondary, paths(DIR, SUBDIR, DIR_NEW, SUBDIR_NEW), paths(FILE)); |
| create(igfs, paths(DIR, SUBDIR, DIR_NEW), paths(FILE)); |
| |
| igfs.rename(FILE, FILE_NEW); |
| |
| checkExist(igfs, SUBDIR_NEW); |
| checkExist(igfs, igfsSecondary, FILE_NEW); |
| checkNotExist(igfs, igfsSecondary, FILE); |
| } |
| |
| /** |
| * Test move and rename in case destination doesn't exist and the path being renamed is a file. |
| * |
| * @throws Exception If failed. |
| */ |
| public void testMoveRenameFileDestinationMissing() throws Exception { |
| create(igfsSecondary, paths(DIR, SUBDIR, DIR_NEW, SUBDIR_NEW), paths(FILE)); |
| create(igfs, paths(DIR, SUBDIR), paths(FILE)); |
| |
| igfs.rename(FILE, FILE_NEW); |
| |
| checkExist(igfs, DIR_NEW, SUBDIR_NEW); |
| checkExist(igfs, igfsSecondary, FILE_NEW); |
| checkNotExist(igfs, igfsSecondary, FILE); |
| } |
| |
| /** |
| * Test move and rename in case source and destination exist partially and the path being renamed is a file. |
| * |
| * @throws Exception If failed. |
| */ |
| public void testMoveRenameFileSourceAndDestinationMissingPartially() throws Exception { |
| create(igfsSecondary, paths(DIR, SUBDIR, DIR_NEW, SUBDIR_NEW), paths(FILE)); |
| create(igfs, paths(DIR, DIR_NEW), null); |
| |
| igfs.rename(FILE, FILE_NEW); |
| |
| checkExist(igfs, SUBDIR, SUBDIR_NEW); |
| checkExist(igfs, igfsSecondary, FILE_NEW); |
| checkNotExist(igfs, igfsSecondary, FILE); |
| } |
| |
| /** |
| * Test move and rename in case source and destination don't exist and the path being renamed is a file. |
| * |
| * @throws Exception If failed. |
| */ |
| public void testMoveRenameFileSourceAndDestinationMissing() throws Exception { |
| create(igfsSecondary, paths(DIR, SUBDIR, DIR_NEW, SUBDIR_NEW), paths(FILE)); |
| create(igfs, null, null); |
| |
| igfs.rename(FILE, FILE_NEW); |
| |
| checkExist(igfs, DIR, SUBDIR, DIR_NEW, SUBDIR_NEW); |
| checkExist(igfs, igfsSecondary, FILE_NEW); |
| checkNotExist(igfs, igfsSecondary, FILE); |
| } |
| |
| /** |
| * Test file move and rename when destination is the root and source is missing partially. |
| * |
| * @throws Exception If failed. |
| */ |
| public void testMoveRenameFileDestinationRootSourceMissingPartially() throws Exception { |
| IgfsPath file = new IgfsPath("/" + FILE.name()); |
| |
| create(igfsSecondary, paths(DIR, SUBDIR), paths(FILE)); |
| create(igfs, paths(DIR), null); |
| |
| igfs.rename(FILE, file); |
| |
| checkExist(igfs, SUBDIR); |
| checkExist(igfs, igfsSecondary, file); |
| checkNotExist(igfs, igfsSecondary, FILE); |
| } |
| |
| /** |
| * Test file move and rename when destination is the root and source is missing. |
| * |
| * @throws Exception If failed. |
| */ |
| public void testMoveRenameFileDestinationRootSourceMissing() throws Exception { |
| IgfsPath file = new IgfsPath("/" + FILE.name()); |
| |
| create(igfsSecondary, paths(DIR, SUBDIR), paths(FILE)); |
| create(igfs, null, null); |
| |
| igfs.rename(FILE, file); |
| |
| checkExist(igfs, DIR, SUBDIR); |
| checkExist(igfs, igfsSecondary, file); |
| checkNotExist(igfs, igfsSecondary, FILE); |
| } |
| |
| /** |
| * Test file move and rename when source parent is the root and the source is missing. |
| * |
| * @throws Exception If failed. |
| */ |
| public void testMoveRenameFileSourceParentRootSourceMissing() throws Exception { |
| IgfsPath file = new IgfsPath("/" + FILE_NEW.name()); |
| |
| create(igfsSecondary, paths(DIR_NEW, SUBDIR_NEW), paths(file)); |
| create(igfs, paths(DIR_NEW, SUBDIR_NEW), null); |
| |
| igfs.rename(file, FILE_NEW); |
| |
| checkExist(igfs, igfsSecondary, FILE_NEW); |
| checkNotExist(igfs, igfsSecondary, file); |
| } |
| |
| /** |
| * Test file move and rename when source parent is the root and destination is missing partially. |
| * |
| * @throws Exception If failed. |
| */ |
| public void testMoveRenameFileSourceParentRootDestinationMissingPartially() throws Exception { |
| IgfsPath file = new IgfsPath("/" + FILE_NEW.name()); |
| |
| create(igfsSecondary, paths(DIR_NEW, SUBDIR_NEW), paths(file)); |
| create(igfs, paths(DIR_NEW), null); |
| |
| igfs.rename(file, FILE_NEW); |
| |
| checkExist(igfs, SUBDIR_NEW); |
| checkExist(igfs, igfsSecondary, FILE_NEW); |
| checkNotExist(igfs, igfsSecondary, file); |
| } |
| |
| /** |
| * Test file move and rename when source parent is the root and destination is missing. |
| * |
| * @throws Exception If failed. |
| */ |
| public void testMoveRenameFileSourceParentRootDestinationMissing() throws Exception { |
| IgfsPath file = new IgfsPath("/" + FILE_NEW.name()); |
| |
| create(igfsSecondary, paths(DIR_NEW, SUBDIR_NEW), paths(file)); |
| create(igfs, null, null); |
| |
| igfs.rename(file, FILE_NEW); |
| |
| checkExist(igfs, DIR_NEW, SUBDIR_NEW); |
| checkExist(igfs, igfsSecondary, FILE_NEW); |
| checkNotExist(igfs, igfsSecondary, file); |
| } |
| |
| /** |
| * Test move in case source exists partially and the path being renamed is a directory. |
| * |
| * @throws Exception If failed. |
| */ |
| public void testMoveDirectorySourceMissingPartially() throws Exception { |
| create(igfsSecondary, paths(DIR, SUBDIR, SUBSUBDIR, DIR_NEW, SUBDIR_NEW), null); |
| create(igfs, paths(DIR, DIR_NEW, SUBDIR_NEW), null); |
| |
| igfs.rename(SUBSUBDIR, SUBDIR_NEW); |
| |
| checkExist(igfs, SUBDIR); |
| checkExist(igfs, igfsSecondary, new IgfsPath(SUBDIR_NEW, SUBSUBDIR.name())); |
| checkNotExist(igfs, igfsSecondary, SUBSUBDIR); |
| } |
| |
| /** |
| * Test move in case source doesn't exist and the path being renamed is a directory. |
| * |
| * @throws Exception If failed. |
| */ |
| public void testMoveDirectorySourceMissing() throws Exception { |
| create(igfsSecondary, paths(DIR, SUBDIR, SUBSUBDIR, DIR_NEW, SUBDIR_NEW), null); |
| create(igfs, paths(DIR_NEW, SUBDIR_NEW), null); |
| |
| igfs.rename(SUBSUBDIR, SUBDIR_NEW); |
| |
| checkExist(igfs, DIR); |
| checkExist(igfs, SUBDIR); |
| checkExist(igfs, igfsSecondary, new IgfsPath(SUBDIR_NEW, SUBSUBDIR.name())); |
| checkNotExist(igfs, igfsSecondary, SUBSUBDIR); |
| } |
| |
| /** |
| * Test move in case destination exists partially and the path being renamed is a directory. |
| * |
| * @throws Exception If failed. |
| */ |
| public void testMoveDirectoryDestinationMissingPartially() throws Exception { |
| create(igfsSecondary, paths(DIR, SUBDIR, SUBSUBDIR, DIR_NEW, SUBDIR_NEW), null); |
| create(igfs, paths(DIR, SUBDIR, SUBSUBDIR, DIR_NEW), null); |
| |
| igfs.rename(SUBSUBDIR, SUBDIR_NEW); |
| |
| checkExist(igfs, SUBDIR_NEW); |
| checkExist(igfs, igfsSecondary, new IgfsPath(SUBDIR_NEW, SUBSUBDIR.name())); |
| checkNotExist(igfs, igfsSecondary, SUBSUBDIR); |
| } |
| |
| /** |
| * Test move in case destination doesn't exist and the path being renamed is a directory. |
| * |
| * @throws Exception If failed. |
| */ |
| public void testMoveDirectoryDestinationMissing() throws Exception { |
| create(igfsSecondary, paths(DIR, SUBDIR, SUBSUBDIR, DIR_NEW, SUBDIR_NEW), null); |
| create(igfs, paths(DIR, SUBDIR, SUBSUBDIR), null); |
| |
| igfs.rename(SUBSUBDIR, SUBDIR_NEW); |
| |
| checkExist(igfs, DIR_NEW, SUBDIR_NEW); |
| checkExist(igfs, igfsSecondary, new IgfsPath(SUBDIR_NEW, SUBSUBDIR.name())); |
| checkNotExist(igfs, igfsSecondary, SUBSUBDIR); |
| } |
| |
| /** |
| * Test move in case source and destination exist partially and the path being renamed is a directory. |
| * |
| * @throws Exception If failed. |
| */ |
| public void testMoveDirectorySourceAndDestinationMissingPartially() throws Exception { |
| create(igfsSecondary, paths(DIR, SUBDIR, SUBSUBDIR, DIR_NEW, SUBDIR_NEW), null); |
| create(igfs, paths(DIR, DIR_NEW), null); |
| |
| igfs.rename(SUBSUBDIR, SUBDIR_NEW); |
| |
| checkExist(igfs, SUBDIR, SUBDIR_NEW); |
| checkExist(igfs, igfsSecondary, new IgfsPath(SUBDIR_NEW, SUBSUBDIR.name())); |
| checkNotExist(igfs, igfsSecondary, SUBSUBDIR); |
| } |
| |
| /** |
| * Test move in case source and destination don't exist and the path being renamed is a directory. |
| * |
| * @throws Exception If failed. |
| */ |
| public void testMoveDirectorySourceAndDestinationMissing() throws Exception { |
| create(igfsSecondary, paths(DIR, SUBDIR, SUBSUBDIR, DIR_NEW, SUBDIR_NEW), null); |
| create(igfs, null, null); |
| |
| igfs.rename(SUBSUBDIR, SUBDIR_NEW); |
| |
| checkExist(igfs, DIR, SUBDIR, DIR_NEW, SUBDIR_NEW); |
| checkExist(igfs, igfsSecondary, new IgfsPath(SUBDIR_NEW, SUBSUBDIR.name())); |
| checkNotExist(igfs, igfsSecondary, SUBSUBDIR); |
| } |
| |
| /** |
| * Test directory move when destination is the root and source is missing partially. |
| * |
| * @throws Exception If failed. |
| */ |
| public void testMoveDirectoryDestinationRootSourceMissingPartially() throws Exception { |
| create(igfsSecondary, paths(DIR, SUBDIR, SUBSUBDIR), null); |
| create(igfs, paths(DIR), null); |
| |
| igfs.rename(SUBSUBDIR, IgfsPath.ROOT); |
| |
| checkExist(igfs, SUBDIR); |
| checkExist(igfs, igfsSecondary, new IgfsPath("/" + SUBSUBDIR.name())); |
| checkNotExist(igfs, igfsSecondary, SUBSUBDIR); |
| } |
| |
| /** |
| * Test directory move when destination is the root and source is missing. |
| * |
| * @throws Exception If failed. |
| */ |
| public void testMoveDirectoryDestinationRootSourceMissing() throws Exception { |
| create(igfsSecondary, paths(DIR, SUBDIR, SUBSUBDIR), null); |
| create(igfs, null, null); |
| |
| igfs.rename(SUBSUBDIR, IgfsPath.ROOT); |
| |
| checkExist(igfs, DIR, SUBDIR); |
| checkExist(igfs, igfsSecondary, new IgfsPath("/" + SUBSUBDIR.name())); |
| checkNotExist(igfs, igfsSecondary, SUBSUBDIR); |
| } |
| |
| /** |
| * Test directory move when source parent is the root and the source folder is missing locally. |
| * |
| * @throws Exception If failed. |
| */ |
| public void testMoveDirectorySourceParentRootSourceMissing() throws Exception { |
| IgfsPath dir = new IgfsPath("/" + SUBSUBDIR.name()); |
| |
| create(igfsSecondary, paths(DIR_NEW, SUBDIR_NEW, dir), null); |
| create(igfs, paths(DIR_NEW, SUBDIR_NEW), null); |
| |
| igfs.rename(dir, SUBDIR_NEW); |
| |
| checkExist(igfs, igfsSecondary, new IgfsPath(SUBDIR_NEW, SUBSUBDIR.name())); |
| checkNotExist(igfs, igfsSecondary, dir); |
| } |
| |
| /** |
| * Test directory move when source parent is the root and destination is missing partially. |
| * |
| * @throws Exception If failed. |
| */ |
| public void testMoveDirectorySourceParentRootDestinationMissingPartially() throws Exception { |
| IgfsPath dir = new IgfsPath("/" + SUBSUBDIR.name()); |
| |
| create(igfsSecondary, paths(DIR_NEW, SUBDIR_NEW, dir), null); |
| create(igfs, paths(DIR_NEW), null); |
| |
| igfs.rename(dir, SUBDIR_NEW); |
| |
| checkExist(igfs, SUBDIR_NEW); |
| checkExist(igfs, igfsSecondary, new IgfsPath(SUBDIR_NEW, SUBSUBDIR.name())); |
| checkNotExist(igfs, igfsSecondary, dir); |
| } |
| |
| /** |
| * Test directory move when source parent is the root and destination is missing. |
| * |
| * @throws Exception If failed. |
| */ |
| public void testMoveDirectorySourceParentRootDestinationMissing() throws Exception { |
| IgfsPath dir = new IgfsPath("/" + SUBSUBDIR.name()); |
| |
| create(igfsSecondary, paths(DIR_NEW, SUBDIR_NEW, dir), null); |
| create(igfs, null, null); |
| |
| igfs.rename(dir, SUBDIR_NEW); |
| |
| checkExist(igfs, DIR_NEW, SUBDIR_NEW); |
| checkExist(igfs, igfsSecondary, new IgfsPath(SUBDIR_NEW, SUBSUBDIR.name())); |
| checkNotExist(igfs, igfsSecondary, dir); |
| } |
| |
| /** |
| * Test move and rename in case source exists partially and the path being renamed is a directory. |
| * |
| * @throws Exception If failed. |
| */ |
| public void testMoveRenameDirectorySourceMissingPartially() throws Exception { |
| create(igfsSecondary, paths(DIR, SUBDIR, SUBSUBDIR, DIR_NEW, SUBDIR_NEW), null); |
| create(igfs, paths(DIR, DIR_NEW, SUBDIR_NEW), null); |
| |
| igfs.rename(SUBSUBDIR, SUBSUBDIR_NEW); |
| |
| checkExist(igfs, SUBDIR); |
| checkExist(igfs, igfsSecondary, SUBSUBDIR_NEW); |
| checkNotExist(igfs, igfsSecondary, SUBSUBDIR); |
| } |
| |
| /** |
| * Test move and rename in case source doesn't exist and the path being renamed is a directory. |
| * |
| * @throws Exception If failed. |
| */ |
| public void testMoveRenameDirectorySourceMissing() throws Exception { |
| create(igfsSecondary, paths(DIR, SUBDIR, SUBSUBDIR, DIR_NEW, SUBDIR_NEW), null); |
| create(igfs, paths(DIR_NEW, SUBDIR_NEW), null); |
| |
| igfs.rename(SUBSUBDIR, SUBSUBDIR_NEW); |
| |
| checkExist(igfs, DIR); |
| checkExist(igfs, SUBDIR); |
| checkExist(igfs, igfsSecondary, SUBSUBDIR_NEW); |
| checkNotExist(igfs, igfsSecondary, SUBSUBDIR); |
| } |
| |
| /** |
| * Test move and rename in case destination exists partially and the path being renamed is a directory. |
| * |
| * @throws Exception If failed. |
| */ |
| public void testMoveRenameDirectoryDestinationMissingPartially() throws Exception { |
| create(igfsSecondary, paths(DIR, SUBDIR, SUBSUBDIR, DIR_NEW, SUBDIR_NEW), null); |
| create(igfs, paths(DIR, SUBDIR, SUBSUBDIR, DIR_NEW), null); |
| |
| igfs.rename(SUBSUBDIR, SUBSUBDIR_NEW); |
| |
| checkExist(igfs, SUBDIR_NEW); |
| checkExist(igfs, igfsSecondary, SUBSUBDIR_NEW); |
| checkNotExist(igfs, igfsSecondary, SUBSUBDIR); |
| } |
| |
| /** |
| * Test move and rename in case destination doesn't exist and the path being renamed is a directory. |
| * |
| * @throws Exception If failed. |
| */ |
| public void testMoveRenameDirectoryDestinationMissing() throws Exception { |
| create(igfsSecondary, paths(DIR, SUBDIR, SUBSUBDIR, DIR_NEW, SUBDIR_NEW), null); |
| create(igfs, paths(DIR, SUBDIR, SUBSUBDIR), null); |
| |
| igfs.rename(SUBSUBDIR, SUBSUBDIR_NEW); |
| |
| checkExist(igfs, DIR_NEW, SUBDIR_NEW); |
| checkExist(igfs, igfsSecondary, SUBSUBDIR_NEW); |
| checkNotExist(igfs, igfsSecondary, SUBSUBDIR); |
| } |
| |
| /** |
| * Test move and rename in case source and destination exist partially and the path being renamed is a directory. |
| * |
| * @throws Exception If failed. |
| */ |
| public void testMoveRenameDirectorySourceAndDestinationMissingPartially() throws Exception { |
| create(igfsSecondary, paths(DIR, SUBDIR, SUBSUBDIR, DIR_NEW, SUBDIR_NEW), null); |
| create(igfs, paths(DIR, DIR_NEW), null); |
| |
| igfs.rename(SUBSUBDIR, SUBSUBDIR_NEW); |
| |
| checkExist(igfs, SUBDIR, SUBDIR_NEW); |
| checkExist(igfs, igfsSecondary, SUBSUBDIR_NEW); |
| checkNotExist(igfs, igfsSecondary, SUBSUBDIR); |
| } |
| |
| /** |
| * Test move and rename in case source and destination don't exist and the path being renamed is a directory. |
| * |
| * @throws Exception If failed. |
| */ |
| public void testMoveRenameDirectorySourceAndDestinationMissing() throws Exception { |
| create(igfsSecondary, paths(DIR, SUBDIR, SUBSUBDIR, DIR_NEW, SUBDIR_NEW), null); |
| create(igfs, null, null); |
| |
| igfs.rename(SUBSUBDIR, SUBSUBDIR_NEW); |
| |
| checkExist(igfs, DIR, SUBDIR, DIR_NEW, SUBDIR_NEW); |
| checkExist(igfs, igfsSecondary, SUBSUBDIR_NEW); |
| checkNotExist(igfs, igfsSecondary, SUBSUBDIR); |
| } |
| |
| /** |
| * Test directory move and rename when destination is the root and source is missing partially. |
| * |
| * @throws Exception If failed. |
| */ |
| public void testMoveRenameDirectoryDestinationRootSourceMissingPartially() throws Exception { |
| IgfsPath dir = new IgfsPath("/" + SUBSUBDIR.name()); |
| |
| create(igfsSecondary, paths(DIR, SUBDIR, SUBSUBDIR), null); |
| create(igfs, paths(DIR), null); |
| |
| igfs.rename(SUBSUBDIR, dir); |
| |
| checkExist(igfs, SUBDIR); |
| checkExist(igfs, igfsSecondary, dir); |
| checkNotExist(igfs, igfsSecondary, SUBSUBDIR); |
| } |
| |
| /** |
| * Test directory move and rename when destination is the root and source is missing. |
| * |
| * @throws Exception If failed. |
| */ |
| public void testMoveRenameDirectoryDestinationRootSourceMissing() throws Exception { |
| IgfsPath dir = new IgfsPath("/" + SUBSUBDIR.name()); |
| |
| create(igfsSecondary, paths(DIR, SUBDIR, SUBSUBDIR), null); |
| create(igfs, null, null); |
| |
| igfs.rename(SUBSUBDIR, dir); |
| |
| checkExist(igfs, DIR, SUBDIR); |
| checkExist(igfs, igfsSecondary, dir); |
| checkNotExist(igfs, igfsSecondary, SUBSUBDIR); |
| } |
| |
| /** |
| * Test directory move and rename when source parent is the root and the source is missing locally. |
| * |
| * @throws Exception If failed. |
| */ |
| public void testMoveRenameDirectorySourceParentRootSourceMissing() throws Exception { |
| IgfsPath dir = new IgfsPath("/" + SUBSUBDIR_NEW.name()); |
| |
| create(igfsSecondary, paths(DIR_NEW, SUBDIR_NEW, dir), null); |
| create(igfs, paths(DIR_NEW, SUBDIR_NEW), null); |
| |
| igfs.rename(dir, SUBSUBDIR_NEW); |
| |
| checkExist(igfs, igfsSecondary, SUBSUBDIR_NEW); |
| checkNotExist(igfs, igfsSecondary, dir); |
| } |
| |
| /** |
| * Test directory move and rename when source parent is the root and destination is missing partially. |
| * |
| * @throws Exception If failed. |
| */ |
| public void testMoveRenameDirectorySourceParentRootDestinationMissingPartially() throws Exception { |
| IgfsPath dir = new IgfsPath("/" + SUBSUBDIR_NEW.name()); |
| |
| create(igfsSecondary, paths(DIR_NEW, SUBDIR_NEW, dir), null); |
| create(igfs, paths(DIR_NEW), null); |
| |
| igfs.rename(dir, SUBSUBDIR_NEW); |
| |
| checkExist(igfs, SUBDIR_NEW); |
| checkExist(igfs, igfsSecondary, SUBSUBDIR_NEW); |
| checkNotExist(igfs, igfsSecondary, dir); |
| } |
| |
| /** |
| * Test directory move and rename when source parent is the root and destination is missing. |
| * |
| * @throws Exception If failed. |
| */ |
| public void testMoveRenameDirectorySourceParentRootDestinationMissing() throws Exception { |
| IgfsPath dir = new IgfsPath("/" + SUBSUBDIR_NEW.name()); |
| |
| create(igfsSecondary, paths(DIR_NEW, SUBDIR_NEW, dir), null); |
| create(igfs, null, null); |
| |
| igfs.rename(dir, SUBSUBDIR_NEW); |
| |
| checkExist(igfs, DIR_NEW, SUBDIR_NEW); |
| checkExist(igfs, igfsSecondary, SUBSUBDIR_NEW); |
| checkNotExist(igfs, igfsSecondary, dir); |
| } |
| |
| /** |
| * Test mkdirs in case parent exists remotely, but some part of the parent path doesn't exist locally. |
| * |
| * @throws Exception If failed. |
| */ |
| public void testMkdirsParentPathMissingPartially() throws Exception { |
| Map<String, String> props = null; |
| |
| if (permissionsSupported()) |
| props = properties(null, null, "0555"); // mkdirs command doesn't propagate user info. |
| |
| create(igfsSecondary, paths(DIR, SUBDIR), null); |
| create(igfs, paths(DIR), null); |
| |
| igfs.mkdirs(SUBSUBDIR, props); |
| |
| // Ensure that directory was created and properties are propagated. |
| checkExist(igfs, SUBDIR); |
| checkExist(igfs, igfsSecondary, SUBSUBDIR); |
| |
| if (permissionsSupported()) { |
| // Check only permissions because user and group will always be present in Hadoop secondary filesystem. |
| assertEquals(props.get(IgfsUtils.PROP_PERMISSION), igfsSecondary.permissions(SUBSUBDIR.toString())); |
| |
| // We check only permission because IGFS client adds username and group name explicitly. |
| assertEquals(props.get(IgfsUtils.PROP_PERMISSION), |
| igfs.info(SUBSUBDIR).properties().get(IgfsUtils.PROP_PERMISSION)); |
| } |
| } |
| |
| /** |
| * Test mkdirs in case parent exists remotely, but no parents exist locally. |
| * |
| * @throws Exception If failed. |
| */ |
| public void testMkdrisParentPathMissing() throws Exception { |
| Map<String, String> props = null; |
| |
| if (permissionsSupported()) |
| props = properties(null, null, "0555"); // mkdirs command doesn't propagate user info. |
| |
| create(igfsSecondary, paths(DIR, SUBDIR), null); |
| create(igfs, null, null); |
| |
| igfs.mkdirs(SUBSUBDIR, props); |
| |
| // Ensure that directory was created and properties are propagated. |
| checkExist(igfs, DIR); |
| checkExist(igfs, SUBDIR); |
| checkExist(igfs, igfsSecondary, SUBSUBDIR); |
| |
| if (permissionsSupported()) { |
| // Check only permission because in case of Hadoop secondary Fs user and group will always be present: |
| assertEquals(props.get(IgfsUtils.PROP_PERMISSION), igfsSecondary.permissions(SUBSUBDIR.toString())); |
| |
| // We check only permission because IGFS client adds username and group name explicitly. |
| assertEquals(props.get(IgfsUtils.PROP_PERMISSION), |
| igfs.info(SUBSUBDIR).properties().get(IgfsUtils.PROP_PERMISSION)); |
| } |
| } |
| |
| /** |
| * Test delete in case parent exists remotely, but some part of the parent path doesn't exist locally. |
| * |
| * @throws Exception If failed. |
| */ |
| public void testDeletePathMissingPartially() throws Exception { |
| create(igfsSecondary, paths(DIR, SUBDIR, SUBSUBDIR), paths(FILE)); |
| create(igfs, paths(DIR), null); |
| |
| igfs.delete(SUBDIR, true); |
| |
| checkExist(igfs, DIR); |
| checkNotExist(igfs, igfsSecondary, SUBDIR, SUBSUBDIR, FILE); |
| } |
| |
| /** |
| * Test delete in case parent exists remotely, but no parents exist locally. |
| * |
| * @throws Exception If failed. |
| */ |
| public void testDeletePathMissing() throws Exception { |
| create(igfsSecondary, paths(DIR, SUBDIR, SUBSUBDIR), paths(FILE)); |
| create(igfs, null, null); |
| |
| igfs.delete(SUBDIR, true); |
| |
| checkExist(igfs, DIR); |
| checkNotExist(igfs, igfsSecondary, SUBDIR, SUBSUBDIR, FILE); |
| } |
| |
| /** |
| * Test delete when the path parent is the root and the path is missing locally. |
| * |
| * @throws Exception If failed. |
| */ |
| public void testDeleteParentRootPathMissing() throws Exception { |
| create(igfsSecondary, paths(DIR, SUBDIR, SUBSUBDIR), paths(FILE)); |
| create(igfs, null, null); |
| |
| igfs.delete(DIR, true); |
| |
| checkNotExist(igfs, igfsSecondary, DIR, SUBDIR, SUBSUBDIR, FILE); |
| } |
| |
| /** |
| * Test update in case file exists remotely, but some part of the path doesn't exist locally. |
| * |
| * @throws Exception If failed. |
| */ |
| public void testUpdatePathMissingPartially() throws Exception { |
| if(!propertiesSupported()) |
| return; |
| |
| Map<String, String> propsSubDir = properties("subDirOwner", "subDirGroup", "0555"); |
| Map<String, String> propsFile = properties("fileOwner", "fileGroup", "0666"); |
| |
| create(igfsSecondary, paths(DIR, SUBDIR), paths(FILE)); |
| create(igfs, paths(DIR), null); |
| |
| // Set different properties to the sub-directory. |
| igfsSecondaryFileSystem.update(SUBDIR, propsSubDir); |
| |
| igfs.update(FILE, propsFile); |
| |
| // Ensure missing entries were re-created locally. |
| checkExist(igfs, SUBDIR, FILE); |
| |
| // Ensure properties propagation. |
| assertEquals(propsSubDir, igfsSecondary.properties(SUBDIR.toString())); |
| assertEquals(propsSubDir, igfs.info(SUBDIR).properties()); |
| |
| assertEquals(propsFile, igfsSecondary.properties(FILE.toString())); |
| assertEquals(propsFile, igfs.info(FILE).properties()); |
| } |
| |
| /** |
| * Test update in case file exists remotely, but neither the file nor all it's parents exist locally. |
| * |
| * @throws Exception If failed. |
| */ |
| public void testUpdatePathMissing() throws Exception { |
| if(!propertiesSupported()) |
| return; |
| |
| Map<String, String> propsSubDir = properties("subDirOwner", "subDirGroup", "0555"); |
| Map<String, String> propsFile = properties("fileOwner", "fileGroup", "0666"); |
| |
| create(igfsSecondary, paths(DIR, SUBDIR), paths(FILE)); |
| create(igfs, null, null); |
| |
| // Set different properties to the sub-directory. |
| igfsSecondaryFileSystem.update(SUBDIR, propsSubDir); |
| |
| igfs.update(FILE, propsFile); |
| |
| // Ensure missing entries were re-created locally. |
| checkExist(igfs, DIR, SUBDIR, FILE); |
| |
| // Ensure properties propagation. |
| assertEquals(propsSubDir, igfsSecondary.properties(SUBDIR.toString())); |
| assertEquals(propsSubDir, igfs.info(SUBDIR).properties()); |
| |
| assertEquals(propsFile, igfsSecondary.properties(FILE.toString())); |
| assertEquals(propsFile, igfs.info(FILE).properties()); |
| } |
| |
| /** |
| * Test update when parent is the root and the path being updated is missing locally. |
| * |
| * @throws Exception If failed. |
| */ |
| public void testUpdateParentRootPathMissing() throws Exception { |
| doUpdateParentRootPathMissing(properties("owner", "group", "0555")); |
| } |
| |
| /** |
| * Test update when parent is the root and the path being updated is missing locally. |
| * |
| * @param props Properties. |
| * @throws Exception If failed. |
| */ |
| protected void doUpdateParentRootPathMissing(Map<String, String> props) throws Exception { |
| if (!propertiesSupported()) |
| return; |
| |
| create(igfsSecondary, paths(DIR), null); |
| create(igfs, null, null); |
| |
| igfs.update(DIR, props); |
| |
| checkExist(igfs, DIR); |
| |
| assertTrue(propertiesContains(igfsSecondary.properties(DIR.toString()), props)); |
| assertTrue(propertiesContains(igfs.info(DIR).properties(), props)); |
| } |
| |
| /** |
| * Test file open in case it doesn't exist locally. |
| * |
| * @throws Exception If failed. |
| */ |
| public void testOpenMissing() throws Exception { |
| create(igfsSecondary, paths(DIR, SUBDIR), null); |
| create(igfs, null, null); |
| |
| createFile(igfsSecondary, FILE, chunk); |
| |
| checkFileContent(igfs, FILE, chunk); |
| } |
| |
| /** |
| * Test create when parent directory is partially missing locally. |
| * |
| * @throws Exception If failed. |
| */ |
| public void testCreateParentMissingPartially() throws Exception { |
| create(igfsSecondary, paths(DIR, SUBDIR), null); |
| create(igfs, paths(DIR), null); |
| |
| createFile(igfs, FILE, true, chunk); |
| |
| // Ensure that directory structure was created. |
| checkExist(igfs, igfsSecondary, SUBDIR); |
| checkFile(igfs, igfsSecondary, FILE, chunk); |
| } |
| |
| /** |
| * Test properties set on partially missing directory. |
| * |
| * @throws Exception If failed. |
| */ |
| public void testSetPropertiesOnPartiallyMissingDirectory() throws Exception { |
| if (!propertiesSupported()) |
| return; |
| |
| Map<String, String> props = properties("owner", "group", "0555"); |
| |
| create(igfsSecondary, paths(DIR, SUBDIR), null); |
| create(igfs, paths(DIR), null); |
| |
| igfsSecondaryFileSystem.update(SUBDIR, props); |
| |
| // Ensure properties propagation of the created subdirectory. |
| assertEquals(props, igfs.info(SUBDIR).properties()); |
| } |
| |
| /** |
| * Test create when parent directory is missing locally. |
| * |
| * @throws Exception If failed. |
| */ |
| public void testCreateParentMissing() throws Exception { |
| create(igfsSecondary, paths(DIR, SUBDIR), null); |
| create(igfs, null, null); |
| |
| createFile(igfs, FILE, true, chunk); |
| |
| checkExist(igfs, igfsSecondary, SUBDIR); |
| checkFile(igfs, igfsSecondary, FILE, chunk); |
| } |
| |
| /** |
| * Test properties set on missing directory. |
| * |
| * @throws Exception If failed. |
| */ |
| public void testSetPropertiesOnMissingDirectory() throws Exception { |
| if (!propertiesSupported()) |
| return; |
| |
| Map<String, String> propsDir = properties("ownerDir", "groupDir", "0555"); |
| Map<String, String> propsSubDir = properties("ownerSubDir", "groupSubDir", "0666"); |
| |
| create(igfsSecondary, paths(DIR, SUBDIR), null); |
| create(igfs, null, null); |
| |
| igfsSecondaryFileSystem.update(DIR, propsDir); |
| igfsSecondaryFileSystem.update(SUBDIR, propsSubDir); |
| |
| // Ensure properties propagation of the created directories. |
| assertEquals(propsDir, igfs.info(DIR).properties()); |
| assertEquals(propsSubDir, igfs.info(SUBDIR).properties()); |
| } |
| |
| /** |
| * Test append when parent directory is partially missing locally. |
| * |
| * @throws Exception If failed. |
| */ |
| public void testAppendParentMissingPartially() throws Exception { |
| if (!appendSupported()) |
| return; |
| |
| create(igfsSecondary, paths(DIR, SUBDIR), null); |
| create(igfs, paths(DIR), null); |
| |
| createFile(igfsSecondary, FILE, /*BLOCK_SIZE,*/ chunk); |
| |
| appendFile(igfs, FILE, chunk); |
| |
| // Ensure that directory structure was created. |
| checkExist(igfs, igfsSecondary, SUBDIR); |
| checkFile(igfs, igfsSecondary, FILE, chunk, chunk); |
| } |
| |
| /** |
| * Test append when parent directory is missing locally. |
| * |
| * @throws Exception If failed. |
| */ |
| public void testAppendParentMissing() throws Exception { |
| if (!appendSupported()) |
| return; |
| |
| create(igfsSecondary, paths(DIR, SUBDIR), null); |
| create(igfs, null, null); |
| |
| createFile(igfsSecondary, FILE, /*BLOCK_SIZE,*/ chunk); |
| |
| appendFile(igfs, FILE, chunk); |
| |
| checkExist(igfs, igfsSecondary, SUBDIR); |
| checkFile(igfs, igfsSecondary, FILE, chunk, chunk); |
| } |
| |
| /** |
| * Ensure that in case we rename the folder A and delete it at the same time, only one of these requests succeed. |
| * Initially file system entries are created only in the secondary file system. |
| * |
| * @throws Exception If failed. |
| */ |
| public void testConcurrentRenameDeleteSourceRemote() throws Exception { |
| for (int i = 0; i < REPEAT_CNT; i++) { |
| final CyclicBarrier barrier = new CyclicBarrier(2); |
| |
| create(igfsSecondary, paths(DIR, SUBDIR, DIR_NEW), paths()); |
| |
| IgniteInternalFuture<Boolean> res1 = execute(new Callable<Boolean>() { |
| @Override public Boolean call() throws Exception { |
| U.awaitQuiet(barrier); |
| |
| try { |
| igfs.rename(SUBDIR, SUBDIR_NEW); |
| |
| return true; |
| } |
| catch (IgniteException ignored) { |
| return false; |
| } |
| } |
| }); |
| |
| IgniteInternalFuture<Boolean> res2 = execute(new Callable<Boolean>() { |
| @Override public Boolean call() throws Exception { |
| U.awaitQuiet(barrier); |
| |
| return igfs.delete(SUBDIR, true); |
| } |
| }); |
| |
| res1.get(); |
| res2.get(); |
| |
| if (res1.get()) { |
| assert !res2.get(); // Rename succeeded, so delete must fail. |
| |
| checkExist(igfs, igfsSecondary, DIR, DIR_NEW, SUBDIR_NEW); |
| checkNotExist(igfs, igfsSecondary, SUBDIR); |
| } |
| else { |
| assert res2.get(); // Rename failed because delete succeeded. |
| |
| checkExist(igfs, DIR); // DIR_NEW should not be synchronized with he primary IGFS. |
| checkExist(igfsSecondary, DIR, DIR_NEW); |
| checkNotExist(igfs, igfsSecondary, SUBDIR, SUBDIR_NEW); |
| } |
| |
| clear(igfs, igfsSecondary); |
| } |
| } |
| |
| /** |
| * Ensure that in case we rename the folder A to B and delete B at the same time, FS consistency is not compromised. |
| * Initially file system entries are created only in the secondary file system. |
| * |
| * @throws Exception If failed. |
| */ |
| public void testConcurrentRenameDeleteDestinationRemote() throws Exception { |
| for (int i = 0; i < REPEAT_CNT; i++) { |
| final CyclicBarrier barrier = new CyclicBarrier(2); |
| |
| create(igfsSecondary, paths(DIR, SUBDIR, DIR_NEW), paths()); |
| |
| IgniteInternalFuture<Boolean> res1 = execute(new Callable<Boolean>() { |
| @Override public Boolean call() throws Exception { |
| U.awaitQuiet(barrier); |
| |
| try { |
| igfs.rename(SUBDIR, SUBDIR_NEW); |
| |
| return true; |
| } |
| catch (IgniteException ignored) { |
| return false; |
| } |
| } |
| }); |
| |
| IgniteInternalFuture<Boolean> res2 = execute(new Callable<Boolean>() { |
| @Override public Boolean call() throws Exception { |
| U.awaitQuiet(barrier); |
| |
| return igfs.delete(SUBDIR_NEW, true); |
| } |
| }); |
| |
| assert res1.get(); |
| |
| if (res2.get()) { |
| // Delete after rename. |
| checkExist(igfs, igfsSecondary, DIR, DIR_NEW); |
| checkNotExist(igfs, igfsSecondary, SUBDIR, SUBDIR_NEW); |
| } |
| else { |
| // Delete before rename. |
| checkExist(igfs, igfsSecondary, DIR, DIR_NEW, SUBDIR_NEW); |
| checkNotExist(igfs, igfsSecondary, SUBDIR); |
| } |
| |
| clear(igfs, igfsSecondary); |
| } |
| } |
| |
| /** |
| * Ensure file system consistency in case two concurrent rename requests are executed: A -> B and B -> A. |
| * Initially file system entries are created only in the secondary file system. |
| * |
| * @throws Exception If failed. |
| */ |
| public void testConcurrentRenamesRemote() throws Exception { |
| for (int i = 0; i < REPEAT_CNT; i++) { |
| final CyclicBarrier barrier = new CyclicBarrier(2); |
| |
| create(igfsSecondary, paths(DIR, SUBDIR, DIR_NEW), paths()); |
| |
| IgniteInternalFuture<Boolean> res1 = execute(new Callable<Boolean>() { |
| @Override public Boolean call() throws Exception { |
| U.awaitQuiet(barrier); |
| |
| try { |
| igfs.rename(SUBDIR, SUBDIR_NEW); |
| |
| return true; |
| } |
| catch (IgniteException ignored) { |
| return false; |
| } |
| } |
| }); |
| |
| IgniteInternalFuture<Boolean> res2 = execute(new Callable<Boolean>() { |
| @Override public Boolean call() throws Exception { |
| U.awaitQuiet(barrier); |
| |
| try { |
| igfs.rename(SUBDIR_NEW, SUBDIR); |
| |
| return true; |
| } |
| catch (IgniteException ignored) { |
| return false; |
| } |
| } |
| }); |
| |
| res1.get(); |
| res2.get(); |
| |
| assert res1.get(); // First rename must be successful anyway. |
| |
| if (res2.get()) { |
| checkExist(igfs, igfsSecondary, DIR, SUBDIR, DIR_NEW); |
| checkNotExist(igfs, igfsSecondary, SUBDIR_NEW); |
| } |
| else { |
| checkExist(igfs, igfsSecondary, DIR, DIR_NEW, SUBDIR_NEW); |
| checkNotExist(igfs, igfsSecondary, SUBDIR); |
| } |
| |
| clear(igfs, igfsSecondary); |
| } |
| } |
| |
| /** |
| * Ensure that in case we delete the folder A and delete its parent at the same time, resulting file system |
| * structure is consistent. Initially file system entries are created only in the secondary file system. |
| * |
| * @throws Exception If failed. |
| */ |
| public void testConcurrentDeletesRemote() throws Exception { |
| for (int i = 0; i < REPEAT_CNT; i++) { |
| final CyclicBarrier barrier = new CyclicBarrier(2); |
| |
| create(igfsSecondary, paths(DIR, SUBDIR, SUBSUBDIR), paths()); |
| |
| IgniteInternalFuture<Boolean> res1 = execute(new Callable<Boolean>() { |
| @Override public Boolean call() throws Exception { |
| U.awaitQuiet(barrier); |
| |
| try { |
| igfs.delete(SUBDIR, true); |
| |
| return true; |
| } |
| catch (IgniteException ignored) { |
| return false; |
| } |
| } |
| }); |
| |
| IgniteInternalFuture<Boolean> res2 = execute(new Callable<Boolean>() { |
| @Override public Boolean call() throws Exception { |
| U.awaitQuiet(barrier); |
| |
| try { |
| igfs.delete(SUBSUBDIR, true); |
| |
| return true; |
| } |
| catch (IgniteException ignored) { |
| return false; |
| } |
| } |
| }); |
| |
| assert res1.get(); // Delete on the parent must succeed anyway. |
| res2.get(); |
| |
| checkExist(igfs, igfsSecondary, DIR); |
| checkNotExist(igfs, igfsSecondary, SUBDIR, SUBSUBDIR); |
| |
| clear(igfs, igfsSecondary); |
| } |
| } |
| |
| /** |
| * Checks file access & modification time equality in the file itself and in the same file found through |
| * the listing of its parent. |
| * |
| * @param fs The file system. |
| * @param p The file path. |
| * |
| * @return Tuple of access and modification times of the file. |
| */ |
| private T2<Long, Long> checkParentListingTime(IgfsSecondaryFileSystem fs, IgfsPath p) { |
| IgfsFile f0 = fs.info(p); |
| |
| T2<Long, Long> t0 = new T2<>(f0.accessTime(), f0.modificationTime()); |
| |
| // Root cannot be seen through the parent listing: |
| if (!F.eq(IgfsPath.ROOT, p)) { |
| assertNotNull(f0); |
| |
| Collection<IgfsFile> listing = fs.listFiles(p.parent()); |
| |
| IgfsFile f1 = null; |
| |
| for (IgfsFile fi : listing) { |
| if (F.eq(fi.path(), p)) { |
| f1 = fi; |
| |
| break; |
| } |
| } |
| |
| assertNotNull(f1); // file should be found in parent listing. |
| |
| T2<Long, Long> t1 = new T2<>(f1.accessTime(), f1.modificationTime()); |
| |
| assertEquals(t0, t1); |
| } |
| |
| return t0; |
| } |
| |
| /** |
| * Test for file modification time upwards propagation when files are |
| * created on the secondary file system and initially |
| * unknown on the primary file system. |
| * |
| * @throws Exception On error. |
| */ |
| public void testAccessAndModificationTimeUpwardsPropagation() throws Exception { |
| create(igfsSecondary, paths(DIR, SUBDIR), paths(FILE, FILE2)); |
| |
| T2<Long,Long> timesDir0 = checkParentListingTime(igfsSecondaryFileSystem, DIR); |
| T2<Long,Long> timesSubDir0 = checkParentListingTime(igfsSecondaryFileSystem, SUBDIR); |
| T2<Long,Long> timesFile0 = checkParentListingTime(igfsSecondaryFileSystem, FILE); |
| T2<Long,Long> timesFile20 = checkParentListingTime(igfsSecondaryFileSystem, FILE2); |
| |
| Thread.sleep(500L); |
| |
| T2<Long,Long> timesDir1 = checkParentListingTime(igfs.asSecondary(), DIR); |
| T2<Long,Long> timesSubDir1 = checkParentListingTime(igfs.asSecondary(), SUBDIR); |
| T2<Long,Long> timesFile1 = checkParentListingTime(igfs.asSecondary(), FILE); |
| T2<Long,Long> timesFile21 = checkParentListingTime(igfs.asSecondary(), FILE2); |
| |
| assertEquals(timesDir0, timesDir1); |
| assertEquals(timesSubDir0, timesSubDir1); |
| assertEquals(timesFile0, timesFile1); |
| assertEquals(timesFile20, timesFile21); |
| } |
| |
| /** |
| * Test setTimes method when path is partially missing. |
| * |
| * @throws Exception If failed. |
| */ |
| public void testSetTimesMissingPartially() throws Exception { |
| if (!timesSupported()) |
| return; |
| |
| create(igfs, paths(DIR, SUBDIR), null); |
| |
| createFile(igfsSecondary, FILE, chunk); |
| |
| final long MAX_ALIGN_ON_SECOND = (long)Integer.MAX_VALUE * 1000; |
| |
| igfs.setTimes(FILE, MAX_ALIGN_ON_SECOND, MAX_ALIGN_ON_SECOND - 1000); |
| |
| IgfsFile info = igfs.info(FILE); |
| |
| assert info != null; |
| |
| assertEquals(MAX_ALIGN_ON_SECOND - 1000, info.accessTime()); |
| assertEquals(MAX_ALIGN_ON_SECOND, info.modificationTime()); |
| |
| T2<Long, Long> secondaryTimes = igfsSecondary.times(FILE.toString()); |
| |
| assertEquals(info.modificationTime(), (long) secondaryTimes.get1()); |
| assertEquals(info.accessTime(), (long) secondaryTimes.get2()); |
| |
| try { |
| igfs.setTimes(FILE2, MAX_ALIGN_ON_SECOND, MAX_ALIGN_ON_SECOND); |
| |
| fail("Exception is not thrown for missing file."); |
| } catch (Exception ignore) { |
| // No-op. |
| } |
| } |
| |
| /** |
| * |
| * @throws Exception If failed. |
| */ |
| public void testSecondarySize() throws Exception { |
| igfs.mkdirs(SUBDIR); |
| |
| createFile(igfsSecondary, FILE, chunk); |
| createFile(igfsSecondary, new IgfsPath(SUBDIR, "file2"), chunk); |
| |
| assertEquals(chunk.length, igfs.size(FILE)); |
| assertEquals(chunk.length * 2, igfs.size(SUBDIR)); |
| } |
| |
| /** |
| * @param allProps All properties. |
| * @param checkedProps Checked properies |
| * @return {@code true} If allchecked properties are contained in the #propsAll. |
| */ |
| public static boolean propertiesContains(Map<String, String> allProps, Map<String, String> checkedProps) { |
| for (String name : checkedProps.keySet()) |
| if (!checkedProps.get(name).equals(allProps.get(name))) { |
| System.err.println("All properties: " + allProps); |
| System.err.println("Checked properties: " + checkedProps); |
| return false; |
| } |
| |
| return true; |
| } |
| } |