Search in sources :

Example 6 with IndexedJournalKey

use of com.questdb.net.ha.model.IndexedJournalKey in project questdb by bluestreak01.

the class JournalServerAgentTest method testSetKeyRequestResponse.

@Test
public void testSetKeyRequestResponse() throws Exception {
    commandProducer.write(channel, Command.ADD_KEY_CMD);
    setKeyRequestProducer.write(channel, new IndexedJournalKey(0, quoteWriter.getMetadata().getKey()));
    agent.process(channel);
    charSequenceResponseConsumer.read(channel);
    TestUtils.assertEquals("OK", charSequenceResponseConsumer.getValue());
    hugeBufferConsumer.read(channel);
    commandProducer.write(channel, Command.ADD_KEY_CMD);
    setKeyRequestProducer.write(channel, new IndexedJournalKey(0, tradeWriter.getMetadata().getKey()));
    agent.process(channel);
    charSequenceResponseConsumer.read(channel);
    Assert.assertTrue(Chars.startsWith(charSequenceResponseConsumer.getValue(), "Requested key not exported"));
}
Also used : IndexedJournalKey(com.questdb.net.ha.model.IndexedJournalKey) AbstractTest(com.questdb.test.tools.AbstractTest)

Example 7 with IndexedJournalKey

use of com.questdb.net.ha.model.IndexedJournalKey in project questdb by bluestreak01.

the class JournalServerAgentTest method testJournalIndexCorrectness.

@Test
public void testJournalIndexCorrectness() throws Exception {
    server.publish(tradeWriter);
    server.start();
    try (Journal<Quote> quoteClientWriter = getFactory().writer(Quote.class, "client")) {
        // send quote journal key
        // commandProducer.write(channel, Command.ADD_KEY_CMD);
        // setKeyRequestProducer.write(channel, new IndexedJournalKey(3, quoteWriter.getKey()));
        // agent.process(channel);
        // charSequenceResponseConsumer.reset();
        // charSequenceResponseConsumer.read(channel);
        // Assert.assertTrue(charSequenceResponseConsumer.isComplete());
        // Assert.assertEquals("Journal index is too large. Max 1", charSequenceResponseConsumer.getValue());
        commandProducer.write(channel, Command.ADD_KEY_CMD);
        setKeyRequestProducer.write(channel, new IndexedJournalKey(0, quoteWriter.getMetadata().getKey()));
        agent.process(channel);
        charSequenceResponseConsumer.read(channel);
        TestUtils.assertEquals("OK", charSequenceResponseConsumer.getValue());
        hugeBufferConsumer.read(channel);
        commandProducer.write(channel, Command.DELTA_REQUEST_CMD);
        journalClientStateProducer.write(channel, new IndexedJournal(1, quoteClientWriter));
        agent.process(channel);
        charSequenceResponseConsumer.read(channel);
        TestUtils.assertEquals("Journal index does not match key request", charSequenceResponseConsumer.getValue());
        commandProducer.write(channel, Command.DELTA_REQUEST_CMD);
        journalClientStateProducer.write(channel, new IndexedJournal(0, quoteClientWriter));
        agent.process(channel);
        charSequenceResponseConsumer.read(channel);
        TestUtils.assertEquals("OK", charSequenceResponseConsumer.getValue());
    }
}
Also used : Quote(com.questdb.model.Quote) IndexedJournalKey(com.questdb.net.ha.model.IndexedJournalKey) IndexedJournal(com.questdb.net.ha.model.IndexedJournal) AbstractTest(com.questdb.test.tools.AbstractTest)

Example 8 with IndexedJournalKey

use of com.questdb.net.ha.model.IndexedJournalKey in project questdb by bluestreak01.

the class JournalClient method subscribeOne.

private void subscribeOne(int index, SubscriptionHolder holder, String name, boolean newSubscription) {
    if (newSubscription) {
        SubscriptionHolder sub = new SubscriptionHolder();
        sub.local = holder.local;
        sub.remote = holder.remote;
        sub.listener = holder.listener;
        sub.writer = holder.writer;
        subscriptions.add(sub);
    }
    JournalWriter<?> writer = writers.getQuiet(index);
    try {
        commandProducer.write(channel, Command.ADD_KEY_CMD);
        setKeyRequestProducer.write(channel, new IndexedJournalKey(index, holder.remote));
        checkAck();
        // todo: do we really have to use file here?
        JournalMetadata<?> metadata;
        File file = Files.makeTempFile();
        try {
            try (HugeBufferConsumer h = new HugeBufferConsumer(file)) {
                h.read(channel);
                metadata = new JournalMetadata(h.getHb(), name);
            } catch (JournalException e) {
                throw new JournalNetworkException(e);
            }
        } finally {
            Files.delete(file);
        }
        boolean validate = true;
        if (writer == null) {
            if (holder.writer == null) {
                try {
                    writer = factory.writer(metadata);
                } catch (JournalException e) {
                    LOG.error().$("Failed to create writer: ").$(e).$();
                    unsubscribe(index, null, holder, JournalEvents.EVT_JNL_INCOMPATIBLE);
                    return;
                }
                writersToClose.add(writer);
                validate = false;
            } else {
                writer = holder.writer;
            }
            writer.disableCommitOnClose();
            statusSentList.extendAndSet(index, 0);
            deltaConsumers.extendAndSet(index, new JournalDeltaConsumer(writer));
            writers.extendAndSet(index, writer);
            writer.setJournalListener(holder.listener);
        } else {
            statusSentList.setQuick(index, 0);
        }
        if (validate && !metadata.isCompatible(writer.getMetadata(), false)) {
            LOG.error().$("Journal ").$(holder.local.getName()).$(" is not compatible with ").$(holder.remote.getName()).$("(remote)").$();
            unsubscribe(index, writer, holder, JournalEvents.EVT_JNL_INCOMPATIBLE);
            return;
        }
        commandProducer.write(channel, Command.DELTA_REQUEST_CMD);
        journalClientStateProducer.write(channel, new IndexedJournal(index, writer));
        checkAck();
        statusSentList.setQuick(index, 1);
        if (holder.listener != null) {
            holder.listener.onEvent(JournalEvents.EVT_JNL_SUBSCRIBED);
        }
        LOG.info().$("Subscribed ").$(name).$(" to ").$(holder.remote.getName()).$("(remote)").$();
    } catch (JournalNetworkException e) {
        LOG.error().$("Failed to subscribe ").$(name).$(" to ").$(holder.remote.getName()).$("(remote)").$();
        unsubscribe(index, writer, holder, JournalEvents.EVT_JNL_SERVER_ERROR);
    }
}
Also used : JournalMetadata(com.questdb.store.factory.configuration.JournalMetadata) IncompatibleJournalException(com.questdb.ex.IncompatibleJournalException) JournalException(com.questdb.std.ex.JournalException) JournalDeltaConsumer(com.questdb.net.ha.comsumer.JournalDeltaConsumer) IndexedJournalKey(com.questdb.net.ha.model.IndexedJournalKey) JournalNetworkException(com.questdb.std.ex.JournalNetworkException) HugeBufferConsumer(com.questdb.net.ha.comsumer.HugeBufferConsumer) IndexedJournal(com.questdb.net.ha.model.IndexedJournal) File(java.io.File)

Aggregations

IndexedJournalKey (com.questdb.net.ha.model.IndexedJournalKey)8 Quote (com.questdb.model.Quote)3 JournalDeltaConsumer (com.questdb.net.ha.comsumer.JournalDeltaConsumer)3 IndexedJournal (com.questdb.net.ha.model.IndexedJournal)3 AbstractTest (com.questdb.test.tools.AbstractTest)3 JournalException (com.questdb.std.ex.JournalException)2 JournalNetworkException (com.questdb.std.ex.JournalNetworkException)2 IncompatibleJournalException (com.questdb.ex.IncompatibleJournalException)1 HugeBufferConsumer (com.questdb.net.ha.comsumer.HugeBufferConsumer)1 SetKeyRequestConsumer (com.questdb.net.ha.protocol.commands.SetKeyRequestConsumer)1 SetKeyRequestProducer (com.questdb.net.ha.protocol.commands.SetKeyRequestProducer)1 JournalMetadata (com.questdb.store.factory.configuration.JournalMetadata)1 File (java.io.File)1 Test (org.junit.Test)1