Skip to content

Commit 8fedb77

Browse files
committed
remove redundant data on node join
1 parent 9b5a9b5 commit 8fedb77

File tree

3 files changed

+60
-4
lines changed

3 files changed

+60
-4
lines changed

http-handlers.go

+43-4
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ func homePageHandler(w http.ResponseWriter, r *http.Request) {
1212
http.NotFound(w, r)
1313
return
1414
}
15+
w.Header().Set("Content-Type", "application/json")
1516

1617
if r.Method == http.MethodGet {
1718
var requestBody KeyValuePair
@@ -30,7 +31,6 @@ func homePageHandler(w http.ResponseWriter, r *http.Request) {
3031
log.Printf("Trying to find the key %s in node %+v", requestKey, readFromNode)
3132
keyValuePair, err := readDataFromSpecificNode(readFromNode, requestKey)
3233

33-
w.Header().Set("Content-Type", "application/json")
3434
if err == nil {
3535
w.WriteHeader(http.StatusOK)
3636
err = json.NewEncoder(w).Encode(keyValuePair)
@@ -51,7 +51,6 @@ func homePageHandler(w http.ResponseWriter, r *http.Request) {
5151

5252
if body.Key == "" || body.Value == "" {
5353
responseMessage := ResponseMessage{false,"Key or value missing. No write or update performed"}
54-
w.Header().Set("Content-Type", "application/json")
5554
w.WriteHeader(http.StatusBadRequest)
5655
err = json.NewEncoder(w).Encode(responseMessage)
5756
return
@@ -77,20 +76,46 @@ func homePageHandler(w http.ResponseWriter, r *http.Request) {
7776
} else {
7877
log.Fatal(err)
7978
}
79+
} else if r.Method == http.MethodDelete {
80+
var requestBody KeyValuePair
81+
err := json.NewDecoder(r.Body).Decode(&requestBody)
82+
if err != nil {
83+
http.Error(w, err.Error(), http.StatusBadRequest)
84+
return
85+
}
86+
requestKey := requestBody.Key
87+
log.Println("Received request to delete key", requestKey)
88+
baseNode, err := addrToNode(CompleteBaseAddress())
89+
if err != nil {
90+
log.Fatal("Base node not found while searching for a key")
91+
}
92+
deleteFromNode := findNode(baseNode, requestKey)
93+
log.Printf("Trying to delete the key %s from node %+v", requestKey, deleteFromNode)
94+
respMessage, err := deleteDataFromSpecificNode(deleteFromNode, requestKey)
95+
96+
if err == nil {
97+
w.WriteHeader(http.StatusOK)
98+
err = json.NewEncoder(w).Encode(respMessage)
99+
if err != nil {
100+
log.Fatal(err)
101+
}
102+
} else {
103+
log.Fatal(err)
104+
}
80105
} else {
81106
http.Error(w, "Only use GET or PUT", http.StatusMethodNotAllowed)
82107
}
83108
}
84109

85110
func directDataLevelCommunicationHandler(w http.ResponseWriter, r *http.Request) {
111+
w.Header().Set("Content-Type", "application/json")
86112
if r.Method == http.MethodGet {
87113
var requestBody KeyValuePair
88114
err := json.NewDecoder(r.Body).Decode(&requestBody)
89115
if err != nil {
90116
http.Error(w, err.Error(), http.StatusBadRequest)
91117
return
92118
}
93-
w.Header().Set("Content-Type", "application/json")
94119
requestKey := requestBody.Key
95120
log.Printf("Checking if key %s is present in local store", requestKey)
96121
if val, ok := keyValueStore[requestKey]; ok {
@@ -116,7 +141,6 @@ func directDataLevelCommunicationHandler(w http.ResponseWriter, r *http.Request)
116141

117142
if body.Key == "" || body.Value == "" {
118143
responseMessage := ResponseMessage{false,"Key or value missing. No write or update performed"}
119-
w.Header().Set("Content-Type", "application/json")
120144
w.WriteHeader(http.StatusBadRequest)
121145
err = json.NewEncoder(w).Encode(responseMessage)
122146
return
@@ -130,6 +154,21 @@ func directDataLevelCommunicationHandler(w http.ResponseWriter, r *http.Request)
130154
if err != nil {
131155
log.Fatal(err)
132156
}
157+
} else if r.Method == http.MethodDelete {
158+
var requestBody KeyValuePair
159+
err := json.NewDecoder(r.Body).Decode(&requestBody)
160+
if err != nil {
161+
http.Error(w, err.Error(), http.StatusBadRequest)
162+
return
163+
}
164+
requestKey := requestBody.Key
165+
log.Printf("Attempting to delete key %s if present", requestKey)
166+
delete(keyValueStore, requestKey)
167+
w.WriteHeader(http.StatusOK)
168+
err = json.NewEncoder(w).Encode(ResponseMessage{true, fmt.Sprintf("Key %s deleted", requestKey)})
169+
if err != nil {
170+
log.Fatal(err)
171+
}
133172
} else {
134173
http.Error(w, "Only use GET or PUT", http.StatusMethodNotAllowed)
135174
}

http-requests.go

+16
Original file line numberDiff line numberDiff line change
@@ -73,6 +73,22 @@ func writeDataToSpecificNode(node Node, keyValuePair KeyValuePair) (ResponseMess
7373
return ResponseMessage{true, "Written"}, nil
7474
}
7575

76+
func deleteDataFromSpecificNode(node Node, key string) (ResponseMessage, error) {
77+
url := fmt.Sprintf("http://%s/server-data", node.Address)
78+
jsonData, _ := json.Marshal(KeyValuePair{key, ""})
79+
req, err := http.NewRequest(http.MethodDelete, url, bytes.NewBuffer(jsonData))
80+
req.Header.Set("Content-Type", "application/json")
81+
client := &http.Client{}
82+
resp, err := client.Do(req)
83+
if err != nil {
84+
log.Fatal(err)
85+
}
86+
if resp.StatusCode == http.StatusOK {
87+
return ResponseMessage{true, "Successfully deleted"}, nil
88+
}
89+
return ResponseMessage{false, "Delete failure"}, errors.New("delete failure")
90+
}
91+
7692
func getAllDataFromNode(node Node) []KeyValuePair {
7793
resp, err := http.Get(fmt.Sprintf("http://%s/data", node.Address))
7894
if err == nil {

main.go

+1
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,7 @@ func insertSelfAfter(oldNodeAddr string) {
4444
if util.RingDistance(node.ID, itemKeyHash, K) <
4545
util.RingDistance(prevNode.ID, itemKeyHash, K) {
4646
log.Printf("Copying %+v with hash %d from predecessor %d to self", item, itemKeyHash, prevNode.ID)
47+
deleteDataFromSpecificNode(prevNode, item.Key)
4748
keyValueStore[item.Key] = item.Value
4849
}
4950
}

0 commit comments

Comments
 (0)