IGNITE-3248: Optimized fileIds() usage.
Project: http://git-wip-us.apache.org/repos/asf/ignite/repo Commit: http://git-wip-us.apache.org/repos/asf/ignite/commit/e409b67a Tree: http://git-wip-us.apache.org/repos/asf/ignite/tree/e409b67a Diff: http://git-wip-us.apache.org/repos/asf/ignite/diff/e409b67a Branch: refs/heads/ignite-3216 Commit: e409b67a14ed67025a4bdd5824d4cc3a02f4e920 Parents: b96afb2 Author: vozerov-gridgain <voze...@gridgain.com> Authored: Sun Jun 5 21:04:03 2016 +0300 Committer: vozerov-gridgain <voze...@gridgain.com> Committed: Sun Jun 5 21:04:03 2016 +0300 ---------------------------------------------------------------------- .../internal/processors/igfs/IgfsImpl.java | 18 +++--- .../processors/igfs/IgfsInputStreamImpl.java | 2 +- .../processors/igfs/IgfsMetaManager.java | 34 ++++++++-- .../meta/IgfsClientMetaIdsForPathCallable.java | 65 ++++++++++++++++++++ .../meta/IgfsClientMetaInfoForPathCallable.java | 63 +++++++++++++++++++ .../processors/igfs/IgfsOneClientNodeTest.java | 2 +- 6 files changed, 167 insertions(+), 17 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/ignite/blob/e409b67a/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 b7b3fac..9087ff0 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 @@ -660,7 +660,7 @@ public final class IgfsImpl implements IgfsEx { return new IgfsFileImpl(path, info, data.groupBlockSize()); } - List<IgniteUuid> fileIds = meta.fileIds(path); + List<IgniteUuid> fileIds = meta.idsForPath(path); IgniteUuid fileId = fileIds.get(fileIds.size() - 1); @@ -938,7 +938,8 @@ public final class IgfsImpl implements IgfsEx { } } } - } else if (mode == PRIMARY) { + } + else if (mode == PRIMARY) { checkConflictWithPrimary(path); throw new IgfsPathNotFoundException("Failed to list files (path not found): " + path); @@ -993,7 +994,7 @@ public final class IgfsImpl implements IgfsEx { return os; } - IgfsEntryInfo info = meta.info(meta.fileId(path)); + IgfsEntryInfo info = meta.infoForPath(path); if (info == null) { checkConflictWithPrimary(path); @@ -1144,7 +1145,7 @@ public final class IgfsImpl implements IgfsEx { return new IgfsEventAwareOutputStream(path, desc.info(), bufferSize(bufSize), mode, batch); } - final List<IgniteUuid> ids = meta.fileIds(path); + final List<IgniteUuid> ids = meta.idsForPath(path); final IgniteUuid id = ids.get(ids.size() - 1); @@ -1259,8 +1260,7 @@ public final class IgfsImpl implements IgfsEx { IgfsMode mode = resolveMode(path); // Check memory first. - IgniteUuid fileId = meta.fileId(path); - IgfsEntryInfo info = meta.info(fileId); + IgfsEntryInfo info = meta.infoForPath(path); if (info == null && mode != PRIMARY) { assert mode == DUAL_SYNC || mode == DUAL_ASYNC; @@ -1469,7 +1469,7 @@ public final class IgfsImpl implements IgfsEx { @Nullable private FileDescriptor getFileDescriptor(IgfsPath path) throws IgniteCheckedException { assert path != null; - List<IgniteUuid> ids = meta.fileIds(path); + List<IgniteUuid> ids = meta.idsForPath(path); IgfsEntryInfo fileInfo = meta.info(ids.get(ids.size() - 1)); @@ -1645,13 +1645,13 @@ public final class IgfsImpl implements IgfsEx { switch (mode) { case PRIMARY: - info = meta.info(meta.fileId(path)); + info = meta.infoForPath(path); break; case DUAL_SYNC: case DUAL_ASYNC: - info = meta.info(meta.fileId(path)); + info = meta.infoForPath(path); if (info == null) { try { http://git-wip-us.apache.org/repos/asf/ignite/blob/e409b67a/modules/core/src/main/java/org/apache/ignite/internal/processors/igfs/IgfsInputStreamImpl.java ---------------------------------------------------------------------- diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/igfs/IgfsInputStreamImpl.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/igfs/IgfsInputStreamImpl.java index 447be93..de7071a 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/igfs/IgfsInputStreamImpl.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/igfs/IgfsInputStreamImpl.java @@ -319,7 +319,7 @@ public class IgfsInputStreamImpl extends IgfsInputStreamAdapter { } // Safety to ensure no orphaned data blocks exist in case file was concurrently deleted. - if (!meta.exists(fileInfo.id())) + if (!meta.exists(fileInfo.id())) data.delete(fileInfo); } } http://git-wip-us.apache.org/repos/asf/ignite/blob/e409b67a/modules/core/src/main/java/org/apache/ignite/internal/processors/igfs/IgfsMetaManager.java ---------------------------------------------------------------------- diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/igfs/IgfsMetaManager.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/igfs/IgfsMetaManager.java index 3295249..fa748f8 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/igfs/IgfsMetaManager.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/igfs/IgfsMetaManager.java @@ -49,6 +49,8 @@ import org.apache.ignite.internal.processors.cache.GridCacheInternal; import org.apache.ignite.internal.processors.cache.IgniteInternalCache; import org.apache.ignite.internal.processors.cache.transactions.IgniteInternalTx; import org.apache.ignite.internal.processors.igfs.client.IgfsClientAbstractCallable; +import org.apache.ignite.internal.processors.igfs.client.meta.IgfsClientMetaIdsForPathCallable; +import org.apache.ignite.internal.processors.igfs.client.meta.IgfsClientMetaInfoForPathCallable; import org.apache.ignite.internal.processors.igfs.meta.IgfsMetaDirectoryCreateProcessor; import org.apache.ignite.internal.processors.igfs.meta.IgfsMetaFileCreateProcessor; import org.apache.ignite.internal.processors.igfs.meta.IgfsMetaFileLockProcessor; @@ -2097,6 +2099,28 @@ public class IgfsMetaManager extends IgfsManager { } /** + * Get info for the given path. + * + * @param path Path. + * @return Info. + * @throws IgniteCheckedException If failed. + */ + @Nullable public IgfsEntryInfo infoForPath(IgfsPath path) throws IgniteCheckedException { + return client ? runClientTask(new IgfsClientMetaInfoForPathCallable(cfg.getName(), path)) : info(fileId(path)); + } + + /** + * Get IDs for the given path. + * + * @param path Path. + * @return IDs. + * @throws IgniteCheckedException If failed. + */ + public List<IgniteUuid> idsForPath(IgfsPath path) throws IgniteCheckedException { + return client ? runClientTask(new IgfsClientMetaIdsForPathCallable(cfg.getName(), path)) : fileIds(path); + } + + /** * Open file in DUAL mode. * * @param fs Secondary file system. @@ -2106,15 +2130,14 @@ public class IgfsMetaManager extends IgfsManager { * @throws IgniteCheckedException If input stream open has failed. */ public IgfsSecondaryInputStreamDescriptor openDual(final IgfsSecondaryFileSystem fs, final IgfsPath path, - final int bufSize) - throws IgniteCheckedException { + final int bufSize) throws IgniteCheckedException { if (busyLock.enterBusy()) { try { assert fs != null; assert path != null; // First, try getting file info without any transactions and synchronization. - IgfsEntryInfo info = info(fileId(path)); + IgfsEntryInfo info = infoForPath(path); if (info != null) { if (!info.isFile()) @@ -2176,7 +2199,7 @@ public class IgfsMetaManager extends IgfsManager { if (busyLock.enterBusy()) { try { // First, try getting file info without any transactions and synchronization. - IgfsEntryInfo info = info(fileId(path)); + IgfsEntryInfo info = infoForPath(path); if (info != null) return info; @@ -2652,10 +2675,9 @@ public class IgfsMetaManager extends IgfsManager { List<List<IgniteUuid>> pathIds = new ArrayList<>(paths.length); for (IgfsPath path : paths) - pathIds.add(fileIds(path)); + pathIds.add(idsForPath(path)); // Start pessimistic. - try (IgniteInternalTx tx = startTx()) { // Lock the very first existing parents and possibly the leaf as well. Map<IgfsPath, IgfsPath> pathToParent = new HashMap<>(); http://git-wip-us.apache.org/repos/asf/ignite/blob/e409b67a/modules/core/src/main/java/org/apache/ignite/internal/processors/igfs/client/meta/IgfsClientMetaIdsForPathCallable.java ---------------------------------------------------------------------- diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/igfs/client/meta/IgfsClientMetaIdsForPathCallable.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/igfs/client/meta/IgfsClientMetaIdsForPathCallable.java new file mode 100644 index 0000000..7b3d142 --- /dev/null +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/igfs/client/meta/IgfsClientMetaIdsForPathCallable.java @@ -0,0 +1,65 @@ +/* + * 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.client.meta; + +import org.apache.ignite.igfs.IgfsPath; +import org.apache.ignite.internal.processors.igfs.IgfsContext; +import org.apache.ignite.internal.processors.igfs.IgfsMetaManager; +import org.apache.ignite.internal.processors.igfs.client.IgfsClientAbstractCallable; +import org.apache.ignite.internal.util.typedef.internal.S; +import org.apache.ignite.lang.IgniteUuid; +import org.jetbrains.annotations.Nullable; + +import java.util.List; + +/** + * Get entry info for the given path. + */ +public class IgfsClientMetaIdsForPathCallable extends IgfsClientAbstractCallable<List<IgniteUuid>> { + /** */ + private static final long serialVersionUID = 0L; + + /** + * Default constructor. + */ + public IgfsClientMetaIdsForPathCallable() { + // NO-op. + } + + /** + * Constructor. + * + * @param igfsName IGFS name. + * @param path Path. + */ + public IgfsClientMetaIdsForPathCallable(@Nullable String igfsName, IgfsPath path) { + super(igfsName, path); + } + + /** {@inheritDoc} */ + @Override protected List<IgniteUuid> call0(IgfsContext ctx) throws Exception { + IgfsMetaManager meta = ctx.meta(); + + return meta.idsForPath(path); + } + + /** {@inheritDoc} */ + @Override public String toString() { + return S.toString(IgfsClientMetaIdsForPathCallable.class, this); + } +} http://git-wip-us.apache.org/repos/asf/ignite/blob/e409b67a/modules/core/src/main/java/org/apache/ignite/internal/processors/igfs/client/meta/IgfsClientMetaInfoForPathCallable.java ---------------------------------------------------------------------- diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/igfs/client/meta/IgfsClientMetaInfoForPathCallable.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/igfs/client/meta/IgfsClientMetaInfoForPathCallable.java new file mode 100644 index 0000000..cb31663 --- /dev/null +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/igfs/client/meta/IgfsClientMetaInfoForPathCallable.java @@ -0,0 +1,63 @@ +/* + * 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.client.meta; + +import org.apache.ignite.igfs.IgfsPath; +import org.apache.ignite.internal.processors.igfs.IgfsContext; +import org.apache.ignite.internal.processors.igfs.IgfsEntryInfo; +import org.apache.ignite.internal.processors.igfs.IgfsMetaManager; +import org.apache.ignite.internal.processors.igfs.client.IgfsClientAbstractCallable; +import org.apache.ignite.internal.util.typedef.internal.S; +import org.jetbrains.annotations.Nullable; + +/** + * Get entry info for the given path. + */ +public class IgfsClientMetaInfoForPathCallable extends IgfsClientAbstractCallable<IgfsEntryInfo> { + /** */ + private static final long serialVersionUID = 0L; + + /** + * Default constructor. + */ + public IgfsClientMetaInfoForPathCallable() { + // NO-op. + } + + /** + * Constructor. + * + * @param igfsName IGFS name. + * @param path Path. + */ + public IgfsClientMetaInfoForPathCallable(@Nullable String igfsName, IgfsPath path) { + super(igfsName, path); + } + + /** {@inheritDoc} */ + @Override protected IgfsEntryInfo call0(IgfsContext ctx) throws Exception { + IgfsMetaManager meta = ctx.meta(); + + return meta.infoForPath(path); + } + + /** {@inheritDoc} */ + @Override public String toString() { + return S.toString(IgfsClientMetaInfoForPathCallable.class, this); + } +} http://git-wip-us.apache.org/repos/asf/ignite/blob/e409b67a/modules/core/src/test/java/org/apache/ignite/internal/processors/igfs/IgfsOneClientNodeTest.java ---------------------------------------------------------------------- diff --git a/modules/core/src/test/java/org/apache/ignite/internal/processors/igfs/IgfsOneClientNodeTest.java b/modules/core/src/test/java/org/apache/ignite/internal/processors/igfs/IgfsOneClientNodeTest.java index 3bfd372..c5f85bc 100644 --- a/modules/core/src/test/java/org/apache/ignite/internal/processors/igfs/IgfsOneClientNodeTest.java +++ b/modules/core/src/test/java/org/apache/ignite/internal/processors/igfs/IgfsOneClientNodeTest.java @@ -128,6 +128,6 @@ public class IgfsOneClientNodeTest extends GridCommonAbstractTest { return null; } - }, IgfsException.class, "Cache server nodes not found."); + }, IgfsException.class, "Failed to execute operation because there are no IGFS metadata nodes."); } } \ No newline at end of file