/**
* Copyright 2016 Yahoo Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.apache.bookkeeper.mledger.impl;
import static org.testng.Assert.assertEquals;
import static org.testng.Assert.assertTrue;
import java.util.List;
import java.util.concurrent.TimeUnit;
import org.apache.bookkeeper.mledger.Entry;
import org.apache.bookkeeper.mledger.ManagedCursor;
import org.apache.bookkeeper.mledger.ManagedLedgerFactoryConfig;
import org.apache.bookkeeper.mledger.Position;
import org.apache.bookkeeper.test.MockedBookKeeperTestCase;
import org.testng.annotations.Test;
public class ManagedLedgerMBeanTest extends MockedBookKeeperTestCase {
private void waitForRefresh(ManagedLedgerMBeanImpl mbean) {
try {
Thread.sleep(100);
} catch (Exception e) {
// do nothing
}
}
@Test
public void simple() throws Exception {
ManagedLedgerFactoryConfig config = new ManagedLedgerFactoryConfig();
config.setMaxCacheSize(0);
ManagedLedgerFactoryImpl factory = new ManagedLedgerFactoryImpl(bkc, zkc, config);
ManagedLedgerImpl ledger = (ManagedLedgerImpl) factory.open("my_test_ledger");
ManagedCursor cursor = ledger.openCursor("c1");
ManagedLedgerMBeanImpl mbean = ledger.mbean;
assertEquals(mbean.getName(), "my_test_ledger");
assertEquals(mbean.getStoredMessagesSize(), 0);
assertEquals(mbean.getNumberOfMessagesInBacklog(), 0);
waitForRefresh(mbean);
mbean.addAddEntryLatencySample(1, TimeUnit.MILLISECONDS);
mbean.addAddEntryLatencySample(10, TimeUnit.MILLISECONDS);
mbean.addAddEntryLatencySample(1, TimeUnit.SECONDS);
mbean.addLedgerSwitchLatencySample(1, TimeUnit.MILLISECONDS);
mbean.addLedgerSwitchLatencySample(10, TimeUnit.MILLISECONDS);
mbean.addLedgerSwitchLatencySample(1, TimeUnit.SECONDS);
// Simulate stats getting update from different thread
factory.executor.submit(() -> {
mbean.refreshStats(1, TimeUnit.SECONDS);
}).get();
assertEquals(mbean.getAddEntryBytesRate(), 0.0);
assertEquals(mbean.getAddEntryMessagesRate(), 0.0);
assertEquals(mbean.getAddEntrySucceed(), 0);
assertEquals(mbean.getAddEntryErrors(), 0);
assertEquals(mbean.getReadEntriesBytesRate(), 0.0);
assertEquals(mbean.getReadEntriesRate(), 0.0);
assertEquals(mbean.getReadEntriesSucceeded(), 0);
assertEquals(mbean.getReadEntriesErrors(), 0);
assertEquals(mbean.getMarkDeleteRate(), 0.0);
assertEquals(mbean.getAddEntryLatencyBuckets(), new long[] { 0, 1, 0, 1, 0, 0, 0, 0, 1, 0 });
assertEquals(mbean.getAddEntryLatencyAverageUsec(), 337_000.0);
assertEquals(mbean.getEntrySizeBuckets(), new long[] { 0, 0, 0, 0, 0, 0, 0, 0, 0 });
assertEquals(mbean.getLedgerSwitchLatencyBuckets(), new long[] { 0, 1, 0, 1, 0, 0, 0, 0, 1, 0 });
assertEquals(mbean.getLedgerSwitchLatencyAverageUsec(), 337_000.0);
Position p1 = ledger.addEntry(new byte[200]);
ledger.addEntry(new byte[600]);
cursor.markDelete(p1);
factory.executor.submit(() -> {
mbean.refreshStats(1, TimeUnit.SECONDS);
}).get();
assertEquals(mbean.getAddEntryBytesRate(), 800.0);
assertEquals(mbean.getAddEntryMessagesRate(), 2.0);
assertEquals(mbean.getAddEntrySucceed(), 2);
assertEquals(mbean.getAddEntryErrors(), 0);
assertEquals(mbean.getReadEntriesBytesRate(), 0.0);
assertEquals(mbean.getReadEntriesRate(), 0.0);
assertEquals(mbean.getReadEntriesSucceeded(), 0);
assertEquals(mbean.getReadEntriesErrors(), 0);
assertTrue(mbean.getMarkDeleteRate() > 0.0);
assertEquals(mbean.getEntrySizeBuckets(), new long[] { 0, 1, 1, 0, 0, 0, 0, 0, 0 });
mbean.recordAddEntryError();
mbean.recordReadEntriesError();
factory.executor.submit(() -> {
mbean.refreshStats(1, TimeUnit.SECONDS);
}).get();
assertEquals(mbean.getAddEntryErrors(), 1);
assertEquals(mbean.getReadEntriesErrors(), 1);
List<Entry> entries = cursor.readEntries(100);
assertEquals(entries.size(), 1);
factory.executor.submit(() -> {
mbean.refreshStats(1, TimeUnit.SECONDS);
}).get();
assertEquals(mbean.getReadEntriesBytesRate(), 600.0);
assertEquals(mbean.getReadEntriesRate(), 1.0);
assertEquals(mbean.getReadEntriesSucceeded(), 1);
assertEquals(mbean.getReadEntriesErrors(), 0);
assertEquals(mbean.getNumberOfMessagesInBacklog(), 1);
assertEquals(mbean.getMarkDeleteRate(), 0.0);
factory.shutdown();
}
}