/* * 函 数:mq_sm_db_write_msg * 功 能:把msg_item消息写入到mq_queue队列中 * 返回值:成功返回true,失败返回false * * 步骤:1.检查文件剩余空间是否足够,如果不够则创建新的文件 * */ bool mq_sm_db_write_msg(mq_queue_t *mq_queue, msg_item_t *msg_item) { char* p; uint32_t temp_write_pos; //1.检查文件剩余空间是否足够,如果不够则创建新的文件 if (mq_queue->cur_wdb.pos + msg_item->len + MSG_HEAD_LEN > MAX_DB_FILE_SIZE) { log_debug("Current DB file write full; Get next DB file for write"); /* Write current status to data file befor close it */ //因为在文件创建时向文件写了个消息用于占位,所以在关闭文件之前会再次在文件头部点位的地方重写一条消息,记录当前文件总共写了多少条消息 if (mq_queue->cur_wdb.map_mem != NULL){ mq_sm_db_write_file_head(mq_queue); } pthread_mutex_lock(&(mq_queue->mutex)); if (!get_next_write_file(mq_queue)) { pthread_mutex_unlock(&(mq_queue->mutex)); log_error("Get next DB file fail"); return false; } pthread_mutex_unlock(&(mq_queue->mutex)); } log_debug("Write msg begin!"); temp_write_pos = mq_queue->cur_wdb.pos; p = mq_queue->cur_wdb.map_mem + temp_write_pos; //写入magic_num1 memcpy(p, &(msg_item->magic_num1), MSG_HEAD_OF_ONE_MAGIC_NUM_LEN); p += MSG_HEAD_OF_ONE_MAGIC_NUM_LEN; //写入magic_num2 memcpy(p, &(msg_item->magic_num2), MSG_HEAD_OF_ONE_MAGIC_NUM_LEN); p += MSG_HEAD_OF_ONE_MAGIC_NUM_LEN; //写入delay memcpy(p, &(msg_item->delay), MSG_HEAD_OF_DELAY_LEN); p += MSG_HEAD_OF_DELAY_LEN; //写入crc16 memcpy(p, &(msg_item->crc16), MSG_HEAD_OF_CRC16_LEN); p += MSG_HEAD_OF_CRC16_LEN; //写入消息长度值 memcpy(p, &(msg_item->len), MSG_HEAD_OF_MSGLEN_LEN); p += MSG_HEAD_OF_MSGLEN_LEN; //写入消息体 memcpy(p, msg_item->msg, msg_item->len); //修改偏移指针 mq_queue->cur_wdb.pos += (msg_item->len + MSG_HEAD_LEN); //增加写入的次数 mq_queue->cur_wdb.opt_count += 1; //增加写入的次数 mq_queue->put_num += 1; log_debug("Write msg seccuss!"); return true; }
/* Get next write file */ bool get_next_write_file(mq_queue_t *mq_queue) { uint64_t next_index; char new_db_fname[MAX_FULL_FILE_NAME_LEN + 1]; /* Check Storage Free */ if (get_storage_free(g_mq_conf.data_file_path) < g_mq_conf.res_store_space) { log_error("No space left on device, free storage [%d]GB", get_storage_free(g_mq_conf.data_file_path)); return false; } log_debug("Current: read db id[%"PRIu64"], write db id[%"PRIu64"]", mq_queue->cur_rdb.cur_index, mq_queue->cur_wdb.cur_index); next_index = mq_queue->cur_wdb.cur_index + 1; GEN_DATA_FULL_PATH_BY_QNAME_INDEX(new_db_fname, mq_queue->qname, next_index); /* If cur db file not bee read */ if (mq_queue->cur_wdb.cur_index > mq_queue->cur_rdb.cur_index) { /* Munmap and close readed db file */ msync(mq_queue->cur_wdb.map_mem, MAX_DB_FILE_SIZE, MS_SYNC); munmap(mq_queue->cur_wdb.map_mem, MAX_DB_FILE_SIZE); mq_queue->cur_wdb.flag = 0; close(mq_queue->cur_wdb.fd); } /* Creat a new write db file */ if((mq_queue->cur_wdb.map_mem = mq_sm_open_db_file(&mq_queue->cur_wdb.fd, new_db_fname, FOPEN_FLAG_CREATE)) == NULL) { log_warn("Open read data file[%s] fail", new_db_fname); return false; } log_debug("Creat new db file [%s], size[%d]", new_db_fname, get_file_size(new_db_fname)); mq_queue->cur_wdb.opt_count = 0; mq_queue->cur_wdb.flag = 1; mq_queue->cur_wdb.pos = DB_FILE_HEAD_LEN; mq_queue->cur_wdb.cur_index = next_index; /* Write the db file head befor Get new data file to write */ mq_sm_db_write_file_head(mq_queue); mq_sm_rtag_write_item(mq_queue); return true; }
/* Write mssage to DB file */ bool mq_sm_db_write_msg(mq_queue_t *mq_queue, msg_item_t *msg_item) { char* p; uint32_t temp_write_pos; if (mq_queue->cur_wdb.pos + msg_item->len + MSG_HEAD_LEN > MAX_DB_FILE_SIZE) { log_debug("Current DB file write full; Get next DB file for write"); /* Write current status to data file befor close it */ if (mq_queue->cur_wdb.map_mem != NULL){ mq_sm_db_write_file_head(mq_queue); } if (!get_next_write_file(mq_queue)) { log_error("Get next DB file fail"); return false; } } log_debug("Write msg begin!"); temp_write_pos = mq_queue->cur_wdb.pos; p = mq_queue->cur_wdb.map_mem + temp_write_pos; memcpy(p, &(msg_item->magic_num1), MSG_HEAD_OF_ONE_MAGIC_NUM_LEN); p += MSG_HEAD_OF_ONE_MAGIC_NUM_LEN; memcpy(p, &(msg_item->magic_num2), MSG_HEAD_OF_ONE_MAGIC_NUM_LEN); p += MSG_HEAD_OF_ONE_MAGIC_NUM_LEN; memcpy(p, &(msg_item->delay), MSG_HEAD_OF_DELAY_LEN); p += MSG_HEAD_OF_DELAY_LEN; memcpy(p, &(msg_item->crc16), MSG_HEAD_OF_CRC16_LEN); p += MSG_HEAD_OF_CRC16_LEN; memcpy(p, &(msg_item->len), MSG_HEAD_OF_MSGLEN_LEN); p += MSG_HEAD_OF_MSGLEN_LEN; memcpy(p, msg_item->msg, msg_item->len); mq_queue->cur_wdb.pos += (msg_item->len + MSG_HEAD_LEN); mq_queue->cur_wdb.opt_count += 1; mq_queue->put_num += 1; log_debug("Write msg seccuss!"); return true; }