package com.jivesoftware.os.amza.service.replication.http; import com.jivesoftware.os.amza.api.PartitionClient.KeyValueFilter; import com.jivesoftware.os.amza.api.RingPartitionProperties; import com.jivesoftware.os.amza.api.filer.IReadable; import com.jivesoftware.os.amza.api.filer.IWriteable; import com.jivesoftware.os.amza.api.partition.Consistency; import com.jivesoftware.os.amza.api.partition.PartitionName; import com.jivesoftware.os.amza.api.partition.PartitionProperties; import com.jivesoftware.os.amza.api.ring.RingMember; import com.jivesoftware.os.amza.service.Partition.ScanRange; import com.jivesoftware.os.amza.service.replication.http.endpoints.ChunkedOutputFiler; import com.jivesoftware.os.amza.service.ring.RingTopology; import java.io.IOException; import java.util.List; /** * @author jonathan.colt */ public interface AmzaRestClient { RingPartitionProperties getProperties(PartitionName partitionName) throws Exception; StateMessageCause commit(PartitionName partitionName, Consistency consistency, boolean checkLeader, long partitionAwaitOnlineTimeoutMillis, IReadable read) throws Exception; RingTopology configPartition(PartitionName partitionName, PartitionProperties partitionProperties, int ringSize) throws Exception; void configPartition(RingTopology ring, IWriteable writeable) throws Exception; void ensurePartition(PartitionName partitionName, long waitForLeaderElection) throws Exception; void get(PartitionName partitionName, Consistency consistency, IReadable in, IWriteable out) throws Exception; void getOffset(PartitionName partitionName, Consistency consistency, IReadable in, IWriteable out) throws Exception; RingLeader ring(PartitionName partitionName) throws Exception; RingLeader ringLeader(PartitionName partitionName, long waitForLeaderElection) throws Exception; void ring(RingLeader ringLeader, IWriteable writeable) throws IOException; void scan(PartitionName partitionName, List<ScanRange> ranges, boolean rangeBoundaries, KeyValueFilter filter, IWriteable out, boolean hydrateValues) throws Exception; StateMessageCause status(PartitionName partitionName, Consistency consistency, boolean checkLeader, long partitionAwaitOnlineTimeoutMillis); void takeFromTransactionId(PartitionName partitionName, int limit, IReadable in, IWriteable out) throws Exception; void takePrefixFromTransactionId(PartitionName partitionName, int limit, IReadable in, IWriteable out) throws Exception; long approximateCount(PartitionName partitionName) throws Exception; class RingLeader { final RingTopology ringTopology; final RingMember leader; public RingLeader(RingTopology ringTopology, RingMember leader) { this.ringTopology = ringTopology; this.leader = leader; } } enum State { ok, properties_not_present, not_a_ring_member, failed_to_come_online, lacks_leader, not_the_leader, error } class StateMessageCause { public final PartitionName partitionName; public final Consistency consistency; public final boolean checkLeader; public final long partitionAwaitOnlineTimeoutMillis; public final State state; public final String message; public final Exception cause; public StateMessageCause(PartitionName partitionName, Consistency consistency, boolean checkLeader, long partitionAwaitOnlineTimeoutMillis, State state, String message, Exception cause) { this.partitionName = partitionName; this.consistency = consistency; this.checkLeader = checkLeader; this.partitionAwaitOnlineTimeoutMillis = partitionAwaitOnlineTimeoutMillis; this.state = state; this.message = message; this.cause = cause; } @Override public String toString() { return "StateMessageCause{" + "partitionName=" + partitionName + ", consistency=" + consistency + ", checkLeader=" + checkLeader + ", partitionAwaitOnlineTimeoutMillis=" + partitionAwaitOnlineTimeoutMillis + ", state=" + state + ", message=" + message + ", cause=" + cause + '}'; } } }