make normal logreader more robust (#24577)
	
		
	
				
					
				
			
							parent
							
								
									3771ccc655
								
							
						
					
					
						commit
						194e5fdf1c
					
				
				 4 changed files with 24 additions and 70 deletions
			
			
		| @ -1,60 +0,0 @@ | ||||
| #!/usr/bin/env python3 | ||||
| import os | ||||
| import bz2 | ||||
| import urllib.parse | ||||
| import subprocess | ||||
| import tqdm | ||||
| import glob | ||||
| from tempfile import TemporaryDirectory | ||||
| import capnp | ||||
| 
 | ||||
| from tools.lib.logreader import FileReader, LogReader | ||||
| from cereal import log as capnp_log | ||||
| 
 | ||||
| 
 | ||||
| class RobustLogReader(LogReader): | ||||
|   def __init__(self, fn, canonicalize=True, only_union_types=False, sort_by_time=False):  # pylint: disable=super-init-not-called | ||||
|     data_version = None | ||||
|     _, ext = os.path.splitext(urllib.parse.urlparse(fn).path) | ||||
|     with FileReader(fn) as f: | ||||
|       dat = f.read() | ||||
| 
 | ||||
|     if ext == "": | ||||
|       pass | ||||
|     elif ext == ".bz2": | ||||
|       try: | ||||
|         dat = bz2.decompress(dat) | ||||
|       except ValueError: | ||||
|         print("Failed to decompress, falling back to bzip2recover") | ||||
|         with TemporaryDirectory() as directory: | ||||
|           # Run bzip2recovery on log | ||||
|           with open(os.path.join(directory, 'out.bz2'), 'wb') as f: | ||||
|             f.write(dat) | ||||
|           subprocess.check_call(["bzip2recover", "out.bz2"], cwd=directory) | ||||
| 
 | ||||
|           # Decompress and concatenate parts | ||||
|           dat = b"" | ||||
|           for n in sorted(glob.glob(f"{directory}/rec*.bz2")): | ||||
|             print(f"Decompressing {n}") | ||||
|             with open(n, 'rb') as f: | ||||
|               dat += bz2.decompress(f.read()) | ||||
|     else: | ||||
|       raise Exception(f"unknown extension {ext}") | ||||
| 
 | ||||
|     progress = None | ||||
|     while True: | ||||
|       try: | ||||
|         ents = capnp_log.Event.read_multiple_bytes(dat) | ||||
|         self._ents = list(sorted(ents, key=lambda x: x.logMonoTime) if sort_by_time else ents) | ||||
|         break | ||||
|       except capnp.lib.capnp.KjException: | ||||
|         if progress is None: | ||||
|           progress = tqdm.tqdm(total=len(dat)) | ||||
| 
 | ||||
|         # Cut off bytes at the end until capnp is able to read | ||||
|         dat = dat[:-1] | ||||
|         progress.update(1) | ||||
| 
 | ||||
|     self._ts = [x.logMonoTime for x in self._ents] | ||||
|     self.data_version = data_version | ||||
|     self._only_union_types = only_union_types | ||||
					Loading…
					
					
				
		Reference in new issue