On Tue, 22 Sep 2020 07:00:06 GMT, Robbin Ehn <r...@openjdk.org> wrote:
>> Hi Robbin, >> >> I've gone back to refresh myself on the previous discussions and (internal) >> design walk-throughs to get a better sense >> of these changes. Really the "asynchronous handshake" aspect is only a small >> part of this. The fundamental change here >> is that handshakes are now maintained via a per-thread queue, and those >> handshake operations can, in the general case, >> be executed by any of the target thread, the requestor (active_handshaker) >> thread or the VMThread. Hence the removal of >> the various "JavaThread::current()" assumptions. Unless constrained >> otherwise, any handshake operation may be executed >> by the VMThread so we have to take extra care to ensure the code is written >> to allow this. I'm a little concerned that >> our detour into direct-handshakes actually lulled us into a false sense of >> security knowing that an operation would >> always execute in a JavaThread, and we have now reverted that and allowed >> the VMThread back in. I understand why, but >> the change in direction here caught me by surprise (as I had forgotten the >> bigger picture). It may not always be >> obvious that the transitive closure of the code from an operation can be >> safely executed by a non-JavaThread. Then on >> top of this generalized queuing mechanism there is a filter which allows >> some control over which thread may perform a >> given operation - at the moment the only filter isolates "async" operations >> which only the target thread can execute. >> In addition another nuance is that when processing a given thread's >> handshake operation queue, different threads have >> different criteria for when to stop processing the queue: >> - the target thread will drain the queue completely >> - the VMThread will drain the queue of all "non-async" operations** >> - the initiator for a "direct" operation will drain the queue up to, and >> including, the synchronous operation they >> submitted >> - the initiator for an "async" operation will not process any operation >> themselves and will simply add to the queue and >> then continue on their way (hence the "asynchronous") >> >> ** I do have some concerns about latency impact on the VMThread if it is >> used to execute operations that didn't need to be >> executed by the VMThread! >> >> I remain concerned about the terminology conflation that happens around >> "async handshakes". There are two aspects that >> need to be separated: >> - the behaviour of the thread initiating the handshake operation; and >> - which thread can execute the handshake operation >> >> When a thread initiates a handshake operation and waits until that operation >> is complete (regardless of which thread >> performed it, or whether the initiator processed any other operations) that >> is a synchronous handshake operation. When >> a thread initiates a handshake operation and does not wait for the operation >> to complete (it does the >> target->queue()->add(op); and continues on its way) that is an asynchronous >> handshake operation. The question of >> whether the operation must be executed by the target thread is orthogonal to >> whether the operation was submitted as a >> synchronous or asynchronous operation. So I have problem when you say that >> an asynchronous handshake operation is one >> that must be executed by the target thread, as this is not the right >> characterisation at all. It is okay to constrain >> things such that an async operation is always executed by the target, but >> that is not what makes it an async operation. >> In the general case there is no reason why an async operation might not be >> executed by the VMThread, or some other >> JavaThread performing a synchronous operation on the same target. I will go >> back through the actual handshake code to >> see if there are specific things I would like to see changed, but that will >> have to wait until tomorrow. Thanks, David > > Hi David, you are correct and you did a fine job summarizing this, thanks! > >> I will go back through the actual handshake code to see if there are >> specific things I would like to see changed, but >> that will have to wait until tomorrow. > > Great thanks! > >> >> Thanks, >> David > > # @coleenp I think you placed your comment: "The "driver" concept is odd. Should it really be caller? Like the thread that called VMHandshake?" On the commit or somewhere else, not a review comment, I can't reply. Anyhow I can reply to it here: The answer is caller makes me think of requester, but we don't know if it's the requester executing this. Therefore I referred to the thread executing handshakes on the target/handshakee as driver. ------------- PR: https://git.openjdk.java.net/jdk/pull/151