- 论坛徽章:
- 0
|
为了使 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 相应,总是超时呢? |
|