Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.

...

Code Block
 BookKeeper bookeeper = ....;
 CompletableFuture<WriteHandler> future = bookkeeper.createLedger()
    .withEnsembleSize(3)
    .withWriteQuorumSize(2)
    .withAckQuorumSize(1)
    .withDigestType(DigestType.CRC32)                                       
    .withCustomMetadata(metadata)
    .withPassword(password)
    .apply();
WriterHandlerWriteHandler lh = future.get();

 CompletableFuture<WriteHandlerAdv>CompletableFuture<WriteAdvHandler> future = bookkeeper.createLedger()
    .withEnsembleSize(3)
    .withWriteQuorumSize(2)
    .withAckQuorumSize(1)
    .withDigestType(DigestType.CRC32)                                       
    .withCustomMetadata(metadata)
    .withPassword(password)
    .withLedgerId(ledgerId)
    .makeAdv()
    .apply();
WriterHandlerAdvWriteAdvHandler lh = future.get();
 

In order to achieve this goal we are going to introduce CreateBuilder and CreateBuilderAdv interfaces

Code Block
interface CreateBuilder {
     CreateBuilder withEnsembleSize(...);
     CreateBuilder withWriteQuorumSize(...);
     ...
     CreateAdvBuilder makeAdv();

     // old style callbacks
     void execute(CreateCallback callback, Object ctx);
     // support java8 completable future
     CompletableFuture<WriteHandler> apply();
     // sync method
     WriteHandler create() throws BKException, InterruptedException;
 }
interface CreateBuilderAdvCreateAdvBuilder {
     // old style callbacks
     void execute(CreateCallback callback, Object ctx);
     // support java8 completable future
     CompletableFuture<WriteHandlerAdv>CompletableFuture<WriteAdvHandler> apply();
     // sync method
     WriteHandlerAdvWriteAdvHandler create() throws BKException, InterruptedException;

}
interface OpenBuilder {
     OpenBuilder withRecovery(boolean)
     OpenBuilder withPassword(password) 
     OpenBuilder withDigestType(digestType)
     CompleableFuture<ReadHandler> apply(long ledgerId)
     void open(long ledgerId, OpenCallback cb, Object ctx)
     ReadHandler open(long ledgerId)
}

And we will make CrateLedgerOp implement such interfaces.

We are going to introduce an BookKeeperClient a new BookKeeper interface

Code Block
interface BookKeeperClientBookKeeper extends AutoCloseable { 
      CreateBuilder createLedger();
      OpenBuilder   openLedger();
}

...

Please note that WriteHandler and WriteHandlerAdv WriteAdvHandler will extend ReadHandler as writer need to be able to read its own writes.

A common LedgerHandler Handler interface will be a base interface for ReadHandler and it will contain basic operations like 'close'

Code Block
 interface OpenBuilder {
     OpenBuilder withRecovery(boolean)
     OpenBuilder withPassword(password) 
     OpenBuilder withDigestType(digestType)
     CompleableFuture<ReadHandler> apply(long ledgerId)
     void open(long ledgerId, OpenCallback cb, Object ctx)
     ReadHandler open(long ledgerId)
}

interface LedgerHandler interface Handler extends AutoCloseable {
     void close();
     void asyncClose(CloseCallback cb, Object ctx);
}

interface ReadHandler extends ILedgerHandlerHandler {
     void readEntries();
     long readLastAddConfirmed();
     .....
     
}
interface IWriteHandlerWriteHandler extends IReadHandlerReadHandler {
     void addEntry(byte[] data)
     void sync(...)
}
interface IWriteHandlerAdvWriteAdvHandler extends IReadHandlerReadHandler {
     void addEntry(long entryID, byte[] data)
     void sync(...)
}

...

Legacy methods will be retained. No @Deprecated annotation will be added.

Further removal of existing APIs will be evaluated in the future, maybe while starting a new major release, like 5.0.0

...