logBlock = new LogBucket(bucketId, logRecords); consumedMemoryStorage.put(logBlock.getBucketId(), logBlockSize); Log.i(TAG, "Created log block: id [" + logBlock.getBucketId() + "], size: " + logBlockSize + ". Log block record count: " + logBlock.getRecords().size() + ", total record count: " + totalRecordCount + ", unmarked record count: " + unmarkedRecordCount); } else {
if (bucket == null || bucket.getRecords().isEmpty()) { LOG.trace("No logs to send"); return; List<LogRecord> recordList = bucket.getRecords(); request.setRequestId(bucket.getBucketId()); request.setLogEntries(logs); final int bucketId = bucket.getBucketId(); Future<?> timeoutFuture = executorContext.getScheduledExecutor().schedule(new Runnable() { @Override LOG.info("Adding following bucket id [{}] for timeout tracking", bucket.getBucketId()); timeouts.put(bucket.getBucketId(), timeoutFuture);
private int addIfNotEmpty(int count, LogBucket logBlock) { if (logBlock != null && logBlock.getRecords().size() > 0) { count += logBlock.getRecords().size(); } return count; }
@Override public LogBucket getNextBucket() { LOG.trace("Getting new record block with block"); LogBucket result = null; MemBucket bucketCandidate = null; synchronized (buckets) { for (MemBucket bucket : buckets.values()) { if (bucket.getState() == MemBucketState.FREE) { bucketCandidate = bucket; } if (bucket.getState() == MemBucketState.FULL) { bucket.setState(MemBucketState.PENDING); bucketCandidate = bucket; break; } } if (bucketCandidate != null) { consumedVolume -= bucketCandidate.getSize(); recordCount -= bucketCandidate.getCount(); if (bucketCandidate.getState() == MemBucketState.FREE) { LOG.trace("Only a bucket with state FREE found: [{}]. Changing its state to PENDING", bucketCandidate.getId()); bucketCandidate.setState(MemBucketState.PENDING); } result = new LogBucket(bucketCandidate.getId(), bucketCandidate.getRecords()); LOG.debug("Return record block with records count: [{}]", bucketCandidate.getCount()); } } return result; }
@Test public void testUniqueIdGeneration() { long bucketSize = 3; int recordCount = 3; LogStorage storage = (LogStorage) getStorage(bucketSize, recordCount); LogRecord record = new LogRecord(); int insertionCount = 3; /* * Size of each record is 3B */ int iter = insertionCount; while (iter-- > 0) { storage.addLogRecord(record); } LogBucket group1 = storage.getNextBucket(); LogBucket group2 = storage.getNextBucket(); Assert.assertNotEquals(group1.getBucketId(), group2.getBucketId()); storage.close(); }
insertionCount -= removingBlock1.getRecords().size(); insertionCount -= removingBlock2.getRecords().size(); insertionCount -= removingBlock3.getRecords().size(); storage.removeBucket(removingBlock2.getBucketId()); storage.rollbackBucket(removingBlock1.getBucketId()); insertionCount += removingBlock1.getRecords().size(); int leftSize = leftBlock1.getRecords().size(); if (leftBlock2 != null) { leftSize += leftBlock2.getRecords().size();
private void testAddHelper(int addedN, int bucketSize, int recordCount, int expectedN) { LogStorage storage = (LogStorage) getStorage(bucketSize, recordCount); List<LogRecord> expectedList = new LinkedList<>(); LogRecord record = new LogRecord(); while (addedN-- > 0) { storage.addLogRecord(record); } while (expectedN-- > 0) { expectedList.add(record); } LogBucket group = storage.getNextBucket(); List<LogRecord> actualList = group.getRecords(); Assert.assertTrue("Expected: " + expectedList.size() + ", actual: " + actualList.size() , expectedList.size() == actualList.size()); Iterator<LogRecord> expectedIt = expectedList.iterator(); Iterator<LogRecord> actualIt = actualList.iterator(); while (expectedIt.hasNext()) { LogRecord expected = expectedIt.next(); LogRecord actual = actualIt.next(); Assert.assertTrue(expected.getSize() == actual.getSize()); Assert.assertArrayEquals(expected.getData(), actual.getData()); } storage.close(); }
LogBucket logBlock = new LogBucket(defaultId, logRecords); Mockito.when(storage.getNextBucket()).thenReturn(logBlock);
@Test public void testGetSameLogBlock() { long bucketSize = 3; int recordCount = 3; LogStorage storage = (LogStorage) getStorage(bucketSize, recordCount); LogRecord record = new LogRecord(); int insertionCount = 3; /* * Size of each record is 3B */ int iter = insertionCount; while (iter-- > 0) { storage.addLogRecord(record); } LogBucket group1 = storage.getNextBucket(); storage.rollbackBucket(group1.getBucketId()); LogBucket group2 = storage.getNextBucket(); Assert.assertTrue("Expected: " + group1.getRecords().size() + ", actual: " + group2.getRecords().size() , group1.getRecords().size() == group2.getRecords().size()); Iterator<LogRecord> expectedIt = group1.getRecords().iterator(); Iterator<LogRecord> actualIt = group2.getRecords().iterator(); while (expectedIt.hasNext()) { LogRecord expected = expectedIt.next(); LogRecord actual = actualIt.next(); Assert.assertTrue(expected.getSize() == actual.getSize()); Assert.assertArrayEquals(expected.getData(), actual.getData()); } storage.close(); }
logBlock = new LogBucket(bucketId, logRecords); consumedMemoryStorage.put(logBlock.getBucketId(), logBlockSize); + "total record count: {}, unmarked record count: {}", logBlock.getBucketId(), logBlockSize, logBlock.getRecords().size(), totalRecordCount, unmarkedRecordCount); } else {
@Test public void testGetBigRecordBlock() { long bucketSize = 8192; int recordCount = 1000; LogStorage storage = (LogStorage) getStorage(bucketSize, recordCount); LogRecord record = new LogRecord(); int insertionCount = 7; /* * Size of each record is 3B */ int iter = insertionCount; while (iter-- > 0) { storage.addLogRecord(record); } LogBucket logBlock = storage.getNextBucket(); Assert.assertEquals(insertionCount, logBlock.getRecords().size()); storage.close(); }
new LogBucket(1, Arrays.asList(new LogRecord(record), new LogRecord(record), new LogRecord(record))));
@Test public void testLogRecordRemoval() { long bucketSize = 9; int recordCount = 3; LogStorage storage = (LogStorage) getStorage(bucketSize, recordCount); LogRecord record = new LogRecord(); int insertionCount = 7; /* * Size of each record is 3B */ int iter = insertionCount; while (iter-- > 0) { storage.addLogRecord(record); } LogBucket removingBlock = storage.getNextBucket(); insertionCount -= removingBlock.getRecords().size(); storage.removeBucket(removingBlock.getBucketId()); removingBlock = storage.getNextBucket(); insertionCount -= removingBlock.getRecords().size(); storage.removeBucket(removingBlock.getBucketId()); LogBucket leftBlock = storage.getNextBucket(); Assert.assertTrue(leftBlock.getRecords().size() == insertionCount); storage.close(); }
@Test public void testPersistDBState() { LogStorage storage = (LogStorage) getStorage(BUCKET_SIZE, RECORD_COUNT); LogRecord record = new LogRecord(); int insertionCount = 7; /* * Size of each record is 3B */ int iter = insertionCount; while (iter-- > 0) { storage.addLogRecord(record); } LogBucket beforePersist = storage.getNextBucket(); storage.close(); storage = (LogStorage) getStorage(BUCKET_SIZE, RECORD_COUNT); LogStorageStatus storageStatus = (LogStorageStatus) storage; Assert.assertEquals(insertionCount, storageStatus.getRecordCount()); Assert.assertEquals(insertionCount * 3, storageStatus.getConsumedVolume()); LogBucket afterPersist = storage.getNextBucket(); Assert.assertEquals(beforePersist.getRecords().size(), afterPersist.getRecords().size()); storage.close(); }
new LogBucket(1, Arrays.asList(new LogRecord(record), new LogRecord(record), new LogRecord(record))));
Assert.assertEquals((insertionCount - receivedCount) * 3, storage.getStatus().getConsumedVolume()); storage.rollbackBucket(logBlock.getBucketId()); receivedCount -= logBlock.getRecords().size(); Assert.assertEquals(insertionCount - receivedCount, storage.getStatus().getRecordCount()); Assert.assertEquals((insertionCount - receivedCount) * 3, storage.getStatus().getConsumedVolume());