You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ignite.apache.org by sb...@apache.org on 2016/03/04 09:06:12 UTC
[06/10] ignite git commit: IGNITE-2754: IGFS: Created separate
processor for listing remove operation.
IGNITE-2754: IGFS: Created separate processor for listing remove operation.
Project: http://git-wip-us.apache.org/repos/asf/ignite/repo
Commit: http://git-wip-us.apache.org/repos/asf/ignite/commit/c13339fe
Tree: http://git-wip-us.apache.org/repos/asf/ignite/tree/c13339fe
Diff: http://git-wip-us.apache.org/repos/asf/ignite/diff/c13339fe
Branch: refs/heads/ignite-1232
Commit: c13339fef50b34157d0b9d74ee42c24d89af79b2
Parents: bcb8b52
Author: vozerov-gridgain <vo...@gridgain.com>
Authored: Thu Mar 3 13:25:43 2016 +0300
Committer: vozerov-gridgain <vo...@gridgain.com>
Committed: Thu Mar 3 13:25:43 2016 +0300
----------------------------------------------------------------------
.../processors/igfs/IgfsMetaManager.java | 160 ++++++++++++-------
1 file changed, 105 insertions(+), 55 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/ignite/blob/c13339fe/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 0ba78c5..c120b9d 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
@@ -43,6 +43,7 @@ import javax.cache.processor.EntryProcessor;
import javax.cache.processor.EntryProcessorException;
import javax.cache.processor.EntryProcessorResult;
import javax.cache.processor.MutableEntry;
+
import org.apache.ignite.IgniteCheckedException;
import org.apache.ignite.IgniteException;
import org.apache.ignite.IgniteInterruptedException;
@@ -847,7 +848,7 @@ public class IgfsMetaManager extends IgfsManager {
if (!id2InfoPrj.putIfAbsent(fileId, newFileInfo))
throw fsException("Failed to add file details into cache: " + newFileInfo);
- id2InfoPrj.invoke(parentId, new UpdateListing(fileName, new IgfsListingEntry(newFileInfo), false));
+ id2InfoPrj.invoke(parentId, new ListingAdd(fileName, new IgfsListingEntry(newFileInfo)));
return null;
}
@@ -956,8 +957,8 @@ public class IgfsMetaManager extends IgfsManager {
// 8. Actual move: remove from source parent and add to destination target.
IgfsListingEntry entry = srcTargetInfo.listing().get(srcName);
- id2InfoPrj.invoke(srcTargetId, new UpdateListing(srcName, entry, true));
- id2InfoPrj.invoke(dstTargetId, new UpdateListing(dstName, entry, false));
+ id2InfoPrj.invoke(srcTargetId, new ListingRemove(srcName, entry.fileId()));
+ id2InfoPrj.invoke(dstTargetId, new ListingAdd(dstName, entry));
tx.commit();
@@ -1093,10 +1094,10 @@ public class IgfsMetaManager extends IgfsManager {
", destParentId=" + destParentId + ", destEntry=" + destEntry + ']'));
// Remove listing entry from the source parent listing.
- id2InfoPrj.invoke(srcParentId, new UpdateListing(srcFileName, srcEntry, true));
+ id2InfoPrj.invoke(srcParentId, new ListingRemove(srcFileName, srcEntry.fileId()));
// Add listing entry into the destination parent listing.
- id2InfoPrj.invoke(destParentId, new UpdateListing(destFileName, srcEntry, false));
+ id2InfoPrj.invoke(destParentId, new ListingAdd(destFileName, srcEntry));
}
/**
@@ -1134,8 +1135,8 @@ public class IgfsMetaManager extends IgfsManager {
id2InfoPrj.put(newInfo.id(), newInfo);
// Add new info to trash listing.
- id2InfoPrj.invoke(TRASH_ID, new UpdateListing(newInfo.id().toString(),
- new IgfsListingEntry(newInfo), false));
+ id2InfoPrj.invoke(TRASH_ID, new ListingAdd(newInfo.id().toString(),
+ new IgfsListingEntry(newInfo)));
// Remove listing entries from root.
// Note that root directory properties and other attributes are preserved:
@@ -1233,10 +1234,10 @@ public class IgfsMetaManager extends IgfsManager {
assert victimId.equals(srcEntry.fileId());
- id2InfoPrj.invoke(srcParentId, new UpdateListing(srcFileName, srcEntry, true));
+ id2InfoPrj.invoke(srcParentId, new ListingRemove(srcFileName, srcEntry.fileId()));
// Add listing entry into the destination parent listing.
- id2InfoPrj.invoke(TRASH_ID, new UpdateListing(destFileName, srcEntry, false));
+ id2InfoPrj.invoke(TRASH_ID, new ListingAdd(destFileName, srcEntry));
if (victimInfo.isFile())
// Update a file info of the removed file with a file path,
@@ -1313,12 +1314,12 @@ public class IgfsMetaManager extends IgfsManager {
id2InfoPrj.getAndPut(newInfo.id(), newInfo);
// Add new info to trash listing.
- id2InfoPrj.invoke(TRASH_ID, new UpdateListing(newInfo.id().toString(),
- new IgfsListingEntry(newInfo), false));
+ id2InfoPrj.invoke(TRASH_ID, new ListingAdd(newInfo.id().toString(),
+ new IgfsListingEntry(newInfo)));
// Remove listing entries from root.
for (Map.Entry<String, IgfsListingEntry> entry : transferListing.entrySet())
- id2InfoPrj.invoke(ROOT_ID, new UpdateListing(entry.getKey(), entry.getValue(), true));
+ id2InfoPrj.invoke(ROOT_ID, new ListingRemove(entry.getKey(), entry.getValue().fileId()));
resId = newInfo.id();
}
@@ -1468,7 +1469,7 @@ public class IgfsMetaManager extends IgfsManager {
IgfsListingEntry listingEntry = parentInfo.listing().get(name);
if (listingEntry != null)
- id2InfoPrj.invoke(parentId, new UpdateListing(name, listingEntry, true));
+ id2InfoPrj.invoke(parentId, new ListingRemove(name, listingEntry.fileId()));
IgfsFileInfo deleted = id2InfoPrj.getAndRemove(id);
@@ -1599,7 +1600,7 @@ public class IgfsMetaManager extends IgfsManager {
assert id2InfoPrj.get(parentId) != null;
- id2InfoPrj.invoke(parentId, new UpdateListing(fileName, entry, false));
+ id2InfoPrj.invoke(parentId, new ListingAdd(fileName, entry));
}
return newInfo;
@@ -2009,9 +2010,9 @@ public class IgfsMetaManager extends IgfsManager {
id2InfoPrj.put(newInfo.id(), newInfo); // Put the new one.
id2InfoPrj.invoke(parentInfo.id(),
- new UpdateListing(path.name(), parentInfo.listing().get(path.name()), true));
+ new ListingRemove(path.name(), parentInfo.listing().get(path.name()).fileId()));
id2InfoPrj.invoke(parentInfo.id(),
- new UpdateListing(path.name(), new IgfsListingEntry(newInfo), false));
+ new ListingAdd(path.name(), new IgfsListingEntry(newInfo)));
IgniteInternalFuture<?> delFut = igfsCtx.data().delete(oldInfo);
}
@@ -3213,10 +3214,82 @@ public class IgfsMetaManager extends IgfsManager {
}
/**
+ * Remove entry from directory listing.
+ */
+ @GridInternal
+ private static final class ListingRemove implements EntryProcessor<IgniteUuid, IgfsFileInfo, Void>,
+ Externalizable {
+ /** */
+ private static final long serialVersionUID = 0L;
+
+ /** File name. */
+ private String fileName;
+
+ /** Expected ID. */
+ private IgniteUuid fileId;
+
+ /**
+ * Default constructor.
+ */
+ public ListingRemove() {
+ // No-op.
+ }
+
+ /**
+ * Constructor.
+ *
+ * @param fileName File name.
+ * @param fileId File ID.
+ */
+ public ListingRemove(String fileName, IgniteUuid fileId) {
+ this.fileName = fileName;
+ this.fileId = fileId;
+ }
+
+ /** {@inheritDoc} */
+ @Override public Void process(MutableEntry<IgniteUuid, IgfsFileInfo> e, Object... args)
+ throws EntryProcessorException {
+ IgfsFileInfo fileInfo = e.getValue();
+
+ assert fileInfo != null;
+ assert fileInfo.isDirectory();
+
+ Map<String, IgfsListingEntry> listing = new HashMap<>(fileInfo.listing());
+
+ listing.putAll(fileInfo.listing());
+
+ IgfsListingEntry oldEntry = listing.get(fileName);
+
+ if (oldEntry == null || !oldEntry.fileId().equals(fileId))
+ throw new IgniteException("Directory listing doesn't contain expected file" +
+ " [listing=" + listing + ", fileName=" + fileName + "]");
+
+ // Modify listing in-place.
+ listing.remove(fileName);
+
+ e.setValue(new IgfsFileInfo(listing, fileInfo));
+
+ return null;
+ }
+
+ /** {@inheritDoc} */
+ @Override public void writeExternal(ObjectOutput out) throws IOException {
+ U.writeString(out, fileName);
+ U.writeGridUuid(out, fileId);
+ }
+
+ /** {@inheritDoc} */
+ @Override public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException {
+ fileName = U.readString(in);
+ fileId = U.readGridUuid(in);
+ }
+ }
+
+ /**
* Update directory listing closure.
*/
@GridInternal
- private static final class UpdateListing implements EntryProcessor<IgniteUuid, IgfsFileInfo, Void>,
+ private static final class ListingAdd implements EntryProcessor<IgniteUuid, IgfsFileInfo, Void>,
Externalizable {
/** */
private static final long serialVersionUID = 0L;
@@ -3227,30 +3300,25 @@ public class IgfsMetaManager extends IgfsManager {
/** File ID.*/
private IgfsListingEntry entry;
- /** Update operation: remove entry from listing if {@code true} or add entry to listing if {@code false}. */
- private boolean rmv;
-
/**
* Constructs update directory listing closure.
*
* @param fileName File name to add into parent listing.
* @param entry Listing entry to add or remove.
- * @param rmv Remove entry from listing if {@code true} or add entry to listing if {@code false}.
*/
- private UpdateListing(String fileName, IgfsListingEntry entry, boolean rmv) {
+ private ListingAdd(String fileName, IgfsListingEntry entry) {
assert fileName != null;
assert entry != null;
this.fileName = fileName;
this.entry = entry;
- this.rmv = rmv;
}
/**
* Empty constructor required for {@link Externalizable}.
*
*/
- public UpdateListing() {
+ public ListingAdd() {
// No-op.
}
@@ -3261,30 +3329,15 @@ public class IgfsMetaManager extends IgfsManager {
assert fileInfo != null : "File info not found for the child: " + entry.fileId();
assert fileInfo.isDirectory();
- Map<String, IgfsListingEntry> listing =
- U.newHashMap(fileInfo.listing().size() + (rmv ? 0 : 1));
-
- listing.putAll(fileInfo.listing());
-
- if (rmv) {
- IgfsListingEntry oldEntry = listing.get(fileName);
+ Map<String, IgfsListingEntry> listing = new HashMap<>(fileInfo.listing());
- if (oldEntry == null || !oldEntry.fileId().equals(entry.fileId()))
- throw new IgniteException("Directory listing doesn't contain expected file" +
- " [listing=" + listing + ", fileName=" + fileName + ", entry=" + entry + ']');
+ // Modify listing in-place.
+ IgfsListingEntry oldEntry = listing.put(fileName, entry);
- // Modify listing in-place.
- listing.remove(fileName);
- }
- else {
- // Modify listing in-place.
- IgfsListingEntry oldEntry = listing.put(fileName, entry);
-
- if (oldEntry != null && !oldEntry.fileId().equals(entry.fileId()))
- throw new IgniteException("Directory listing contains unexpected file" +
- " [listing=" + listing + ", fileName=" + fileName + ", entry=" + entry +
- ", oldEntry=" + oldEntry + ']');
- }
+ if (oldEntry != null && !oldEntry.fileId().equals(entry.fileId()))
+ throw new IgniteException("Directory listing contains unexpected file" +
+ " [listing=" + listing + ", fileName=" + fileName + ", entry=" + entry +
+ ", oldEntry=" + oldEntry + ']');
e.setValue(new IgfsFileInfo(listing, fileInfo));
@@ -3295,19 +3348,17 @@ public class IgfsMetaManager extends IgfsManager {
@Override public void writeExternal(ObjectOutput out) throws IOException {
U.writeString(out, fileName);
out.writeObject(entry);
- out.writeBoolean(rmv);
}
/** {@inheritDoc} */
@Override public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException {
fileName = U.readString(in);
entry = (IgfsListingEntry)in.readObject();
- rmv = in.readBoolean();
}
/** {@inheritDoc} */
@Override public String toString() {
- return S.toString(UpdateListing.class, this);
+ return S.toString(ListingAdd.class, this);
}
}
@@ -3482,11 +3533,11 @@ public class IgfsMetaManager extends IgfsManager {
assert deletedEntry != null;
- id2InfoPrj.invoke(parentId, new UpdateListing(name, deletedEntry, true));
+ id2InfoPrj.invoke(parentId, new ListingRemove(name, deletedEntry.fileId()));
// Add listing entry into the destination parent listing.
- id2InfoPrj.invoke(TRASH_ID, new UpdateListing(
- lowermostExistingInfo.id().toString(), deletedEntry, false));
+ id2InfoPrj.invoke(TRASH_ID, new ListingAdd(
+ lowermostExistingInfo.id().toString(), deletedEntry));
// Update a file info of the removed file with a file path,
// which will be used by delete worker for event notifications.
@@ -3505,7 +3556,7 @@ public class IgfsMetaManager extends IgfsManager {
assert put;
id2InfoPrj.invoke(parentId,
- new UpdateListing(name, new IgfsListingEntry(newFileInfo), false));
+ new ListingAdd(name, new IgfsListingEntry(newFileInfo)));
IgniteBiTuple<IgfsFileInfo, IgniteUuid> t2 = new T2<>(newFileInfo, parentId);
@@ -3679,8 +3730,7 @@ public class IgfsMetaManager extends IgfsManager {
throws IgniteCheckedException {
assert childInfo != null;
- id2InfoPrj.invoke(lowermostExistingId,
- new UpdateListing(childName, new IgfsListingEntry(childInfo), false));
+ id2InfoPrj.invoke(lowermostExistingId, new ListingAdd(childName, new IgfsListingEntry(childInfo)));
}
/**