private static void completeStoreSnapshotWithMissingInstanceSnapshots ( Path targetStoresPath ) { String transactionIdRegexAlone = "\"transactionId\"\\s*:\\s*\\d+\\s*," ; String transactionIdRegexReplace = "(.*\"transactionId\"\\s*:\\s*)\\d+(\\s*,.*)" ; Pattern transactionIdPattern = compile ( transactionIdRegexAlone ) ; Set < File > previousSnapshots = new HashSet <> ( ) ; Arrays . stream ( targetStoresPath . resolve ( SNAPSHOT_DIRECTORY_NAME ) . toFile ( ) . listFiles ( ) ) . sorted ( ) . forEach ( snapshot -> { Set < String > snapshotNames = Arrays . stream ( snapshot . listFiles ( ) ) . map ( File :: getName ) . collect ( toSet ( ) ) ; previousSnapshots . stream ( ) . filter ( previousSnapshot -> ! snapshotNames . contains ( previousSnapshot . getName ( ) ) ) . forEach ( previousSnapshot -> { try { Path targetPath = snapshot . toPath ( ) . resolve ( previousSnapshot . getName ( ) ) ; Path sourcePath = previousSnapshot . toPath ( ) ; long count = countTransactionId ( transactionIdPattern , sourcePath ) ; if ( count != 1L ) { throw new StoreException ( "transactionId not found once" , args -> args . add ( "found count" , count ) ) ; } BigInteger newTransactionId = new BigInteger ( snapshot . getName ( ) ) ; replaceTransactionIdValue ( transactionIdRegexReplace , sourcePath , targetPath , newTransactionId . toString ( ) ) ; } catch ( IOException e ) { throw new UncheckedIOException ( e ) ; } } ) ; previousSnapshots . clear ( ) ; previousSnapshots . addAll ( Arrays . stream ( snapshot . listFiles ( ) ) . collect ( toSet ( ) ) ) ; } ) ; }
Complete snapshot N with lacking instance snapshots from snapshot N - 1