|  | @@ -419,7 +419,10 @@ class ArchiveChecker:
 | 
	
		
			
				|  |  |          shutil.rmtree(self.tmpdir)
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |      def init_chunks(self):
 | 
	
		
			
				|  |  | -        self.chunks = ChunkIndex.create(os.path.join(self.tmpdir, 'chunks').encode('utf-8'))
 | 
	
		
			
				|  |  | +        # Explicity set the initial hash table capacity to avoid performance issues
 | 
	
		
			
				|  |  | +        # due to hash table "resonance"
 | 
	
		
			
				|  |  | +        capacity = int(len(self.repository) * 1.2)
 | 
	
		
			
				|  |  | +        self.chunks = ChunkIndex.create(os.path.join(self.tmpdir, 'chunks').encode('utf-8'), capacity=capacity)
 | 
	
		
			
				|  |  |          marker = None
 | 
	
		
			
				|  |  |          while True:
 | 
	
		
			
				|  |  |              result = self.repository.list(limit=10000, marker=marker)
 | 
	
	
		
			
				|  | @@ -466,11 +469,11 @@ class ArchiveChecker:
 | 
	
		
			
				|  |  |          if not Manifest.MANIFEST_ID in self.chunks:
 | 
	
		
			
				|  |  |              self.manifest = self.rebuild_manifest()
 | 
	
		
			
				|  |  |          else:
 | 
	
		
			
				|  |  | -            self.manifest, _ = Manifest.load(repository)
 | 
	
		
			
				|  |  | +            self.manifest, _ = Manifest.load(repository, key=self.key)
 | 
	
		
			
				|  |  |          self.rebuild_chunks()
 | 
	
		
			
				|  |  |          self.verify_chunks()
 | 
	
		
			
				|  |  |          if not self.error_found:
 | 
	
		
			
				|  |  | -            self.report_progress('Archive consistency check complete, no errors found.')
 | 
	
		
			
				|  |  | +            self.report_progress('Archive consistency check complete, no problems found.')
 | 
	
		
			
				|  |  |          return self.repair or not self.error_found
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |      def verify_chunks(self):
 | 
	
	
		
			
				|  | @@ -563,8 +566,9 @@ class ArchiveChecker:
 | 
	
		
			
				|  |  |                      for item in unpacker:
 | 
	
		
			
				|  |  |                          yield item
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -        for name, info in list(self.manifest.archives.items()):
 | 
	
		
			
				|  |  | -            self.report_progress('Analyzing archive: ' + name)
 | 
	
		
			
				|  |  | +        num_archives = len(self.manifest.archives)
 | 
	
		
			
				|  |  | +        for i, (name, info) in enumerate(list(self.manifest.archives.items()), 1):
 | 
	
		
			
				|  |  | +            self.report_progress('Analyzing archive {} ({}/{})'.format(name, i, num_archives))
 | 
	
		
			
				|  |  |              archive_id = info[b'id']
 | 
	
		
			
				|  |  |              if not archive_id in self.chunks:
 | 
	
		
			
				|  |  |                  self.report_progress('Archive metadata block is missing', error=True)
 |