Exemple #1
0
bool TCPProxy::sendrecv(const void *sendbuf, const size_t sendcount,
		void *recvbuf, size_t &recvcount) {

	/*get client sock fd*/
	ZHTUtil zu;
	string msg((char*) sendbuf, sendcount);
	HostEntity he = zu.getHostEntityByKey(msg);

	int sock = getSockCached(he.host, he.port);

	reuseSock(sock);

	/*get mutex to protected shared socket*/
	pthread_mutex_t *sock_mutex = getSockMutex(he.host, he.port);
	LockGuard lock(sock_mutex);

	/*send message to server over client sock fd*/
	int sentSize = sendTo(sock, sendbuf, sendcount);
	int sent_bool = sentSize == sendcount;

	/*receive response from server over client sock fd*/
	recvcount = recvFrom(sock, recvbuf);
	int recv_bool = recvcount >= 0;

	/*combine flags as value to be returned*/
	return sent_bool && recv_bool;
}
string ZHTClient::getStringToLocalServer(int len) {

	string str = HashUtil::randomString(len);
	ZHTUtil zu;
	HostEntity he = zu.keyToHost(str);
	string destHost = he.host;

	string localIP = getIp();

	while (0 != localIP.compare(destHost)) {
		str = HashUtil::randomString(len);
		he = zu.keyToHost(str);
		destHost = he.host;
		cout << "destHost:"<<destHost << endl;
		cout << "localIP"<<localIP << endl;
	}
	return str;
}
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;
}