DUE TO SPAM, SIGN-UP IS DISABLED. Goto Selfserve wiki signup and request an account.
...
| Code Block |
|---|
BookKeeper bookeeper = ....;
CompletableFuture<WriteHandler> future = bookkeeper.createLedger()
.withEnsembleSize(3)
.withWriteQuorumSize(2)
.withAckQuorumSize(1)
.withDigestType(DigestType.CRC32)
.withCustomMetadata(metadata)
.withPassword(password)
.apply();
IWriterHandlerWriterHandler lh = future.get();
CompletableFuture<WriteHandlerAdv> future = bookkeeper.createLedger()
.withEnsembleSize(3)
.withWriteQuorumSize(2)
.withAckQuorumSize(1)
.withDigestType(DigestType.CRC32)
.withCustomMetadata(metadata)
.withPassword(password)
.withLedgerId(ledgerId)
.makeAdv()
.apply();
IWriterHandlerAdvWriterHandlerAdv lh = future.get();
|
In order to achieve this goal we are going to introduce a ICreateBuilder and ICreateAdvBuilder interfaces
| Code Block |
|---|
interface ICreateBuilderCreateBuilder { ICreateBuilderCreateBuilder withEnsembleSize(...); ICreateBuilderCreateBuilder withWriteQuorumSize(...); ... ICreateAdvBuilderCreateAdvBuilder makeAdv(); // old style callbacks void execute(CreateCallback callback, Object ctx); // support java8 completable future CompletableFuture<IWriteHandler>CompletableFuture<WriteHandler> apply(); // sync method IWriteHandlerWriteHandler create() throws BKException, InterruptedException; } interface ICreateAdvBuilderCreateAdvBuilder { // old style callbacks void execute(CreateCallback callback, Object ctx); // support java8 completable future CompletableFuture<IWriteHandlerAdv>CompletableFuture<WriteHandlerAdv> apply(); // sync method IWriteHandlerAdvWriteHandlerAdv create() throws BKException, InterruptedException; } |
...
We are going to introduce IWriteHandler WriteHandler and IWriteHandlerAdv WriteHandlerAdv interfaces which contains only the API related to writing to a Ledger, following the LedgerHandler/LedgerHandlerAdv semantics.
In a similar way we are going to introduce a IReadHandler a ReadHandler which contains only the API related to reading to a Ledger and a IOpenBuilderOpenBuilder.
Please note that IWriteHandler WriteHandler and IWriteHandlerAdv WriteHandlerAdv will extend IReadHandler ReadHandler as writer need to be able to read its own writes.
A common ILedgerHandler LedgerHandler interface will be a base interface for IReadHandler ReadHandler and it will contain basic operations like 'close'
| Code Block |
|---|
interface IOpenBuilderOpenBuilder { IOpenBuilderOpenBuilder withRecovery(boolean) IOpenBuilderOpenBuilder withPassword(password) IOpenBuilderOpenBuilder withDigestType(digestType) CompleableFuture<IReadHandler>CompleableFuture<ReadHandler> apply(long ledgerId) void open(long ledgerId, OpenCallback cb, Object ctx) IReadHandlerReadHandler open(long ledgerId) } interface LedgerHandler ILedgerHandlerextends AutoCloseable { void close(); void asyncClose(CloseCallback cb, Object ctx); } interface IReadHandlerReadHandler extends ILedgerHandler { void readEntries(); long readLastAddConfirmed(); ..... } interface IWriteHandler extends IReadHandler { void addEntry(byte[] data) void sync(...) } interface IWriteHandlerAdv extends IReadHandler { void addEntry(long entryID, byte[] data) void sync(...) } |
...
We can create similar API style for addEntry, readEntries and other operations which need an extensible API.
We would leverage CompletableFuture for operations like close, delete, addEntry, readEntries....
Rejected Alternatives
This is an example of an alternative API which has been rejected, as it will not be really extensible in the future.
...