Lucio Lelii 2019-05-20 16:42:55 +00:00
parent a752a80758
commit 0b917990a9
6 changed files with 84 additions and 30 deletions

View File

@ -0,0 +1,6 @@
eclipse.preferences.version=1
encoding//src/main/java=UTF-8
encoding//src/main/resources=UTF-8
encoding//src/test/java=UTF-8
encoding//src/test/resources=UTF-8
encoding/<project>=UTF-8

View File

@ -32,8 +32,8 @@ public class FileDownload implements SHFile{
} }
public int read(Pointer buf, @size_t long size, @off_t long offset) { public int read(Pointer buf, @size_t long size, @off_t long offset) {
logger.trace("read called with size {} and offset {} ", size, offset); logger.trace("{} read called with size {} and offset {} ", fileItem.getName(), size, offset);
while (this.offset!=offset) { while (this.offset!=offset) {
logger.trace("going in wait ({},{})",this.offset, offset); logger.trace("going in wait ({},{})",this.offset, offset);
synchronized (monitor) { synchronized (monitor) {
@ -53,13 +53,13 @@ public class FileDownload implements SHFile{
try { try {
int read =0; int read =0;
logger.trace("BEFORE: bytes to read {} and read total {} and last read {}", bytesToRead, readTotal, read); logger.trace("{} BEFORE: bytes to read {} and read total {} and last read {}", fileItem.getName(), bytesToRead, readTotal, read);
while ((read= stream.read(mybuf, 0 , bytesToRead-readTotal))!=-1 && bytesToRead>readTotal) { while ((read= stream.read(mybuf, 0 , bytesToRead-readTotal))!=-1 && bytesToRead>readTotal) {
buf.put(readTotal, mybuf, 0, read); buf.put(readTotal, mybuf, 0, read);
readTotal+= read; readTotal+= read;
logger.trace("INSIDE: bytes to read {} and read total {} and last read {}", bytesToRead, readTotal, read); logger.trace("{} INSIDE: bytes to read {} and read total {} and last read {}", fileItem.getName() , bytesToRead, readTotal, read);
} }
logger.trace("AFTER: bytes to read {} and read total {} and last read {}", bytesToRead, readTotal, read); logger.trace("{} AFTER: bytes to read {} and read total {} and last read {}", fileItem.getName() , bytesToRead, readTotal, read);
}catch (Exception e) { }catch (Exception e) {
logger.error("error in read",e); logger.error("error in read",e);
@ -74,7 +74,7 @@ public class FileDownload implements SHFile{
monitor.notifyAll(); monitor.notifyAll();
} }
} }
logger.trace("work finished!!! {}", readTotal); logger.trace("{} work finished!!! {}",fileItem.getName() , readTotal);
return readTotal; return readTotal;
} }
@ -86,6 +86,9 @@ public class FileDownload implements SHFile{
//logger.trace("file is ready "+mapPathUpload.get(path).toString()); //logger.trace("file is ready "+mapPathUpload.get(path).toString());
try { try {
stream.close(); stream.close();
synchronized (monitor) {
monitor.notifyAll();
}
} catch (IOException e1) { } catch (IOException e1) {
logger.error("error closing stream",e1); logger.error("error closing stream",e1);
} }
@ -98,11 +101,9 @@ public class FileDownload implements SHFile{
stat.st_mode.set(FileStat.S_IFREG | 0555); stat.st_mode.set(FileStat.S_IFREG | 0555);
stat.st_size.set(fileItem.getContent().getSize()); stat.st_size.set(fileItem.getContent().getSize());
stat.st_mtim.tv_sec.set(fileItem.getLastModificationTime().toInstant().getEpochSecond()); stat.st_mtim.tv_sec.set(fileItem.getLastModificationTime().toInstant().getEpochSecond());
stat.st_mtim.tv_nsec.set(fileItem.getLastModificationTime().toInstant().getNano()); stat.st_ctim.tv_sec.set(fileItem.getLastModificationTime().toInstant().getEpochSecond());
stat.st_ctim.tv_sec.set(fileItem.getCreationTime().toInstant().getEpochSecond());
stat.st_ctim.tv_nsec.set(fileItem.getCreationTime().toInstant().getNano());
stat.st_atim.tv_sec.set(fileItem.getLastModificationTime().toInstant().getEpochSecond()); stat.st_atim.tv_sec.set(fileItem.getLastModificationTime().toInstant().getEpochSecond());
stat.st_atim.tv_nsec.set(fileItem.getLastModificationTime().toInstant().getNano()); //stat.st_birthtime.tv_sec.set(fileItem.getCreationTime().toInstant().getEpochSecond());
return 0; return 0;
} }

View File

@ -55,6 +55,11 @@ public class FileUpload implements SHFile {
public int getAttr(FileStat stat) { public int getAttr(FileStat stat) {
stat.st_mode.set(FileStat.S_IFREG | 0555); stat.st_mode.set(FileStat.S_IFREG | 0555);
stat.st_size.set(bytesRead); stat.st_size.set(bytesRead);
long now = System.currentTimeMillis()/1000;
//stat.st_birthtime.tv_sec.set(now);
stat.st_mtim.tv_sec.set(now);
stat.st_ctim.tv_sec.set(now);
stat.st_atim.tv_sec.set(now);
return 0; return 0;
} }

View File

@ -6,7 +6,9 @@ import java.util.List;
import org.cache2k.Cache; import org.cache2k.Cache;
import org.gcube.common.storagehub.client.dsl.FolderContainer; import org.gcube.common.storagehub.client.dsl.FolderContainer;
import org.gcube.common.storagehub.client.dsl.ItemContainer; import org.gcube.common.storagehub.client.dsl.ItemContainer;
import org.gcube.common.storagehub.client.dsl.StorageHubClient;
import org.gcube.common.storagehub.model.items.Item; import org.gcube.common.storagehub.model.items.Item;
import org.gcube.common.storagehub.model.items.SharedFolder;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
@ -16,12 +18,13 @@ public class PathUtils {
private Cache<String,ItemContainer<Item>> cache; private Cache<String,ItemContainer<Item>> cache;
private FolderContainer rootDirectory; private FolderContainer rootDirectory;
private StorageHubClient client;
public PathUtils(Cache<String, ItemContainer<Item>> cache, FolderContainer rootDirectory) { public PathUtils(Cache<String, ItemContainer<Item>> cache, FolderContainer rootDirectory, StorageHubClient client) {
super(); super();
this.cache = cache; this.cache = cache;
this.rootDirectory = rootDirectory; this.rootDirectory = rootDirectory;
this.client = client;
} }
@ -68,9 +71,23 @@ public class PathUtils {
logger.trace("found? "+(items.size()>0)); logger.trace("found? "+(items.size()>0));
return items.size()>0? items.get(0): null; return items.size()>0? items.get(0): null;
} }
if (path.startsWith(StorageHubFS.VREFOLDERS_NAME)) {
List<ItemContainer<? extends Item>> vreFolders = client.getVREFolders().getContainers();
String vreName = path.split("/")[1];
for (ItemContainer<? extends Item> vreContainer : vreFolders) {
SharedFolder veFolder = (SharedFolder)vreContainer.get();
if (veFolder.getDisplayName().equals(vreName)) {
String nextPath = path.replace(StorageHubFS.VREFOLDERS_NAME+"/"+veFolder.getDisplayName(), "");
if(nextPath.isEmpty()) return vreContainer;
else return getPathRecursive(nextPath, (FolderContainer)vreContainer);
}
}
}
String nextName = path.substring(0, path.indexOf("/")); String nextName = path.substring(0, path.indexOf("/"));
String rest = path.substring(path.indexOf("/")); String rest = path.substring(path.indexOf("/"));
for (ItemContainer<? extends Item> container : parentContainer.findByName(nextName).withContent().getContainers()) { for (ItemContainer<? extends Item> container : parentContainer.findByName(nextName).withContent().getContainers()) {
if (container instanceof FolderContainer) { if (container instanceof FolderContainer) {
logger.trace("seaching path "+rest+" in "+container.get().getTitle()); logger.trace("seaching path "+rest+" in "+container.get().getTitle());

View File

@ -48,7 +48,7 @@ public class StorageHubFS extends FuseStubFS {
HashMap<String, SHFile> tempFiles = new HashMap<>(); HashMap<String, SHFile> tempFiles = new HashMap<>();
static final String VREFOLDERS_NAME= "VREFolders"; protected static final String VREFOLDERS_NAME= "VREFolders";
Cache<String,ItemContainer<Item>> cache; Cache<String,ItemContainer<Item>> cache;
@ -68,7 +68,7 @@ public class StorageHubFS extends FuseStubFS {
.expireAfterWrite(30, TimeUnit.SECONDS) .expireAfterWrite(30, TimeUnit.SECONDS)
.resilienceDuration(30, TimeUnit.SECONDS) .resilienceDuration(30, TimeUnit.SECONDS)
.build(); .build();
pathUtils = new PathUtils(cache, rootDirectory); pathUtils = new PathUtils(cache, rootDirectory, client);
} }
/* /*
@ -82,6 +82,7 @@ public class StorageHubFS extends FuseStubFS {
logger.trace(Thread.currentThread().getName()+" ) calling write "+ size+" "+offset); logger.trace(Thread.currentThread().getName()+" ) calling write "+ size+" "+offset);
SHFile file = tempFiles.get(path); SHFile file = tempFiles.get(path);
return file.write(buf, size, offset); return file.write(buf, size, offset);
} }
@ -89,7 +90,7 @@ public class StorageHubFS extends FuseStubFS {
public synchronized int flush(String path, FuseFileInfo fi) { public synchronized int flush(String path, FuseFileInfo fi) {
logger.trace("called flush for "+path); logger.trace("called flush for "+path);
tempFiles.get(path).flush(); tempFiles.get(path).flush();
tempFiles.remove(path); logger.trace("file have been removed? {}", (tempFiles.remove(path)!=null));
return 0; return 0;
} }
@ -107,7 +108,14 @@ public class StorageHubFS extends FuseStubFS {
if (pathUtils.getPath(path) != null) { if (pathUtils.getPath(path) != null) {
return -ErrorCodes.EEXIST(); return -ErrorCodes.EEXIST();
} }
uploadFile(path);
return 0;
}
private void uploadFile(String path) {
final ItemContainer<? extends Item> parentContainer; final ItemContainer<? extends Item> parentContainer;
if (path.substring(1).contains("/")) { if (path.substring(1).contains("/")) {
@ -131,10 +139,8 @@ public class StorageHubFS extends FuseStubFS {
} }
} }
})).start(); })).start();
return 0;
} }
@Override @Override
public int getattr(String path, FileStat stat) { public int getattr(String path, FileStat stat) {
@ -167,6 +173,7 @@ public class StorageHubFS extends FuseStubFS {
return 0; return 0;
} }
private void getAttrSHItem(ItemContainer<? extends Item> container, FileStat stat) throws IllegalArgumentException{ private void getAttrSHItem(ItemContainer<? extends Item> container, FileStat stat) throws IllegalArgumentException{
if (container.getType()==ContainerType.FILE) { if (container.getType()==ContainerType.FILE) {
@ -193,10 +200,10 @@ public class StorageHubFS extends FuseStubFS {
} }
stat.st_mtim.tv_sec.set(item.getLastModificationTime().toInstant().getEpochSecond()); stat.st_mtim.tv_sec.set(item.getLastModificationTime().toInstant().getEpochSecond());
stat.st_mtim.tv_nsec.set(item.getLastModificationTime().toInstant().getNano()); stat.st_mtim.tv_nsec.set(item.getLastModificationTime().toInstant().getNano());
stat.st_ctim.tv_sec.set(item.getCreationTime().toInstant().getEpochSecond()); stat.st_ctim.tv_sec.set(item.getLastModificationTime().toInstant().getEpochSecond());
stat.st_ctim.tv_nsec.set(item.getCreationTime().toInstant().getNano()); stat.st_ctim.tv_nsec.set(item.getLastModificationTime().toInstant().getNano());
stat.st_atim.tv_sec.set(item.getLastModificationTime().toInstant().getEpochSecond()); //stat.st_atim.tv_sec.set(System.currentTimeMillis()/1000);
stat.st_atim.tv_nsec.set(item.getLastModificationTime().toInstant().getNano()); //stat.st_birthtime.tv_nsec.set(item.getLastModificationTime().toInstant().getNano());
} }
@ -238,8 +245,8 @@ public class StorageHubFS extends FuseStubFS {
public int read(String path, Pointer buf, @size_t long size, @off_t long offset, FuseFileInfo fi) { public int read(String path, Pointer buf, @size_t long size, @off_t long offset, FuseFileInfo fi) {
ScopeProvider.instance.set(scope); ScopeProvider.instance.set(scope);
SecurityTokenProvider.instance.set(token); SecurityTokenProvider.instance.set(token);
logger.trace("!!! read called in path {} with size {} and offset {} ",path, size, offset); logger.trace("!!! read called in path {} with size {} and offset {} and pointer address {}",path, size, offset, buf.address());
SHFile fileDownload; SHFile fileDownload;
synchronized (tempFiles) { synchronized (tempFiles) {
@ -321,10 +328,11 @@ public class StorageHubFS extends FuseStubFS {
for (ItemContainer <? extends Item> child : containers ) { for (ItemContainer <? extends Item> child : containers ) {
try { try {
Item it = child.get(); Item it = child.get();
filter.apply(buf, it.getTitle(), null, 0); String name = (it instanceof SharedFolder && ((SharedFolder)it).isVreFolder())? ((SharedFolder)it).getDisplayName() : it.getTitle();
filter.apply(buf, name, null, 0);
if (path.charAt(path.length() - 1)!='/') if (path.charAt(path.length() - 1)!='/')
path+="/"; path+="/";
cache.put(path+it.getTitle(), (ItemContainer<Item>) child); cache.put(path+name, (ItemContainer<Item>) child);
}catch (Exception e) { }catch (Exception e) {
logger.error("error riding children ",e); logger.error("error riding children ",e);
@ -471,10 +479,27 @@ public class StorageHubFS extends FuseStubFS {
@Override @Override
public int open(String path, FuseFileInfo fi) { public int open(String path, FuseFileInfo fi) {
logger.info("open called"); logger.info("open called {} {}",path, fi.fh.getMemory().address());
return 0;
}
@Override
public int release(String path, FuseFileInfo fi) {
logger.info("release called {} {}",path, fi.fh.getMemory().address());
return 0; return 0;
} }
@Override
public int truncate(String path, long size) {
logger.info("truncate called {} ",path);
ScopeProvider.instance.set(scope);
SecurityTokenProvider.instance.set(token);
cache.remove(path);
uploadFile(path);
return 0;
}
/* /*
@Override @Override
public int access(String path, int mask) { public int access(String path, int mask) {

View File

@ -11,7 +11,7 @@ public class FuseTest {
@Test @Test
public void mount() { public void mount() {
StorageHubFS memfs = new StorageHubFS("b7c80297-e4ed-42ab-ab42-fdc0b8b0eabf-98187548","/gcube"); StorageHubFS memfs = new StorageHubFS("7c26a682-f47b-4e6e-90e0-6d101a4314cd-980114272","/pred4s/preprod/preVRE");
try { try {
String path; String path;
switch (Platform.getNativePlatform().getOS()) { switch (Platform.getNativePlatform().getOS()) {
@ -19,7 +19,7 @@ public class FuseTest {
path = "J:\\"; path = "J:\\";
break; break;
default: default:
path = "/home/lucio/javaMount/mnt1"; path = "/home/lucio/javaMount/mnt";
} }
memfs.mount(Paths.get(path), true, true); memfs.mount(Paths.get(path), true, true);
} finally { } finally {