Remove Raw Upload toggle (#23143)

* Remove Raw Upload toggle

* fix tests
pull/23154/head
Willem Melching 3 years ago committed by GitHub
parent 77a99e7d6d
commit 2e0c73fc0c
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
  1. 1
      selfdrive/common/params.cc
  2. 1
      selfdrive/loggerd/tests/loggerd_tests_common.py
  3. 72
      selfdrive/loggerd/tests/test_uploader.py
  4. 37
      selfdrive/loggerd/uploader.py
  5. 6
      selfdrive/ui/qt/offroad/settings.cc

@ -153,7 +153,6 @@ std::unordered_map<std::string, uint32_t> keys = {
{"TrainingVersion", PERSISTENT}, {"TrainingVersion", PERSISTENT},
{"UpdateAvailable", CLEAR_ON_MANAGER_START}, {"UpdateAvailable", CLEAR_ON_MANAGER_START},
{"UpdateFailedCount", CLEAR_ON_MANAGER_START}, {"UpdateFailedCount", CLEAR_ON_MANAGER_START},
{"UploadRaw", PERSISTENT},
{"Version", PERSISTENT}, {"Version", PERSISTENT},
{"VisionRadarToggle", PERSISTENT}, {"VisionRadarToggle", PERSISTENT},
{"ApiCache_Device", PERSISTENT}, {"ApiCache_Device", PERSISTENT},

@ -56,7 +56,6 @@ class MockParams():
def __init__(self): def __init__(self):
self.params = { self.params = {
"DongleId": b"0000000000000000", "DongleId": b"0000000000000000",
"UploadRaw": b"1",
"IsOffroad": b"1", "IsOffroad": b"1",
} }

@ -1,3 +1,5 @@
#!/usr/bin/env python3
import os
import time import time
import threading import threading
import unittest import unittest
@ -50,66 +52,72 @@ class TestUploader(UploaderTestCase):
self.end_event.set() self.end_event.set()
self.up_thread.join() self.up_thread.join()
def gen_files(self, lock=False): def gen_files(self, lock=False, boot=True):
f_paths = list() f_paths = list()
for t in ["bootlog.bz2", "qlog.bz2", "rlog.bz2", "dcamera.hevc", "fcamera.hevc"]: for t in ["qlog.bz2", "rlog.bz2", "dcamera.hevc", "fcamera.hevc"]:
f_paths.append(self.make_file_with_data(self.seg_dir, t, 1, lock=lock)) f_paths.append(self.make_file_with_data(self.seg_dir, t, 1, lock=lock))
if boot:
f_paths.append(self.make_file_with_data("boot", f"{self.seg_dir}.bz2", 1, lock=lock))
return f_paths return f_paths
def gen_order(self, seg1, seg2): def gen_order(self, seg1, seg2, boot=True):
keys = [f"{self.seg_format.format(i)}/qlog.bz2" for i in seg1] keys = []
if boot:
keys += [f"boot/{self.seg_format.format(i)}.bz2" for i in seg1]
keys += [f"boot/{self.seg_format2.format(i)}.bz2" for i in seg2]
keys += [f"{self.seg_format.format(i)}/qlog.bz2" for i in seg1]
keys += [f"{self.seg_format2.format(i)}/qlog.bz2" for i in seg2] keys += [f"{self.seg_format2.format(i)}/qlog.bz2" for i in seg2]
for i in seg1:
keys += [f"{self.seg_format.format(i)}/{f}" for f in ['rlog.bz2', 'fcamera.hevc', 'dcamera.hevc']]
for i in seg2:
keys += [f"{self.seg_format2.format(i)}/{f}" for f in ['rlog.bz2', 'fcamera.hevc', 'dcamera.hevc']]
keys += [f"{self.seg_format.format(i)}/bootlog.bz2" for i in seg1]
keys += [f"{self.seg_format2.format(i)}/bootlog.bz2" for i in seg2]
return keys return keys
def test_upload(self): def test_upload(self):
f_paths = self.gen_files(lock=False) self.gen_files(lock=False)
self.start_thread() self.start_thread()
# allow enough time that files could upload twice if there is a bug in the logic # allow enough time that files could upload twice if there is a bug in the logic
time.sleep(5) time.sleep(5)
self.join_thread() self.join_thread()
self.assertTrue(len(log_handler.upload_ignored) == 0, "Some files were ignored")
self.assertFalse(len(log_handler.upload_order) < len(f_paths), "Some files failed to upload")
self.assertFalse(len(log_handler.upload_order) > len(f_paths), "Some files were uploaded twice")
for f_path in f_paths:
self.assertTrue(getxattr(f_path, uploader.UPLOAD_ATTR_NAME), "All files not uploaded")
exp_order = self.gen_order([self.seg_num], []) exp_order = self.gen_order([self.seg_num], [])
self.assertTrue(len(log_handler.upload_ignored) == 0, "Some files were ignored")
self.assertFalse(len(log_handler.upload_order) < len(exp_order), "Some files failed to upload")
self.assertFalse(len(log_handler.upload_order) > len(exp_order), "Some files were uploaded twice")
for f_path in exp_order:
self.assertTrue(getxattr(os.path.join(self.root, f_path), uploader.UPLOAD_ATTR_NAME), "All files not uploaded")
self.assertTrue(log_handler.upload_order == exp_order, "Files uploaded in wrong order") self.assertTrue(log_handler.upload_order == exp_order, "Files uploaded in wrong order")
def test_upload_ignored(self): def test_upload_ignored(self):
self.set_ignore() self.set_ignore()
f_paths = self.gen_files(lock=False) self.gen_files(lock=False)
self.start_thread() self.start_thread()
# allow enough time that files could upload twice if there is a bug in the logic # allow enough time that files could upload twice if there is a bug in the logic
time.sleep(5) time.sleep(5)
self.join_thread() self.join_thread()
self.assertTrue(len(log_handler.upload_order) == 0, "Some files were not ignored")
self.assertFalse(len(log_handler.upload_ignored) < len(f_paths), "Some files failed to ignore")
self.assertFalse(len(log_handler.upload_ignored) > len(f_paths), "Some files were ignored twice")
for f_path in f_paths:
self.assertTrue(getxattr(f_path, uploader.UPLOAD_ATTR_NAME), "All files not ignored")
exp_order = self.gen_order([self.seg_num], []) exp_order = self.gen_order([self.seg_num], [])
self.assertTrue(len(log_handler.upload_order) == 0, "Some files were not ignored")
self.assertFalse(len(log_handler.upload_ignored) < len(exp_order), "Some files failed to ignore")
self.assertFalse(len(log_handler.upload_ignored) > len(exp_order), "Some files were ignored twice")
for f_path in exp_order:
self.assertTrue(getxattr(os.path.join(self.root, f_path), uploader.UPLOAD_ATTR_NAME), "All files not ignored")
self.assertTrue(log_handler.upload_ignored == exp_order, "Files ignored in wrong order") self.assertTrue(log_handler.upload_ignored == exp_order, "Files ignored in wrong order")
def test_upload_files_in_create_order(self): def test_upload_files_in_create_order(self):
f_paths = list()
seg1_nums = [0, 1, 2, 10, 20] seg1_nums = [0, 1, 2, 10, 20]
for i in seg1_nums: for i in seg1_nums:
self.seg_dir = self.seg_format.format(i) self.seg_dir = self.seg_format.format(i)
f_paths += self.gen_files() self.gen_files(boot=False)
seg2_nums = [5, 50, 51] seg2_nums = [5, 50, 51]
for i in seg2_nums: for i in seg2_nums:
self.seg_dir = self.seg_format2.format(i) self.seg_dir = self.seg_format2.format(i)
f_paths += self.gen_files() self.gen_files(boot=False)
exp_order = self.gen_order(seg1_nums, seg2_nums, boot=False)
self.start_thread() self.start_thread()
# allow enough time that files could upload twice if there is a bug in the logic # allow enough time that files could upload twice if there is a bug in the logic
@ -117,15 +125,15 @@ class TestUploader(UploaderTestCase):
self.join_thread() self.join_thread()
self.assertTrue(len(log_handler.upload_ignored) == 0, "Some files were ignored") self.assertTrue(len(log_handler.upload_ignored) == 0, "Some files were ignored")
self.assertFalse(len(log_handler.upload_order) < len(f_paths), "Some files failed to upload") self.assertFalse(len(log_handler.upload_order) < len(exp_order), "Some files failed to upload")
self.assertFalse(len(log_handler.upload_order) > len(f_paths), "Some files were uploaded twice") self.assertFalse(len(log_handler.upload_order) > len(exp_order), "Some files were uploaded twice")
for f_path in f_paths: for f_path in exp_order:
self.assertTrue(getxattr(f_path, uploader.UPLOAD_ATTR_NAME), "All files not uploaded") self.assertTrue(getxattr(os.path.join(self.root, f_path), uploader.UPLOAD_ATTR_NAME), "All files not uploaded")
exp_order = self.gen_order(seg1_nums, seg2_nums)
self.assertTrue(log_handler.upload_order == exp_order, "Files uploaded in wrong order") self.assertTrue(log_handler.upload_order == exp_order, "Files uploaded in wrong order")
def test_no_upload_with_lock_file(self): def test_no_upload_with_lock_file(self):
f_paths = self.gen_files(lock=True) f_paths = self.gen_files(lock=True, boot=False)
self.start_thread() self.start_thread()
# allow enough time that files should have been uploaded if they would be uploaded # allow enough time that files should have been uploaded if they would be uploaded
@ -137,4 +145,4 @@ class TestUploader(UploaderTestCase):
if __name__ == "__main__": if __name__ == "__main__":
unittest.main() unittest.main(failfast=True)

@ -60,8 +60,6 @@ class Uploader():
self.last_resp = None self.last_resp = None
self.last_exc = None self.last_exc = None
self.raw_size = 0
self.raw_count = 0
self.immediate_size = 0 self.immediate_size = 0
self.immediate_count = 0 self.immediate_count = 0
@ -72,21 +70,16 @@ class Uploader():
self.immediate_folders = ["crash/", "boot/"] self.immediate_folders = ["crash/", "boot/"]
self.immediate_priority = {"qlog.bz2": 0, "qcamera.ts": 1} self.immediate_priority = {"qlog.bz2": 0, "qcamera.ts": 1}
self.high_priority = {"rlog.bz2": 0, "fcamera.hevc": 1, "dcamera.hevc": 2, "ecamera.hevc": 3}
def get_upload_sort(self, name): def get_upload_sort(self, name):
if name in self.immediate_priority: if name in self.immediate_priority:
return self.immediate_priority[name] return self.immediate_priority[name]
if name in self.high_priority:
return self.high_priority[name] + 100
return 1000 return 1000
def list_upload_files(self): def list_upload_files(self):
if not os.path.isdir(self.root): if not os.path.isdir(self.root):
return return
self.raw_size = 0
self.raw_count = 0
self.immediate_size = 0 self.immediate_size = 0
self.immediate_count = 0 self.immediate_count = 0
@ -116,38 +109,27 @@ class Uploader():
if name in self.immediate_priority: if name in self.immediate_priority:
self.immediate_count += 1 self.immediate_count += 1
self.immediate_size += os.path.getsize(fn) self.immediate_size += os.path.getsize(fn)
else:
self.raw_count += 1
self.raw_size += os.path.getsize(fn)
except OSError: except OSError:
pass pass
yield (name, key, fn) yield (name, key, fn)
def next_file_to_upload(self, with_raw): def next_file_to_upload(self):
upload_files = list(self.list_upload_files()) upload_files = list(self.list_upload_files())
# try to upload qlog files first
for name, key, fn in upload_files: for name, key, fn in upload_files:
if name in self.immediate_priority or 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 (key, fn)
if with_raw: for name, key, fn in upload_files:
# then upload the full log files, rear and front camera files if name in self.immediate_priority:
for name, key, fn in upload_files: return (key, fn)
if name in self.high_priority:
return (key, fn)
# then upload other files
for name, key, fn in upload_files:
if not name.endswith('.lock') and not name.endswith(".tmp"):
return (key, fn)
return None return None
def do_upload(self, key, fn): def do_upload(self, key, fn):
try: try:
url_resp = self.api.get("v1.4/"+self.dongle_id+"/upload_url/", timeout=10, path=key, access_token=self.api.get_token()) url_resp = self.api.get("v1.4/" + self.dongle_id + "/upload_url/", timeout=10, path=key, access_token=self.api.get_token())
if url_resp.status_code == 412: if url_resp.status_code == 412:
self.last_resp = url_resp self.last_resp = url_resp
return return
@ -226,8 +208,6 @@ class Uploader():
def get_msg(self): def get_msg(self):
msg = messaging.new_message("uploaderState") msg = messaging.new_message("uploaderState")
us = msg.uploaderState us = msg.uploaderState
us.rawQueueSize = int(self.raw_size / 1e6)
us.rawQueueCount = self.raw_count
us.immediateQueueSize = int(self.immediate_size / 1e6) us.immediateQueueSize = int(self.immediate_size / 1e6)
us.immediateQueueCount = self.immediate_count us.immediateQueueCount = self.immediate_count
us.lastTime = self.last_time us.lastTime = self.last_time
@ -260,10 +240,7 @@ def uploader_fn(exit_event):
time.sleep(60 if offroad else 5) time.sleep(60 if offroad else 5)
continue continue
good_internet = network_type in [NetworkType.wifi, NetworkType.ethernet] d = uploader.next_file_to_upload()
allow_raw_upload = params.get_bool("UploadRaw")
d = uploader.next_file_to_upload(with_raw=allow_raw_upload and good_internet and offroad)
if d is None: # Nothing to upload if d is None: # Nothing to upload
if allow_sleep: if allow_sleep:
time.sleep(60 if offroad else 5) time.sleep(60 if offroad else 5)

@ -59,12 +59,6 @@ TogglesPanel::TogglesPanel(SettingsWindow *parent) : ListWidget(parent) {
"Use features, such as community supported hardware, from the open source community that are not maintained or supported by comma.ai and have not been confirmed to meet the standard safety model. Be extra cautious when using these features", "Use features, such as community supported hardware, from the open source community that are not maintained or supported by comma.ai and have not been confirmed to meet the standard safety model. Be extra cautious when using these features",
"../assets/offroad/icon_shell.png", "../assets/offroad/icon_shell.png",
}, },
{
"UploadRaw",
"Upload Raw Logs",
"Upload full logs and full resolution video by default while on Wi-Fi. If not enabled, individual logs can be marked for upload at useradmin.comma.ai.",
"../assets/offroad/icon_network.png",
},
{ {
"RecordFront", "RecordFront",
"Record and Upload Driver Camera", "Record and Upload Driver Camera",

Loading…
Cancel
Save