> On July 5, 2016, 3:08 p.m., Alexander Rukletsov wrote: > > src/tests/hierarchical_allocator_tests.cpp, line 3100 > > <https://reviews.apache.org/r/49612/diff/2/?file=1436764#file1436764line3100> > > > > I would keep these 3 instances in this test. It's not immediately clear > > that `AWAIT` happens in `handleAllocationsAndRecoverResources()`. > > Neil Conway wrote: > I don't agree with keeping `Clock::settle` in this case. For one thing, > it implies the wrong thing: i.e., keeping `Clock::settle` implies that > `handleAllocationsAndRecoverResources()` does not do sufficient > synchronization on its own, which is incorrect. > > Second, `Clock::settle` is a kludge; it should only be used when there is > _no other way_ to achieve the synchronization required by the test. So I'd > prefer to discourage its use whenever possible. > > Alexander Rukletsov wrote: > In general, `Clock::settle` is not a kludge: it allows to make sure a > certain event is processed before another event is scheduled. > > It is not the case here, though. We usually write tests in a way that > people can easily follow main steps without looking into functions (hence a > lot od copy paste code instead of fixture methods). > `handleAllocationsAndRecoverResources()` already breaks this convention by > modifying the caller's context; removing `Clock::settle` makes things even > worse IMO.
`Clock::settle` is a kludge because it hides the synchronization dependencies between operations. If a test needs to wait for operation X to complete before it does operation X, then X should provide an explicit interface (e.g., return a `Future` or using GMock trickery) to allow the test code to wait for X to complete. `Clock::settle` hides the synchronization dependency between X and Y. Moreover, `Clock::settle` waits for _all_ outstanding messages to be consumed, which is overkill. It is also very easy to write subtly incorrect code using `Clock::settle` -- e.g., look at all the stuff that breaks if you remove the `os::sleep()` call from the `Clock::settle` implementation. I agree that `handleAllocationsAndRecoverResources()` is somewhat inconsistent with our usual convention for test cases, but I don't think that the presence/absence of `Clock::settle` makes things any better/worse. - Neil ----------------------------------------------------------- This is an automatically generated e-mail. To reply, visit: https://reviews.apache.org/r/49612/#review140790 ----------------------------------------------------------- On July 5, 2016, 8:51 a.m., Neil Conway wrote: > > ----------------------------------------------------------- > This is an automatically generated e-mail. To reply, visit: > https://reviews.apache.org/r/49612/ > ----------------------------------------------------------- > > (Updated July 5, 2016, 8:51 a.m.) > > > Review request for mesos and Alexander Rukletsov. > > > Repository: mesos > > > Description > ------- > > If a test case calls `Clock::settle` and then immediately waits for a > future to be completed, settling the clock is usually unnecessary. > > > Diffs > ----- > > src/tests/hierarchical_allocator_tests.cpp > 0498cd5e54b0e4b87a767585a77699653aa52179 > > Diff: https://reviews.apache.org/r/49612/diff/ > > > Testing > ------- > > `mesos-tests --gtest_filter=HierarchicalAllocatorTest.* --gtest_repeat=500 > --gtest_break_on_failure` > > > Thanks, > > Neil Conway > >