HashZhang opened a new issue #2747:
URL: https://github.com/apache/bookkeeper/issues/2747


   There is a little inconsistency in the last confirmed fetch while ledger is 
open. for example:
   I have 4 bookies run in local, their configurations are:
   **bk_server_1.conf**
   ```
   bookiePort=3181
   advertisedAddress=127.0.0.1
   allowLoopback=true
   httpServerEnabled=false
   httpServerPort=8080
   httpServerClass=org.apache.bookkeeper.http.vertx.VertxHttpServer
   journalDirectories=d:\\github\\apache-bookkeeper\\data\\bk-server-1
   ledgerDirectories=d:\\github\\apache-bookkeeper\\data\\bk-server-data-1
   metadataServiceUri=zk+hierarchical://localhost:2181/ledgers
   zkEnableSecurity=false
   storageserver.grpc.port=4181
   dlog.bkcEnsembleSize=3
   dlog.bkcWriteQuorumSize=2
   dlog.bkcAckQuorumSize=2
   storage.range.store.dirs=d:\\github\\apache-bookkeeper\\data\\bk-ranges-1
   storage.serve.readonly.tables=false
   storage.cluster.controller.schedule.interval.ms=30000
   ```
   **bk_server_2.conf**
   ```
   bookiePort=3182
   advertisedAddress=127.0.0.1
   allowLoopback=true
   httpServerEnabled=false
   httpServerPort=8081
   httpServerClass=org.apache.bookkeeper.http.vertx.VertxHttpServer
   journalDirectories=d:\\github\\apache-bookkeeper\\data\\bk-server-2
   ledgerDirectories=d:\\github\\apache-bookkeeper\\data\\bk-server-data-2
   metadataServiceUri=zk+hierarchical://localhost:2181/ledgers
   zkEnableSecurity=false
   storageserver.grpc.port=4182
   dlog.bkcEnsembleSize=3
   dlog.bkcWriteQuorumSize=2
   dlog.bkcAckQuorumSize=2
   storage.range.store.dirs=d:\\github\\apache-bookkeeper\\data\\bk-ranges-2
   storage.serve.readonly.tables=false
   storage.cluster.controller.schedule.interval.ms=30000
   ```
   **bk_server_3.conf**
   ```
   bookiePort=3183
   advertisedAddress=127.0.0.1
   allowLoopback=true
   httpServerEnabled=false
   httpServerPort=8082
   httpServerClass=org.apache.bookkeeper.http.vertx.VertxHttpServer
   journalDirectories=d:\\github\\apache-bookkeeper\\data\\bk-server-3
   ledgerDirectories=d:\\github\\apache-bookkeeper\\data\\bk-server-data-3
   metadataServiceUri=zk+hierarchical://localhost:2181/ledgers
   zkEnableSecurity=false
   storageserver.grpc.port=4183
   dlog.bkcEnsembleSize=3
   dlog.bkcWriteQuorumSize=2
   dlog.bkcAckQuorumSize=2
   storage.range.store.dirs=d:\\github\\apache-bookkeeper\\data\\bk-ranges-3
   storage.serve.readonly.tables=false
   storage.cluster.controller.schedule.interval.ms=30000
   ```
   **bk_server_4.conf**
   ```
   bookiePort=3184
   advertisedAddress=127.0.0.1
   allowLoopback=true
   httpServerEnabled=false
   httpServerPort=8083
   httpServerClass=org.apache.bookkeeper.http.vertx.VertxHttpServer
   journalDirectories=d:\\github\\apache-bookkeeper\\data\\bk-server-4
   ledgerDirectories=d:\\github\\apache-bookkeeper\\data\\bk-server-data-4
   metadataServiceUri=zk+hierarchical://localhost:2181/ledgers
   zkEnableSecurity=false
   storageserver.grpc.port=4184
   dlog.bkcEnsembleSize=3
   dlog.bkcWriteQuorumSize=2
   dlog.bkcAckQuorumSize=2
   storage.range.store.dirs=d:\\github\\apache-bookkeeper\\data\\bk-ranges-4
   storage.serve.readonly.tables=false
   storage.cluster.controller.schedule.interval.ms=30000
   ```
   
   **enable these bookies and I have application shown below**:
   ```
   BookKeeper bookKeeper = new BookKeeper("localhost:2181");
           WriteHandle writeHandle = bookKeeper.newCreateLedgerOp()
                   .withEnsembleSize(3)
                   .withWriteQuorumSize(2)
                   .withAckQuorumSize(2)
                   .withDigestType(DigestType.CRC32C)
                   .withPassword("test".getBytes(StandardCharsets.UTF_8))
                   .execute().get();
           long ledgerId = writeHandle.getId();
           long entryId = 
writeHandle.append("message1".getBytes(StandardCharsets.UTF_8));
           System.out.println(entryId + " appended");
           entryId = 
writeHandle.append(ByteBuffer.wrap("message2".getBytes(StandardCharsets.UTF_8)));
           System.out.println(entryId + " appended");
           entryId = 
writeHandle.append(Unpooled.wrappedBuffer("message3".getBytes(StandardCharsets.UTF_8)));
           System.out.println(entryId + " appended");
           ByteBuf byteBuf = PooledByteBufAllocator.DEFAULT.directBuffer();
           byteBuf.writeBytes("message4".getBytes(StandardCharsets.UTF_8));
           System.out.println("sleep start!");
           //during sleep time, shut down one of the ensemble
           TimeUnit.SECONDS.sleep(10);
           entryId = writeHandle.append(byteBuf);
   //        writeHandle.close();
   
           ReadHandle readHandle = bookKeeper.newOpenLedgerOp()
                   .withLedgerId(ledgerId)
                   .withDigestType(DigestType.CRC32C)
                   .withPassword("test".getBytes(StandardCharsets.UTF_8))
                   .execute().get();
           LedgerEntries read = readHandle.read(0, 3);
           read.forEach(ledgerEntry -> {
               byte[] entryBytes = ledgerEntry.getEntryBytes();
               System.out.println(new String(entryBytes, 
StandardCharsets.UTF_8));
           });
   ```
   
   During sleep time, shut down one of the ensemble. Then during read operation 
I would got Exception says:
   ```
   2021-06-29 09:29:09,224 - ERROR - [main:LedgerHandle@754] - ReadAsync 
exception on ledgerId:19 firstEntry:0 lastEntry:3 lastAddConfirmed:2
   Exception in thread "main" 
org.apache.bookkeeper.client.BKException$BKReadException: Error while reading 
ledger
        at 
org.apache.bookkeeper.client.LedgerHandle.readAsync(LedgerHandle.java:756)
        at org.apache.bookkeeper.client.api.ReadHandle.read(ReadHandle.java:58)
        at org.apache.bookkeeper.TestClient.main(TestClient.java:74)
   ```
   
   that is because the ledger is not closed and client would fetch last 
confirmed from one of the ensemble bookies, but the write quorum is 2. if the 
fetch request is sent to the bookie where message4 is not placed on, message4 
cannot be read although is it confirmed. Therefore I think the Lac fetch 
request should be sent to all bookies.


-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: [email protected]

For queries about this service, please contact Infrastructure at:
[email protected]


Reply via email to