Browse Source

Merge pull request #18 from xiangli-cmu/master

combine testandset and set command
Xiang Li 12 years ago
parent
commit
c9561cacf0
3 changed files with 23 additions and 55 deletions
  1. 5 4
      README.md
  2. 18 50
      client_handlers.go
  3. 0 1
      etcd.go

+ 5 - 4
README.md

@@ -166,15 +166,16 @@ curl http://127.0.0.1:4001/v1/keys/testAndSet -d value=one
 ```
 
 Let's try an invaild `TestAndSet` command.
+We can give another parameter prevValue to set command to make it a TestAndSet command.
 
 ```sh
-curl http://127.0.0.1:4001/v1/testAndSet/testAndSet -d prevValue=two -d value=three
+curl http://127.0.0.1:4001/v1/keys/testAndSet -d prevValue=two -d value=three
 ```
 
 This will try to test if the previous of the key is two, it is change it to three.
 
-```html
-Test one==two fails
+```json
+{"errorCode":101,"message":"The given PrevValue is not equal to the value of the key","cause":"TestAndSet: one!=two"}
 ```
 
 which means `testAndSet` failed.
@@ -182,7 +183,7 @@ which means `testAndSet` failed.
 Let us try a vaild one.
 
 ```sh
-curl http://127.0.0.1:4001/v1/testAndSet/testAndSet -d prevValue=one -d value=two
+curl http://127.0.0.1:4001/v1/keys/testAndSet -d prevValue=one -d value=two
 ```
 
 The response should be

+ 18 - 50
client_handlers.go

@@ -37,23 +37,20 @@ func SetHttpHandler(w *http.ResponseWriter, req *http.Request) {
 
 	debug("[recv] POST http://%v/v1/keys/%s", raftServer.Name(), key)
 
-	command := &SetCommand{}
-	command.Key = key
-
-	command.Value = req.FormValue("value")
+	value := req.FormValue("value")
 
-	if len(command.Value) == 0 {
+	if len(value) == 0 {
 		(*w).WriteHeader(http.StatusBadRequest)
 
 		(*w).Write(newJsonError(200, "Set"))
 		return
 	}
 
-	strDuration := req.FormValue("ttl")
+	prevValue := req.FormValue("prevValue")
 
-	var err error
+	strDuration := req.FormValue("ttl")
 
-	command.ExpireTime, err = durationToExpireTime(strDuration)
+	expireTime, err := durationToExpireTime(strDuration)
 
 	if err != nil {
 
@@ -62,51 +59,22 @@ func SetHttpHandler(w *http.ResponseWriter, req *http.Request) {
 		(*w).Write(newJsonError(202, "Set"))
 	}
 
-	dispatch(command, w, req, true)
-
-}
-
-// TestAndSet handler
-func TestAndSetHttpHandler(w http.ResponseWriter, req *http.Request) {
-	key := req.URL.Path[len("/v1/testAndSet/"):]
+	if len(prevValue) != 0 {
+		command := &TestAndSetCommand{}
+		command.Key = key
+		command.Value = value
+		command.PrevValue = prevValue
+		command.ExpireTime = expireTime
+		dispatch(command, w, req, true)
 
-	debug("[recv] POST http://%v/v1/testAndSet/%s", raftServer.Name(), key)
-
-	command := &TestAndSetCommand{}
-	command.Key = key
-
-	command.PrevValue = req.FormValue("prevValue")
-	command.Value = req.FormValue("value")
-
-	if len(command.Value) == 0 {
-		w.WriteHeader(http.StatusBadRequest)
-
-		w.Write(newJsonError(200, "TestAndSet"))
-
-		return
-	}
-
-	if len(command.PrevValue) == 0 {
-		w.WriteHeader(http.StatusBadRequest)
-
-		w.Write(newJsonError(201, "TestAndSet"))
-		return
-	}
-
-	strDuration := req.FormValue("ttl")
-
-	var err error
-
-	command.ExpireTime, err = durationToExpireTime(strDuration)
-
-	if err != nil {
-		w.WriteHeader(http.StatusBadRequest)
-
-		w.Write(newJsonError(202, "TestAndSet"))
+	} else {
+		command := &SetCommand{}
+		command.Key = key
+		command.Value = value
+		command.ExpireTime = expireTime
+		dispatch(command, w, req, true)
 	}
 
-	dispatch(command, &w, req, true)
-
 }
 
 // Delete Handler

+ 0 - 1
etcd.go

@@ -372,7 +372,6 @@ func startClientTransport(port int, st int) {
 	// external commands
 	http.HandleFunc("/"+version+"/keys/", Multiplexer)
 	http.HandleFunc("/"+version+"/watch/", WatchHttpHandler)
-	http.HandleFunc("/"+version+"/testAndSet/", TestAndSetHttpHandler)
 	http.HandleFunc("/leader", LeaderHttpHandler)
 	http.HandleFunc("/machines", MachinesHttpHandler)