All Downloads are FREE. Search and download functionalities are using the official Maven repository.

io.zeebe.logstreams.impl.service.LogWriteBufferService Maven / Gradle / Ivy

There is a newer version: 0.16.4
Show newest version
/*
 * Copyright © 2017 camunda services GmbH ([email protected])
 *
 * 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 io.zeebe.logstreams.impl.service;

import io.zeebe.dispatcher.Dispatcher;
import io.zeebe.dispatcher.DispatcherBuilder;
import io.zeebe.dispatcher.impl.PositionUtil;
import io.zeebe.logstreams.impl.log.index.LogBlockIndex;
import io.zeebe.logstreams.log.BufferedLogStreamReader;
import io.zeebe.logstreams.log.LoggedEvent;
import io.zeebe.logstreams.spi.LogStorage;
import io.zeebe.servicecontainer.Injector;
import io.zeebe.servicecontainer.Service;
import io.zeebe.servicecontainer.ServiceStartContext;
import io.zeebe.servicecontainer.ServiceStopContext;

public class LogWriteBufferService implements Service {
  private final Injector logStorageInjector = new Injector<>();
  private final Injector logBlockIndexInjector = new Injector<>();

  protected DispatcherBuilder dispatcherBuilder;
  protected Dispatcher dispatcher;

  public LogWriteBufferService(DispatcherBuilder builder) {
    this.dispatcherBuilder = builder;
  }

  @Override
  public void start(ServiceStartContext ctx) {
    ctx.run(
        () -> {
          final int partitionId = determineInitialPartitionId();

          dispatcher =
              dispatcherBuilder
                  .initialPartitionId(partitionId + 1)
                  .name(ctx.getName())
                  .actorScheduler(ctx.getScheduler())
                  .build();
        });
  }

  @Override
  public void stop(ServiceStopContext ctx) {
    ctx.async(dispatcher.closeAsync());
  }

  private int determineInitialPartitionId() {
    final LogStorage logStorage = logStorageInjector.getValue();
    final LogBlockIndex logBlockIndex = logBlockIndexInjector.getValue();

    try (BufferedLogStreamReader logReader = new BufferedLogStreamReader(true)) {
      logReader.wrap(logStorage, logBlockIndex);

      long lastPosition = 0;

      // Get position of last entry
      logReader.seekToLastEvent();
      if (logReader.hasNext()) {
        final LoggedEvent lastEntry = logReader.next();
        lastPosition = lastEntry.getPosition();
      }

      // dispatcher needs to generate positions greater than the last position
      int partitionId = 0;

      if (lastPosition > 0) {
        partitionId = PositionUtil.partitionId(lastPosition);
      }

      return partitionId;
    }
  }

  @Override
  public Dispatcher get() {
    return dispatcher;
  }

  public Injector getLogBlockIndexInjector() {
    return logBlockIndexInjector;
  }

  public Injector getLogStorageInjector() {
    return logStorageInjector;
  }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy