mirror of
https://github.com/samba-team/samba.git
synced 2024-12-23 17:34:34 +03:00
e232ba946f
There were some reports that strace output an LDAP server socket is in CLOSE_WAIT state, returning EAGAIN for writev over and over (after a call to epoll() each time). In the tstream_bsd code the problem happens when we have a pending writev_send, while there's no readv_send pending. In that case we still ask for TEVENT_FD_READ in order to notice connection errors early, so we try to call writev even if the socket doesn't report TEVENT_FD_WRITE. And there are situations where we do that over and over again. It happens like this with a Linux kernel: tcp_fin() has this: struct tcp_sock *tp = tcp_sk(sk); inet_csk_schedule_ack(sk); sk->sk_shutdown |= RCV_SHUTDOWN; sock_set_flag(sk, SOCK_DONE); switch (sk->sk_state) { case TCP_SYN_RECV: case TCP_ESTABLISHED: /* Move to CLOSE_WAIT */ tcp_set_state(sk, TCP_CLOSE_WAIT); inet_csk_enter_pingpong_mode(sk); break; It means RCV_SHUTDOWN gets set as well as TCP_CLOSE_WAIT, but sk->sk_err is not changed to indicate an error. tcp_sendmsg_locked has this: ... err = -EPIPE; if (sk->sk_err || (sk->sk_shutdown & SEND_SHUTDOWN)) goto do_error; while (msg_data_left(msg)) { int copy = 0; skb = tcp_write_queue_tail(sk); if (skb) copy = size_goal - skb->len; if (copy <= 0 || !tcp_skb_can_collapse_to(skb)) { bool first_skb; new_segment: if (!sk_stream_memory_free(sk)) goto wait_for_space; ... wait_for_space: set_bit(SOCK_NOSPACE, &sk->sk_socket->flags); if (copied) tcp_push(sk, flags & ~MSG_MORE, mss_now, TCP_NAGLE_PUSH, size_goal); err = sk_stream_wait_memory(sk, &timeo); if (err != 0) goto do_error; It means if (sk->sk_err || (sk->sk_shutdown & SEND_SHUTDOWN)) doesn't hit as we only have RCV_SHUTDOWN and sk_stream_wait_memory returns -EAGAIN. tcp_poll has this: if (sk->sk_shutdown & RCV_SHUTDOWN) mask |= EPOLLIN | EPOLLRDNORM | EPOLLRDHUP; So we'll get EPOLLIN | EPOLLRDNORM | EPOLLRDHUP triggering TEVENT_FD_READ and writev/sendmsg keeps getting EAGAIN. So we need to always clear TEVENT_FD_READ if we don't have readable handler in order to avoid burning cpu. But we turn it on again after a timeout of 1 second in order to monitor the error state of the connection. And now that our tsocket_bsd_error() helper checks for POLLRDHUP, we can check if the socket is in an error state before calling the writable handler when TEVENT_FD_READ was reported. Only on error we'll call the writable handler, which will pick the error without calling writev(). BUG: https://bugzilla.samba.org/show_bug.cgi?id=15202 Signed-off-by: Stefan Metzmacher <metze@samba.org> Reviewed-by: Ralph Boehme <slow@samba.org> |
||
---|---|---|
.. | ||
flapping.d | ||
gnupg | ||
knownfail.d | ||
manage-ca | ||
ns | ||
sanitizer | ||
target | ||
checkpassword_arg1.sh | ||
create_smb1_fail_skipfile.txt | ||
devel_env.sh | ||
filter-subunit | ||
flapping | ||
format-subunit | ||
format-subunit-json | ||
gdb_backtrace | ||
gdb_backtrace_test.c | ||
gdb_run | ||
in_screen | ||
knownfail | ||
knownfail_heimdal_kdc | ||
knownfail_mit_kdc | ||
knownfail_mit_kdc_1_20 | ||
knownfail_mit_kdc_pre_1_20 | ||
no-python-tests.txt | ||
perf_tests.py | ||
quick | ||
README | ||
save.env.sh | ||
selftest.pl | ||
selftest.pl.1 | ||
selftesthelpers.py | ||
skip | ||
skip_mit_kdc | ||
skip_mit_kdc_pre_1_20 | ||
skip.no-GSS_KRB5_CRED_NO_CI_FLAGS_X | ||
skip.opath-required | ||
slow | ||
slow-none | ||
SocketWrapper.pm | ||
Subunit.pm | ||
subunithelper.py | ||
tap2subunit | ||
tests.py | ||
TODO | ||
todo_smb2_tests_to_port.list | ||
ubsan.supp | ||
valgrind_run | ||
wscript |
# vim: ft=rst This directory contains test scripts that are useful for running a bunch of tests all at once. There are two parts to this: * The test runner (selftest/selftest.pl) * The test formatter selftest.pl simply outputs subunit, which can then be formatted or analyzed by tools that understand the subunit protocol. One of these tools is format-subunit, which is used by default as part of "make test". Available testsuites ==================== The available testsuites are obtained from a script, usually source{3,4}/selftest/tests.py. This script should for each testsuite output the name of the test, the command to run and the environment that should be provided. Use the included "plantest" function to generate the required output. Testsuite behaviour =================== Exit code ------------ The testsuites should exit with a non-zero exit code if at least one test failed. Skipped tests should not influence the exit code. Output format ------------- Testsuites can simply use the exit code to indicate whether all of their tests have succeeded or one or more have failed. It is also possible to provide more granular information using the Subunit protocol. This protocol works by writing simple messages to standard output. Any messages that can not be interpreted by this protocol are considered comments for the last announced test. For a full description of the subunit protocol, see the README file in the subunit repository at http://github.com/testing-cabal/subunit. The following commands are Samba extensions to Subunit: start-testsuite ~~~~~~~~~~~~~~~ start-testsuite: name The testsuite name is used as prefix for all containing tests. skip-testsuite ~~~~~~~~~~~~~~ skip-testsuite: name Mark the testsuite with the specified name as skipped. testsuite-success ~~~~~~~~~~~~~~~~~ testsuite-success: name Indicate that the testsuite has succeeded successfully. testsuite-fail ~~~~~~~~~~~~~~ testsuite-fail: name Indicate that a testsuite has failed. Environments ============ Tests often need to run against a server with particular things set up, a "environment". This environment is provided by the test "target": Samba 3, Samba 4 or Windows. The environments are currently available include - none: No server set up, no variables set. - dc,s3dc: Domain controller set up. The following environment variables will be set: * USERNAME: Administrator user name * PASSWORD: Administrator password * DOMAIN: Domain name * REALM: Realm name * SERVER: DC host name * SERVER_IP: DC IPv4 address * SERVER_IPV6: DC IPv6 address * NETBIOSNAME: DC NetBIOS name * NETIOSALIAS: DC NetBIOS alias - member,s4member,s3member: Domain controller and member server that is joined to it set up. The following environment variables will be set: * USERNAME: Domain administrator user name * PASSWORD: Domain administrator password * DOMAIN: Domain name * REALM: Realm name * SERVER: Name of the member server See Samba.pm, Samba3.pm and Samba4.pm for the full list. Running tests ============= To run all the tests use:: make test To run a quicker subset run:: make quicktest To run a specific test, use this syntax:: make test TESTS=testname for example:: make test TESTS=samba4.BASE-DELETE