You are viewing a plain text version of this content. The canonical link for it is here.
Posted to user@bookkeeper.apache.org by Stone <st...@gmail.com> on 2012/06/11 08:19:21 UTC

ManagedCursor gives wrong number of entries (sometimes) when reestablish connection after shutdown

Hi Guys,

I am experimenting the managed-ledger implementation (
https://github.com/merlimat/managed-ledger ). It works good in one session,
but if I add some entries to managed ledger and shutdown the first session
and then start a new session. Managed cursor no longer give right number of
entries. Here's what I did with managed-legers (I paly with managed-ledger
with scala repl )

Start a new scala repl and input the following code:

import org.apache.bookkeeper.mledger._
import org.apache.bookkeeper.mledger.impl._


val factory = new ManagedLedgerFactoryImpl("127.0.0.1:2181")
val ledger = factory.open("my_test_ledger")

val cursor = ledger.openCursor("c1");
ledger.addEntry("dummy-entry-1".getBytes()) // add one entry to managed ledger

scala> cursor.getNumberOfEntries // # of entries are correct in the same session
res1: Long = 1

scala> cursor.hasMoreEntries  //# there's one entry added but not
consumed yet, so hasMoreEntires is true.
res2: Boolean = true



Then I quit the scala repl and start a new one with the following code ( I
expect for the same cursor "c1" the number of entries should be 1 and
hasMoreEntries should be true but it's not)

import org.apache.bookkeeper.mledger._
import org.apache.bookkeeper.mledger.impl._


val factory = new ManagedLedgerFactoryImpl("127.0.0.1:2181")
val ledger = factory.open("my_test_ledger")

val cursor = ledger.openCursor("c1");

scala> cursor.getNumberOfEntries
res0: Long = 1                // this number is correct and wrong
sometimes. I noticed it return 11 once but I only added 1 entry in the last
session.

scala> cursor.hasMoreEntries // this is inconsistent with
cursor.getNumberOfEntries,
there's 1 entry not consumed so cursor.hasMoreEntries should return true
not false.
res1: Boolean = false



Any suggestions ?

Best Regards,
Stone

Re: ManagedCursor gives wrong number of entries (sometimes) when reestablish connection after shutdown

Posted by Stone <st...@gmail.com>.
Thanks for the quick fix Matteo. I will give it a try.


Best Regards,
Stone



On Tue, Jun 12, 2012 at 6:48 AM, Matteo Merli <mm...@yahoo-inc.com> wrote:

> Hi Stone,
>
> you are right, there's a problem in the ManagedCursor.hasMoreEntries()
> when the cursor hasn't been "initialized" (ie: read from) and it's opened
> in a new session.
> I fixed that and added a new test case in
> http://github.com/merlimat/managed-ledger/commit/60fa8a93f09715cb64a9d02f4e4430122e50d48a
>
> On the other hand I cannot reproduce the problem with
> cursor.getNumberOfEntries(), I consistently get the right value.
>
> Thank you for catching and pointing out this bug.
>
> Matteo
>
> On Jun 10, 2012, at 11:19 PM, Stone wrote:
>
> Hi Guys,
>
> I am experimenting the managed-ledger implementation (
> https://github.com/merlimat/managed-ledger ). It works good in one
> session, but if I add some entries to managed ledger and shutdown the first
> session and then start a new session. Managed cursor no longer give right
> number of entries. Here's what I did with managed-legers (I paly with
> managed-ledger with scala repl )
>
> Start a new scala repl and input the following code:
>
> import org.apache.bookkeeper.mledger._
> import org.apache.bookkeeper.mledger.impl._
>
>
> val factory = new ManagedLedgerFactoryImpl("127.0.0.1:2181")
> val ledger = factory.open("my_test_ledger")
>
> val cursor = ledger.openCursor("c1");
> ledger.addEntry("dummy-entry-1".getBytes()) // add one entry to managed ledger
>
> scala> cursor.getNumberOfEntries // # of entries are correct in the same session
> res1: Long = 1
>
> scala> cursor.hasMoreEntries  //# there's one entry added but not consumed yet, so hasMoreEntires is true.
>
> res2: Boolean = true
>
>
>
> Then I quit the scala repl and start a new one with the following code ( I
> expect for the same cursor "c1" the number of entries should be 1 and
> hasMoreEntries should be true but it's not)
>
> import org.apache.bookkeeper.mledger._
> import org.apache.bookkeeper.mledger.impl._
>
>
> val factory = new ManagedLedgerFactoryImpl("127.0.0.1:2181")
> val ledger = factory.open("my_test_ledger")
>
> val cursor = ledger.openCursor("c1");
>
> scala> cursor.getNumberOfEntries
> res0: Long = 1                // this number is correct and wrong
> sometimes. I noticed it return 11 once but I only added 1 entry in the last
> session.
>
> scala> cursor.hasMoreEntries // this is inconsistent with cursor.getNumberOfEntries,
> there's 1 entry not consumed so cursor.hasMoreEntries should return true
> not false.
> res1: Boolean = false
>
>
>
> Any suggestions ?
>
> Best Regards,
> Stone
>
>
> *matteo*
> *merli*
>
> technical yahoo!
>
> mmerli@yahoo-inc.com
> direct 408-336-6035
>
> 701 first avenue, sunnyvale, ca, 94089-0703, us
> phone (408) 349 3300    fax (408) 349 3301
>
>
>

Re: ManagedCursor gives wrong number of entries (sometimes) when reestablish connection after shutdown

Posted by Matteo Merli <mm...@yahoo-inc.com>.
Hi Stone,

you are right, there's a problem in the ManagedCursor.hasMoreEntries() when the cursor hasn't been "initialized" (ie: read from) and it's opened in a new session.
I fixed that and added a new test case in http://github.com/merlimat/managed-ledger/commit/60fa8a93f09715cb64a9d02f4e4430122e50d48a

On the other hand I cannot reproduce the problem with cursor.getNumberOfEntries(), I consistently get the right value.

Thank you for catching and pointing out this bug.

Matteo

On Jun 10, 2012, at 11:19 PM, Stone wrote:

Hi Guys,

I am experimenting the managed-ledger implementation ( https://github.com/merlimat/managed-ledger ). It works good in one session, but if I add some entries to managed ledger and shutdown the first session and then start a new session. Managed cursor no longer give right number of entries. Here's what I did with managed-legers (I paly with managed-ledger with scala repl )

Start a new scala repl and input the following code:


import org.apache.bookkeeper.mledger._


import org.apache.bookkeeper.mledger.impl._





val factory = new ManagedLedgerFactoryImpl("127.0.0.1:2181<http://127.0.0.1:2181/>")


val ledger = factory.open("my_test_ledger")




val cursor = ledger.openCursor("c1");


ledger.addEntry("dummy-entry-1".getBytes()) // add one entry to managed ledger


scala> cursor.getNumberOfEntries // # of entries are correct in the same session
res1: Long = 1

scala> cursor.hasMoreEntries  //# there's one entry added but not consumed yet, so hasMoreEntires is true.

res2: Boolean = true


Then I quit the scala repl and start a new one with the following code ( I expect for the same cursor "c1" the number of entries should be 1 and hasMoreEntries should be true but it's not)

import org.apache.bookkeeper.mledger._
import org.apache.bookkeeper.mledger.impl._


val factory = new ManagedLedgerFactoryImpl("127.0.0.1:2181<http://127.0.0.1:2181/>")
val ledger = factory.open("my_test_ledger")

val cursor = ledger.openCursor("c1");

scala> cursor.getNumberOfEntries
res0: Long = 1                // this number is correct and wrong sometimes. I noticed it return 11 once but I only added 1 entry in the last session.

scala> cursor.hasMoreEntries // this is inconsistent with cursor.getNumberOfEntries, there's 1 entry not consumed so cursor.hasMoreEntries should return true not false.
res1: Boolean = false



Any suggestions ?

Best Regards,
Stone


matteo
merli

technical yahoo!

mmerli@yahoo-inc.com<ma...@yahoo-inc.com>
direct 408-336-6035

701 first avenue, sunnyvale, ca, 94089-0703, us
phone (408) 349 3300    fax (408) 349 3301

[cid:DF0C4C0F-53B5-433E-BD38-901D3506823B]