Beispiel #1
0
/*
 * 函 数: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;
}
Beispiel #2
0
/* 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;
}
Beispiel #3
0
/* 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;
}