So next step is to make a unit test and jira so that it can be investigated
Get Outlook for Android On Fri, Jul 5, 2019 at 1:37 PM +0100, "yw yw" <wy96...@gmail.com> wrote: No, the message is not lost after restart. 于2019年7月5日周五 下午7:54写道: > As asked previous, does the same occur if you have non destructive false, > the consumer receives the message but not acks it and restart is the > message lost there too? > > > > > Get Outlook for Android > > > > > > > > On Fri, Jul 5, 2019 at 9:02 AM +0100, "yw yw" wrote: > > > > > > > > > > > Sorry for the ambiguousness. I created a durable lvq where non destructive > is *true*, the consumer received the message and acked it. After broker > restarted, the message was lost. > > > > 于2019年7月5日周五 下午3:28写道: > > > Have you done the same test with lvq and non destructive false (default) > > where the consumer receives the message but doesnt ack it. Then restart > > broker. > > > > > > > > > > If the message is lost there it would suggest issue in lvq or > persistence. > > > > > > > > > > Remember you need to set the queue to durable if you want it to survive a > > restart. > > > > > > > > > > I did a quick test myself and from what i can tell if the queue is non > > durable i get the experiece you are describing which would be expected as > > queue is not durable. But if i set the queue durable i dont. > > > > > > > > > > So far from tests ive done things are behaving expected per settings. > > > > > > > > > > > > > > Get Outlook for Android > > > > > > > > > > > > > > > > On Fri, Jul 5, 2019 at 8:06 AM +0100, > > wrote: > > > > > > > > > > > > > > > > > > > > > > Note non destructive, is regardless of the queue being lvq or normal. > > > > > > > > > > Though primary case (but not only) for it is in conjunction with lvq. > > > > > > > > > > Get Outlook for Android > > > > > > > > > > > > > > > > On Fri, Jul 5, 2019 at 8:03 AM +0100, wrote: > > > > > > > > > > > > > > > > > > > > > > When non destructive is true the consumer ack ignored. > > > > > > > > > > When non destructive is false (default) the consumer ack is honoured. > > > > > > > > > > There is test cases for this and is used in real use cases. > > > > > > > > > > Get Outlook for Android > > > > > > > > > > > > > > > > On Fri, Jul 5, 2019 at 7:30 AM +0100, "yw yw" wrote: > > > > > > > > > > > > > > > > > > > > > > Hi, > > Just to clarify, are consumers meant to be able to remove the message > for > > lvq when non destructive is true? > > > > I took a test: for the lvq of which non destructive is true, the producer > > sent a message and consumer received it. After broker restarted, the > > message was removed. > > > > 于2019年7月5日周五 下午1:33写道: > > > > > For lvq when non destructive is false consumers are meant to be able to > > > remove the message by acking. > > > > > > > > > > > > > > > Use case there is coalesced price updates where you just care about > > > lastest value, but the updates are faster than a consumer may deal > with. > > > > > > > > > > > > > > > Behaviour is as expected. > > > > > > > > > > > > > > > Get Outlook for Android > > > > > > > > > > > > > > > > > > > > > > > > On Fri, Jul 5, 2019 at 2:53 AM +0100, "yw yw" wrote: > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > Yes, the last value always wins. > > > > > > The document says "Another common pattern is to have queue "browsers" > > which > > > send all messages to the browser, but do not prevent other consumers > from > > > receiving the messages, and do not remove them from the queue when the > > > browser is done with them. Such a browser is an instance of a > > > "non-destructive" consumer." The fact is we don't remove them in memory > > but > > > we append records in journal. When the consumer acks the message and > > > reference count of message is decremented to zero, the ack record and > > > delete message record are written into journal. If broker restarts, the > > > last value is lost. Not sure it's what we expect? > > > > > > > > > michael.andre.pearce 于2019年7月4日周四 > > > 下午11:30写道: > > > > > > > Non destructive is so a consumer doesnt ack the message. Essentially > > > > meaning the last value is always kept in the lvq.When a new messages > > > > replaces and old then it needs the old one is acked to it is removed, > > > this > > > > is the point.Sent from my Samsung Galaxy smartphone. > > > > -------- Original message --------From: yw yw Date: > > > > 04/07/2019 08:42 (GMT+00:00) To: users@activemq.apache.org > Subject: > > > Re: > > > > AMQ 224038 on Last Value Queue Hi,We have encountered the same > problems > > > > these days.Right now the JMSNonDestructiveTest passes successfully > bcs > > > > persistence isdisabled which means there are no journal operations. > If > > we > > > > enablepersistence, the test fails in > > testNonDestructiveLVQTombstone().The > > > > reproduce step is the same with what Matt said:1. First send a > > message.2. > > > > Then receive the message. The key point is here: We ack this message > > > > anddelete the message so the record is removed in "records" map.3. > Last > > > > send another message. The exception occurs > > > > > > > > > > below:[Thread-13(ActiveMQ-server-org.apache.activemq.artemis.core.server.impl.ActiveMQServerImpl$6@77a57272 > > > )]15:01:06,990 > > > > ERROR [org.apache.activemq.artemis.core.server] AMQ224038:Failed to > ack > > > old > > > > reference: java.lang.IllegalStateException: Cannot findadd info 446 > on > > > > compactor or current > > > > > > > > > > recordsatorg.apache.activemq.artemis.core.journal.impl.JournalImpl.checkKnownRecordID(JournalImpl.java:1081)[:]atorg.apache.activemq.artemis.core.journal.impl.JournalImpl.appendUpdateRecord(JournalImpl.java:888)[:]atorg.apache.activemq.artemis.core.journal.Journal.appendUpdateRecord(Journal.java:98)[:]atorg.apache.activemq.artemis.core.persistence.impl.journal.AbstractJournalStorageManager.storeAcknowledge(AbstractJournalStorageManager.java:425)[:]atorg.apache.activemq.artemis.core.server.impl.QueueImpl.acknowledge(QueueImpl.java:1539)[:]atorg.apache.activemq.artemis.core.server.impl.LastValueQueue.acknowledge(LastValueQueue.java:193)[:]atorg.apache.activemq.artemis.core.server.impl.MessageReferenceImpl.acknowledge(MessageReferenceImpl.java:235)[:]atorg.apache.activemq.artemis.core.server.impl.LastValueQueue.replaceLVQMessage(LastValueQueue.java:172)[:]atorg.apache.activemq.artemis.core.server.impl.LastValueQueue.addTail(LastValueQueue.java:107)[:]atorg.apache.activemq.artemis.core.server.impl.RoutingContextImpl.internalprocessReferences(RoutingContextImpl.java:164)[:]atorg.apache.activemq.artemis.core.server.impl.RoutingContextImpl.processReferences(RoutingContextImpl.java:159)[:]atorg.apache.activemq.artemis.core.postoffice.impl.PostOfficeImpl$2.done(PostOfficeImpl.java:1378)[:]atorg.apache.activemq.artemis.core.persistence.impl.journal.OperationContextImpl$1.run(OperationContextImpl.java:244)[:]atorg.apache.activemq.artemis.utils.actors.OrderedExecutor.doTask(OrderedExecutor.java:42)[:]atorg.apache.activemq.artemis.utils.actors.OrderedExecutor.doTask(OrderedExecutor.java:31)[:]atorg.apache.activemq.artemis.utils.actors.ProcessorBase.executePendingTasks(ProcessorBase.java:66)[:]atjava.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)[rt.jar:1.8.0_102]atjava.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)[rt.jar:1.8.0_102]atorg.apache.activemq.artemis.utils.ActiveMQThreadFactory$1.run(ActiveMQThreadFactory.java:118)[:]I'm > > > > confused with the current lastValueQueue design. Why do we > > acknowledgethe > > > > message(i mean in normal ack reason) if the queue is non > > destructive?What > > > > if we acknowledged messages and messages were deleted in the > > journal,then > > > > broker restarted? I assume these messages would be lost, seems > > againstthe > > > > non destructive principal? It seems like we don't need to > > > reallyacknowledge > > > > messages except for KILLED/EXPIRED/ REPLACED reasons for thenon > > > destructive > > > > queue?Justin Bertram 于2019年7月4日周四 上午11:27写道:> There > > > > are a couple of tests in the test suite which use both last-value > and> > > > > non-destructive queue attributes (e.g. in> > > > > > > > > > > org.apache.activemq.artemis.tests.integration.amqp.JMSNonDestructiveTest).> > > > > These work without issue. I also took the code you pasted and tried > to> > > > > reproduce the failure, but everything appears to be working as > > expected.> > > > > For what it's worth, I'm testing on the tip of the master branch > (i.e.> > > > > 2.10.0-SNAPSHOT).>> Would it be possible for you to provide more > > details > > > > about how to reproduce> this failure? Perhaps some simple > modifications > > > to > > > > the last-value-queue> example distributed with the broker would > > > suffice.>>> > > > > Justin>> On Wed, Jul 3, 2019 at 4:44 PM mschmeiser > > > > wrote:>> > Hello> >> > I am getting an error "AMQ224039: Failed to > ack > > > old > > > > reference:> > java.lang.IllegalStateException: Cannot find add info > > 5698 > > > on > > > > compactor> or> > current records" after every publish of a message > to a > > > > Last Value Queue> > except the first time.> >> > I am on ActiveMQ > > Artemis > > > > 2.8.1. I know there's a more recent version but> > checked the > release > > > > notes and none of the bug fixes looked like they'd be> > relevant to > > > this.> > > > > >> > I'm not working with a deployment-ready system yet, this is very > > > > early> > stage> > prototyping. I have a single broker with the basic > > > > configuration, I'm> > basically running things 'out of the box'. The > > java > > > > code that I'm using> > looks something like:> >> > ***> >> > > > > ActiveMQQueue > > > > destination = ActiveMQQueue.createQueue(subject +> > > > > > "?last-value-key=LVK&non-destructive=true");> >> > MessageProducer > > > producer > > > > = session.createProducer(destination);> >> > TextMessage message = > > > > session.createTextMessage("test object");> > > > > > message.setStringProperty("LVK", "foo");> >> > Thread.sleep(500);> > >> > > > > > session.createConsumer(destination, "LVK = > > 'foo'").setMessageListener(m> > > > > ->> > processMessage(m));> >> > Thread.sleep(500);> >> > message = > > > > session.createTextMessage("test object 2");> > > > > > message.setStringProperty("LVK", "foo");> >> > > producer.send(message);> > > > >> > > > > > Thread.sleep(500);> >> > session.createConsumer(destination, "LVK = > > > > 'foo'").setMessageListener(m> ->> > processMessage(m));> >> > ***> > >> > > > > The > > > > first time this code is run, I only get the error when the message > is> > > > > > > > sent the second time. After that, the error happens twice per run. If > > I> > > > > go> > into the broker console and purge the queue, then the first > > message > > > > send> > works fine, error is thrown every subsequent time.> >> > The > > > stack > > > > trace (I'm not able to copy/paste from my development> > > environment)> > > > > > > > looks like:> >> > > > JournalImpl.checkKnownRecordID(JournalImpl.java:1074)> > > > > > > > > JournalImpl.appendUpdateRecord(JournalImpl.java:881)> > > > > > Journal.appendUpdateRecord(Journal.java:98)> >> >> > > > > > > > > > > AbstractJournalStorageManager.storeAcknowledge(AbstractJournalStorageManager.java:425)> > > > > > QueueImpl.acknowledge(QueueImpl.java:1533)> > > > > > LastValueQueue.acknowledge(MessageReferenceImpl.java:235)> > > > > > MessageReferenceImpl.acknowledge(MessageReferenceImpl.java:235)> > > > > > LastValueQueue.replaceLVQMessage(LastValueQueue.java:172)> > > > > > LastValueQueue.addTail(LastValueQueue.java:107)> > ...> >> > Tracing > it > > > > back that far, it looks like the failed acknowledge shouldn't> > > cause > > > > major problems for the functionality of the system. The code is all> > > > > > > executing as you'd expect it to and the queue on the broker always > has> > > > > the> > expected message in it. The error is still a concern though > > simply > > > > as a> > matter of performance - scalability is a concern for me and > the > > > > overhead> of> > logging a bunch of errors would be a problem.> >> > > Let > > > me > > > > know if there's any other information I can provide that could> > help> > > > > > diagnose this issue.> >> > Thanks,> > Matt> >> >> >> > --> > Sent > > from:> > > > > > > > > http://activemq.2283324.n4.nabble.com/ActiveMQ-User-f2341805.html> > >> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > >