[ 
https://issues.apache.org/jira/browse/CASSANDRA-8963?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=14629907#comment-14629907
 ] 

Joshua McKenzie commented on CASSANDRA-8963:
--------------------------------------------

bq. MultiPhaseOp is another possibility, to indicate it crosses phase 
boundaries.
Works for me.
bq. For this reason I'm not a fan of OpPhaseChain either. I would prefer 
something like OpPhaser, or something that conveys that it is a mechanism for 
creating a partial or phased ordering of operations.
I don't love OpPhaser but neither do I hate it. That'll also work for me.
Lastly, regarding the commenting style - it's just that: style. Breaking 
methods up into blocks of operations w/comments explaining what they're doing 
is fine. I prefer to have comments serving as a warning that something tricky 
is going on and the code clearly explaining the rest, but it's just a 
preference.

One thing I've been stewing on since yesterday - first off, the uncommented 
bit-magic in here is clearly not the easiest to digest. That being said, the 
OpPOrder.close() implementation currently on 2.2:
{code:title=current}
public void close()
{
    while (true)
    {
        int current = running;
        if (current < 0)
        {
            if (runningUpdater.compareAndSet(this, current, current + 1))
            {
                if (current + 1 == FINISHED)
                {
                    // if we're now finished, unlink ourselves
                    unlink();
                }
                return;
            }
        }
        else if (runningUpdater.compareAndSet(this, current, current - 1))
        {
            return;
        }
    }
}
{code}

Phase.closeOne():
{code:title=current branch}
void closeOne()
{
    assert next == null || next.prev == this;
    while (true)
    {
        int current = state;
        int next = (current & RUNNING) - 1;
        next |= (current & ~RUNNING);
        if (stateUpdater.compareAndSet(this, current, next))
        {
            if (isFinished(next))
                unlink();
            return;
        }
    }
}
{code}

I feel like we're moving in a less readable direction here; is there a reason 
an AtomicInteger wouldn't do for our purposes?

Lastly, Sylvain's advice seems sound to me. Having a header comment of that 
sort would go a long way to setting the stage to understand this code structure 
more for new users of the construct.

> Make OpOrder more intuitive
> ---------------------------
>
>                 Key: CASSANDRA-8963
>                 URL: https://issues.apache.org/jira/browse/CASSANDRA-8963
>             Project: Cassandra
>          Issue Type: Improvement
>          Components: Core
>            Reporter: Benedict
>            Assignee: Benedict
>            Priority: Minor
>             Fix For: 3.x
>
>
> There has been plenty of feedback about OpOrder being unintuitive. As well as 
> revisiting the naming, I propose to introduce an Action object with RAII 
> (AutoCloseable) protection that should be more obvious to users of the API. 
> We can also then protect this by a Ref instance for use cases where the 
> action lifetime is illdefined, and perhaps also introduce some checks for 
> actions whose lifetimes extend beyond a sensible limit to report those where 
> the object reference is retained.



--
This message was sent by Atlassian JIRA
(v6.3.4#6332)

Reply via email to