ivankelly commented on a change in pull request #1225: Issue #570: getting rid of unnecessary synchronization in InterleavedLedgerStorage URL: https://github.com/apache/bookkeeper/pull/1225#discussion_r172311201
########## File path: bookkeeper-server/src/test/java/org/apache/bookkeeper/bookie/EntryLogTest.java ########## @@ -391,4 +400,137 @@ public void testGetEntryLogsSet() throws Exception { assertEquals(Sets.newHashSet(0L, 1L, 2L, 3L), logger.getEntryLogsSet()); } + + static class LedgerStorageWriteTask implements Callable<Boolean> { + long ledgerId; + int entryId; + LedgerStorage ledgerStorage; + + LedgerStorageWriteTask(long ledgerId, int entryId, LedgerStorage ledgerStorage) { + this.ledgerId = ledgerId; + this.entryId = entryId; + this.ledgerStorage = ledgerStorage; + } + + @Override + public Boolean call() { + try { + ledgerStorage.addEntry(generateEntry(ledgerId, entryId)); + } catch (IOException e) { + LOG.error("Got Exception for AddEntry call. LedgerId: " + ledgerId + " entryId: " + entryId, e); + return false; + } + return true; + } + } + + static class LedgerStorageReadTask implements Callable<Boolean> { + long ledgerId; + int entryId; + LedgerStorage ledgerStorage; + + LedgerStorageReadTask(long ledgerId, int entryId, LedgerStorage ledgerStorage) { + this.ledgerId = ledgerId; + this.entryId = entryId; + this.ledgerStorage = ledgerStorage; + } + + @Override + public Boolean call() { + try { + String expectedValue = generateDataString(ledgerId, entryId); + ByteBuf byteBuf = ledgerStorage.getEntry(ledgerId, entryId); + long actualLedgerId = byteBuf.readLong(); + long actualEntryId = byteBuf.readLong(); + byte[] data = new byte[byteBuf.readableBytes()]; + byteBuf.readBytes(data); + if (ledgerId != actualLedgerId) { + LOG.error("For ledgerId: {} entryId: {} readRequest, actual ledgerId: {}", ledgerId, entryId, + actualLedgerId); + return false; + } + if (entryId != actualEntryId) { + LOG.error("For ledgerId: {} entryId: {} readRequest, actual entryId: {}", ledgerId, entryId, + actualEntryId); + return false; + } + if (!expectedValue.equals(new String(data))) { + LOG.error("For ledgerId: {} entryId: {} readRequest, actual Data: {}", ledgerId, entryId, + new String(data)); + return false; + } + } catch (IOException e) { + LOG.error("Got Exception for GetEntry call. LedgerId: " + ledgerId + " entryId: " + entryId, e); + return false; + } + return true; + } + } + + /** + * test concurrent write operations and then concurrent read + * operations using InterleavedLedgerStorage. + */ + @Test + public void testConcurrentWriteAndReadCallsOfInterleavedLedgerStorage() throws Exception { Review comment: > whether constructing a full bookie or constructing a ledger storage is just a tool to setup a test case for testing EntryLog. If it's only testing EntryLogger, then only entrylogger should be constructed. But the change has changed flushing also, and removed locking that was previous around access to the index, so the how ledger storage should be tested. > the whole test suite is using Bookie already. for consistency, it is okay to use Bookie here. I don't see a strong reason to block this change just because of that. The rest of the suite is testing badly. We shouldn't propagate bad practices. I don't consider consistency a good argument against this. ---------------------------------------------------------------- This is an automated message from the Apache Git Service. To respond to the message, please log on GitHub and use the URL above to go to the specific comment. For queries about this service, please contact Infrastructure at: us...@infra.apache.org With regards, Apache Git Services