Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Ruby isolation rootfs pytest reliably fails #1238

Closed
ac000 opened this issue Apr 30, 2024 · 2 comments
Closed

Ruby isolation rootfs pytest reliably fails #1238

ac000 opened this issue Apr 30, 2024 · 2 comments
Assignees

Comments

@ac000
Copy link
Member

ac000 commented Apr 30, 2024

The below test reliably fails, though generally only for ruby 3.2, the 3.3 tests generally always succeed.

Rerunning it usually works... (sometimes it needs a few runs)

test/test_ruby_isolation.py::test_ruby_isolation_rootfs ERROR

==================================== ERRORS ====================================
_______________ ERROR at teardown of test_ruby_isolation_rootfs ________________

request = <SubRequest 'run' for <Function test_ruby_isolation_rootfs>>

    @pytest.fixture(autouse=True)
    def run(request):
        unit = unit_run()
    
        option.skip_alerts = [
            r'read signalfd\(4\) failed',
            r'sendmsg.+failed',
            r'recvmsg.+failed',
        ]
        option.skip_sanitizer = False
    
        _fds_info['main']['skip'] = False
        _fds_info['router']['skip'] = False
        _fds_info['controller']['skip'] = False
    
        yield
    
        # stop unit
    
        error_stop_unit = unit_stop()
        error_stop_processes = stop_processes()
    
        # prepare log
    
        with Log.open() as f:
            log = f.read()
            Log.set_pos(f.tell())
    
        if not option.save_log and option.restart:
            shutil.rmtree(unit['temp_dir'])
            Log.set_pos(0)
    
        # clean temp_dir before the next test
    
        if not option.restart:
            _clear_conf(log=log)
>           _clear_temp_dir()

test/conftest.py:238: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

    def _clear_temp_dir():
        temporary_dir = unit_instance['temp_dir']
    
        if is_findmnt and not waitforunmount(temporary_dir, timeout=600):
>           sys.exit('Could not unmount filesystems in tmpdir ({temporary_dir}).')
E           SystemExit: Could not unmount filesystems in tmpdir ({temporary_dir}).

test/conftest.py:432: SystemExit
=================================== FAILURES ===================================
__________________________ test_ruby_isolation_rootfs __________________________

is_su = True, require = <function check_prerequisites at 0x7f20b43a9ab0>
temp_dir = '/tmp/unit-test-1mcvwuuu'

    def test_ruby_isolation_rootfs(is_su, require, temp_dir):
        isolation = {'rootfs': temp_dir}
    
        if not is_su:
            require(
                {
                    'features': {
                        'isolation': [
                            'unprivileged_userns_clone',
                            'user',
                            'mnt',
                            'pid',
                        ]
                    }
                }
            )
    
            isolation['namespaces'] = {
                'mount': True,
                'credential': True,
                'pid': True,
            }
    
        client.load('status_int', isolation=isolation)
    
        assert 'success' in client.conf(
            '"/ruby/status_int/config.ru"',
            'applications/status_int/script',
        )
    
        assert 'success' in client.conf(
            '"/ruby/status_int"',
            'applications/status_int/working_directory',
        )
    
>       assert client.get()['status'] == 200, 'status int'

test/test_ruby_isolation.py:43: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
test/unit/http.py:165: in get
    return self.http('GET', **kwargs)
test/unit/http.py:103: in http
    resp = self.recvall(sock, **recvall_kwargs).decode(
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

self = <unit.applications.lang.ruby.ApplicationRuby object at 0x7f20b4418250>
sock = <socket.socket fd=5, family=AddressFamily.AF_INET, type=SocketKind.SOCK_STREAM, proto=0, laddr=('127.0.0.1', 43988), raddr=('127.0.0.1', 8080)>
kwargs = {}, timeout_default = 60, timeout = 60, buff_size = 4096, data = b''
rlist = []

    def recvall(self, sock, **kwargs):
        timeout_default = 60
    
        timeout = kwargs.get('read_timeout', timeout_default)
        buff_size = kwargs.get('buff_size', 4096)
    
        data = b''
        while True:
            rlist = select.select([sock], [], [], timeout)[0]
            if not rlist:
                # For all current cases if the "read_timeout" was changed
                # than test do not expect to get a response from server.
                if timeout == timeout_default:
>                   pytest.fail("Can't read response from server.")
E                   Failed: Can't read response from server.

test/unit/http.py:189: Failed
=========================== short test summary info ============================
FAILED test/test_ruby_isolation.py::test_ruby_isolation_rootfs - Failed: Can't read response from server.
ERROR test/test_ruby_isolation.py::test_ruby_isolation_rootfs - SystemExit: Could not unmount filesystems in tmpdir ({temporary_dir}).
========= 1 failed, 38 passed, 7 skipped, 1 error in 132.93s (0:02:12) =========
@arbourd
Copy link
Member

arbourd commented Oct 17, 2024

Is this still consistent / appearing?

@arbourd arbourd removed their assignment Oct 17, 2024
@ac000
Copy link
Member Author

ac000 commented Oct 17, 2024

Actually I don't recall seeing it fail recently... closing for now...

@ac000 ac000 closed this as completed Oct 17, 2024
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

3 participants