Attached are patches against 452927 . . .

- gp 

> -----Original Message-----
> From: Jaliya Ekanayake [mailto:[EMAIL PROTECTED] 
> Sent: Tuesday, October 03, 2006 6:43 PM
> To: Gilbert Pilz; [email protected]
> Subject: Re: Sandesha 1.0; fix for clients hanging in 
> SandeshaContext.endSequence()
> 
> Hi Gilbert,
> 
> Thanks for the patch. I tried to apply it but the version is 
> not matching the current svn tree.
> Please update the code and creat the patch.
> 
> -Jaliya
> 
> 
> ----- Original Message -----
> From: "Gilbert Pilz" <[EMAIL PROTECTED]>
> To: "Jaliya Ekanayake" <[EMAIL PROTECTED]>; 
> <[email protected]>
> Sent: Tuesday, October 03, 2006 3:49 PM
> Subject: RE: Sandesha 1.0; fix for clients hanging in
> SandeshaContext.endSequence()
> 
> 
> There is a race condition for outbound sequences between the 
> SenderWorker thread transmitting the TerminateSequence message and the
> endSequence() call stopping that thread. It's difficult to 
> figure out what a good wait value might be because, depending 
> upon how many messages are queued up, the length of time you 
> might need to wait for the TerminateSequence to be sent could 
> be arbitrarily long.
> 
> I've changed the code to log an INFO-level message when an 
> incomplete sequence is ignored. If ignoring incomplete 
> sequences causes people problems then they shouldn't do that.
> 
> - gp
> 
> 
> > -----Original Message-----
> > From: Jaliya Ekanayake [mailto:[EMAIL PROTECTED]
> > Sent: Friday, September 29, 2006 8:06 PM
> > To: Gilbert Pilz; [email protected]
> > Subject: Re: Sandesha 1.0; fix for clients hanging in
> > SandeshaContext.endSequence()
> >
> > Sure, I have one clarification.
> >
> > What not allow some time-out before we cleanup. The reason 
> for this is 
> > as follows; In the one-way messaging case
> > SandeshaContext.endSequence() is called just after the service 
> > requests so if someone use END_SEQUENCE_IGNORE_ACTIVE then the 
> > sequences will immediately be terminated. It is better to set some 
> > timestamp to wait.
> >
> > In addition can you please send the patch as an attachment?
> >
> > Thanks,
> > -Jaliya
> >
> > ----- Original Message -----
> > From: "Gilbert Pilz" <[EMAIL PROTECTED]>
> > To: <[email protected]>
> > Sent: Friday, September 29, 2006 7:14 PM
> > Subject: Sandesha 1.0; fix for clients hanging in
> > SandeshaContext.endSequence()
> >
> >
> > The story so far: the SandeshaContext.endSequence() method 
> waits for 
> > all the sequences related to a SandeshaContext to 
> "complete" before it 
> > returns. Because some implementations of WS-RM (200502) do not 
> > automatically terminate their offered sequence when the 
> sequence that 
> > carried that offer is terminated (did you get that?), this 
> may cause a 
> > Sandesha client to hang until the sequence's inactivity timeout 
> > expires.
> > At this point the client will see an AxisFault that they may or may 
> > not understand to be benign.
> >
> > My plan was to fix this by adding a property to the SandeshaContext 
> > called "EndSeqBehavior". The default value for this behavior, 
> > "END_SEQUENCE_BLOCK_ON_ACTIVE", causes
> > endSequence() to behave exactly as it does today (block on 
> any active 
> > sequences until they either complete or time out due to 
> inactivity). 
> > Another value for this behavior, 
> "END_SEQUENCE_IGNORE_ACTIVE", causes 
> > endSequence() to simply ignore any active sequences and 
> clean up. This 
> > behavior is ok if all you are interested in doing is cleaning up 
> > quickly, but it could make things difficult for the peers of the 
> > sequences that are more or less orphaned.
> > If they tried to send messages using those sequences they 
> would retry 
> > and retry and retry until they reached some internal limit 
> that told 
> > them to stop. This seems rather wasteful given the fact 
> that Sandesha 
> > knew it was going to abandon the sequence, so I thought 
> there should 
> > be one more value for the EndSeqBehavior property called 
> > "END_SEQUENCE_FAULT_ACTIVE". This value would cause
> > endSequence() to send an unsolicited 
> wsrm:SequenceTerminated fault to 
> > the sequence peer of any active sequences.
> >
> > Unfortunately the last value has proven much harder to 
> implement than 
> > I expected so I thought it would be a good idea to at least get the 
> > changes for END_SEQUENCE_IGNORE_ACTIVE into the tree. Below are two 
> > patch files; one for org/apache/sandesha/Constants.java and one for 
> > org/apache/sandesha/SandeshaContext.java.
> >
> > Jaliya, if you could look these over and get them into the tree, I 
> > would appreciate that very much. Note that clients that are 
> unaware of 
> > the EndSeqBehavior property will continue to work as they do today 
> > w/out recompilation etc. Clients that wish to avoid the hanging 
> > problem described above simply have to call the new
> > SandeshaContext.setEndSeqBehavior() method with the 
> appropriate value 
> > (as defined in Constants).
> >
> > - gp
> >
> > Index: src/org/apache/sandesha/Constants.java
> > ===================================================================
> > --- src/org/apache/sandesha/Constants.java (revision 451449)
> > +++ src/org/apache/sandesha/Constants.java (working copy)
> > @@ -72,6 +72,10 @@
> >
> >      int SYNCHRONOUS = 0;
> >
> > +    // Flags for controlling the behavior of endSequence()
> > in the face
> > of active sequences.
> > +    int END_SEQUENCE_BLOCK_ON_ACTIVE = 0;       // default
> > +    int END_SEQUENCE_IGNORE_ACTIVE = 1;         // ignore 
> any active
> > seqs
> > +
> >      public interface WSA {
> >          String NS_ADDRESSING_ANONYMOUS = 
> > AddressingUtils.getAnonymousRoleURI();
> >      }
> >
> > ----------------------------------------
> >
> > Index: src/org/apache/sandesha/SandeshaContext.java
> > ===================================================================
> > --- src/org/apache/sandesha/SandeshaContext.java (revision
> > 451449)
> > +++ src/org/apache/sandesha/SandeshaContext.java (working copy)
> > @@ -76,6 +76,7 @@
> >      private boolean sendOffer;
> >      private long messageNumber;
> >      private boolean sync;
> > +    private int endSeqActiveBehavior;
> >
> >      static int clientListnerPort = -1;
> >      public final int MIN_PORT = 0;
> > @@ -155,6 +156,14 @@
> >          this.toURL = toURL;
> >      }
> >
> > +    public int getEndSeqBehavior() {
> > +        return endSeqActiveBehavior;
> > +    }
> > +
> > +    public void setEndSeqBehavior(int flag) {
> > +        this.endSeqActiveBehavior = flag;
> > +    }
> > +
> >      public SandeshaContext() throws AxisFault {
> >          initSandeshaAsync();
> >      }
> > @@ -331,33 +340,38 @@
> >      public final RMReport endSequence() throws AxisFault {
> >
> >          IStorageManager storageManager = new 
> ClientStorageManager();
> > -        long startingTime = System.currentTimeMillis();
> > -        long inactivityTimeOut =
> > PolicyLoader.getInstance().getInactivityTimeout();
> >
> > -        Iterator ite = callMap.keySet().iterator();
> > +        if (endSeqActiveBehavior !=
> > Constants.END_SEQUENCE_IGNORE_ACTIVE)
> > +        {
> > +            long startingTime = System.currentTimeMillis();
> > +            long inactivityTimeOut =
> > PolicyLoader.getInstance().getInactivityTimeout();
> >
> > -        while (ite.hasNext()) {
> > -            String key = (String) ite.next();
> > -            Call tempCall = (Call) callMap.get(key);
> > -            String seqId = (String)
> > tempCall.getProperty(Constants.ClientProperties.CALL_KEY);
> > -            while (!storageManager.isSequenceComplete(seqId)) {
> > -                try {
> > -                    if (log.isDebugEnabled()) {
> > -
> > log.debug(Constants.InfomationMessage.WAITING_TO_STOP_CLIENT);
> > +            Iterator ite = callMap.keySet().iterator();
> > +
> > +            while (ite.hasNext()) {
> > +                String key = (String) ite.next();
> > +                Call tempCall = (Call) callMap.get(key);
> > +                String seqId = (String)
> > tempCall.getProperty(Constants.ClientProperties.CALL_KEY);
> > +                while (!storageManager.isSequenceComplete(seqId)) {
> > +                    try {
> > +                        if (log.isDebugEnabled()) {
> > +
> > log.debug(Constants.InfomationMessage.WAITING_TO_STOP_CLIENT);
> > +                        }
> > +
> > Thread.sleep(Constants.CLIENT_WAIT_PERIOD_FOR_COMPLETE);
> > +                        if ((System.currentTimeMillis() -
> > startingTime)
> > >= inactivityTimeOut) {
> > +                            stopClientByForce();
> > +                            
> this.report.setError("Inactivity Time Out
> > Reached. Sequence not complete");
> > +                        }
> > +                    } catch (InterruptedException e) {
> > +                        log.error("",e);
> >                      }
> > -
> > Thread.sleep(Constants.CLIENT_WAIT_PERIOD_FOR_COMPLETE);
> > -                    if ((System.currentTimeMillis() -
> > startingTime) >=
> > inactivityTimeOut) {
> > -                        stopClientByForce();
> > -                        this.report.setError("Inactivity Time Out
> > Reached. Sequence not complete");
> > -                    }
> > -                } catch (InterruptedException e) {
> > -                    log.error("",e);
> >                  }
> >              }
> >          }
> > +        // else - ignore any sequence that are still active
> >
> >          if (this.report.getError() == null) {
> > -            this.report.setAllAcked(true);
> > +        this.report.setAllAcked(true);
> >          }
> >
> >          seqMap.remove(key);
> >
> > 
> ---------------------------------------------------------------------
> > To unsubscribe, e-mail: [EMAIL PROTECTED]
> > For additional commands, e-mail: [EMAIL PROTECTED]
> >
> >
> 
> 

Attachment: SandeshaContext.java.patch
Description: SandeshaContext.java.patch

Attachment: Constants.java.patch
Description: Constants.java.patch

---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to