public int recover ( ) throws IOException { FilenameFilter unmanagedFilesFilter = new FilenameFilter ( ) { public boolean accept ( File dir , String name ) { // we used to try to avoid instantiating commitlog (thus creating an empty segment ready for writes) // until after recover was finished. this turns out to be fragile; it is less error-prone to go // ahead and allow writes before recover(), and just skip active segments when we do. return CommitLogDescriptor . isValid ( name ) && ! instance . allocator . manages ( name ) ; } } ; // submit all existing files in the commit log dir for archiving prior to recovery - CASSANDRA-6904 for ( File file : new File ( DatabaseDescriptor . getCommitLogLocation ( ) ) . listFiles ( unmanagedFilesFilter ) ) { archiver . maybeArchive ( file . getPath ( ) , file . getName ( ) ) ; archiver . maybeWaitForArchiving ( file . getName ( ) ) ; } assert archiver . archivePending . isEmpty ( ) : "Not all commit log archive tasks were completed before restore" ; archiver . maybeRestoreArchive ( ) ; File [ ] files = new File ( DatabaseDescriptor . getCommitLogLocation ( ) ) . listFiles ( unmanagedFilesFilter ) ; int replayed = 0 ; if ( files . length == 0 ) { logger . info ( "No commitlog files found; skipping replay" ) ; } else { Arrays . sort ( files , new CommitLogSegmentFileComparator ( ) ) ; logger . info ( "Replaying {}" , StringUtils . join ( files , ", " ) ) ; replayed = recover ( files ) ; logger . info ( "Log replay complete, {} replayed mutations" , replayed ) ; for ( File f : files ) CommitLog . instance . allocator . recycleSegment ( ) ; } allocator . enableReserveSegmentCreation ( ) ; return replayed ; }
Perform recovery on commit logs located in the directory specified by the config file .