[jira] [Issue Comment Deleted] (AMQ-4710) The first heart-beat after a connection becomes idle isn't sent as quickly as it should be

2013-09-09 Thread Paul Gale (JIRA)

 [ 
https://issues.apache.org/jira/browse/AMQ-4710?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
 ]

Paul Gale updated AMQ-4710:
---

Comment: was deleted

(was: Updated patch containing fix for Jira AMQ-4710. Improved the checking for 
when to recreate the write checker timer task. Previous patch attachment has 
been deleted.)

 The first heart-beat after a connection becomes idle isn't sent as quickly as 
 it should be
 --

 Key: AMQ-4710
 URL: https://issues.apache.org/jira/browse/AMQ-4710
 Project: ActiveMQ
  Issue Type: Bug
  Components: stomp
Affects Versions: 5.8.0
Reporter: Andy Wilkinson
 Attachments: amq-4710.diff


 After ActiveMQ sends a stomp frame, it may not send a heart-beat for up to 
 almost 2x the negotiated interval.
 The following test should illustrate the problem:
 {code}
 import org.junit.Test;
 import static org.junit.Assert.*;
 public class ActiveMqHeartbeatTests {
   @Test
   public void heartbeats() throws Exception {
   BrokerService broker = createAndStartBroker();
   Socket socket = null;
   try {
   socket = new Socket(localhost, 61613);
   byte[] connectFrame = 
 CONNECT\nheart-beat:0,1\naccept-version:1.2\n\n\0.getBytes();
   socket.getOutputStream().write(connectFrame);
   byte[] buffer = new byte[4096];
   long lastReadTime = System.currentTimeMillis();
   while (true) {
   int read = socket.getInputStream().read(buffer);
   byte[] frame = Arrays.copyOf(buffer, read);
   long now = System.currentTimeMillis();
   long timeSinceLastRead = now - lastReadTime;
   lastReadTime = now;
   System.out.println(new String(frame));
   System.out.println(Time since last read:  + 
 timeSinceLastRead + ms);
   if (timeSinceLastRead  15000) {
   fail(Data not received for  + 
 timeSinceLastRead + ms);
   }
   }
   } finally {
   if (socket != null) {
   socket.close();
   }
   broker.stop();
   }
   }
   private BrokerService createAndStartBroker() throws Exception {
   BrokerService broker = new BrokerService();
   broker.addConnector(stomp://localhost:61613);
   broker.setStartAsync(false);
   broker.setDeleteAllMessagesOnStartup(true);
   broker.start();
   return broker;
   }
 }
 {code}
 For the initial read of the CONNECTED frame I see:
 {noformat}
 Time since last read: 49ms
 {noformat}
 However, it's then almost 20 seconds before a heart-beat's sent:
 {noformat}
 Time since last read: 19994ms
 {noformat}
 If I comment out the fail(…) line in the test, after the first heartbeat 
 taking almost 2ms to be sent, things settle down and a heartbeat's 
 received every 1ms.
 It looks like the write checker wakes up every 1ms. The first time it 
 wakes up, it notices that the CONNECTED frame was sent and does nothing. It 
 then sleeps for a further 1ms before checking again. As the CONNECTED 
 frame was sent very early in the first 1ms window, this leads to it 
 taking almost 2ms for the first heart-beat to be sent. From this point, 
 as no further data frames are sent, the write checker wakes up and sends a 
 heart-beat every 1ms.
 In short, I don't think ActiveMQ is adhering to the requirement that the 
 sender MUST send new data over the network connection at least every n 
 milliseconds.

--
This message is automatically generated by JIRA.
If you think it was sent incorrectly, please contact your JIRA administrators
For more information on JIRA, see: http://www.atlassian.com/software/jira


Re: [jira] [Issue Comment Deleted] (AMQ-4710) The first heart-beat after a connection becomes idle isn't sent as quickly as it should be

2013-09-09 Thread Paul Gale
If any of the ActiveMQ committers could take a look at my patch for this
Jira issue I would really appreciate the feedback as I'd like to
incorporate it into 5.8.0.

Thanks,
Paul


On Mon, Sep 9, 2013 at 10:13 AM, Paul Gale (JIRA) j...@apache.org wrote:


  [
 https://issues.apache.org/jira/browse/AMQ-4710?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel]

 Paul Gale updated AMQ-4710:
 ---

 Comment: was deleted

 (was: Updated patch containing fix for Jira AMQ-4710. Improved the
 checking for when to recreate the write checker timer task. Previous patch
 attachment has been deleted.)

  The first heart-beat after a connection becomes idle isn't sent as
 quickly as it should be
 
 --
 
  Key: AMQ-4710
  URL: https://issues.apache.org/jira/browse/AMQ-4710
  Project: ActiveMQ
   Issue Type: Bug
   Components: stomp
 Affects Versions: 5.8.0
 Reporter: Andy Wilkinson
  Attachments: amq-4710.diff
 
 
  After ActiveMQ sends a stomp frame, it may not send a heart-beat for up
 to almost 2x the negotiated interval.
  The following test should illustrate the problem:
  {code}
  import org.junit.Test;
  import static org.junit.Assert.*;
  public class ActiveMqHeartbeatTests {
@Test
public void heartbeats() throws Exception {
BrokerService broker = createAndStartBroker();
Socket socket = null;
try {
socket = new Socket(localhost, 61613);
byte[] connectFrame =
 CONNECT\nheart-beat:0,1\naccept-version:1.2\n\n\0.getBytes();
socket.getOutputStream().write(connectFrame);
byte[] buffer = new byte[4096];
long lastReadTime = System.currentTimeMillis();
while (true) {
int read =
 socket.getInputStream().read(buffer);
byte[] frame = Arrays.copyOf(buffer, read);
long now = System.currentTimeMillis();
long timeSinceLastRead = now -
 lastReadTime;
lastReadTime = now;
System.out.println(new String(frame));
System.out.println(Time since last read:
  + timeSinceLastRead + ms);
if (timeSinceLastRead  15000) {
fail(Data not received for  +
 timeSinceLastRead + ms);
}
}
} finally {
if (socket != null) {
socket.close();
}
broker.stop();
}
}
private BrokerService createAndStartBroker() throws Exception {
BrokerService broker = new BrokerService();
broker.addConnector(stomp://localhost:61613);
broker.setStartAsync(false);
broker.setDeleteAllMessagesOnStartup(true);
broker.start();
return broker;
}
  }
  {code}
  For the initial read of the CONNECTED frame I see:
  {noformat}
  Time since last read: 49ms
  {noformat}
  However, it's then almost 20 seconds before a heart-beat's sent:
  {noformat}
  Time since last read: 19994ms
  {noformat}
  If I comment out the fail(…) line in the test, after the first heartbeat
 taking almost 2ms to be sent, things settle down and a heartbeat's
 received every 1ms.
  It looks like the write checker wakes up every 1ms. The first time
 it wakes up, it notices that the CONNECTED frame was sent and does nothing.
 It then sleeps for a further 1ms before checking again. As the
 CONNECTED frame was sent very early in the first 1ms window, this leads
 to it taking almost 2ms for the first heart-beat to be sent. From this
 point, as no further data frames are sent, the write checker wakes up and
 sends a heart-beat every 1ms.
  In short, I don't think ActiveMQ is adhering to the requirement that
 the sender MUST send new data over the network connection at least every
 n milliseconds.

 --
 This message is automatically generated by JIRA.
 If you think it was sent incorrectly, please contact your JIRA
 administrators
 For more information on JIRA, see: http://www.atlassian.com/software/jira



[jira] [Issue Comment Deleted] (AMQ-4710) The first heart-beat after a connection becomes idle isn't sent as quickly as it should be

2013-09-05 Thread Paul Gale (JIRA)

 [ 
https://issues.apache.org/jira/browse/AMQ-4710?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
 ]

Paul Gale updated AMQ-4710:
---

Comment: was deleted

(was: I have modified my last patch. The latest has been attached as 
amq_4710_2.patch)

 The first heart-beat after a connection becomes idle isn't sent as quickly as 
 it should be
 --

 Key: AMQ-4710
 URL: https://issues.apache.org/jira/browse/AMQ-4710
 Project: ActiveMQ
  Issue Type: Bug
  Components: stomp
Affects Versions: 5.8.0
Reporter: Andy Wilkinson
 Attachments: amq_4710_2.patch


 After ActiveMQ sends a stomp frame, it may not send a heart-beat for up to 
 almost 2x the negotiated interval.
 The following test should illustrate the problem:
 {code}
 import org.junit.Test;
 import static org.junit.Assert.*;
 public class ActiveMqHeartbeatTests {
   @Test
   public void heartbeats() throws Exception {
   BrokerService broker = createAndStartBroker();
   Socket socket = null;
   try {
   socket = new Socket(localhost, 61613);
   byte[] connectFrame = 
 CONNECT\nheart-beat:0,1\naccept-version:1.2\n\n\0.getBytes();
   socket.getOutputStream().write(connectFrame);
   byte[] buffer = new byte[4096];
   long lastReadTime = System.currentTimeMillis();
   while (true) {
   int read = socket.getInputStream().read(buffer);
   byte[] frame = Arrays.copyOf(buffer, read);
   long now = System.currentTimeMillis();
   long timeSinceLastRead = now - lastReadTime;
   lastReadTime = now;
   System.out.println(new String(frame));
   System.out.println(Time since last read:  + 
 timeSinceLastRead + ms);
   if (timeSinceLastRead  15000) {
   fail(Data not received for  + 
 timeSinceLastRead + ms);
   }
   }
   } finally {
   if (socket != null) {
   socket.close();
   }
   broker.stop();
   }
   }
   private BrokerService createAndStartBroker() throws Exception {
   BrokerService broker = new BrokerService();
   broker.addConnector(stomp://localhost:61613);
   broker.setStartAsync(false);
   broker.setDeleteAllMessagesOnStartup(true);
   broker.start();
   return broker;
   }
 }
 {code}
 For the initial read of the CONNECTED frame I see:
 {noformat}
 Time since last read: 49ms
 {noformat}
 However, it's then almost 20 seconds before a heart-beat's sent:
 {noformat}
 Time since last read: 19994ms
 {noformat}
 If I comment out the fail(…) line in the test, after the first heartbeat 
 taking almost 2ms to be sent, things settle down and a heartbeat's 
 received every 1ms.
 It looks like the write checker wakes up every 1ms. The first time it 
 wakes up, it notices that the CONNECTED frame was sent and does nothing. It 
 then sleeps for a further 1ms before checking again. As the CONNECTED 
 frame was sent very early in the first 1ms window, this leads to it 
 taking almost 2ms for the first heart-beat to be sent. From this point, 
 as no further data frames are sent, the write checker wakes up and sends a 
 heart-beat every 1ms.
 In short, I don't think ActiveMQ is adhering to the requirement that the 
 sender MUST send new data over the network connection at least every n 
 milliseconds.

--
This message is automatically generated by JIRA.
If you think it was sent incorrectly, please contact your JIRA administrators
For more information on JIRA, see: http://www.atlassian.com/software/jira