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

com.scalar.database.transaction.consensuscommit.ConsensusCommitManager Maven / Gradle / Ivy

Go to download

A universal transaction manager that achieves database-agnostic transactions and distributed transactions that span multiple databases

There is a newer version: 3.14.0-alpha.1
Show newest version
package com.scalar.database.transaction.consensuscommit;

import static com.google.common.base.Preconditions.checkArgument;

import com.google.common.annotations.VisibleForTesting;
import com.google.common.base.Strings;
import com.google.inject.Inject;
import com.scalar.database.api.DistributedStorage;
import com.scalar.database.api.DistributedTransactionManager;
import com.scalar.database.api.Isolation;
import java.util.UUID;
import javax.annotation.concurrent.ThreadSafe;

@ThreadSafe
public class ConsensusCommitManager implements DistributedTransactionManager {
  private final DistributedStorage storage;
  private Coordinator coordinator;
  private RecoveryHandler recovery;
  private CommitHandler commit;
  private String namespace;
  private String tableName;

  @Inject
  public ConsensusCommitManager(DistributedStorage storage) {
    this.storage = storage;
    this.coordinator = new Coordinator(storage);
    this.recovery = new RecoveryHandler(storage, coordinator);
    this.commit = new CommitHandler(storage, coordinator, recovery);
  }

  @VisibleForTesting
  ConsensusCommitManager(
      DistributedStorage storage,
      Coordinator coordinator,
      RecoveryHandler recovery,
      CommitHandler commit) {
    this.storage = storage;
    this.coordinator = coordinator;
    this.recovery = recovery;
    this.commit = commit;
  }

  @Override
  public void with(String namespace, String tableName) {
    this.namespace = namespace;
    this.tableName = tableName;
  }

  @Override
  public ConsensusCommit start() {
    return start(Isolation.SNAPSHOT);
  }

  @Override
  public synchronized ConsensusCommit start(Isolation isolation) {
    String txId = UUID.randomUUID().toString();
    checkArgument(!Strings.isNullOrEmpty(txId));
    checkArgument(isolation != null);
    Snapshot snapshot = new Snapshot(txId, isolation);
    CrudHandler crud = new CrudHandler(storage, snapshot);
    ConsensusCommit consensus = new ConsensusCommit(crud, commit, recovery);
    consensus.with(namespace, tableName);
    return consensus;
  }

  @Override
  public void close() {
    storage.close();
  }
}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy