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, ":"); /* * 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; zpack.ParseFromString(returnStr); if (zpack.valnull()) val = ""; else val = zpack.val(); } return val; }