Java NIO TreeVisitor удалить проблемы с NFS
Я пытаюсь удалить дерево каталогов с помощью Java NIO FileVisitor в файловой системе Linux NFS. Однако у меня возникли проблемы из-за файлов "глупого переименования" NFS (например,.nfs0000000007fa00e6000004c7). Кажется, что FileSystem или FileSystemProvider не освобождают файловые ресурсы во время работы JVM. Может быть, есть лучший способ?
Ниже я хотел бы реализовать, но вот что я попробовал
- Запустите код на сервере: нет проблем, за исключением того, что я хотел бы, чтобы клиенты могли делать то же самое
- Используйте DirectoryStream и Filter для ожидания удаления файлов NFS: предсказуемая тупиковая ситуация
- Сначала удалите файлы, а затем каталоги в отдельных процессах. Подождите, пока файлы NFS исчезнут при удалении каталогов: слишком много файлов inotify или open. (это кажется довольно грязным)
трассировка журнала
2017-09-10 11:56:58,930 [ main][ preVisitDirectory][ org.cocoloco.util.CCUtils$TreeDeleteVisitor( 903)] [TRACE: tmp/src/tree ] 2017-09-10 11:56:58,932 [ main][ preVisitDirectory][ org.cocoloco.util.CCUtils$TreeDeleteVisitor( 903)] [TRACE: tmp/src/tree/dir1 ] 2017-09-10 11:56:58,932 [ main][ visitFile][ org.cocoloco.util.CCUtils$TreeDeleteVisitor( 918)] [TRACE: tmp/src/tree/dir1/uvalda_01_2.dat ] 2017-09-10 11:56:58,939 [ main][ visitFile][ org.cocoloco.util.CCUtils$TreeDeleteVisitor( 918)] [TRACE: tmp/src/tree/dir1/dir1.txt ] 2017-09-10 11:56:58,941 [ main][ visitFile][ org.cocoloco.util.CCUtils$TreeDeleteVisitor( 918)] [TRACE: tmp/src/tree/dir1/uvalda_03_0.res ] 2017-09-10 11:56:58,948 [ main][ visitFile][ org.cocoloco.util.CCUtils$TreeDeleteVisitor( 918)] [TRACE: tmp/src/tree/dir1/uvalda_01_0.txt ] 2017-09-10 11:56:58,950 [ main][ visitFile][ org.cocoloco.util.CCUtils$TreeDeleteVisitor( 918)] [TRACE: tmp/src/tree/dir1/uvalda_01_3.dat ] 2017-09-10 11:56:58,952 [ main][ visitFile][ org.cocoloco.util.CCUtils$TreeDeleteVisitor( 918)] [TRACE: tmp/src/tree/dir1/uvalda_02_0.txt ] 2017-09-10 11:56:58,954 [ main][ visitFile][ org.cocoloco.util.CCUtils$TreeDeleteVisitor( 918)] [TRACE: tmp/src/tree/dir1/uvalda_03_0.txt ] 2017-09-10 11:56:58,957 [ main][ visitFile][ org.cocoloco.util.CCUtils$TreeDeleteVisitor( 918))] [TRACE: tmp/src/tree/dir1/uvalda_01_1.dat ] 2017-09-10 11:56:58,959 [ main][ visitFile][ org.cocoloco.util.CCUtils$TreeDeleteVisitor( 918)] [TRACE: tmp/src/tree/dir1/dir1.res ] 2017-09-10 11:56:58,963 [ main][ visitFile][ org.cocoloco.util.CCUtils$TreeDeleteVisitor( 918)] [TRACE: tmp/src/tree/dir1/uvalda_01_0.res ] 2017-09-10 11:56:58,967 [ main][ visitFile][ org.cocoloco.util.CCUtils$TreeDeleteVisitor( 918)] [TRACE: tmp/src/tree/dir1/uvalda_03_1. дата] 2017-09-10 11:56:58,977 [ main][ visitFile][ org.cocoloco.util.CCUtils$TreeDeleteVisitor( 918)] [TRACE: tmp/src/tree/dir1/uvalda_01_0.dat ] 2017-09-10 11:56:58,985 [ main][ visitFile][ org.cocoloco.util.CCUtils$TreeDeleteVisitor( 918)] [TRACE: tmp/src/tree/dir1/uvalda_02_1.dat ] 2017-09-10 11:56:58,994 [ main][ visitFile][ org.cocoloco.util.CCUtils$TreeDeleteVisitor( 918)] [TRACE: tmp/src/tree/dir1/uvalda_02_0.res ] 2017-09-10 11:56:58,998 [ main][ postVisitDirectory][ org.cocoloco.util.CCUtils$TreeDeleteVisitor( 886)] [TRACE: tmp/src/tree/dir1 ] 2017-09-10 11:56:59,005 [ main][ walkFileTree][ org.cocoloco.util.CCUtils( 664)] [ОШИБКА: не удалось просмотреть дерево файлов: tmp/src/tree ] java Исключение.nio.file.Files.delete(Files.java:1126) в org.cocoloco.util.CCUtils$TreeDeleteVisitor.postVisitDirectory(CCUtils.java:888) в org.cocoloco.util.CCUtils $ TreeDeleteVisitor.postVisitDirect.:876) на java.nio.file.Files.walkFileTree(Files.java:2688) на java.nio.file.Files.walkFileTree(Files.java:2742) в org.cocoloco.util.CCUtils.walkFileTree(CCUtils.java:660) в org.cocoloco.util.CCUtils.deleteDir(CCUtils.java:717) в org.cocoloco.util.CCUtils.moveDir(CCUtils.java:762) в org.cocoloco.dircopy.FilterProcessor.lambda$processDirs$5(FilterProcessor.java:209) в java.util.TreeMap$KeySpliterator.forEachRemaining(TreeMap.java:2746) в java.util..ReferencePipeline$Head.forEach(ReferencePipeline.java:580) в org.cocoloco.dircopy.FilterProcessor.processDirs(FilterProcessor.java:204) в org.cocoloco.dircopy.FilterProcessor.process(FilterProcessor.jg13: cocoloco.dircopy.Dircopy.process(Dircopy.java:142) в org.cocoloco.dircopy.Dircopy.main(Dircopy.java:275)
"найти" во время обработки
Каждые 2,0: найти. имя.nfs* вс 10 сентября 11:58:38 2017
TMP / SRC / дерево /dir1/.nfs0000000007fa00e7000004c1 TMP / SRC / дерево /dir1/.nfs0000000007fa0139000004bd TMP / SRC / дерево /dir1/.nfs0000000007fa00ea000004c8 TMP / SRC / дерево /dir1/.nfs0000000007fa0124000004c0 TMP / SRC / дерево /dir1/.nfs0000000007fa00e8000004bc TMP / SRC / дерево /dir1/.nfs0000000007fa0133000004c6 TMP / SRC / дерево /dir1/.nfs0000000007fa00e2000004bf TMP / SRC / дерево /dir1/.nfs0000000007fa00e5000004be TMP / SRC / дерево /dir1/.nfs0000000007fa00eb000004bb TMP / SRC / дерево /dir1/.nfs0000000007fa00dc000004c4 tmp/src/tree/dir1/.nfs0000000007fa011d000004c2 tmp/src/tree/dir1/.nfs0000000007fa00de000004c5 tmp/src/tree/dir1/.nfs0000000007fa0138000004c3 / 0000000007000000700000000cf1
фрагмент кода
/**
*
*/
public static void moveDir( Path source, Path target )
{
copyDir( source, target );
if ( validateDir( source, target ) )
{
deleteDir( source );
}
else
{
deleteDir( target );
}
}
...
/**
*
*/
public static void deleteDir( Path source )
{
CCUtils.walkFileTree( source, new TreeDeleteVisitor() );
}
...
/**
* Wrap {@link Files#walkFileTree(Path,FileVisitor)}, logging any {@link
* IOException} that gets thrown. If an exception is thrown, this method
* returns null.
*
* @param start the starting {@link Path} to walk.
* @param visitor the {@code Path} {@link FilVisitor}.
*/
public static Path walkFileTree(
Path start, FileVisitor< ? super Path > visitor )
{
Path path = null;
try
{
path = Files.walkFileTree( start, visitor );
}
catch ( IOException ee )
{
LOGGER.error( "Could not walk file tree: " + start, ee );
}
return path;
}
...
/**
*
*/
private static class TreeDeleteVisitor implements FileVisitor< Path >
{
/**
* {@inheritDoc}
*/
@Override
public FileVisitResult postVisitDirectory(
Path dir, IOException exc )
throws IOException
{
LOGGER.trace( dir );
Files.delete( dir );
return FileVisitResult.CONTINUE;
}
/**
* {@inheritDoc}
*/
@Override
public FileVisitResult preVisitDirectory(
Path dir, BasicFileAttributes attrs )
throws IOException
{
LOGGER.trace( dir );
return FileVisitResult.CONTINUE;
}
/**
* {@inheritDoc}
*/
@Override
public FileVisitResult visitFile(
Path file, BasicFileAttributes attrs )
throws IOException
{
LOGGER.trace( file );
Files.delete( file );
return FileVisitResult.CONTINUE;
}
/**
* {@inheritDoc}
*/
@Override
public FileVisitResult visitFileFailed(
Path file, IOException exc )
throws IOException
{
LOGGER.error( "Could not visit file: " + file, exc );
return FileVisitResult.TERMINATE;
}
}