Re: BookKeeper Doubts

2010-07-19 Thread André Oriani
I filled ZOOKEEPER-824 and ZOOKEEPER-825

tks,
André

On Mon, Jul 19, 2010 at 19:44, Benjamin Reed  wrote:

> you have concluded correctly.
>
> 1) bookkeeper was designed for a process to use as a write-ahead log, so as
> a simplifying assumption we assume a single writer to a log. we should be
> throwing an exception if you try to write to a handle that you obtained
> using openLedger. can you open a jira for that?
>
> 2) this is mostly true, there are some exceptions. the creater of a ledger
> can read entries even though the ledger is still being written to. we would
> like to add the ability for a reader to assert the last entry in a ledger
> and read up to that entry, but this is not yet in the code.
>
> 3) there is one other bug you are seeing, before a ledger can be read, it
> must be closed. as your code shows, a process can open a ledger for reading
> while it is still being written to, which causes an implicit close that is
> not detected by the writer.
>
> this is a nice test case :) thanx
> ben
>
>
> On 07/17/2010 05:02 PM, André Oriani wrote:
>
>> Hi,
>>
>>
>> I was not sure if I had understood the behavior of BookKeeper from
>> documentation. So I made  a little program, reproduced below, to see what
>> BookKeeper looks like in action. Assuming my code is correct ( you never
>> know  when your code has some nasty obvious bugs that only other person
>> than
>> you can see ) , I could draw the follow conclusions:
>>
>> 1) Only the creator can add entries to a ledger, even though you can  open
>> the ledger, get a handle and call addEntry on it. No exception is thrown
>>  i.
>> In other words, you cannot open a ledger for append.
>>
>> 2) Readers are able to see only the entries that were added to a ledger
>> until someone had opened it for reading. If you want to ensure  readers
>> will
>> see all the entries, you must add all entries before any reader attempts
>> to
>> read from the ledger.
>>
>> Could someone please tell me if those conclusions are correct or if I am
>> mistaken? In the later case, could that person also tell me what is wrong
>> ?
>>
>> Thanks a lot for the attention and the patience with this BookKeeper
>> newbie,
>> André
>>
>>
>>
>>
>> package br.unicamp.zooexp.booexp;
>>
>>
>> import java.io.IOException;
>>
>> import java.util.Enumeration;
>>
>>
>> import org.apache.bookkeeper.client.BKException;
>>
>> import org.apache.bookkeeper.client.BookKeeper;
>>
>> import org.apache.bookkeeper.client.LedgerEntry;
>>
>> import org.apache.bookkeeper.client.LedgerHandle;
>>
>> import org.apache.bookkeeper.client.BookKeeper.DigestType;
>>
>> import org.apache.zookeeper.KeeperException;
>>
>>
>> public class BookTest {
>>
>>
>> public static void main (String ... args) throws IOException,
>> InterruptedException, KeeperException, BKException{
>>
>> BookKeeper bk = new BookKeeper("127.0.0.1");
>>
>> LedgerHandle lh = bk.createLedger(DigestType.CRC32, "123"
>> .getBytes());
>>
>> long lh_id = lh.getId();
>>
>> lh.addEntry("Teste".getBytes());
>>
>> lh.addEntry("Test2".getBytes());
>>
>> System.out.printf("Got %d entries for lh\n"
>> ,lh.getLastAddConfirmed()+1);
>>
>>
>>
>>
>> lh.addEntry("Test3".getBytes());
>>
>> LedgerHandle lh1 = bk.openLedger(lh_id, DigestType.CRC32, "123"
>> .getBytes());
>>
>> System.out.printf("Got %d entries for lh1\n"
>> ,lh1.getLastAddConfirmed()+1);
>>
>> lh.addEntry("Test4".getBytes());
>>
>>
>> lh.addEntry("Test5".getBytes());
>>
>> lh.addEntry("Test6".getBytes());
>>
>> System.out.printf("Got %d entries for lh\n"
>> ,lh.getLastAddConfirmed()+1);
>>
>> Enumeration  seq = lh.readEntries(0,
>> lh.getLastAddConfirmed());
>>
>> while (seq.hasMoreElements()){
>>
>> System.out.println(new String(seq.nextElement().getEntry()));
>>
>> }
>>
>> lh.close();
>>
>>
>>
>> lh1.addEntry("Test7".getBytes());
>>
>> lh1.addEntry("Test8".getBytes());
>>
>>
>> System.out.printf("Got %d entries for lh1\n"
>> ,lh1.getLastAddConfirmed()+1);
>>
>>
>> seq = lh1.readEntries(0, lh1.getLastAddConfirmed());
>>
>> while (seq.hasMoreElements()){
>>
>> System.out.println(new String(seq.nextElement().getEntry()));
>>
>> }
>>
>>
>>
>> lh1.close();
>>
>>
>> LedgerHandle lh2 = bk.openLedger(lh_id, DigestType.CRC32, "123"
>> .getBytes());
>>
>> lh2.addEntry("Test9".getBytes());
>>
>>
>> System.out.printf("Got %d entries for lh2 \n"
>> ,lh2.getLastAddConfirmed()+1);
>>
>>
>> seq = lh2.readEntries(0, lh2.getLastAddConfirmed());
>>
>> while (seq.hasMoreElements()){
>>
>> System.out.println(new String(seq.nextElement().getEntry()));
>>
>> }
>>
>>
>> bk.halt();
>>
>>
>> }
>>
>> }
>>
>>
>> Output:
>>
>> Got 2 entries for lh
>>
>> Got 3 entries for lh1
>>
>> Got 6 entries for lh
>>
>> Teste
>>
>> Test2
>>
>> Test3
>

Re: BookKeeper Doubts

2010-07-19 Thread Benjamin Reed

you have concluded correctly.

1) bookkeeper was designed for a process to use as a write-ahead log, so 
as a simplifying assumption we assume a single writer to a log. we 
should be throwing an exception if you try to write to a handle that you 
obtained using openLedger. can you open a jira for that?


2) this is mostly true, there are some exceptions. the creater of a 
ledger can read entries even though the ledger is still being written 
to. we would like to add the ability for a reader to assert the last 
entry in a ledger and read up to that entry, but this is not yet in the 
code.


3) there is one other bug you are seeing, before a ledger can be read, 
it must be closed. as your code shows, a process can open a ledger for 
reading while it is still being written to, which causes an implicit 
close that is not detected by the writer.


this is a nice test case :) thanx
ben

On 07/17/2010 05:02 PM, André Oriani wrote:

Hi,


I was not sure if I had understood the behavior of BookKeeper from
documentation. So I made  a little program, reproduced below, to see what
BookKeeper looks like in action. Assuming my code is correct ( you never
know  when your code has some nasty obvious bugs that only other person than
you can see ) , I could draw the follow conclusions:

1) Only the creator can add entries to a ledger, even though you can  open
the ledger, get a handle and call addEntry on it. No exception is thrown  i.
In other words, you cannot open a ledger for append.

2) Readers are able to see only the entries that were added to a ledger
until someone had opened it for reading. If you want to ensure  readers will
see all the entries, you must add all entries before any reader attempts to
read from the ledger.

Could someone please tell me if those conclusions are correct or if I am
mistaken? In the later case, could that person also tell me what is wrong ?

Thanks a lot for the attention and the patience with this BookKeeper newbie,
André




package br.unicamp.zooexp.booexp;


import java.io.IOException;

import java.util.Enumeration;


import org.apache.bookkeeper.client.BKException;

import org.apache.bookkeeper.client.BookKeeper;

import org.apache.bookkeeper.client.LedgerEntry;

import org.apache.bookkeeper.client.LedgerHandle;

import org.apache.bookkeeper.client.BookKeeper.DigestType;

import org.apache.zookeeper.KeeperException;


public class BookTest {


 public static void main (String ... args) throws IOException,
InterruptedException, KeeperException, BKException{

 BookKeeper bk = new BookKeeper("127.0.0.1");

 LedgerHandle lh = bk.createLedger(DigestType.CRC32, "123"
.getBytes());

 long lh_id = lh.getId();

 lh.addEntry("Teste".getBytes());

 lh.addEntry("Test2".getBytes());

 System.out.printf("Got %d entries for lh\n"
,lh.getLastAddConfirmed()+1);




 lh.addEntry("Test3".getBytes());

 LedgerHandle lh1 = bk.openLedger(lh_id, DigestType.CRC32, "123"
.getBytes());

 System.out.printf("Got %d entries for lh1\n"
,lh1.getLastAddConfirmed()+1);

 lh.addEntry("Test4".getBytes());


 lh.addEntry("Test5".getBytes());

 lh.addEntry("Test6".getBytes());

 System.out.printf("Got %d entries for lh\n"
,lh.getLastAddConfirmed()+1);

 Enumeration  seq = lh.readEntries(0,
lh.getLastAddConfirmed());

 while (seq.hasMoreElements()){

 System.out.println(new String(seq.nextElement().getEntry()));

 }

 lh.close();



 lh1.addEntry("Test7".getBytes());

 lh1.addEntry("Test8".getBytes());


 System.out.printf("Got %d entries for lh1\n"
,lh1.getLastAddConfirmed()+1);


 seq = lh1.readEntries(0, lh1.getLastAddConfirmed());

 while (seq.hasMoreElements()){

 System.out.println(new String(seq.nextElement().getEntry()));

 }



 lh1.close();


 LedgerHandle lh2 = bk.openLedger(lh_id, DigestType.CRC32, "123"
.getBytes());

 lh2.addEntry("Test9".getBytes());


 System.out.printf("Got %d entries for lh2 \n"
,lh2.getLastAddConfirmed()+1);


 seq = lh2.readEntries(0, lh2.getLastAddConfirmed());

 while (seq.hasMoreElements()){

 System.out.println(new String(seq.nextElement().getEntry()));

 }


 bk.halt();


 }

}


Output:

Got 2 entries for lh

Got 3 entries for lh1

Got 6 entries for lh

Teste

Test2

Test3

Test4

Test5

Test6

Got 3 entries for lh1

Teste

Test2

Test3

Got 3 entries for lh2

Teste

Test2

Test3
   




BookKeeper Doubts

2010-07-17 Thread André Oriani
Hi,


I was not sure if I had understood the behavior of BookKeeper from
documentation. So I made  a little program, reproduced below, to see what
BookKeeper looks like in action. Assuming my code is correct ( you never
know  when your code has some nasty obvious bugs that only other person than
you can see ) , I could draw the follow conclusions:

1) Only the creator can add entries to a ledger, even though you can  open
the ledger, get a handle and call addEntry on it. No exception is thrown  i.
In other words, you cannot open a ledger for append.

2) Readers are able to see only the entries that were added to a ledger
until someone had opened it for reading. If you want to ensure  readers will
see all the entries, you must add all entries before any reader attempts to
read from the ledger.

Could someone please tell me if those conclusions are correct or if I am
mistaken? In the later case, could that person also tell me what is wrong ?

Thanks a lot for the attention and the patience with this BookKeeper newbie,
André




package br.unicamp.zooexp.booexp;


import java.io.IOException;

import java.util.Enumeration;


import org.apache.bookkeeper.client.BKException;

import org.apache.bookkeeper.client.BookKeeper;

import org.apache.bookkeeper.client.LedgerEntry;

import org.apache.bookkeeper.client.LedgerHandle;

import org.apache.bookkeeper.client.BookKeeper.DigestType;

import org.apache.zookeeper.KeeperException;


public class BookTest {


public static void main (String ... args) throws IOException,
InterruptedException, KeeperException, BKException{

BookKeeper bk = new BookKeeper("127.0.0.1");

LedgerHandle lh = bk.createLedger(DigestType.CRC32, "123"
.getBytes());

long lh_id = lh.getId();

lh.addEntry("Teste".getBytes());

lh.addEntry("Test2".getBytes());

System.out.printf("Got %d entries for lh\n"
,lh.getLastAddConfirmed()+1);




lh.addEntry("Test3".getBytes());

LedgerHandle lh1 = bk.openLedger(lh_id, DigestType.CRC32, "123"
.getBytes());

System.out.printf("Got %d entries for lh1\n"
,lh1.getLastAddConfirmed()+1);

lh.addEntry("Test4".getBytes());


lh.addEntry("Test5".getBytes());

lh.addEntry("Test6".getBytes());

System.out.printf("Got %d entries for lh\n"
,lh.getLastAddConfirmed()+1);

Enumeration seq = lh.readEntries(0,
lh.getLastAddConfirmed());

while (seq.hasMoreElements()){

System.out.println(new String(seq.nextElement().getEntry()));

}

lh.close();



lh1.addEntry("Test7".getBytes());

lh1.addEntry("Test8".getBytes());


System.out.printf("Got %d entries for lh1\n"
,lh1.getLastAddConfirmed()+1);


seq = lh1.readEntries(0, lh1.getLastAddConfirmed());

while (seq.hasMoreElements()){

System.out.println(new String(seq.nextElement().getEntry()));

}



lh1.close();


LedgerHandle lh2 = bk.openLedger(lh_id, DigestType.CRC32, "123"
.getBytes());

lh2.addEntry("Test9".getBytes());


System.out.printf("Got %d entries for lh2 \n"
,lh2.getLastAddConfirmed()+1);


seq = lh2.readEntries(0, lh2.getLastAddConfirmed());

while (seq.hasMoreElements()){

System.out.println(new String(seq.nextElement().getEntry()));

}


bk.halt();


}

}


Output:

Got 2 entries for lh

Got 3 entries for lh1

Got 6 entries for lh

Teste

Test2

Test3

Test4

Test5

Test6

Got 3 entries for lh1

Teste

Test2

Test3

Got 3 entries for lh2

Teste

Test2

Test3