免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1403 | 回复: 0
打印 上一主题 下一主题

[FastDFS] 在 FDHT 中删除超时 KEY 对应的文件时出错 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2014-05-13 18:11 |只看该作者 |倒序浏览
为了使  FDFS 上的文件随着其在 FDHT 上对应的 KEY 超时而顺带删除,对 db_op.c 文件的  db_clear_expired_keys 函数做了如下改动:

int db_clear_expired_keys(void *arg)
{
        int db_index;
        DB *db;
        DBC *cursor;
        int result;
        DBT key;
        DBT value;
        char szKey[FDHT_MAX_NAMESPACE_LEN + FDHT_MAX_OBJECT_ID_LEN + \
                   FDHT_MAX_SUB_KEY_LEN + 2];
        char szValue[1024];
        time_t current_time;
        struct timeval tv_start;
        struct timeval tv_end;
        int64_t total_count;
        int64_t expired_count;
        int64_t success_count;
        int expires;

        // updated by huaxiufeng
        //get connction to a traker server
        ConnectionInfo *trackerServer = NULL;
        trackerServer = tracker_get_connection();
        if (trackerServer == NULL)
        {
                logError("failed to connect to tracker server!");
        }

        logInfo("Start %s!", __FUNCTION__);

        if (gettimeofday(&tv_start, NULL) != 0)
        {
                logError("file: "__FILE__", line: %d, " \
                        "call gettimeofday fail, errno: %d, error info: %s", \
                        __LINE__, errno, STRERROR(errno));

            if (trackerServer)
            {
                tracker_disconnect_server_ex(trackerServer, true);
            }

                return -1;
        }

        // .[s]. add for init fdfs client
//        char conf_buffer[256];
//        result = get_fdfs_client_conf(conf_buffer,
//                                      sizeof(conf_buffer),
//                                      trackerServer);
//
//        if(result < 0)
//        {
//            if (trackerServer)
//            {
//                tracker_disconnect_server_ex(trackerServer, true);
//            }
//
//            return -1;
//        }
//        else
//        {
//            logInfo("Start init client!", __FUNCTION__);
//            fdfs_client_init_from_buffer(conf_buffer);
//            logInfo("Finish init client!", __FUNCTION__);
//        }
        // .[e]. add for init fdfs client

        db_index = (long)arg;
        db = (DB *)(g_db_list[db_index]);
        if ((result=db->cursor(db, NULL, &cursor, 0)) != 0)
        {
                logError("file: "__FILE__", line: %d, " \
                        "db->cursor fail, errno: %d, error info: %s", \
                        __LINE__, result, db_strerror(result));

//                fdfs_client_destroy();

            if (trackerServer)
            {
                tracker_disconnect_server_ex(trackerServer, true);
            }

                return -1;
        }
       
        memset(&key, 0, sizeof(key));
        memset(&value, 0, sizeof(value));

        key.flags = DB_DBT_USERMEM;
        key.data = szKey;
        key.ulen = sizeof(szKey);

        value.flags = DB_DBT_USERMEM | DB_DBT_PARTIAL;
        value.data = szValue;
        value.ulen = sizeof(szValue);
        value.dlen = sizeof(szValue);

        total_count = 0;
        expired_count = 0;
        success_count = 0;
        current_time = tv_start.tv_sec;

        while (g_continue_flag && (result=cursor->get(cursor, &key, &value, \
                DB_NEXT)) == 0)
        {
                /*
                ((char *)key.data)[key.size] = '\0';
                logInfo("key=%s(%d), value=%d(%d)", (char *)key.data, key.size, \
                        buff2int((char *)value.data), value.size);
                */

                total_count++;

                expires = buff2int((char *)value.data);
                if (expires == FDHT_EXPIRES_NEVER || expires > current_time)
                {
                        continue;
                }

                expired_count++;
                if ((result=cursor->del(cursor, 0)) == 0)
                {
                        success_count++;
                }
                else
                {
                        logError("file: "__FILE__", line: %d, " \
                                "cursor->del fail, errno: %d, error info: %s", \
                                __LINE__, result, db_strerror(result));
                }
               
                // updated by huaxiufeng
                // delete the storage file
                if (trackerServer != NULL)
                {
                        const char *fileId = (const char*)value.data + 4;
                        if (0 == storage_file_exist1(trackerServer, NULL, fileId)) {
                                storage_delete_file1(trackerServer, NULL, fileId);
                                logInfo("delete file %s", fileId);
                        } else {
                                logInfo("can not find file %s", fileId);
                        }
                }
        }

        // updated by huaxiufeng
        // release the tracker connection
        if (trackerServer)
        {
                tracker_disconnect_server_ex(trackerServer, true);
        }

//        fdfs_client_destroy();
        cursor->close(cursor);

        gettimeofday(&tv_end, NULL);

        logInfo("clear expired keys, db %d, total count: "INT64_PRINTF_FORMAT \
                ", expired key count: "INT64_PRINTF_FORMAT \
                ", success count: "INT64_PRINTF_FORMAT \
                ", time used: %dms", db_index + 1, \
                total_count, expired_count, success_count, \
                (int)((tv_end.tv_sec - tv_start.tv_sec) * 1000 + \
                (tv_end.tv_usec - tv_start.tv_usec) / 1000));

        return success_count;
}

有 // updated by huaxiufeng 的地方是增加的代码,主要目的就是  storage_delete_file1(trackerServer, NULL, fileId); 顺便删除FDFS 上对应的文件
可在  storage_delete_file1 里,总是会停到

        if ((result=fdfs_recv_response(pStorageServer, \
                &pBuff, 0, &in_bytes)) != 0)
        {
            logInfo("ERROR: Get Response From[%s:%d], Data[%s , %d]" ,
                    pStorageServer->ip_addr, pStorageServer->port,
                    pBuff, in_bytes);

                break;
        }

这一句,一致收不到 StorageServer 返回的  Response,直到超时,出现如下 log:
ERROR - file: tracker_proto.c, line: 37, server: 10.101.10.210:23000, recv data fail, errno: 110, error info: Connection timed out

通过在 storage_service.c 中打 log, storage_deal_task 处理 storage_server_delete_file(pTask); 的过程 20ms 就完成了

按照 fdfs_delete_file.c 的样式,在 db_clear_expired_keys 中增加 fdfs_client_init_from_buffer(conf_buffer); 也还是会报超时错误

请问大牛为什么收不到 response 相应,总是超时呢?
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP