/** * * @brief 处理srch命令的函数 * * @param[in] cmd_no 命令号,一个函数可能处理多条命令,可以用命令号来区分 * @param[in] req_head 请求数据的nshead_t* * @param[in] req_buf 请求数据的buffer,本buffer不包含nshead_t * @param[out] res_head 应答数据的nshead_t* * @param[out] res_buf 应答数据的buffer,本buffer不包含nshead_t * @return * 0 : 成功 * -1 : 失败,socket将直接关闭,不给client返回错误信息 **/ STATIC int srch_process(int cmd_no, nshead_t * req_head, ub_buff_t * req_buf, nshead_t * res_head, ub_buff_t * res_buf) { /** *在打NOTICE日志时,请使用 ub_log_pushnotice 加入日志信息 *如果返回值不为0,将导致socket被直接关闭而不给客户返回任何信息 **/ srch_thread_data_t *p_thread_data; if(NULL == req_head || NULL == req_buf || NULL == res_head || NULL == res_buf) { UB_LOG_FATAL("parameter error in srch process."); return -1; } srch_reset_res(req_head, res_head, res_buf); char* req = req_buf->buf; char* res = res_buf->buf; res_head->body_len = 0; int response_buffer_size = ub_server_get_write_size() - sizeof (nshead_t); p_thread_data = (srch_thread_data_t* )ub_server_get_user_data(); if(NULL == p_thread_data) { UB_LOG_FATAL("thead_data null"); return -1; } int post_count = 0; int max_post_count = p_thread_data->max_post_count; u_int64_t* pids = p_thread_data->post_ids; delpost_record_t* records = p_thread_data->records; if (!unpack_data(req, req_head->body_len, post_count, pids, max_post_count)) { UB_LOG_WARNING("unpack mcpack error"); return -1; } int ret = query(post_count, pids, records, g_conf.mask_path, g_conf.index_file, g_conf.mask_file); if (ret < 0) { UB_LOG_WARNING("query[ret=%d] error", ret); return -1; } ret = pack_data(res, response_buffer_size, post_count, records); if (ret < 0) { UB_LOG_WARNING("pack mcpack error"); return -1; } res_head->body_len = ret; return 0; }
/** * @brief 主处理函数 * * @return int * @retval **/ int op_query() { int opret = 0; nshead_t *req_head; nshead_t *res_head; ub_buff_t req_buf; ub_buff_t res_buf; in_addr_t req_ip; req_head = (nshead_t *) ub_server_get_read_buf(); res_head = (nshead_t *) ub_server_get_write_buf(); if(NULL == req_head || NULL == res_head) { UB_LOG_FATAL("get req_head[%ld] || res_head[%ld] failed.", (long)req_head, (long)res_head); return -1; } req_buf.buf = (char *)(req_head + 1); req_buf.size = ub_server_get_read_size() - sizeof(nshead_t); res_buf.buf = (char *)(res_head + 1); res_buf.size = ub_server_get_write_size() - sizeof(nshead_t); //设置一些log需要的字段 char ip_str[20]; ip_str[0] = 0; req_ip = ub_server_get_ip(); inet_ntop(AF_INET, &req_ip, ip_str, sizeof(ip_str)); ub_log_setbasic(UB_LOG_REQIP, "%s", ip_str); ub_log_setbasic(UB_LOG_LOGID, "%u", req_head->log_id); ub_log_setbasic(UB_LOG_REQSVR, "%s", req_head->provider); ub_log_setbasic(UB_LOG_SVRNAME, "%s", g_cfg.svr_query.svr_name); ub_log_pushnotice("req_dlen", "%d", req_head->body_len); *res_head = *req_head; strncpy(res_head->provider, req_head->provider, sizeof(res_head->provider)); res_head->body_len = 0; res_head->reserved = 0; //处理查询 struct timeval total_s,total_e; gettimeofday(&total_s, NULL); opret = process_query(req_head, &req_buf, res_head, &res_buf); if(opret != 0){ UB_LOG_WARNING("[function:op_update]>>>process_query failed! errno:%d", opret); return -1; } gettimeofday(&total_e, NULL); ub_log_setbasic(UB_LOG_PROCTIME, "%luus", TIME_US_DIFF(total_s, total_e)); return opret; }
/** * * @brief srch的命令处理回调函数 * * @return * 0 : 成功 * -1 : 失败,socket将直接关闭,不给client返回错误信息 **/ int srch_cmdproc_callback() { nshead_t *req_head; nshead_t *res_head; ub_buff_t req_buf; ub_buff_t res_buf; int cmd_no = -1; int ret = 0; //获取请求和回复buffer req_head = (nshead_t *) ub_server_get_read_buf(); res_head = (nshead_t *) ub_server_get_write_buf(); if(NULL == req_head || NULL == res_head) { UB_LOG_FATAL("srch process callback get buffer error."); return -1; } //获取请求和回复实际数据 req_buf.buf = (char *) (req_head + 1); req_buf.size = ub_server_get_read_size() - sizeof (nshead_t); res_buf.buf = (char *) (res_head + 1); res_buf.size = ub_server_get_write_size() - sizeof (nshead_t); //取得命令号 cmd_no = ((srch_req_t *) (req_buf.buf))->cmd_no; //ub_server中设置了: UB_LOG_REQIP, UB_LOGID, UB_LOG_PROCTIME, UB_LOG_ERRNO ub_log_setbasic(UB_LOG_REQSVR, "%s", req_head->provider); ub_log_setbasic(UB_LOG_SVRNAME, "%s", g_conf.srch.svr_name); ub_log_setbasic(UB_LOG_CMDNO, "%d", cmd_no); //ret = ub_process_cmdmap(srch_CMD_MAP, cmd_no, req_head, &req_buf, res_head, &res_buf); ret = srch_process(cmd_no, req_head, &req_buf, res_head, &res_buf); return ret; }