static int inotify_new_task(t_task_base *base) { char httpheader[1024] = {0x0}; create_header(httpheader, base); int fd = active_connect(); if (fd < 0) { LOG(vfs_sig_log, LOG_ERROR, "connect err %m\n"); return -1; } return active_send(fd, httpheader); }
void check_task() { t_pfs_tasklist *task = NULL; int ret = 0; while (1) { ret = pfs_get_task(&task, TASK_Q_WAIT_TMP); if (ret != GET_TASK_Q_OK) { LOG(pfs_data_log, LOG_TRACE, "pfs_get_task get notihng %d\n", ret); break; } pfs_set_task(task, TASK_Q_WAIT); } while (1) { ret = pfs_get_task(&task, TASK_Q_SYNC_DIR_TMP); if (ret != GET_TASK_Q_OK) { LOG(pfs_data_log, LOG_TRACE, "pfs_get_task get notihng %d\n", ret); break; } pfs_set_task(task, TASK_Q_SYNC_DIR); } uint16_t once_run = 0; while (1) { once_run++; if (once_run >= g_config.max_task_run_once) return; ret = pfs_get_task(&task, TASK_Q_WAIT); if (ret != GET_TASK_Q_OK) { LOG(pfs_data_log, LOG_TRACE, "pfs_get_task get notihng %d\n", ret); ret = pfs_get_task(&task, TASK_Q_SYNC_DIR); if (ret != GET_TASK_Q_OK) return ; else LOG(pfs_data_log, LOG_DEBUG, "Process TASK_Q_SYNC_DIR!\n"); } t_task_sub *sub = &(task->task.sub); t_task_base *base = &(task->task.base); LOG(pfs_data_log, LOG_DEBUG, "%s be get from wait queue!\n", base->filename); if (base->retry > g_config.retry) { LOG(pfs_data_log, LOG_DEBUG, "%s too many try!\n", base->filename, base->retry, g_config.retry); base->overstatus = OVER_TOO_MANY_TRY; pfs_set_task(task, TASK_Q_FIN); continue; } if (base->fsize > 0 && check_localfile_md5(base, VIDEOFILE) == LOCALFILE_OK) { LOG(pfs_data_log, LOG_DEBUG, "%s check md5 ok!\n", base->filename); base->overstatus = OVER_OK; pfs_set_task(task, TASK_Q_FIN); continue; } pfs_cs_peer *peer = NULL; find_ip_stat(str2ip(sub->peerip), &peer, CON_ACTIVE, IDLE); if (sub->oper_type != OPER_GET_REQ && OPER_FROM_POSS != sub->oper_type) { LOG(pfs_data_log, LOG_ERROR, "%s:%d ERROR oper_type %d %s!\n", ID, LN, sub->oper_type, base->filename); base->overstatus = OVER_E_TYPE; pfs_set_task(task, TASK_Q_FIN); continue; } LOG(pfs_data_log, LOG_DEBUG, "%s is prepare OPER_GET_REQ from %s\n", base->filename, sub->peerip); if(check_disk_space(base) != DISK_OK) { LOG(pfs_data_log, LOG_DEBUG, "%s:%d filename[%s] DISK NOT ENOUGH SPACE!\n", ID, LN, base->filename); if (DISK_SPACE_TOO_SMALL == check_disk_space(base)) { if (sub->need_sync == TASK_SYNC_ISDIR) pfs_set_task(task, TASK_Q_SYNC_DIR_TMP); else pfs_set_task(task, TASK_Q_WAIT_TMP); } else { base->overstatus = OVER_DISK_ERR; pfs_set_task(task, TASK_Q_FIN); } continue; } if (peer == NULL) { int count = get_ip_connect_count(str2ip(sub->peerip)); if (count > g_config.max_data_connects) { LOG(pfs_data_log, LOG_DEBUG, "ip %s too many connect %d max %d\n", sub->peerip, count, g_config.max_data_connects); if (sub->need_sync == TASK_SYNC_ISDIR) pfs_set_task(task, TASK_Q_SYNC_DIR_TMP); else pfs_set_task(task, TASK_Q_WAIT_TMP); continue; } active_connect(sub->peerip); char *peerhost = sub->peerip; if (find_ip_stat(str2ip(peerhost), &peer, CON_ACTIVE, IDLE) != 0) { LOG(pfs_data_log, LOG_DEBUG, "%s be hung up because find_ip_stat error!\n", base->filename); if (sub->need_sync == TASK_SYNC_ISDIR) pfs_set_task(task, TASK_Q_SYNC_DIR_TMP); else pfs_set_task(task, TASK_Q_WAIT_TMP); continue; } } if (g_config.pfs_test) { LOG(pfs_data_log, LOG_NORMAL, "pfs run in test %s\n", base->filename); base->overstatus = OVER_OK; pfs_set_task(task, TASK_Q_FIN); continue; } t_pfs_sig_head h; t_pfs_sig_body b; sub->lastlen = 0; h.bodylen = sizeof(t_task_base); memcpy(b.body, base, sizeof(t_task_base)); h.cmdid = CMD_GET_FILE_REQ; h.status = FILE_SYNC_DST_2_SRC; active_send(peer, &h, &b); peer->sock_stat = PREPARE_RECVFILE; LOG(pfs_data_log, LOG_DEBUG, "fd[%d:%s] %s send get a file sock_stat [%s]!\n", peer->fd, sub->peerip, base->filename, sock_stat_cmd[peer->sock_stat]); pfs_set_task(task, TASK_Q_RECV); peer->recvtask = task; } }