Hi Rob,

Now I'm concerned about this method:

  71     synchronized boolean addReplyBer(BerDecoder ber) {
72 // check the closed boolean value here as we don't want anything
  73         // to be added to the queue after close() has been called.
  74         if (cancelled || closed) {
  75             return false;
  76         }
  77
  78         // Add a new reply to the queue of unprocessed replies.
  79         try {
  80             replies.put(ber);
  81         } catch (InterruptedException e) {
  82             // ignore
  83         }
  84
85 // peek at the BER buffer to check if it is a SearchResultDone PDU
  86         try {
  87             ber.parseSeq(null);
  88             ber.parseInt();
89 completed = (ber.peekByte() == LdapClient.LDAP_REP_RESULT);
  90         } catch (IOException e) {
  91             // ignore
  92         }
  93         ber.reset();
  94         return pauseAfterReceipt;
  95     }

getReplyBer() is not synchronized, so AFAICS there is a
chance that line 93 executes after another thread as got
hold of the `ber` object.

Is that an issue? Should the `ber` object be added to
the reply queue only after it's been reset?

best regards,

-- daniel

On 25/10/2018 21:53, Rob McKenna wrote:
Thanks Daniel:

http://cr.openjdk.java.net/~robm/8139965/webrev.03/

I'm planning to follow up on the test side of things with a separate
bug. I think the technique used in some of the recent SQE LDAP tests
might be applicable.

     -Rob

On 05/09/18 09:53, Daniel Fuchs wrote:
Hi Rob,

That looks better but I believe that:

1. closed should be volatile since it's read from outside
    synchronized block

2. it seems there might be a race where the last response
    received could be dropped, if the connection is closed
    just after it's been pulled from the queue.

So I would suggest exchanging:

  115         if (isClosed()) {
  116             return null;
  117         }
  118
  119         return result;

with:

              return result == EOF ? null : result;

best regards,

-- daniel

On 05/09/2018 02:05, Rob McKenna wrote:
Thanks for the reviews folks.

I believe the following captures your recommended changes:

http://cr.openjdk.java.net/~robm/8139965/webrev.02/

W.r.t. testing I think this area has been difficult to test
traditionally. I'll have a dig through the existing testbase (and I'll
get back to you) to see if there's anything similar but afaik most tests
simply mimic a bindable dummy ldap server.

Vyom, are you aware of any more rigorous tests / ldap test frameworks?

      -Rob

On 04/09/18 10:22, Daniel Fuchs wrote:
Hi Rob,

I concur with Chris.
completed needs to be volatile and close() needs to
set a flag and use offer like cancel().

The condition for testing for closed then becomes
that the flag is set and the queue is empty or has EOF
as its head.

Is there any way this could be tested by a regression
test?

best regards,

-- daniel

On 04/09/2018 10:00, Chris Hegarty wrote:
Rob,

On 3 Sep 2018, at 22:48, Rob McKenna <rob.mcke...@oracle.com> wrote:

Hi folks,

I'd like to get a re-review of this change:

https://bugs.openjdk.java.net/browse/JDK-8139965 
<https://bugs.openjdk.java.net/browse/JDK-8139965>

This issue is closed as `will not fix`. I presume you will re-open it before 
pushing.

http://cr.openjdk.java.net/~robm/8139965/webrev/ 
<http://cr.openjdk.java.net/~robm/8139965/webrev/>


43     private boolean completed;
Won’t `completed` need to be volatile now? ( since the removal of synchronized 
from hasSearchCompleted )

LdapRequest.close puts EOF into the queue, but that is a potentially blocking 
operation ( while holding the lock ). If the queue is at capacity, then it will 
block forever. This model will only work if `getReplyBer` is always guaranteed 
to be running concurrently. Is it?

Please check the indentation of LdapRequest.java L103 ( in
the new file ). It appears, in the webrev, that the trailing `}` is
not lined up.

The indentation doesn’t look right here either.
    624             if (nparent) {
    625                 LdapRequest ldr = pendingRequests;
    626                 while (ldr != null) {
    627                     ldr.close();
    628                         ldr = ldr.next;
    629                     }
    630                 }
    631             }

-Chris




Reply via email to