@ Override public long deserialize ( DataTree dt , Map < Long , Long > sessions ) throws IOException { // we run through 100 snapshots (not all of them) // if we cannot get it running within 100 snapshots // we should give up List < File > snapList = findNValidSnapshots ( 100 ) ; if ( snapList . size ( ) == 0 ) { return - 1L ; } File snap = null ; boolean foundValid = false ; for ( int i = 0 ; i < snapList . size ( ) ; i ++ ) { snap = snapList . get ( i ) ; InputStream snapIS = null ; CheckedInputStream crcIn = null ; try { LOG . info ( "Reading snapshot " + snap ) ; snapIS = new BufferedInputStream ( new FileInputStream ( snap ) ) ; crcIn = new CheckedInputStream ( snapIS , new Adler32 ( ) ) ; InputArchive ia = BinaryInputArchive . getArchive ( crcIn ) ; deserialize ( dt , sessions , ia ) ; long checkSum = crcIn . getChecksum ( ) . getValue ( ) ; long val = ia . readLong ( "val" ) ; if ( val != checkSum ) { throw new IOException ( "CRC corruption in snapshot : " + snap ) ; } foundValid = true ; break ; } catch ( IOException e ) { LOG . warn ( "problem reading snap file " + snap , e ) ; } finally { if ( snapIS != null ) snapIS . close ( ) ; if ( crcIn != null ) crcIn . close ( ) ; } } if ( ! foundValid ) { throw new IOException ( "Not able to find valid snapshots in " + snapDir ) ; } dt . lastProcessedZxid = Util . getZxidFromName ( snap . getName ( ) , "snapshot" ) ; return dt . lastProcessedZxid ; }
deserialize a data tree from the most recent snapshot