package com.jivesoftware.os.amza.service.replication; import com.google.common.base.Optional; import com.jivesoftware.os.amza.api.partition.Durability; import com.jivesoftware.os.amza.api.partition.PartitionName; import com.jivesoftware.os.amza.api.partition.VersionedPartitionName; import com.jivesoftware.os.amza.api.wal.WALUpdated; /** * @author jonathan.colt */ public class StripedPartitionCommitChanges implements CommitChanges { private final PartitionStripeProvider partitionStripeProvider; private final boolean hardFlush; private final WALUpdated walUpdated; public StripedPartitionCommitChanges(PartitionStripeProvider partitionStripeProvider, boolean hardFlush, WALUpdated walUpdated) { this.partitionStripeProvider = partitionStripeProvider; this.hardFlush = hardFlush; this.walUpdated = walUpdated; } @Override public void commit(VersionedPartitionName versionedPartitionName, CommitTx commitTx) throws Exception { PartitionName partitionName = versionedPartitionName.getPartitionName(); partitionStripeProvider.txPartition(partitionName, (txPartitionStripe, highwaterStorage, versionedAquarium) -> { return commitTx.tx(highwaterStorage, versionedAquarium, (prefix, commitable) -> { return txPartitionStripe.tx((deltaIndex, stripeIndex, partitionStripe) -> { return partitionStripe.commit(highwaterStorage, versionedAquarium, false, Optional.of(versionedPartitionName.getPartitionVersion()), false, prefix, commitable, walUpdated); }); }); }); partitionStripeProvider.flush(partitionName, hardFlush ? Durability.fsync_always : Durability.fsync_async, 0); } @Override public String toString() { return "StripedPartitionCommitChanges{" + "partitionStripeProvider=" + partitionStripeProvider + '}'; } }