Skip to content
This repository was archived by the owner on Jul 7, 2020. It is now read-only.

add isDirectory to VirtualFileReference and subclasses #6

Open
wants to merge 1 commit into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 4 additions & 0 deletions src/main/java/com/addthis/meshy/LocalFileHandlerMux.java
Original file line number Diff line number Diff line change
Expand Up @@ -118,6 +118,10 @@ public VirtualFileReference getFile(String name) {
return null;
}

@Override public boolean isDirectory() {
return false;
}

@Override
public VirtualFileInput getInput(Map<String, String> options) {
try {
Expand Down
5 changes: 5 additions & 0 deletions src/main/java/com/addthis/meshy/LocalFileSystem.java
Original file line number Diff line number Diff line change
Expand Up @@ -119,6 +119,11 @@ public long getLength() {
return ptr.length();
}

@Override
public boolean isDirectory() {
return ptr.isDirectory();
}

@Nullable @Override
public Iterator<VirtualFileReference> listFiles(@Nonnull final PathMatcher filter) {
try {
Expand Down
2 changes: 2 additions & 0 deletions src/main/java/com/addthis/meshy/VirtualFileReference.java
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,8 @@ public interface VirtualFileReference {

public long getLength();

public boolean isDirectory();

public Iterator<VirtualFileReference> listFiles(@Nonnull PathMatcher filter);

public VirtualFileReference getFile(String name);
Expand Down
17 changes: 12 additions & 5 deletions src/main/java/com/addthis/meshy/service/file/FileReference.java
Original file line number Diff line number Diff line change
Expand Up @@ -28,17 +28,19 @@ public class FileReference {
public final String name;
public final long lastModified;
public final long size;
public final boolean isDirectory;

private String hostUUID;

public FileReference(final String name, final long last, final long size) {
public FileReference(final String name, final long last, final long size, final boolean isDirectory) {
this.name = name;
this.lastModified = last;
this.size = size;
this.isDirectory = isDirectory;
}

public FileReference(final String prefix, final VirtualFileReference ref) {
this(prefix + '/' + ref.getName(), ref.getLastModified(), ref.getLength());
this(prefix + '/' + ref.getName(), ref.getLastModified(), ref.getLength(), ref.isDirectory());
}

public FileReference(final byte[] data) throws IOException {
Expand All @@ -47,6 +49,7 @@ public FileReference(final byte[] data) throws IOException {
lastModified = LessBytes.readLength(in);
size = LessBytes.readLength(in);
hostUUID = LessBytes.readString(in);
isDirectory = in.read() == 1;
}

/**
Expand All @@ -63,11 +66,12 @@ public String getHostUUID() {

byte[] encode(String uuid) {
try {
ByteArrayOutputStream out = new ByteArrayOutputStream(name.length() * 2 + 12);
ByteArrayOutputStream out = new ByteArrayOutputStream(name.length() * 2 + 13);
LessBytes.writeString(name, out);
LessBytes.writeLength(lastModified, out);
LessBytes.writeLength(size, out);
LessBytes.writeString(uuid != null ? uuid : hostUUID, out);
out.write(isDirectory ? 1 : 0);
return out.toByteArray();
} catch (IOException ie) {
//using ByteArrayOutputStream. Cant actually throw these
Expand All @@ -77,7 +81,7 @@ byte[] encode(String uuid) {

@Override
public String toString() {
return "[nm=" + name + ",lm=" + lastModified + ",sz=" + size + ",uu=" + hostUUID + ']';
return "[nm=" + name + ",lm=" + lastModified + ",sz=" + size + ",dir=" + isDirectory + ",uu=" + hostUUID + ']';
}

@Override
Expand All @@ -98,6 +102,9 @@ public boolean equals(Object other) {
if (size != otherReference.size) {
return false;
}
if (isDirectory != otherReference.isDirectory) {
return false;
}
if (!Objects.equal(hostUUID, otherReference.hostUUID)) {
return false;
}
Expand All @@ -106,6 +113,6 @@ public boolean equals(Object other) {

@Override
public int hashCode() {
return Objects.hashCode(name, lastModified, size, hostUUID);
return Objects.hashCode(name, lastModified, size, isDirectory, hostUUID);
}
}
6 changes: 3 additions & 3 deletions src/main/java/com/addthis/meshy/service/file/FileTarget.java
Original file line number Diff line number Diff line change
Expand Up @@ -257,7 +257,7 @@ public void doFind() throws IOException {
localFindTimer.update(localRunTime, TimeUnit.MILLISECONDS);
} finally {
if (forwardMetaData) {
FileReference flagRef = new FileReference("localfind", 0, 0);
FileReference flagRef = new FileReference("localfind", 0, 0, false);
FileTarget.this.send(flagRef.encode(null));
}
//Expected conditions under which we should cleanup: If we do not expect a response from the mesh
Expand Down Expand Up @@ -362,7 +362,7 @@ private boolean sendLocalFileRef(FileReference fileReference) {

private void forwardPeerList(Collection<Channel> peerList) {
int peerCount = peerList.size();
FileReference flagRef = new FileReference("peers", 0, peerCount);
FileReference flagRef = new FileReference("peers", 0, peerCount, false);
send(flagRef.encode(FileTarget.peersToString(peerList)));
}

Expand Down Expand Up @@ -550,7 +550,7 @@ public void receiveComplete(ChannelState state, int completedSession) throws Exc
super.receiveComplete(state, completedSession);
if (forwardMetaData) {
int peerCount = getPeerCount();
FileReference flagRef = new FileReference("response", 0, peerCount);
FileReference flagRef = new FileReference("response", 0, peerCount, false);
FileTarget.this.send(flagRef.encode(state.getChannelRemoteAddress().getHostName()));
}
if (doComplete.compareAndSet(true, false) && !firstDone.compareAndSet(false, true)) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -87,6 +87,10 @@ public long getLength() {
return length;
}

@Override public boolean isDirectory() {
return false;
}

@Override
public Iterator<VirtualFileReference> listFiles(PathMatcher filter) {
synchronized (files) {
Expand Down
Empty file added src/test/files/d/dir/file
Empty file.
68 changes: 35 additions & 33 deletions src/test/java/com/addthis/meshy/service/file/TestFileService.java
Original file line number Diff line number Diff line change
Expand Up @@ -36,32 +36,34 @@ public void singlePeer() throws Exception {
final MeshyServer server = getServer("src/test/files");
final MeshyClient client = getClient(server);
FileSource files = new FileSource(client, new String[]{
"*/*.xml",
"*/hosts",
"*/*",
"*/hosts"
});
files.waitComplete();
log.info("file.list --> {}", files.getFileList());
Map<String, FileReference> map = files.getFileMap();
checkFile(map, new FileReference("/a/abc.xml", 0, 4).setHostUUID(server.getUUID()));
checkFile(map, new FileReference("/a/def.xml", 0, 7).setHostUUID(server.getUUID()));
checkFile(map, new FileReference("/b/ghi.xml", 0, 4).setHostUUID(server.getUUID()));
checkFile(map, new FileReference("/b/jkl.xml", 0, 7).setHostUUID(server.getUUID()));
checkFile(map, new FileReference("/c/hosts", 0, 593366).setHostUUID(server.getUUID()));
checkFile(map, new FileReference("/mux/hosts", 0, 593366).setHostUUID(server.getUUID()));
checkFile(map, new FileReference("/a/abc.xml", 0, 4, false).setHostUUID(server.getUUID()));
checkFile(map, new FileReference("/a/def.xml", 0, 7, false).setHostUUID(server.getUUID()));
checkFile(map, new FileReference("/b/ghi.xml", 0, 4, false).setHostUUID(server.getUUID()));
checkFile(map, new FileReference("/b/jkl.xml", 0, 7, false).setHostUUID(server.getUUID()));
checkFile(map, new FileReference("/c/hosts", 0, 593366, false).setHostUUID(server.getUUID()));
checkFile(map, new FileReference("/mux/hosts", 0, 593366, false).setHostUUID(server.getUUID()));
checkFile(map, new FileReference("/d/dir", 0, 102, true).setHostUUID(server.getUUID()));
/** second test exercises the cache */
files = new FileSource(client, new String[]{
"*/*.xml",
"*/*",
"*/hosts",
});
files.waitComplete();
log.info("file.list --> {}", files.getFileList());
map = files.getFileMap();
checkFile(map, new FileReference("/a/abc.xml", 0, 4).setHostUUID(server.getUUID()));
checkFile(map, new FileReference("/a/def.xml", 0, 7).setHostUUID(server.getUUID()));
checkFile(map, new FileReference("/b/ghi.xml", 0, 4).setHostUUID(server.getUUID()));
checkFile(map, new FileReference("/b/jkl.xml", 0, 7).setHostUUID(server.getUUID()));
checkFile(map, new FileReference("/c/hosts", 0, 593366).setHostUUID(server.getUUID()));
checkFile(map, new FileReference("/mux/hosts", 0, 593366).setHostUUID(server.getUUID()));
checkFile(map, new FileReference("/a/abc.xml", 0, 4, false).setHostUUID(server.getUUID()));
checkFile(map, new FileReference("/a/def.xml", 0, 7, false).setHostUUID(server.getUUID()));
checkFile(map, new FileReference("/b/ghi.xml", 0, 4, false).setHostUUID(server.getUUID()));
checkFile(map, new FileReference("/b/jkl.xml", 0, 7, false).setHostUUID(server.getUUID()));
checkFile(map, new FileReference("/c/hosts", 0, 593366, false).setHostUUID(server.getUUID()));
checkFile(map, new FileReference("/mux/hosts", 0, 593366, false).setHostUUID(server.getUUID()));
checkFile(map, new FileReference("/d/dir", 0, 102, true).setHostUUID(server.getUUID()));
}

@Test
Expand All @@ -75,12 +77,12 @@ public void globSyntax() throws Exception {
files.waitComplete();
log.info("file.list --> {}", files.getFileList());
Map<String, FileReference> map = files.getFileMap();
checkFile(map, new FileReference("/a/abc.xml", 0, 4).setHostUUID(server.getUUID()));
checkFile(map, new FileReference("/a/def.xml", 0, 7).setHostUUID(server.getUUID()));
checkFile(map, new FileReference("/a/abc.xml", 0, 4, false).setHostUUID(server.getUUID()));
checkFile(map, new FileReference("/a/def.xml", 0, 7, false).setHostUUID(server.getUUID()));
assertFalse(map.containsKey("/b/ghi.xml"));
assertFalse(map.containsKey("/b/jkl.xml"));
checkFile(map, new FileReference("/c/hosts", 0, 593366).setHostUUID(server.getUUID()));
checkFile(map, new FileReference("/mux/hosts", 0, 593366).setHostUUID(server.getUUID()));
checkFile(map, new FileReference("/c/hosts", 0, 593366, false).setHostUUID(server.getUUID()));
checkFile(map, new FileReference("/mux/hosts", 0, 593366, false).setHostUUID(server.getUUID()));
}

@Test
Expand All @@ -98,26 +100,26 @@ public void multiPeer() throws Exception {
log.info("file.list --> {}", files.getFileList());
Map<String, FileReference> map = files.getFileMap();
log.info("file map --> {}", map);
checkFile(map, new FileReference("/abc.xml", 0, 4).setHostUUID(server1.getUUID()));
checkFile(map, new FileReference("/def.xml", 0, 7).setHostUUID(server1.getUUID()));
checkFile(map, new FileReference("/ghi.xml", 0, 4).setHostUUID(server2.getUUID()));
checkFile(map, new FileReference("/jkl.xml", 0, 7).setHostUUID(server2.getUUID()));
checkFile(map, new FileReference("/xyz.xml", 0, 10).setHostUUID(server3.getUUID()));
checkFile(map, new FileReference("/abc.xml", 0, 4, false).setHostUUID(server1.getUUID()));
checkFile(map, new FileReference("/def.xml", 0, 7, false).setHostUUID(server1.getUUID()));
checkFile(map, new FileReference("/ghi.xml", 0, 4, false).setHostUUID(server2.getUUID()));
checkFile(map, new FileReference("/jkl.xml", 0, 7, false).setHostUUID(server2.getUUID()));
checkFile(map, new FileReference("/xyz.xml", 0, 10, false).setHostUUID(server3.getUUID()));
}

@Test
public void testEquals() throws Exception {
FileReference[] refs = new FileReference[5];

refs[0] = new FileReference("/a/abc.xml", 0, 4);
refs[1] = new FileReference("/a/def.xml", 0, 7);
refs[2] = new FileReference(null, 0, 4);
refs[0] = new FileReference("/a/abc.xml", 0, 4, false);
refs[1] = new FileReference("/a/def.xml", 0, 7, false);
refs[2] = new FileReference(null, 0, 4, false);

// refs[0] and refs[3] are equal
refs[3] = new FileReference("/a/abc.xml", 0, 4);
refs[3] = new FileReference("/a/abc.xml", 0, 4, false);

// refs[2] and refs[4] are equal
refs[4] = new FileReference(null, 0, 4);
refs[4] = new FileReference(null, 0, 4, false);

refs[0].setHostUUID("a");
refs[1].setHostUUID("b");
Expand Down Expand Up @@ -151,10 +153,10 @@ public void testEquals() throws Exception {
public void testHashCode() throws Exception {
FileReference[] refs = new FileReference[4];

refs[0] = new FileReference("/a/abc.xml", 0, 4);
refs[1] = new FileReference("/a/abc.xml", 0, 4);
refs[2] = new FileReference(null, 0, 4);
refs[3] = new FileReference(null, 0, 4);
refs[0] = new FileReference("/a/abc.xml", 0, 4, false);
refs[1] = new FileReference("/a/abc.xml", 0, 4, false);
refs[2] = new FileReference(null, 0, 4, false);
refs[3] = new FileReference(null, 0, 4, false);

refs[0].setHostUUID("a");
refs[1].setHostUUID("a");
Expand Down
6 changes: 5 additions & 1 deletion src/test/java/com/addthis/meshy/service/file/TestVFS.java
Original file line number Diff line number Diff line change
Expand Up @@ -59,7 +59,7 @@ public void testVFS() throws Exception {
files.waitComplete();
Map<String, FileReference> map = files.getFileMap();
log.info("map={}", map);
checkFile(map, new FileReference("/dummy", 0, 0).setHostUUID(server.getUUID()));
checkFile(map, new FileReference("/dummy", 0, 0, false).setHostUUID(server.getUUID()));
}

public static class DummyHandler implements LocalFileHandler {
Expand Down Expand Up @@ -104,6 +104,10 @@ public long getLength() {
return 0;
}

@Override public boolean isDirectory() {
return false;
}

@Override
public Iterator<VirtualFileReference> listFiles(PathMatcher filter) {
return null;
Expand Down