static void continue_task_when_peer_connected (CloneTask *task) { if (ccnet_peer_is_ready (seaf->ccnetrpc_client, task->peer_id)) { start_index_or_transfer (task->manager, task, NULL); } }
static void thread_done (void *result) { CcnetProcessor *processor = result; USE_PRIV; if (processor->delay_shutdown) { ccnet_processor_done (processor, FALSE); return; } if (strcmp (priv->rsp_code, SC_OK) == 0) { /* Repo is updated, trigger repo size computation. */ if (seaf->monitor_id != NULL && (strcmp (seaf->monitor_id, seaf->session->base.id) == 0 || ccnet_peer_is_ready (seaf->ccnetrpc_client, seaf->monitor_id))) { monitor_compute_repo_size_async_wrapper (seaf->monitor_id, priv->repo_id, compute_callback, NULL); } ccnet_processor_send_response (processor, SC_OK, SS_OK, NULL, 0); ccnet_processor_done (processor, TRUE); } else { ccnet_processor_send_response (processor, priv->rsp_code, priv->rsp_msg, NULL, 0); ccnet_processor_done (processor, FALSE); } }
static gboolean restart_task (sqlite3_stmt *stmt, void *data) { SeafCloneManager *mgr = data; const char *repo_id, *repo_name, *token, *peer_id, *worktree, *passwd; const char *peer_addr, *peer_port, *email; CloneTask *task; SeafRepo *repo; repo_id = (const char *)sqlite3_column_text (stmt, 0); repo_name = (const char *)sqlite3_column_text (stmt, 1); token = (const char *)sqlite3_column_text (stmt, 2); peer_id = (const char *)sqlite3_column_text (stmt, 3); worktree = (const char *)sqlite3_column_text (stmt, 4); passwd = (const char *)sqlite3_column_text (stmt, 5); peer_addr = (const char *)sqlite3_column_text (stmt, 6); peer_port = (const char *)sqlite3_column_text (stmt, 7); email = (const char *)sqlite3_column_text (stmt, 8); task = clone_task_new (repo_id, peer_id, repo_name, token, worktree, passwd, peer_addr, peer_port, email); task->manager = mgr; repo = seaf_repo_manager_get_repo (seaf->repo_mgr, repo_id); if (repo != NULL) { if (repo->head != NULL) { /* If repo exists and its head is set, we are done actually. * The task will be removed from db but still left in memory. */ transition_state (task, CLONE_STATE_DONE); g_hash_table_insert (mgr->tasks, g_strdup(task->repo_id), task); } else { /* If head is not set, we haven't finished checkout. */ g_hash_table_insert (mgr->tasks, g_strdup(task->repo_id), task); start_checkout (repo, task); } } else { /* Repo was not created last time. In this case, we just * restart from the very beginning. */ if (!ccnet_peer_is_ready (seaf->ccnetrpc_client, task->peer_id)) { /* the relay is not ready yet */ start_connect_task_relay (task, NULL); } else { start_index_or_transfer (mgr, task, NULL); } g_hash_table_insert (mgr->tasks, g_strdup(task->repo_id), task); } return TRUE; }
static char * add_task_common (SeafCloneManager *mgr, SeafRepo *repo, const char *repo_id, const char *peer_id, const char *repo_name, const char *token, const char *passwd, const char *worktree, const char *peer_addr, const char *peer_port, const char *email, GError **error) { CloneTask *task; task = clone_task_new (repo_id, peer_id, repo_name, token, worktree, passwd, peer_addr, peer_port, email); task->manager = mgr; if (save_task_to_db (mgr, task) < 0) { seaf_warning ("[Clone mgr] failed to save task.\n"); clone_task_free (task); return NULL; } if (repo != NULL && repo->head == NULL) { /* Repo was downloaded but not checked out. * This can happen when the last checkout failed, the user * can then clone the repo again. */ start_checkout (repo, task); } else if (!ccnet_peer_is_ready(seaf->ccnetrpc_client, task->peer_id)) { /* the relay is not connected yet */ start_connect_task_relay (task, error); } else { start_index_or_transfer (mgr, task, error); } /* The old task for this repo will be freed. */ g_hash_table_insert (mgr->tasks, g_strdup(task->repo_id), task); return g_strdup(repo_id); }