DSN_PY_API void* dsn_rpc_call_wait_helper(uint64_t addr, dsn_message_t msg, char *ss) { dsn_message_t resp = dsn_rpc_call_wait(*(dsn_address_t*)&addr, msg); void* ptr; size_t size; dsn_msg_read_next(resp, &ptr, &size); memcpy(ss, ptr, size); dsn_msg_read_commit(resp, size); return (void*)ss; }
bool command_manager::run_command(const safe_string& cmd, const safe_vector<safe_string>& args, /*out*/ safe_string& output) { command* h = nullptr; { utils::auto_read_lock l(_lock); auto it = _handlers.find(cmd); if (it != _handlers.end()) h = it->second; } if (h == nullptr) { output = safe_string("unknown command '") + cmd + "'"; return false; } else { if (h->address.is_invalid() || h->address == dsn::task::get_current_rpc()->primary_address()) { output = h->handler(args); return true; } else { ::dsn::rpc_read_stream response; dsn_message_t msg = dsn_msg_create_request(RPC_CLI_CLI_CALL); ::dsn::command rcmd; rcmd.cmd = cmd.c_str(); for (auto& e : args) { rcmd.arguments.emplace_back(e.c_str()); } ::dsn::marshall(msg, rcmd); auto resp = dsn_rpc_call_wait(h->address.c_addr(), msg); if (resp != nullptr) { std::string o2 = output.c_str(); ::dsn::unmarshall(resp, o2); return true; } else { dwarn("cli run for %s is too long, timeout", cmd.c_str()); return false; } } } }
bool command_manager::run_command(const std::string& cmd, const std::vector<std::string>& args, /*out*/ std::string& output) { command* h = nullptr; { utils::auto_read_lock l(_lock); auto it = _handlers.find(cmd); if (it != _handlers.end()) h = it->second; } if (h == nullptr) { output = std::string("unknown command '") + cmd + "'"; return false; } else { if (h->address.is_invalid() || h->address == dsn::task::get_current_rpc()->primary_address()) { output = h->handler(args); return true; } else { ::dsn::rpc_read_stream response; dsn_message_t msg = dsn_msg_create_request(RPC_DSN_CLI_CALL, 0, 0); ::marshall(msg, cmd); ::marshall(msg, args); auto resp = dsn_rpc_call_wait(h->address.c_addr(), msg); if (resp != nullptr) { response.set_read_msg(resp); unmarshall(response, output); return true; } else { dwarn("cli run for %s is too long, timeout", cmd.c_str()); return false; } } } }