in thrift/perf/cpp/AsyncClientWorker2.cpp [374:487]
void AsyncRunner2::genericCob(
LoadTestAsyncClient* client, ClientReceiveState&& rstate, OpData* opData) {
int64_t int64_result;
std::string string_result;
std::vector<BigStruct> container_result;
n_outstanding_--;
try {
switch (static_cast<apache::thrift::test::ClientLoadConfig::OperationEnum>(
opData->opType_)) {
case apache::thrift::test::ClientLoadConfig::OP_NOOP:
client->recv_noop(rstate);
break;
case apache::thrift::test::ClientLoadConfig::OP_ONEWAY_NOOP:
break;
case apache::thrift::test::ClientLoadConfig::OP_ASYNC_NOOP:
client->recv_asyncNoop(rstate);
break;
case apache::thrift::test::ClientLoadConfig::OP_SLEEP:
client->recv_sleep(rstate);
break;
case apache::thrift::test::ClientLoadConfig::OP_ONEWAY_SLEEP:
break;
case apache::thrift::test::ClientLoadConfig::OP_BURN:
client->recv_burn(rstate);
break;
case apache::thrift::test::ClientLoadConfig::OP_ONEWAY_BURN:
break;
case apache::thrift::test::ClientLoadConfig::OP_BAD_SLEEP:
client->recv_badSleep(rstate);
break;
case apache::thrift::test::ClientLoadConfig::OP_BAD_BURN:
client->recv_badBurn(rstate);
break;
case apache::thrift::test::ClientLoadConfig::OP_THROW_ERROR:
try {
client->recv_throwError(rstate);
T_ERROR("throwError() didn't throw any exception");
} catch (const LoadError& error) {
DCHECK_EQ(*error.code_ref(), opData->code);
}
break;
case apache::thrift::test::ClientLoadConfig::OP_THROW_UNEXPECTED:
try {
client->recv_throwUnexpected(rstate);
} catch (const TApplicationException&) {
// expected; do nothing
}
break;
case apache::thrift::test::ClientLoadConfig::OP_ONEWAY_THROW:
break;
case apache::thrift::test::ClientLoadConfig::OP_SEND:
client->recv_send(rstate);
break;
case apache::thrift::test::ClientLoadConfig::OP_ONEWAY_SEND:
break;
case apache::thrift::test::ClientLoadConfig::OP_RECV:
client->recv_recv(string_result, rstate);
break;
case apache::thrift::test::ClientLoadConfig::OP_SENDRECV:
client->recv_sendrecv(string_result, rstate);
break;
case apache::thrift::test::ClientLoadConfig::OP_ECHO:
client->recv_echo(string_result, rstate);
break;
case apache::thrift::test::ClientLoadConfig::OP_ADD:
int64_result = client->recv_add(rstate);
if (int64_result != opData->a + opData->b) {
T_ERROR(
"add(%" PRId64 ", %" PRId64 " gave wrong result %" PRId64
"(expected %" PRId64 ")",
opData->a,
opData->b,
int64_result,
opData->a + opData->b);
}
break;
case apache::thrift::test::ClientLoadConfig::OP_LARGE_CONTAINER: {
client->recv_largeContainer(rstate);
break;
}
case apache::thrift::test::ClientLoadConfig::OP_ITER_ALL_FIELDS: {
client->recv_iterAllFields(container_result, rstate);
break;
}
case apache::thrift::test::ClientLoadConfig::NUM_OPS:
// fall through
break;
// no default case, so gcc will warn us if a new op is added
// and this switch statement is not updated
}
} catch (const std::exception& ex) {
terminator_.decr();
T_ERROR("Unexpected exception: %s", ex.what());
scoreboard_->opFailed(opData->opType_);
// don't launch anymore
return;
}
scoreboard_->opSucceeded(opData->opType_);
if (ctr_ > 0) {
// launch more ops, attempt to keep between 1x and 2x n_async_ ops
// outstanding
if (n_outstanding_ <= n_async_) {
for (int i = 0; i < n_async_; i++) {
terminator_.incr();
performAsyncOperation();
}
}
}
terminator_.decr();
}