浏览代码

fixed InMemoryFileSystem: Only one volatile file/folder for a given name at a time.

Sebastian Stenzel 9 年之前
父节点
当前提交
e9f5593e33

+ 1 - 0
main/filesystem-inmemory/src/main/java/org/cryptomator/filesystem/inmem/InMemoryFile.java

@@ -53,6 +53,7 @@ class InMemoryFile extends InMemoryNode implements File {
 				throw new UncheckedIOException(new FileExistsException(k));
 			}
 		});
+		parent.volatileFiles.remove(name);
 		return new InMemoryWritableFile(this::setLastModified, this::getContent, this::setContent, this::delete, writeLock);
 	}
 

+ 10 - 4
main/filesystem-inmemory/src/main/java/org/cryptomator/filesystem/inmem/InMemoryFolder.java

@@ -22,7 +22,8 @@ import org.cryptomator.filesystem.Folder;
 class InMemoryFolder extends InMemoryNode implements Folder {
 
 	final Map<String, InMemoryNode> children = new TreeMap<>();
-	final Map<String, InMemoryNode> volatileChildren = new HashMap<>();
+	final Map<String, InMemoryFile> volatileFiles = new HashMap<>();
+	final Map<String, InMemoryFolder> volatileFolders = new HashMap<>();
 
 	public InMemoryFolder(InMemoryFolder parent, String name, Instant lastModified) {
 		super(parent, name, lastModified);
@@ -39,7 +40,9 @@ class InMemoryFolder extends InMemoryNode implements Folder {
 		if (node instanceof InMemoryFile) {
 			return (InMemoryFile) node;
 		} else {
-			return new InMemoryFile(this, name, Instant.MIN);
+			return volatileFiles.computeIfAbsent(name, (n) -> {
+				return new InMemoryFile(this, n, Instant.MIN);
+			});
 		}
 	}
 
@@ -49,7 +52,9 @@ class InMemoryFolder extends InMemoryNode implements Folder {
 		if (node instanceof InMemoryFolder) {
 			return (InMemoryFolder) node;
 		} else {
-			return new InMemoryFolder(this, name, Instant.MIN);
+			return volatileFolders.computeIfAbsent(name, (n) -> {
+				return new InMemoryFolder(this, n, Instant.MIN);
+			});
 		}
 	}
 
@@ -59,7 +64,7 @@ class InMemoryFolder extends InMemoryNode implements Folder {
 			return;
 		}
 		parent.create();
-		parent.children.compute(this.name(), (k, v) -> {
+		parent.children.compute(name, (k, v) -> {
 			if (v == null) {
 				this.lastModified = Instant.now();
 				return this;
@@ -67,6 +72,7 @@ class InMemoryFolder extends InMemoryNode implements Folder {
 				throw new UncheckedIOException(new FileExistsException(k));
 			}
 		});
+		parent.volatileFolders.remove(name);
 		assert this.exists();
 	}
 

+ 1 - 3
main/filesystem-nameshortening/src/test/java/org/cryptomator/filesystem/shortening/ShorteningFileSystemTest.java

@@ -30,9 +30,7 @@ public class ShorteningFileSystemTest {
 		final FileSystem underlyingFs = new InMemoryFileSystem();
 		final Folder metadataRoot = underlyingFs.folder("m");
 		final FileSystem fs = new ShorteningFileSystem(underlyingFs, metadataRoot, 10);
-		final Folder longNamedFolder = fs.folder("morethantenchars"); // base32(sha1(morethantenchars))
-																		// =
-																		// QMJL5GQUETRX2YRV6XDTJQ6NNM7IEUHP
+		final Folder longNamedFolder = fs.folder("morethantenchars"); // base32(sha1(morethantenchars)) = QMJL5GQUETRX2YRV6XDTJQ6NNM7IEUHP
 		final File correspondingMetadataFile = metadataRoot.folder("QM").folder("JL").file("QMJL5GQUETRX2YRV6XDTJQ6NNM7IEUHP.lng");
 		longNamedFolder.create();
 		Assert.assertTrue(longNamedFolder.exists());