common: replace custom xattr implementation with os module's (#24448)

* use os module's xattr function

* fix that

* handle in helper
pull/24542/head
Adeeb Shihadeh 3 years ago committed by GitHub
parent 38e294f393
commit 81dacbedca
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
  1. 47
      common/tests/test_xattr.py
  2. 1
      release/files_common
  3. 4
      selfdrive/loggerd/tests/test_deleter.py
  4. 13
      selfdrive/loggerd/tests/test_uploader.py
  5. 3
      selfdrive/loggerd/tools/mark_all_uploaded.py
  6. 4
      selfdrive/loggerd/tools/mark_unuploaded.py
  7. 30
      selfdrive/loggerd/xattr_cache.py

@ -1,47 +0,0 @@
import os
import tempfile
import shutil
import unittest
from common.xattr import getxattr, setxattr, listxattr, removexattr
class TestParams(unittest.TestCase):
USER_TEST='user.test'
def setUp(self):
self.tmpdir = tempfile.mkdtemp()
self.tmpfn = os.path.join(self.tmpdir, 'test.txt')
open(self.tmpfn, 'w').close()
#print("using", self.tmpfn)
def tearDown(self):
shutil.rmtree(self.tmpdir)
def test_getxattr_none(self):
a = getxattr(self.tmpfn, TestParams.USER_TEST)
assert a is None
def test_listxattr_none(self):
l = listxattr(self.tmpfn)
assert l == []
def test_setxattr(self):
setxattr(self.tmpfn, TestParams.USER_TEST, b'123')
a = getxattr(self.tmpfn, TestParams.USER_TEST)
assert a == b'123'
def test_listxattr(self):
setxattr(self.tmpfn, 'user.test1', b'123')
setxattr(self.tmpfn, 'user.test2', b'123')
l = listxattr(self.tmpfn)
assert l == ['user.test1', 'user.test2']
def test_removexattr(self):
setxattr(self.tmpfn, TestParams.USER_TEST, b'123')
a = getxattr(self.tmpfn, TestParams.USER_TEST)
assert a == b'123'
removexattr(self.tmpfn, TestParams.USER_TEST)
a = getxattr(self.tmpfn, TestParams.USER_TEST)
assert a is None
if __name__ == "__main__":
unittest.main()

@ -28,7 +28,6 @@ common/logging_extra.py
common/numpy_fast.py common/numpy_fast.py
common/params.py common/params.py
common/params_pyx.pyx common/params_pyx.pyx
common/xattr.py
common/profiler.py common/profiler.py
common/basedir.py common/basedir.py
common/dict_helpers.py common/dict_helpers.py

@ -1,12 +1,12 @@
#!/usr/bin/env python3
import os import os
import time import time
import threading import threading
import unittest import unittest
from collections import namedtuple from collections import namedtuple
import selfdrive.loggerd.deleter as deleter
from common.timeout import Timeout, TimeoutException from common.timeout import Timeout, TimeoutException
import selfdrive.loggerd.deleter as deleter
from selfdrive.loggerd.tests.loggerd_tests_common import UploaderTestCase from selfdrive.loggerd.tests.loggerd_tests_common import UploaderTestCase
Stats = namedtuple("Stats", ['f_bavail', 'f_blocks', 'f_frsize']) Stats = namedtuple("Stats", ['f_bavail', 'f_blocks', 'f_frsize'])

@ -9,8 +9,6 @@ import json
from selfdrive.swaglog import cloudlog from selfdrive.swaglog import cloudlog
import selfdrive.loggerd.uploader as uploader import selfdrive.loggerd.uploader as uploader
from common.xattr import getxattr
from selfdrive.loggerd.tests.loggerd_tests_common import UploaderTestCase from selfdrive.loggerd.tests.loggerd_tests_common import UploaderTestCase
@ -84,7 +82,7 @@ class TestUploader(UploaderTestCase):
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 failed to upload")
self.assertFalse(len(log_handler.upload_order) > len(exp_order), "Some files were uploaded twice") self.assertFalse(len(log_handler.upload_order) > len(exp_order), "Some files were uploaded twice")
for f_path in exp_order: for f_path in exp_order:
self.assertTrue(getxattr(os.path.join(self.root, f_path.replace('.bz2', '')), uploader.UPLOAD_ATTR_NAME), "All files not uploaded") self.assertTrue(os.getxattr(os.path.join(self.root, f_path.replace('.bz2', '')), 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")
@ -103,7 +101,7 @@ class TestUploader(UploaderTestCase):
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 failed to ignore")
self.assertFalse(len(log_handler.upload_ignored) > len(exp_order), "Some files were ignored twice") self.assertFalse(len(log_handler.upload_ignored) > len(exp_order), "Some files were ignored twice")
for f_path in exp_order: for f_path in exp_order:
self.assertTrue(getxattr(os.path.join(self.root, f_path.replace('.bz2', '')), uploader.UPLOAD_ATTR_NAME), "All files not ignored") self.assertTrue(os.getxattr(os.path.join(self.root, f_path.replace('.bz2', '')), 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")
@ -128,7 +126,7 @@ class TestUploader(UploaderTestCase):
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 failed to upload")
self.assertFalse(len(log_handler.upload_order) > len(exp_order), "Some files were uploaded twice") self.assertFalse(len(log_handler.upload_order) > len(exp_order), "Some files were uploaded twice")
for f_path in exp_order: for f_path in exp_order:
self.assertTrue(getxattr(os.path.join(self.root, f_path.replace('.bz2', '')), uploader.UPLOAD_ATTR_NAME), "All files not uploaded") self.assertTrue(os.getxattr(os.path.join(self.root, f_path.replace('.bz2', '')), 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")
@ -143,7 +141,8 @@ class TestUploader(UploaderTestCase):
self.join_thread() self.join_thread()
for f_path in f_paths: for f_path in f_paths:
self.assertFalse(getxattr(f_path.replace('.bz2', ''), uploader.UPLOAD_ATTR_NAME), "File upload when locked") uploaded = uploader.UPLOAD_ATTR_NAME in os.listxattr(f_path.replace('.bz2', ''))
self.assertFalse(uploaded, "File upload when locked")
def test_clear_locks_on_startup(self): def test_clear_locks_on_startup(self):
f_paths = self.gen_files(lock=True, boot=False) f_paths = self.gen_files(lock=True, boot=False)
@ -156,4 +155,4 @@ class TestUploader(UploaderTestCase):
if __name__ == "__main__": if __name__ == "__main__":
unittest.main(failfast=True) unittest.main()

@ -1,9 +1,8 @@
import os import os
from common.xattr import setxattr
from selfdrive.loggerd.uploader import UPLOAD_ATTR_NAME, UPLOAD_ATTR_VALUE from selfdrive.loggerd.uploader import UPLOAD_ATTR_NAME, UPLOAD_ATTR_VALUE
from selfdrive.loggerd.config import ROOT from selfdrive.loggerd.config import ROOT
for folder in os.walk(ROOT): for folder in os.walk(ROOT):
for file1 in folder[2]: for file1 in folder[2]:
full_path = os.path.join(folder[0], file1) full_path = os.path.join(folder[0], file1)
setxattr(full_path, UPLOAD_ATTR_NAME, UPLOAD_ATTR_VALUE) os.setxattr(full_path, UPLOAD_ATTR_NAME, UPLOAD_ATTR_VALUE)

@ -1,8 +1,8 @@
#!/usr/bin/env python3 #!/usr/bin/env python3
import os
import sys import sys
from common.xattr import removexattr
from selfdrive.loggerd.uploader import UPLOAD_ATTR_NAME from selfdrive.loggerd.uploader import UPLOAD_ATTR_NAME
for fn in sys.argv[1:]: for fn in sys.argv[1:]:
print(f"unmarking {fn}") print(f"unmarking {fn}")
removexattr(fn, UPLOAD_ATTR_NAME) os.removexattr(fn, UPLOAD_ATTR_NAME)

@ -1,15 +1,23 @@
from typing import Dict, Tuple import os
import errno
from typing import Dict, Tuple, Optional
from common.xattr import getxattr as getattr1 _cached_attributes: Dict[Tuple, Optional[bytes]] = {}
from common.xattr import setxattr as setattr1
cached_attributes: Dict[Tuple, bytes] = {} def getxattr(path: str, attr_name: str) -> Optional[bytes]:
def getxattr(path: str, attr_name: str) -> bytes: key = (path, attr_name)
if (path, attr_name) not in cached_attributes: if key not in _cached_attributes:
response = getattr1(path, attr_name) try:
cached_attributes[(path, attr_name)] = response response = os.getxattr(path, attr_name)
return cached_attributes[(path, attr_name)] except OSError as e:
# ENODATA means attribute hasn't been set
if e.errno == errno.ENODATA:
response = None
else:
raise
_cached_attributes[key] = response
return _cached_attributes[key]
def setxattr(path: str, attr_name: str, attr_value: bytes) -> None: def setxattr(path: str, attr_name: str, attr_value: bytes) -> None:
cached_attributes.pop((path, attr_name), None) _cached_attributes.pop((path, attr_name), None)
return setattr1(path, attr_name, attr_value) return os.setxattr(path, attr_name, attr_value)

Loading…
Cancel
Save