linux - Java NIO TreeVisitor delete problems with NFS -


i trying delete directory tree using java nio filevisitor on linux nfs file system. however, having problems because of nfs 'silly rename' files (.nfs0000000007fa00e6000004c7, example). seems filesystem or filesystemprovider not releasing file resources while jvm running. maybe there better way?

below how implement, here have tried

  • run code on server: no problem except clients able same
  • use directorystream , filter wait nfs files go away: predictable deadlock
  • delete files first dirs in separate processes. wait nfs files go away while deleting dirs: many inotify or open files. (this seems rather kludgey)

log trace

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.dat ] 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)] [error: not walk file tree: tmp/src/tree ] java.nio.file.directorynotemptyexception: tmp/src/tree/dir1 @ sun.nio.fs.unixfilesystemprovider.impldelete(unixfilesystemprovider.java:242) @ sun.nio.fs.abstractfilesystemprovider.delete(abstractfilesystemprovider.java:103) @ java.nio.file.files.delete(files.java:1126) @ org.cocoloco.util.ccutils$treedeletevisitor.postvisitdirectory(ccutils.java:888) @ org.cocoloco.util.ccutils$treedeletevisitor.postvisitdirectory(ccutils.java: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.stream.referencepipeline$head.foreach(referencepipeline.java:580) @ org.cocoloco.dircopy.filterprocessor.processdirs(filterprocessor.java:204) @ org.cocoloco.dircopy.filterprocessor.process(filterprocessor.java:138) @ org.cocoloco.dircopy.dircopy.process(dircopy.java:142) @ org.cocoloco.dircopy.dircopy.main(dircopy.java:275)

'find' during processing

every 2.0s: find . -name .nfs* sun sep 10 11:58:38 2017

tmp/src/tree/dir1/.nfs0000000007fa00e7000004c1 tmp/src/tree/dir1/.nfs0000000007fa0139000004bd tmp/src/tree/dir1/.nfs0000000007fa00ea000004c8 tmp/src/tree/dir1/.nfs0000000007fa0124000004c0 tmp/src/tree/dir1/.nfs0000000007fa00e8000004bc tmp/src/tree/dir1/.nfs0000000007fa0133000004c6 tmp/src/tree/dir1/.nfs0000000007fa00e2000004bf tmp/src/tree/dir1/.nfs0000000007fa00e5000004be tmp/src/tree/dir1/.nfs0000000007fa00eb000004bb tmp/src/tree/dir1/.nfs0000000007fa00dc000004c4 tmp/src/tree/dir1/.nfs0000000007fa011d000004c2 tmp/src/tree/dir1/.nfs0000000007fa00de000004c5 tmp/src/tree/dir1/.nfs0000000007fa0138000004c3 tmp/src/tree/dir1/.nfs0000000007fa00e6000004c7

code snippet

  /**    *    */   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 {@link    * ioexception} gets thrown.  if exception thrown, method    * returns null.    *    * @param start starting {@link path} walk.    * @param visitor {@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;      }   } 


Comments

Popular posts from this blog

resizing Telegram inline keyboard -

command line - How can a Python program background itself? -

php - "cURL error 28: Resolving timed out" on Wordpress on Azure App Service on Linux -