uploader: size limit for automatic uploading of qlogs/qcams (#24403)

* uploader: size limit for automatic uploading of qlogs/qcams

* move check to add logging

* use constant

* mark as uploaded

Co-authored-by: Willem Melching <willem.melching@gmail.com>
old-commit-hash: df8f024e19
taco
Joost Wooning 3 years ago committed by GitHub
parent 171915797a
commit 08da73721c
  1. 32
      selfdrive/loggerd/uploader.py

@ -23,6 +23,8 @@ NetworkType = log.DeviceState.NetworkType
UPLOAD_ATTR_NAME = 'user.upload' UPLOAD_ATTR_NAME = 'user.upload'
UPLOAD_ATTR_VALUE = b'1' UPLOAD_ATTR_VALUE = b'1'
UPLOAD_QLOG_QCAM_MAX_SIZE = 1e7 # 10 MB
allow_sleep = bool(os.getenv("UPLOADER_SLEEP", "1")) allow_sleep = bool(os.getenv("UPLOADER_SLEEP", "1"))
force_wifi = os.getenv("FORCEWIFI") is not None force_wifi = os.getenv("FORCEWIFI") is not None
fake_upload = os.getenv("FAKEUPLOAD") is not None fake_upload = os.getenv("FAKEUPLOAD") is not None
@ -121,11 +123,11 @@ class Uploader():
for name, key, fn in upload_files: for name, key, fn in upload_files:
if any(f in fn for f in self.immediate_folders): if any(f in fn for f in self.immediate_folders):
return (key, fn) return (name, key, fn)
for name, key, fn in upload_files: for name, key, fn in upload_files:
if name in self.immediate_priority: if name in self.immediate_priority:
return (key, fn) return (name, key, fn)
return None return None
@ -172,7 +174,7 @@ class Uploader():
return self.last_resp return self.last_resp
def upload(self, key, fn, network_type, metered): def upload(self, name, key, fn, network_type, metered):
try: try:
sz = os.path.getsize(fn) sz = os.path.getsize(fn)
except OSError: except OSError:
@ -182,22 +184,15 @@ class Uploader():
cloudlog.event("upload_start", key=key, fn=fn, sz=sz, network_type=network_type, metered=metered) cloudlog.event("upload_start", key=key, fn=fn, sz=sz, network_type=network_type, metered=metered)
if sz == 0: if sz == 0:
try:
# tag files of 0 size as uploaded # tag files of 0 size as uploaded
setxattr(fn, UPLOAD_ATTR_NAME, UPLOAD_ATTR_VALUE) success = True
except OSError: elif name in self.immediate_priority and sz > UPLOAD_QLOG_QCAM_MAX_SIZE:
cloudlog.event("uploader_setxattr_failed", exc=self.last_exc, key=key, fn=fn, sz=sz) cloudlog.event("uploader_too_large", key=key, fn=fn, sz=sz)
success = True success = True
else: else:
start_time = time.monotonic() start_time = time.monotonic()
stat = self.normal_upload(key, fn) stat = self.normal_upload(key, fn)
if stat is not None and stat.status_code in (200, 201, 401, 403, 412): if stat is not None and stat.status_code in (200, 201, 401, 403, 412):
try:
# tag file as uploaded
setxattr(fn, UPLOAD_ATTR_NAME, UPLOAD_ATTR_VALUE)
except OSError:
cloudlog.event("uploader_setxattr_failed", exc=self.last_exc, key=key, fn=fn, sz=sz)
self.last_filename = fn self.last_filename = fn
self.last_time = time.monotonic() - start_time self.last_time = time.monotonic() - start_time
self.last_speed = (sz / 1e6) / self.last_time self.last_speed = (sz / 1e6) / self.last_time
@ -207,6 +202,13 @@ class Uploader():
success = False success = False
cloudlog.event("upload_failed", stat=stat, exc=self.last_exc, key=key, fn=fn, sz=sz, network_type=network_type, metered=metered) cloudlog.event("upload_failed", stat=stat, exc=self.last_exc, key=key, fn=fn, sz=sz, network_type=network_type, metered=metered)
if success:
# tag file as uploaded
try:
setxattr(fn, UPLOAD_ATTR_NAME, UPLOAD_ATTR_VALUE)
except OSError:
cloudlog.event("uploader_setxattr_failed", exc=self.last_exc, key=key, fn=fn, sz=sz)
return success return success
def get_msg(self): def get_msg(self):
@ -258,13 +260,13 @@ def uploader_fn(exit_event):
time.sleep(60 if offroad else 5) time.sleep(60 if offroad else 5)
continue continue
key, fn = d name, key, fn = d
# qlogs and bootlogs need to be compressed before uploading # qlogs and bootlogs need to be compressed before uploading
if key.endswith(('qlog', 'rlog')) or (key.startswith('boot/') and not key.endswith('.bz2')): if key.endswith(('qlog', 'rlog')) or (key.startswith('boot/') and not key.endswith('.bz2')):
key += ".bz2" key += ".bz2"
success = uploader.upload(key, fn, sm['deviceState'].networkType.raw, sm['deviceState'].networkMetered) success = uploader.upload(name, key, fn, sm['deviceState'].networkType.raw, sm['deviceState'].networkMetered)
if success: if success:
backoff = 0.1 backoff = 0.1
elif allow_sleep: elif allow_sleep:

Loading…
Cancel
Save