On 15/09/2015 17:59, Yilong Li wrote:
> On Tue, Sep 15, 2015 at 7:19 AM, Mark Thomas <ma...@apache.org> wrote:

>> Long experience has lead us to be sceptical of bugs reported by
>> automated tools. When looking at such bugs and we can't see what the
>> problem is and the person raising the bug can't provide a clear
>> explanation - and continues not to provide a clear explanation when
>> asked for one several times - then that is the point where we start to
>> think the problem is with the tool.
>>
> 
> Sorry, I should not assume that the concepts such as happens-before order
> and memory model are well understood. Let's talk about how this is allowed
> to happen under JMM. Consider the this example again:
> 
> if (st_200 == null ) {
>     st_200 = sm.getString("sc.200");
> }
> return st_200;
> 
> The following is a valid execution trace consists of 5 events:
>             T1                       T2
> 1   READ  null
> 2   WRITE s
> 3                                 READ s
> 4                                 READ ???
> 5   READ  s
> 
> , where s is the result of sm.getString("sc.200").
> 
> T1 sees null in field st_200, initializes it, and return the initialized
> value, while T2 sees a non-null value in st_200 and skips the
> initialization. The question is what value T2 can read and then return in
> event 4. This is addressed in JLS $17.4.5 Happens-before Order (
> https://docs.oracle.com/javase/specs/jls/se8/html/jls-17.html#jls-17.4.5):
> 
> We say that a read *r* of a variable *v* is allowed to observe a write *w*
> to *v* if, in the *happens-before* partial order of the execution trace:
> 
>    -
> 
>    *r* is not ordered before *w* (i.e., it is not the case that *hb(r, w)*),
>    and
>    -
> 
>    there is no intervening write *w*' to *v* (i.e. no write *w*' to *v* such
>    that *hb(w, w')* and *hb(w', r)*).
> 
> Informally, a read *r* is allowed to see the result of a write *w* if there
> is no *happens-before* ordering to prevent that read.
> 
> The question boils down to: does the write in event 2 prevent event 4 from
> reading the initial null value of st_200? No, because there is no
> happens-before order involved here. So what kind of constructs introduce
> happens-before order? This question is also addressed in the same section
> of JLS:
> 
> It follows from the above definitions that:
> 
>    -
> 
>    An unlock on a monitor *happens-before* every subsequent lock on that
>    monitor.
>    -
> 
>    A write to a volatile field (ยง8.3.1.4
>    <https://docs.oracle.com/javase/specs/jls/se8/html/jls-8.html#jls-8.3.1.4>
>    ) *happens-before* every subsequent read of that field.
>    -
> 
>    A call to start() on a thread *happens-before* any actions in the
>    started thread.
>    -
> 
>    All actions in a thread *happen-before* any other thread successfully
>    returns from a join() on that thread.
>    -
> 
>    The default initialization of any object *happens-before* any other
>    actions (other than default-writes) of a program.

Thank you. That helps fill in a few gaps. Putting it into my own words
to check my understanding:

- The two reads in T2 may be re-ordered because, in T2, there is nothing
  that requires a happens-before relationship between the two reads

- If T2 was executing in isolation the order of the reads wouldn't
  matter

- However, T1 is writing.

So if the writes in T2 are re-ordered and the write from T1 takes place
between them the T2 read for the line 'st_200 == null' could return a
non-null value for st_200 (the value after the write from T1) while the
read for the line 'return st_200;' could return null (the value from
before the write in T1).

Is my understanding correct?

>> I don't have any particular issues in mind, just a suspicion that
>> concurrency issues lie behind some of the hard to reproduce bugs that
>> get reported from time to time. If I could produce the bug I would have
>> fixed it already.
>>
> 
> Technically speaking, RV-Predict doesn't require a developer to be able to
> produce the bug or data race in order to detect it. One can run RV-Predict
> on code that fails only intermittently and RV-Predict may still catch the
> bug. Perhaps it can be helpful to ask the bug reporter to run their code
> against RV-Predict if it's just too hard to extract a test case that can
> reproduce the failure consistently enough.

Good to know. That is certainly worth a try. I'll add something to the
bugs in question.

> Thanks again for the prompt responses and the quick fixes of the reported
> bugs. This has also helped RV-Predict to get into a better shape.

Thanks to you to. It has certainly helped Tomcat improve and the
discussion around these issues continues to help educate the community
as a whole about these issues.

Mark


---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscr...@tomcat.apache.org
For additional commands, e-mail: dev-h...@tomcat.apache.org

Reply via email to