string HTWorker::lookup_shared(const ZPack &zpack) { string result; if (zpack.key().empty()) return Const::ZSC_REC_EMPTYKEY; //-1 string key = zpack.key(); string *ret = PMAP->get(key); if (ret == NULL) { printf("thread[%lu] DB Error: lookup found nothing\n", pthread_self()); fflush(stdout); result = Const::ZSC_REC_NONEXISTKEY; result.append("Empty"); } else { result = Const::ZSC_REC_SUCC; result.append(*ret); } return result; }
string HTWorker::remove_shared(const ZPack &zpack) { string result; if (zpack.key().empty()) return Const::ZSC_REC_EMPTYKEY; //-1 string key = zpack.key(); int ret = PMAP->remove(key); if (ret != 0) { printf("thread[%lu] DB Error: fail to remove, rcode = %d\n", pthread_self(), ret); fflush(stdout); result = Const::ZSC_REC_NONEXISTKEY; //-92 } else { if (_instant_swap) { PMAP->writeFileFG(); } result = Const::ZSC_REC_SUCC; //0, succeed. } return result; }
string HTWorker::append_shared(const ZPack &zpack) { string result; if (zpack.key().empty()) return Const::ZSC_REC_EMPTYKEY; //-1 string key = zpack.key(); int ret = PMAP->append(key, zpack.SerializeAsString()); if (ret != 0) { printf("thread[%lu] DB Error: fail to append, rcode = %d\n", pthread_self(), ret); fflush(stdout); result = Const::ZSC_REC_NONEXISTKEY; //-92 } else { if (_instant_swap) { PMAP->writeFile(); //PMAP->flushDbfile(); } result = Const::ZSC_REC_SUCC; //0, succeed. } return result; }
string HTWorker::run(const char *buf) { string result; ZPack zpack; string str(buf); zpack.ParseFromString(str); if (zpack.opcode() == Const::ZSC_OPC_LOOKUP) { result = lookup(zpack); } else if (zpack.opcode() == Const::ZSC_OPC_INSERT) { result = insert(zpack); } else if (zpack.opcode() == Const::ZSC_OPC_APPEND) { result = append(zpack); } else if (zpack.opcode() == Const::ZSC_OPC_CMPSWP) { result = compare_swap(zpack); } else if (zpack.opcode() == Const::ZSC_OPC_REMOVE) { result = remove(zpack); } else if (zpack.opcode() == Const::ZSC_OPC_STCHGCB) { result = state_change_callback(zpack); } else { result = Const::ZSC_REC_UOPC; } return result; }
string HTWorker::compare_swap_internal(const ZPack &zpack) { string ret; /*get Package stored by lookup*/ string lresult = lookup_shared(zpack); ZPack lzpack; lresult = erase_status_code(lresult); lzpack.ParseFromString(lresult); /*get seen_value passed in*/ string seen_value_passed_in = zpack.val(); /*get seen_value stored*/ string seen_value_stored = lzpack.val(); /* printf("{%s}:{%s,%s}\n", zpack.key().c_str(), zpack.val().c_str(), zpack.newval().c_str());*/ /*they are equivalent, compare and swap*/ if (!seen_value_passed_in.compare(seen_value_stored)) { lzpack.set_val(zpack.newval()); return insert_shared(lzpack); } else { return Const::ZSC_REC_SRVEXP; } }
string HTWorker::state_change_callback_internal(const ZPack &zpack) { string result; if (zpack.key().empty()) return Const::ZSC_REC_EMPTYKEY; //-1 string key = zpack.key(); string *ret = PMAP->get(key); if (ret == NULL) { printf("thread[%lu] DB Error: lookup found nothing\n", pthread_self()); fflush(stdout); result = Const::ZSC_REC_NONEXISTKEY; } else { ZPack rltpack; rltpack.ParseFromString(*ret); if (zpack.val() == rltpack.val()) { result = Const::ZSC_REC_SUCC; //0, succeed. } else { result = Const::ZSC_REC_SCCBPOLLTRY; } } return result; }
string ZHTClient::extract_value(const string &returnStr) { string val; //StrTokenizer strtok(returnStr, ":"); //StrTokenizer strtok(returnStr, ";"); /* * hello,zht:hello,ZHT ==> zht:ZHT * */ // if (strtok.has_more_tokens()) { // // while (strtok.has_more_tokens()) { // // ZPack zpack; // zpack.ParseFromString(strtok.next_token()); // // if (zpack.valnull()) // val.append(""); // else // val.append(zpack.val()); // // val.append(":"); // } // // size_t found = val.find_last_of(":"); // val = val.substr(0, found); // // } else { ZPack zpack = str_to_zpack(returnStr); //zpack.ParseFromString(returnStr); if (zpack.valnull()) val = ""; else val = zpack.val(); //} return val; }
string HTWorker::compare_swap(const ZPack &zpack) { if (zpack.key().empty()) return Const::ZSC_REC_EMPTYKEY; //-1 string result = compare_swap_internal(zpack); string lkpresult = lookup_shared(zpack); result.append(erase_status_code(lkpresult)); #ifdef SCCB _stub->sendBack(_addr, result.data(), result.size()); return ""; #else return result; #endif }
string ZHTClient::commonOpInternal(const string &opcode, const string &key, const string &val, const string &val2, string &result, int lease) { ZPack zpack; zpack.set_opcode(opcode); //"001": lookup, "002": remove, "003": insert, "004": append, "005", compare_swap zpack.set_replicanum(3); if (key.empty()) return Const::ZSC_REC_EMPTYKEY; //-1, empty key not allowed. else zpack.set_key(key); if (val.empty()) { zpack.set_val("^"); //coup, to fix ridiculous bug of protobuf! //to debug zpack.set_valnull(true); } else { zpack.set_val(val); zpack.set_valnull(false); } if (val2.empty()) { zpack.set_newval("?"); //coup, to fix ridiculous bug of protobuf! //to debug zpack.set_newvalnull(true); } else { zpack.set_newval(val2); zpack.set_newvalnull(false); } zpack.set_lease(Const::toString(lease)); string msg = zpack.SerializeAsString(); /*ZPack tmp; tmp.ParseFromString(msg); printf("{%s}:{%s,%s}\n", tmp.key().c_str(), tmp.val().c_str(), tmp.newval().c_str());*/ char *buf = (char*) calloc(_msg_maxsize, sizeof(char)); size_t msz = _msg_maxsize; /*send to and receive from*/ _proxy->sendrecv(msg.c_str(), msg.size(), buf, msz); /*...parse status and result*/ string sstatus; string srecv(buf); if (srecv.empty()) { sstatus = Const::ZSC_REC_SRVEXP; } else { result = srecv.substr(3); //the left, if any, is lookup result or second-try zpack sstatus = srecv.substr(0, 3); //status returned, the first three chars, like 001, -98... } free(buf); return sstatus; }
string ZHTClient::commonOpInternal(const string &opcode, const string &key, const string &val, const string &val2, string &result, int lease) { ZPack zpack; zpack.set_opcode(opcode); //"001": lookup, "002": remove, "003": insert, "004": append, "005", compare_swap zpack.set_replicanum(3); //cout<<"Op Code"<<opcode<<"Key"<<key<<endl; if (key.empty()) return Const::ZSC_REC_EMPTYKEY; //-1, empty key not allowed. else zpack.set_key(key); if (val.empty()) { zpack.set_val("^"); //coup, to fix ridiculous bug of protobuf! //to debug zpack.set_valnull(true); } else { zpack.set_val(val); zpack.set_valnull(false); } if (val2.empty()) { zpack.set_newval("?"); //coup, to fix ridiculous bug of protobuf! //to debug zpack.set_newvalnull(true); } else { zpack.set_newval(val2); zpack.set_newvalnull(false); } zpack.set_lease(Const::toString(lease)); //cout<<"lease "<<lease<<endl; string msg = zpack.SerializeAsString(); //cout<<msg<<endl; /*ZPack tmp; tmp.ParseFromString(msg); printf("{%s}:{%s,%s}\n", tmp.key().c_str(), tmp.val().c_str(), tmp.newval().c_str());*/ /* char *buf = (char*) calloc(_msg_maxsize, sizeof(char)); size_t msz = _msg_maxsize; */ /*send to and receive from*/ // this is old making large msg problem //_proxy->sendrecv(msg.c_str(), msg.size(), buf, msz); TCPProxy tcp; ZHTUtil zu; HostEntity he = zu.getHostEntityByKey(msg); int sock = tcp.getSockCached(he.host, he.port); tcp.sendTo(sock, (void*) msg.c_str(), msg.size()); string res; int recvcount = loopedrecv(sock, NULL, res); /*...parse status and result*/ string sstatus; // srecv is no longer used due to a large msg fix. now instead of sendrecv, //we are using sendto and loopedrecv methods /* string srecv(buf); cout<<"res value is "<<res<<endl; if (srecv.empty()) { cout<<"empty"<<endl; sstatus = Const::ZSC_REC_SRVEXP; } else { result = srecv.substr(3); //the left, if any, is lookup result or second-try zpack //cout<<"srecv string size="<<srecv.size()<<endl; if (srecv.size() == 36) { sstatus = srecv.substr(0, 36); //sstatus=Const::ZSC_REC_REMOVEMETADATAQUEUE; } else { sstatus = srecv.substr(0, 3); //status returned, the first three chars, like 001, -98... } } */ //cout<<"res value is "<<res<<endl; if (res.empty()) { //cout<<"empty"<<endl; sstatus = Const::ZSC_REC_SRVEXP; } else { result = res.substr(3); //the left, if any, is lookup result or second-try zpack //cout<<"srecv string size="<<srecv.size()<<endl; if (res.size() == 36) { sstatus = res.substr(0, 36); //sstatus=Const::ZSC_REC_REMOVEMETADATAQUEUE; } else { sstatus = res.substr(0, 3); //status returned, the first three chars, like 001, -98... } } // free(buf); return sstatus; }
string HTWorker::run(const char *buf) { string result; ZPack zpack; //string str(buf); string* str =(string*) buf; zpack.ParseFromString(*str); if(ZPack_Pack_type_BATCH_REQ == zpack.pack_type()){//batch cout << "HTWrorker::run(): ZPack_Pack_type_BATCH_REQ received."<< endl; cout << "Batch contains "<< zpack.batch_item_size() << " items."<<endl; cout <<"zpack.key: "<< zpack.key() <<endl; cout <<"zpack.batch_item(i).val: "<<zpack.batch_item(0).val() << endl<< endl; result = Const::ZSC_REC_UOPC; // "OK"; }else if(ZPack_Pack_type_SINGLE == zpack.pack_type()){//single if (zpack.opcode() == Const::ZSC_OPC_LOOKUP) { result = lookup(zpack); } else if (zpack.opcode() == Const::ZSC_OPC_INSERT) { result = insert(zpack); } else if (zpack.opcode() == Const::ZSC_OPC_APPEND) { result = append(zpack); } else if (zpack.opcode() == Const::ZSC_OPC_CMPSWP) { result = compare_swap(zpack); } else if (zpack.opcode() == Const::ZSC_OPC_REMOVE) { result = remove(zpack); } else if (zpack.opcode() == Const::ZSC_OPC_STCHGCB) { result = state_change_callback(zpack); } else { result = Const::ZSC_REC_UOPC; } } return result; }