public boolean reportChecksumFailure ( Path p , FSDataInputStream in , long inPos , FSDataInputStream sums , long sumsPos ) { try { // canonicalize f File f = ( ( RawLocalFileSystem ) fs ) . pathToFile ( p ) . getCanonicalFile ( ) ; // find highest writable parent dir of f on the same device String device = new DF ( f , getConf ( ) ) . getMount ( ) ; File parent = f . getParentFile ( ) ; File dir = null ; while ( parent != null && parent . canWrite ( ) && parent . toString ( ) . startsWith ( device ) ) { dir = parent ; parent = parent . getParentFile ( ) ; } if ( dir == null ) { throw new IOException ( "not able to find the highest writable parent dir" ) ; } // move the file there File badDir = new File ( dir , "bad_files" ) ; if ( ! badDir . mkdirs ( ) ) { if ( ! badDir . isDirectory ( ) ) { throw new IOException ( "Mkdirs failed to create " + badDir . toString ( ) ) ; } } String suffix = "." + rand . nextInt ( ) ; File badFile = new File ( badDir , f . getName ( ) + suffix ) ; LOG . warn ( "Moving bad file " + f + " to " + badFile ) ; in . close ( ) ; // close it first f . renameTo ( badFile ) ; // rename it // move checksum file too File checkFile = ( ( RawLocalFileSystem ) fs ) . pathToFile ( getChecksumFile ( p ) ) ; checkFile . renameTo ( new File ( badDir , checkFile . getName ( ) + suffix ) ) ; } catch ( IOException e ) { LOG . warn ( "Error moving bad file " + p + ": " + e ) ; } return false ; }
Moves files to a bad file directory on the same device so that their storage will not be reused .