diff --git a/etcdserver2/etcdhttp/http.go b/etcdserver2/etcdhttp/http.go index f4e58f843..eaee4f938 100644 --- a/etcdserver2/etcdhttp/http.go +++ b/etcdserver2/etcdhttp/http.go @@ -13,8 +13,8 @@ import ( "strings" "time" - "code.google.com/p/go.net/context" "crypto/rand" + "code.google.com/p/go.net/context" "github.com/coreos/etcd/elog" etcdserver "github.com/coreos/etcd/etcdserver2" "github.com/coreos/etcd/etcdserver2/etcdserverpb" diff --git a/etcdserver2/etcdhttp/http_test.go b/etcdserver2/etcdhttp/http_test.go index 133ff7101..08ac0f4cb 100644 --- a/etcdserver2/etcdhttp/http_test.go +++ b/etcdserver2/etcdhttp/http_test.go @@ -1,7 +1,6 @@ package etcdhttp import ( - "code.google.com/p/go.net/context" "encoding/json" "net/http" "net/http/httptest" @@ -9,6 +8,7 @@ import ( "reflect" "testing" "time" + "code.google.com/p/go.net/context" etcdserver "github.com/coreos/etcd/etcdserver2" "github.com/coreos/etcd/etcdserver2/etcdserverpb" diff --git a/etcdserver2/etcdserverpb/etcdserver.pb.go b/etcdserver2/etcdserverpb/etcdserver.pb.go index 37d923783..84b0e6b71 100644 --- a/etcdserver2/etcdserverpb/etcdserver.pb.go +++ b/etcdserver2/etcdserverpb/etcdserver.pb.go @@ -41,6 +41,7 @@ type Request struct { Since uint64 `protobuf:"varint,11,req,name=since" json:"since"` Recursive bool `protobuf:"varint,12,req,name=recursive" json:"recursive"` Sorted bool `protobuf:"varint,13,req,name=sorted" json:"sorted"` + Quorum bool `protobuf:"varint,14,req,name=quorum" json:"quorum"` XXX_unrecognized []byte `json:"-"` } @@ -303,6 +304,23 @@ func (m *Request) Unmarshal(data []byte) error { } } m.Sorted = bool(v != 0) + case 14: + if wireType != 0 { + return code_google_com_p_gogoprotobuf_proto.ErrWrongType + } + var v int + for shift := uint(0); ; shift += 7 { + if index >= l { + return io.ErrUnexpectedEOF + } + b := data[index] + index++ + v |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + m.Quorum = bool(v != 0) default: var sizeOfWire int for { @@ -348,6 +366,7 @@ func (m *Request) Size() (n int) { n += 1 + sovEtcdserver(uint64(m.Since)) n += 2 n += 2 + n += 2 if m.XXX_unrecognized != nil { n += len(m.XXX_unrecognized) } @@ -452,6 +471,14 @@ func (m *Request) MarshalTo(data []byte) (n int, err error) { data[i] = 0 } i++ + data[i] = 0x70 + i++ + if m.Quorum { + data[i] = 1 + } else { + data[i] = 0 + } + i++ if m.XXX_unrecognized != nil { i += copy(data[i:], m.XXX_unrecognized) } diff --git a/etcdserver2/etcdserverpb/etcdserver.proto b/etcdserver2/etcdserverpb/etcdserver.proto index 7e287507e..6031a8983 100644 --- a/etcdserver2/etcdserverpb/etcdserver.proto +++ b/etcdserver2/etcdserverpb/etcdserver.proto @@ -21,4 +21,5 @@ message Request { required uint64 since = 11 [(gogoproto.nullable) = false]; required bool recursive = 12 [(gogoproto.nullable) = false]; required bool sorted = 13 [(gogoproto.nullable) = false]; + required bool quorum = 14 [(gogoproto.nullable) = false]; } diff --git a/etcdserver2/server.go b/etcdserver2/server.go index 3647c5f6e..fcf1e706f 100644 --- a/etcdserver2/server.go +++ b/etcdserver2/server.go @@ -100,8 +100,11 @@ func (s *Server) Do(ctx context.Context, r pb.Request) (Response, error) { if r.Id == 0 { panic("r.Id cannot be 0") } + if r.Method == "GET" && r.Quorum { + r.Method = "QGET" + } switch r.Method { - case "POST", "PUT", "DELETE": + case "POST", "PUT", "DELETE", "QGET": data, err := r.Marshal() if err != nil { return Response{}, err @@ -165,6 +168,8 @@ func (s *Server) apply(ctx context.Context, r pb.Request) (*store.Event, error) default: return s.Store.Delete(r.Path, r.Recursive, r.Dir) } + case "QGET": + return s.Store.Get(r.Path, r.Recursive, r.Sorted) default: // This should never be reached, but just in case: return nil, ErrUnknownMethod