diff --git a/community/consistency-check/src/main/java/org/neo4j/consistency/checking/full/RecordScanner.java b/community/consistency-check/src/main/java/org/neo4j/consistency/checking/full/RecordScanner.java index a18c6d028e24d..2c3e1d96db532 100644 --- a/community/consistency-check/src/main/java/org/neo4j/consistency/checking/full/RecordScanner.java +++ b/community/consistency-check/src/main/java/org/neo4j/consistency/checking/full/RecordScanner.java @@ -39,7 +39,10 @@ public RecordScanner( String name, Statistics statistics, int threads, BoundedIt super( name, statistics, threads ); this.store = store; this.processor = processor; - this.progress = builder.progressForPart( name, store.maxCount() ); + long maxCount = store.maxCount(); + this.progress = maxCount == -1 + ? builder.progressForUnknownPart( name ) + : builder.progressForPart( name, maxCount ); this.warmUpStores = warmUpStores; } diff --git a/community/kernel/src/main/java/org/neo4j/helpers/progress/Aggregator.java b/community/kernel/src/main/java/org/neo4j/helpers/progress/Aggregator.java index 9bc4dea71fa77..996eacf8ee83f 100644 --- a/community/kernel/src/main/java/org/neo4j/helpers/progress/Aggregator.java +++ b/community/kernel/src/main/java/org/neo4j/helpers/progress/Aggregator.java @@ -28,9 +28,9 @@ final class Aggregator { - private final Map states = + private final Map states = new ConcurrentHashMap<>(); - private Indicator indicator; + private final Indicator indicator; @SuppressWarnings("unused"/*accessed through updater*/) private volatile long progress; @SuppressWarnings("unused"/*accessed through updater*/) @@ -46,10 +46,10 @@ public Aggregator( Indicator indicator ) this.indicator = indicator; } - synchronized void add( ProgressListener.MultiPartProgressListener progress ) + synchronized void add( ProgressListener progress, long totalCount ) { states.put( progress, ProgressListener.MultiPartProgressListener.State.INIT ); - this.totalCount += progress.totalCount; + this.totalCount += totalCount; } synchronized Completion initialize() diff --git a/community/kernel/src/main/java/org/neo4j/helpers/progress/ProgressMonitorFactory.java b/community/kernel/src/main/java/org/neo4j/helpers/progress/ProgressMonitorFactory.java index da488faab7e84..a76e06ac8197a 100644 --- a/community/kernel/src/main/java/org/neo4j/helpers/progress/ProgressMonitorFactory.java +++ b/community/kernel/src/main/java/org/neo4j/helpers/progress/ProgressMonitorFactory.java @@ -94,7 +94,7 @@ public final ProgressListener openEnded( String process, int resolution ) public static class MultiPartBuilder { private Aggregator aggregator; - private Set parts = new HashSet(); + private Set parts = new HashSet<>(); private Completion completion = null; private MultiPartBuilder( ProgressMonitorFactory factory, String process ) @@ -104,17 +104,37 @@ private MultiPartBuilder( ProgressMonitorFactory factory, String process ) public ProgressListener progressForPart( String part, long totalCount ) { - if ( aggregator == null ) - { - throw new IllegalStateException( "Builder has been completed." ); - } + assertNotBuilt(); + assertUniquePart( part ); + ProgressListener.MultiPartProgressListener progress = + new ProgressListener.MultiPartProgressListener( aggregator, part, totalCount ); + aggregator.add( progress, totalCount ); + return progress; + } + + public ProgressListener progressForUnknownPart( String part ) + { + assertNotBuilt(); + assertUniquePart( part ); + ProgressListener progress = ProgressListener.NONE; + aggregator.add( progress, 0 ); + return progress; + } + + private void assertUniquePart( String part ) + { if ( !parts.add( part ) ) { throw new IllegalArgumentException( String.format( "Part '%s' has already been defined.", part ) ); } - ProgressListener.MultiPartProgressListener progress = new ProgressListener.MultiPartProgressListener( aggregator, part, totalCount ); - aggregator.add( progress ); - return progress; + } + + private void assertNotBuilt() + { + if ( aggregator == null ) + { + throw new IllegalStateException( "Builder has been completed." ); + } } public Completion build()