[
https://issues.apache.org/jira/browse/MESOS-4142?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=15055027#comment-15055027
]
Alexander Rojas commented on MESOS-4142:
So the root of the problem is the asynchronicity of {{spawn}} and
{{ProcessBase::initialize()}}. The bug occurs because in
[{{http_tests.cpp}}|https://github.com/apache/mesos/blob/6bd9b65b9d93f154ff9187fb5e5136262ede043c/3rdparty/libprocess/src/tests/http_tests.cpp#L71]
the class {{HttpProcess}} execute calls to {{ProcessBase::route()}} commands
in the overload of {{ProcessBase::initialize()}}, this causes the endpoint to
be registered for authentication after the request was made. Below I post a
timeline of the bug (Which somewhat is more likely to happen under gcc than
under clang):
* {{Http http}} is created.
* {{Http::Http()}} calls {{HttpProcess::HttpProcess}}.
* {{Http::Http()}} calls {{spawn(process) // where process is an instance of
HttpProcess}}.
* {{spawn(process)}} calls {{enqueue(process)}} which will call
{{HttpProcess::initialize()}} later.
* {{Http::Http()}} returns and can be used already.
* The test calls {{http::get(http.process->self(), "authenticated")}}.
* The request arrives to {{ProcessManager::handle()}} it dispatches for
authentication.
* At this point {{HttpProcess::initialize()}} begins to be executed.
* Request arrives to {{AuthenticationRouterProcess::authenticate()}}, it
doesn't find the path of the request into the registered endpoints.
* {{AuthenticationRouterProcess::authenticate()}} returns with a non
authentication needed response.
* {{HttpProcess::initialize()}} calls {{route("/authenticated", "realm",
None(), &HttpProcess::authenticated);}} At this point it is too late to set
authentication.
* {{ProcessManager::handle()}} dispatches the request to the instance of
{{Http}} but it is too late to set handler. Test fails.
As I see it, this race existed before and I find it rather surprising that it
didn't affected other tests before, while it is true that {{route}} takes
longer if it requires authentication. I have an easy workaround which is
calling {{route}} from {{HttpProcess}} constructor, however, I think we should
evaluate how wise is to allow the use of processes if initialize hasn't run, or
at least being able to wait until the process is initialized.
> HttpAuthenticationTest.Unauthorized is flaky
>
>
> Key: MESOS-4142
> URL: https://issues.apache.org/jira/browse/MESOS-4142
> Project: Mesos
> Issue Type: Bug
> Components: libprocess
>Reporter: Joris Van Remoortere
> Labels: authentication, libprocess, mesosphere
>
> {code}
> [ RUN ] HttpAuthenticationTest.Unauthorized
> libprocess: (35605)@127.0.1.1:40875 terminating due to Uninteresting mock
> function call - returning default value.
> Function call: authenticated(@0x7f412c016540 224-byte object <38-68 01-2C
> 41-7F 00-00 01-00 00-00 00-00 00-00 00-00 00-00 00-00 00-00 01-00 00-00 00-00
> 00-00 00-00 00-00 00-00 00-00 01-00 00-00 00-00 00-00 00-00 00-00 01-00 00-00
> 00-00 00-00 00-00 00-00 ... E0-75 01-2C 41-7F 00-00 03-00 00-00 00-00 00-00
> 00-00 80-3F 00-00 00-00 0B-00 00-00 00-00 00-00 00-00 00-00 00-00 00-00 78-A6
> F9-3A 41-7F 00-00 00-00 00-00 02-00 00-00 7F-00 00-01 13-EB 00-00>,
> @0x7f411c614cd8 16-byte object <01-00 00-00 00-00 00-00 E8-66 91-01 00-00
> 00-00>)
> The mock function has no default action set, and its return type has no
> default value set.
> ../../../3rdparty/libprocess/src/tests/http_tests.cpp:1271: Failure
> Value of: (response).get().status
> Actual: "500 Internal Server Error"
> Expected: http::Unauthorized(vector()).status
> Which is: "401 Unauthorized"
> terminate called after throwing an instance of
> 'testing::internal::GoogleTestFailureException'
> what(): ../../../3rdparty/libprocess/src/tests/http_tests.cpp:1271: Failure
> Value of: (response).get().status
> Actual: "500 Internal Server Error"
> Expected: http::Unauthorized(vector()).status
> Which is: "401 Unauthorized"
> *** Aborted at 1449970589 (unix time) try "date -d @1449970589" if you are
> using GNU date ***
> PC: @ 0x7f413a6e1267 (unknown)
> *** SIGABRT (@0x3e8641e) received by PID 25630 (TID 0x7f413c81f7c0) from
> PID 25630; stack trace: ***
> @ 0x7f413c206d10 (unknown)
> @ 0x7f413a6e1267 (unknown)
> @ 0x7f413a6e2eca (unknown)
> @ 0x7f413aced06d (unknown)
> @ 0x7f413aceaee6 (unknown)
> @ 0x7f413aceaf31 (unknown)
> @ 0x7f413aceb199 (unknown)
> @ 0x73369d
> testing::internal::HandleExceptionsInMethodIfSupported<>()
> @ 0x71a605 testing::UnitTest::Run()
> @ 0x53e201 RUN_ALL_TESTS()
> @ 0x53dfa2 main
> @ 0x7f413a6cca40 (unknown)
> @ 0x419599 _