Search in sources :

Example 1 with PTable

use of org.apache.bookkeeper.api.kv.PTable in project bookkeeper by apache.

the class TestPByteBufTableImpl method testBasicOperations.

@SuppressWarnings("unchecked")
@Test
public void testBasicOperations() throws Exception {
    when(mockMetaRangeClient.getActiveDataRanges()).thenReturn(FutureUtils.value(streamRanges1));
    ConcurrentMap<Long, PTable<ByteBuf, ByteBuf>> tableRanges = Maps.newConcurrentMap();
    for (RangeProperties rangeProps : streamRanges1.getRanges().values()) {
        tableRanges.put(rangeProps.getRangeId(), mock(PTable.class));
    }
    RangeRouter<ByteBuf> mockRouter = mock(RangeRouter.class);
    when(mockRouter.getRange(any(ByteBuf.class))).thenAnswer(invocationOnMock -> {
        ByteBuf key = invocationOnMock.getArgument(0);
        byte[] keyData = ByteBufUtil.getBytes(key);
        return Bytes.toLong(keyData, 0);
    });
    TableRangeFactory<ByteBuf, ByteBuf> trFactory = (streamProps1, rangeProps, executor, opFactory, resultFactory, kvFactory) -> tableRanges.get(rangeProps.getRangeId());
    PByteBufTableImpl table = new PByteBufTableImpl(runtime.getMethodName(), streamProps, mockClientManager, scheduler.chooseThread(), trFactory, Optional.of(mockRouter));
    assertEquals(0, table.getTableRanges().size());
    verify(mockRouter, times(0)).setRanges(any(HashStreamRanges.class));
    // initialize the table
    assertTrue(table == FutureUtils.result(table.initialize()));
    verify(mockRouter, times(1)).setRanges(eq(streamRanges1));
    assertEquals(4, table.getTableRanges().size());
    // test get
    for (RangeProperties rangeProps : streamRanges1.getRanges().values()) {
        ByteBuf pkey = Unpooled.wrappedBuffer(Bytes.toBytes(rangeProps.getRangeId()));
        ByteBuf lkey = Unpooled.wrappedBuffer(Bytes.toBytes(rangeProps.getRangeId()));
        try (RangeOption<ByteBuf> option = optionFactory.newRangeOption().build()) {
            table.get(pkey, lkey, option);
            verify(tableRanges.get(rangeProps.getRangeId()), times(1)).get(eq(pkey), eq(lkey), eq(option));
        }
    }
    // test put
    for (RangeProperties rangeProps : streamRanges1.getRanges().values()) {
        ByteBuf pkey = Unpooled.wrappedBuffer(Bytes.toBytes(rangeProps.getRangeId()));
        ByteBuf lkey = Unpooled.wrappedBuffer(Bytes.toBytes(rangeProps.getRangeId()));
        ByteBuf value = Unpooled.wrappedBuffer(Bytes.toBytes(rangeProps.getRangeId()));
        try (PutOption<ByteBuf> option = optionFactory.newPutOption().build()) {
            table.put(pkey, lkey, value, option);
            verify(tableRanges.get(rangeProps.getRangeId()), times(1)).put(eq(pkey), eq(lkey), eq(value), eq(option));
        }
    }
    // test increment
    for (RangeProperties rangeProps : streamRanges1.getRanges().values()) {
        ByteBuf pkey = Unpooled.wrappedBuffer(Bytes.toBytes(rangeProps.getRangeId()));
        ByteBuf lkey = Unpooled.wrappedBuffer(Bytes.toBytes(rangeProps.getRangeId()));
        long amount = 100L;
        try (IncrementOption<ByteBuf> option = optionFactory.newIncrementOption().build()) {
            table.increment(pkey, lkey, amount, option);
            verify(tableRanges.get(rangeProps.getRangeId()), times(1)).increment(eq(pkey), eq(lkey), eq(amount), same(option));
        }
    }
    // test delete
    for (RangeProperties rangeProps : streamRanges1.getRanges().values()) {
        ByteBuf pkey = Unpooled.wrappedBuffer(Bytes.toBytes(rangeProps.getRangeId()));
        ByteBuf lkey = Unpooled.wrappedBuffer(Bytes.toBytes(rangeProps.getRangeId()));
        try (DeleteOption<ByteBuf> option = optionFactory.newDeleteOption().build()) {
            table.delete(pkey, lkey, option);
            verify(tableRanges.get(rangeProps.getRangeId()), times(1)).delete(eq(pkey), eq(lkey), eq(option));
        }
    }
    // test txn
    for (RangeProperties rangeProps : streamRanges1.getRanges().values()) {
        ByteBuf pkey = Unpooled.wrappedBuffer(Bytes.toBytes(rangeProps.getRangeId()));
        Txn<ByteBuf, ByteBuf> txn = table.txn(pkey);
        verify(tableRanges.get(rangeProps.getRangeId()), times(1)).txn(eq(pkey));
    }
}
Also used : ArgumentMatchers.any(org.mockito.ArgumentMatchers.any) HashRouter(org.apache.bookkeeper.common.router.HashRouter) ArgumentMatchers.eq(org.mockito.ArgumentMatchers.eq) MetaRangeClient(org.apache.bookkeeper.clients.impl.internal.api.MetaRangeClient) RangeKeyType(org.apache.bookkeeper.stream.proto.RangeKeyType) ClientException(org.apache.bookkeeper.clients.exceptions.ClientException) OptionFactoryImpl(org.apache.bookkeeper.api.kv.impl.options.OptionFactoryImpl) Unpooled(io.netty.buffer.Unpooled) ConcurrentMap(java.util.concurrent.ConcurrentMap) RangeRouter(org.apache.bookkeeper.clients.impl.routing.RangeRouter) Lists(com.google.common.collect.Lists) ByteBuf(io.netty.buffer.ByteBuf) RangeProperties(org.apache.bookkeeper.stream.proto.RangeProperties) TestName(org.junit.rules.TestName) ThreadLocalRandom(java.util.concurrent.ThreadLocalRandom) Assert.fail(org.junit.Assert.fail) HashStreamRanges(org.apache.bookkeeper.clients.impl.internal.api.HashStreamRanges) DEFAULT_STREAM_CONF(org.apache.bookkeeper.stream.protocol.ProtocolConstants.DEFAULT_STREAM_CONF) Before(org.junit.Before) OrderedScheduler(org.apache.bookkeeper.common.util.OrderedScheduler) Txn(org.apache.bookkeeper.api.kv.Txn) StorageServerClientManager(org.apache.bookkeeper.clients.impl.internal.api.StorageServerClientManager) Assert.assertTrue(org.junit.Assert.assertTrue) DeleteOption(org.apache.bookkeeper.api.kv.options.DeleteOption) Mockito.times(org.mockito.Mockito.times) Test(org.junit.Test) Mockito.when(org.mockito.Mockito.when) Bytes(org.apache.bookkeeper.common.util.Bytes) NavigableMap(java.util.NavigableMap) PTable(org.apache.bookkeeper.api.kv.PTable) FutureUtils(org.apache.bookkeeper.common.concurrent.FutureUtils) Maps(com.google.common.collect.Maps) OptionFactory(org.apache.bookkeeper.api.kv.options.OptionFactory) Mockito.verify(org.mockito.Mockito.verify) RangeOption(org.apache.bookkeeper.api.kv.options.RangeOption) ByteBufUtil(io.netty.buffer.ByteBufUtil) List(java.util.List) Rule(org.junit.Rule) ProtoUtils(org.apache.bookkeeper.stream.protocol.util.ProtoUtils) StreamProperties(org.apache.bookkeeper.stream.proto.StreamProperties) Optional(java.util.Optional) PutOption(org.apache.bookkeeper.api.kv.options.PutOption) IncrementOption(org.apache.bookkeeper.api.kv.options.IncrementOption) Assert.assertEquals(org.junit.Assert.assertEquals) ArgumentMatchers.same(org.mockito.ArgumentMatchers.same) Mockito.mock(org.mockito.Mockito.mock) HashStreamRanges(org.apache.bookkeeper.clients.impl.internal.api.HashStreamRanges) RangeProperties(org.apache.bookkeeper.stream.proto.RangeProperties) ByteBuf(io.netty.buffer.ByteBuf) PTable(org.apache.bookkeeper.api.kv.PTable) Test(org.junit.Test)

Example 2 with PTable

use of org.apache.bookkeeper.api.kv.PTable in project bookkeeper by apache.

the class PByteBufTableImpl method refreshRangeSpaces.

CompletableFuture<PTable<ByteBuf, ByteBuf>> refreshRangeSpaces(HashStreamRanges newRanges) {
    // compare the ranges to see if it requires an update
    HashStreamRanges oldRanges = rangeRouter.getRanges();
    if (null != oldRanges && oldRanges.getMaxRangeId() >= newRanges.getMaxRangeId()) {
        log.info("No new stream ranges found for stream {}.", streamName);
        return FutureUtils.value(this);
    }
    if (log.isInfoEnabled()) {
        log.info("Updated the active ranges to {}", newRanges);
    }
    rangeRouter.setRanges(newRanges);
    // add new ranges
    Set<Long> activeRanges = Sets.newHashSetWithExpectedSize(newRanges.getRanges().size());
    newRanges.getRanges().forEach((rk, range) -> {
        activeRanges.add(range.getRangeId());
        if (tableRanges.containsKey(range.getRangeId())) {
            return;
        }
        PTable<ByteBuf, ByteBuf> tableRange = trFactory.openTableRange(props, range, executor, opFactory, resultFactory, kvFactory);
        if (log.isInfoEnabled()) {
            log.info("Create table range client for range {}", range.getRangeId());
        }
        this.tableRanges.put(range.getRangeId(), tableRange);
    });
    // remove old ranges
    Iterator<Entry<Long, PTable<ByteBuf, ByteBuf>>> rsIter = tableRanges.entrySet().iterator();
    while (rsIter.hasNext()) {
        Map.Entry<Long, PTable<ByteBuf, ByteBuf>> entry = rsIter.next();
        Long rid = entry.getKey();
        if (activeRanges.contains(rid)) {
            continue;
        }
        rsIter.remove();
        PTable oldRangeSpace = entry.getValue();
        oldRangeSpace.close();
    }
    return FutureUtils.value(this);
}
Also used : HashStreamRanges(org.apache.bookkeeper.clients.impl.internal.api.HashStreamRanges) Entry(java.util.Map.Entry) ByteBuf(io.netty.buffer.ByteBuf) ConcurrentMap(java.util.concurrent.ConcurrentMap) Map(java.util.Map) ConcurrentHashMap(java.util.concurrent.ConcurrentHashMap) PTable(org.apache.bookkeeper.api.kv.PTable)

Aggregations

ByteBuf (io.netty.buffer.ByteBuf)2 ConcurrentMap (java.util.concurrent.ConcurrentMap)2 PTable (org.apache.bookkeeper.api.kv.PTable)2 HashStreamRanges (org.apache.bookkeeper.clients.impl.internal.api.HashStreamRanges)2 Lists (com.google.common.collect.Lists)1 Maps (com.google.common.collect.Maps)1 ByteBufUtil (io.netty.buffer.ByteBufUtil)1 Unpooled (io.netty.buffer.Unpooled)1 List (java.util.List)1 Map (java.util.Map)1 Entry (java.util.Map.Entry)1 NavigableMap (java.util.NavigableMap)1 Optional (java.util.Optional)1 ConcurrentHashMap (java.util.concurrent.ConcurrentHashMap)1 ThreadLocalRandom (java.util.concurrent.ThreadLocalRandom)1 Txn (org.apache.bookkeeper.api.kv.Txn)1 OptionFactoryImpl (org.apache.bookkeeper.api.kv.impl.options.OptionFactoryImpl)1 DeleteOption (org.apache.bookkeeper.api.kv.options.DeleteOption)1 IncrementOption (org.apache.bookkeeper.api.kv.options.IncrementOption)1 OptionFactory (org.apache.bookkeeper.api.kv.options.OptionFactory)1