void Handle (DHT& dht, const Host& host, const Packet& pckt) { Key k = pckt.GetArg<Key>(DHT_GET_KEY); pf_log[W_DHT] << "Get received with key " << k; if(dht.GetStorage()->hasKey(k)) { pf_log[W_DHT] << "Answer with data " << dht.GetStorage()->getInfo(k)->GetStr(); Packet get_ack(DHTGetAckType, dht.GetMe(), host.GetKey()); get_ack.SetArg(DHT_GET_ACK_KEY, k); get_ack.SetArg(DHT_GET_ACK_DATA, dht.GetStorage()->getInfo(k)); if(!dht.GetChimera()->Send(host, get_ack)) pf_log[W_DHT] << "Send get ACK message failed!"; return; } pf_log[W_DHT] << "Data not in cache, try to relay to a closest host."; if(!dht.GetChimera()->Route(pckt)) { pf_log[W_DHT] << "I'm the owner and the key is unknow, answer with GET_NACK."; Packet get_nack(DHTGetNAckType, dht.GetMe(), host.GetKey()); get_nack.SetArg(DHT_GET_NACK_KEY, k); if(!dht.GetChimera()->Send(host, get_nack)) pf_log[W_DHT] << "Send get NACK message failed!"; return; } pf_log[W_DHT] << "GET relayed."; }
void Handle (DHT& dht, const Host&, const Packet& pckt) { Key k = pckt.GetArg<Key>(DHT_UNPUBLISH_KEY); pf_log[W_DHT] << "Got Unpublish message for key " << k; Data *data = pckt.GetArg<Data*>(DHT_UNPUBLISH_DATA); pf_log[W_DHT] << "Data: " << data->GetStr(); try { dht.GetStorage()->removeInfo(k, data); } catch(Storage::WrongDataType e) { pf_log[W_DHT] << "Asked to remove wrong data type, abord."; return; } /* Repeat unpublish on redondancy hosts */ Packet replicate(DHTRepeatUType, dht.GetMe()); replicate.SetArg(DHT_REPEAT_U_KEY, k); replicate.SetArg(DHT_REPEAT_U_DATA, data); dht.GetChimera()->SendToNeighbours(dht.REDONDANCY, replicate); }