Revision eea7f28be45251646bef4dc3bb1a26bf3ca04d8b authored by Yicheng Qin on 24 June 2015, 21:29:07 UTC, committed by Yicheng Qin on 25 June 2015, 17:43:12 UTC
It is possible to trigger the time.After case if the timer went off
between time.After setting the timer for its channel and the time that
select looked at the channel. So it needs to be longer.

refer: https://groups.google.com/forum/#!topic/golang-nuts/1tjcV80ccq8
1 parent 44fda79
Raw File
v3api.proto
syntax = "proto3";

// Interface exported by the server.
service etcd {
  // Range gets the keys in the range from the store.
  rpc Range(RangeRequest) returns (RangeResponse) {}

  // Put puts the given key into the store.
  // A put request increases the index of the store,
  // and generates one event in the event history.
  rpc Put(PutRequest) returns (PutResponse) {}

  // Delete deletes the given range from the store.
  // A delete request increase the index of the store,
  // and generates one event in the event history.
  rpc DeleteRange(DeleteRangeRequest) returns (DeleteRangeResponse) {}

  // Tnx processes all the requests in one transaction.
  // A tnx request increases the index of the store,
  // and generates events with the same index in the event history.
  rpc Tnx(TnxRequest) returns (TnxResponse) {}

  // Watch watches the events happening or happened in etcd. Both input and output
  // are stream. One watch rpc can watch for multiple ranges and get a stream of
  // events. The whole events history can be watched unless compacted.
  rpc WatchRange(stream WatchRangeRequest) returns (stream WatchRangeResponse) {}

  // Compact compacts the event history in etcd. User should compact the
  // event history periodically, or it will grow infinitely.
  rpc Compact(CompactionRequest) returns (CompactionResponse) {}

  // LeaseCreate creates a lease. A lease has a TTL. The lease will expire if the
  // server does not receive a keepAlive within TTL from the lease holder.
  // All keys attached to the lease will be expired and deleted if the lease expires.
  // The key expiration generates an event in event history.
  rpc LeaseCreate(LeaseCreateRequest) returns (LeaseCreateResponse) {}

  // LeaseRevoke revokes a lease. All the key attached to the lease will be expired and deleted.
  rpc LeaseRevoke(LeaseRevokeRequest) returns (LeaseRevokeResponse) {}

  // LeaseAttach attaches keys with a lease.
  rpc LeaseAttach(LeaseAttachRequest) returns (LeaseAttachResponse) {}

  // LeaseTnx likes Tnx. It has two addition success and failure LeaseAttachRequest list.
  // If the Tnx is successful, then the success list will be executed. Or the failure list
  // will be executed.
  rpc LeaseTnx(LeaseTnxRequest) returns (LeaseTnxResponse) {}

  // KeepAlive keeps the lease alive.
  rpc LeaseKeepAlive(stream LeaseKeepAliveRequest) returns (stream LeaseKeepAliveResponse) {}
}

message ResponseHeader {
  // an error type message?
  optional string error = 1;
  optional uint64 cluster_id = 2;
  optional uint64 member_id = 3;
  // index of the store when the request was applied.
  optional int64 index = 4;
  // term of raft when the request was applied.
  optional uint64 raft_term = 5;
}

message RangeRequest {
  // if the range_end is not given, the request returns the key.
  optional bytes key = 1;
  // if the range_end is given, it gets the keys in range [key, range_end).
  optional bytes range_end = 2;
  // limit the number of keys returned.
  optional int64 limit = 3;
  // the response will be consistent with previous request with same token if the token is 
  // given and is vaild.
  optional bytes consistent_token = 4;
}

message RangeResponse {
  optional ResponseHeader header = 1;
  repeated KeyValue kvs = 2;
  optional bytes consistent_token = 3;
}

message PutRequest {
  optional bytes key = 1;
  optional bytes value = 2;
}

message PutResponse {
  optional ResponseHeader header = 1;
}

message DeleteRangeRequest {
  // if the range_end is not given, the request deletes the key.
  optional bytes key = 1;
  // if the range_end is given, it deletes the keys in range [key, range_end).
  optional bytes range_end = 2;
}

message DeleteRangeResponse {
  optional ResponseHeader header = 1;
}

message RequestUnion {
  oneof request {
    RangeRequest request_range = 1;
    PutRequest request_put = 2;
    DeleteRangeRequest request_delete_range = 3;
  }
}

message ResponseUnion {
  oneof response {
    RangeResponse reponse_range = 1;
    PutResponse response_put = 2;
    DeleteRangeResponse response_delete_range = 3;
  }
}

message Compare {
  enum CompareType {
    EQUAL = 0;
    GREATER = 1;
    LESS = 2;
  }
  optional CompareType type = 1;
  // key path
  optional bytes key = 2;
  oneof target {
    // version of the given key
    int64 version = 3;
    // create index of the given key
    int64 create_index = 4;
    // last modified index of the given key
    int64 mod_index = 5;
    // value of the given key
    bytes value = 6;
  }
}

// First all the compare requests are processed.
// If all the compare succeed, all the success
// requests will be processed.
// Or all the failure requests will be processed and
// all the errors in the comparison will be returned.

// From google paxosdb paper:
// Our implementation hinges around a powerful primitive which we call MultiOp. All other database
// operations except for iteration are implemented as a single call to MultiOp. A MultiOp is applied atomically
// and consists of three components:
// 1. A list of tests called guard. Each test in guard checks a single entry in the database. It may check
// for the absence or presence of a value, or compare with a given value. Two different tests in the guard
// may apply to the same or different entries in the database. All tests in the guard are applied and
// MultiOp returns the results. If all tests are true, MultiOp executes t op (see item 2 below), otherwise
// it executes f op (see item 3 below).
// 2. A list of database operations called t op. Each operation in the list is either an insert, delete, or
// lookup operation, and applies to a single database entry. Two different operations in the list may apply
// to the same or different entries in the database. These operations are executed
// if guard evaluates to
// true.
// 3. A list of database operations called f op. Like t op, but executed if guard evaluates to false.
message TnxRequest {
  repeated Compare compare = 1;
  repeated RequestUnion success = 2;
  repeated RequestUnion failure = 3;
}

message TnxResponse {
  optional ResponseHeader header = 1;
  optional bool succeeded = 2;
  repeated ResponseUnion responses = 3;
}

message KeyValue {
  optional bytes key = 1;
  // mod_index is the last modified index of the key.
  optional int64 create_index = 2;
  optional int64 mod_index = 3;
  // version is the version of the key. A deletion resets
  // the version to zero and any modification of the key
  // increases its version.
  optional int64 version = 4;
  optional bytes value = 5;
}

message WatchRangeRequest {
  // if the range_end is not given, the request returns the key.
  optional bytes key = 1;
  // if the range_end is given, it gets the keys in range [key, range_end).
  optional bytes range_end = 2;
  // start_index is an optional index (including) to watch from. No start_index is "now".
  optional int64 start_index = 3;
  // end_index is an optional index (excluding) to end watch. No end_index is "forever".
  optional int64 end_index = 4;
  optional bool progress_notification = 5;
}

message WatchRangeResponse {
  optional ResponseHeader header = 1;
  repeated Event events = 2;
}

message Event {
  enum EventType {
    PUT = 0;
    DELETE = 1;
    EXPIRE = 2;
  }
  optional EventType event_type = 1;
  // a put event contains the current key-value
  // a delete/expire event contains the previous
  // key-value
  optional KeyValue kv = 2;
}

message CompactionRequest {
  optional int64 index = 1;
}

message CompactionResponse {
  optional ResponseHeader header = 1;
}

message LeaseCreateRequest {
  // advisory ttl in seconds
  optional int64 ttl = 1;
}

message LeaseCreateResponse {
  optional ResponseHeader header = 1;
  optional int64 lease_id = 2;
  // server decided ttl in second
  optional int64 ttl = 3;
  optional string error = 4;
}

message LeaseRevokeRequest {
  optional int64 lease_id = 1;
}

message LeaseRevokeResponse {
  optional ResponseHeader header = 1;
}

message LeaseTnxRequest {
  optional TnxRequest request = 1;
  repeated LeaseAttachRequest success = 2;
  repeated LeaseAttachRequest failure = 3;
}

message LeaseTnxResponse {
  optional ResponseHeader header = 1;
  optional TnxResponse response = 2;
  repeated LeaseAttachResponse attach_responses = 3;
}

message LeaseAttachRequest {
  optional int64 lease_id = 1;
  optional bytes key = 2;
}

message LeaseAttachResponse {
  optional ResponseHeader header = 1;
}

message LeaseKeepAliveRequest {
  optional int64 lease_id = 1;
}

message LeaseKeepAliveResponse {
  optional ResponseHeader header = 1;
  optional int64 lease_id = 2;
  optional int64 ttl = 3;
}
back to top