gfarm_error_t gfj_server_unregister(struct peer *peer, gfp_xdr_xid_t xid, size_t *sizep, int from_client, int skip) { char *user = peer_get_username(peer); gfarm_error_t e; gfarm_int32_t error; gfarm_int32_t job_id; static const char diag[] = "GFJ_PROTO_UNREGISTER"; e = gfj_server_get_request(peer, sizep, diag, "i", &job_id); if (e != GFARM_ERR_NO_ERROR) { gflog_debug(GFARM_MSG_1001692, "unregister request failure"); return (e); } if (skip) return (GFARM_ERR_NO_ERROR); if (!from_client) { error = GFARM_ERR_OPERATION_NOT_PERMITTED; gflog_debug(GFARM_MSG_1001693, "operation is not permitted for from_client"); } else { giant_lock(); error = job_table_remove(job_id, user, peer_get_jobs_ref(peer)); giant_unlock(); } return (gfj_server_put_reply(peer, xid, sizep, diag, error, "")); }
gfarm_error_t gfj_server_unregister(struct peer *peer, int from_client, int skip) { char *user = peer_get_username(peer); gfarm_error_t e; gfarm_int32_t error; gfarm_int32_t job_id; e = gfj_server_get_request(peer, "unregister", "i", &job_id); if (e != GFARM_ERR_NO_ERROR) return (e); if (skip) return (GFARM_ERR_NO_ERROR); if (!from_client) { error = GFARM_ERR_OPERATION_NOT_PERMITTED; } else { giant_lock(); error = job_table_remove(job_id, user, peer_get_jobs_ref(peer)); giant_unlock(); } return (gfj_server_put_reply(peer, "unregister", error, "")); }
gfarm_error_t gfj_server_register(struct peer *peer, gfp_xdr_xid_t xid, size_t *sizep, int from_client, int skip) { gfarm_error_t e; struct gfp_xdr *client = peer_get_conn(peer); char *user = peer_get_username(peer); int i, eof; gfarm_int32_t flags, total_nodes, argc, error, job_id = 0; struct gfarm_job_info *info; static const char diag[] = "GFJ_PROTO_REGISTER"; GFARM_MALLOC(info); if (info == NULL) { gflog_debug(GFARM_MSG_1001685, "allocation of gfarm_job_info failed"); return (GFARM_ERR_NO_MEMORY); } gfarm_job_info_clear(info, 1); e = gfj_server_get_request(peer, sizep, diag, "iisssi", &flags, &total_nodes, &info->job_type, &info->originate_host, &info->gfarm_url_for_scheduling, &argc); if (e != GFARM_ERR_NO_ERROR) { gflog_debug(GFARM_MSG_1001686, "gfj_server_get_request() failed"); return (e); } /* XXX - currently `flags' is just igored */ info->total_nodes = total_nodes; info->argc = argc; GFARM_MALLOC_ARRAY(info->argv, argc + 1); GFARM_MALLOC_ARRAY(info->nodes, total_nodes); if (info->argv == NULL || info->nodes == NULL) { gflog_debug(GFARM_MSG_1001687, "allocation of 'info->argv' or 'info->nodes' failed "); free(info->job_type); free(info->originate_host); free(info->gfarm_url_for_scheduling); if (info->argv != NULL) free(info->argv); if (info->nodes != NULL) free(info->nodes); free(info); return (GFARM_ERR_NO_MEMORY); } for (i = 0; i < argc; i++) { e = gfp_xdr_recv(client, 0, &eof, "s", &info->argv[i]); if (e != GFARM_ERR_NO_ERROR || eof) { gflog_debug(GFARM_MSG_1001688, "gfp_xdr_recv(info->argv[i]) failed"); if (e == GFARM_ERR_NO_ERROR) e = GFARM_ERR_PROTOCOL; while (--i >= 0) free(info->argv[i]); free(info->job_type); free(info->originate_host); free(info->gfarm_url_for_scheduling); free(info->argv); free(info->nodes); return (e); } } info->argv[i] = NULL; info->user = user; /* shared with file_table[].user */ for (i = 0; i < total_nodes; i++) { e = gfp_xdr_recv(client, 0, &eof, "s", &info->nodes[i].hostname); if (e != GFARM_ERR_NO_ERROR || eof) { gflog_debug(GFARM_MSG_1001689, "gfp_xdr_recv(hostname) failed"); if (e == GFARM_ERR_NO_ERROR) e = GFARM_ERR_PROTOCOL; while (--i >= 0) free(info->nodes[i].hostname); for (i = 0; i < argc; i++) free(info->argv[i]); free(info->job_type); free(info->originate_host); free(info->gfarm_url_for_scheduling); free(info->argv); free(info->nodes); return (e); } info->nodes[i].pid = 0; info->nodes[i].state = GFJ_NODE_NONE; } if (skip || !from_client) { for (i = 0; i < total_nodes; i++) free(info->nodes[i].hostname); for (i = 0; i < argc; i++) free(info->argv[i]); free(info->job_type); free(info->originate_host); free(info->gfarm_url_for_scheduling); free(info->argv); free(info->nodes); if (skip) return (GFARM_ERR_NO_ERROR); error = GFARM_ERR_OPERATION_NOT_PERMITTED; gflog_debug(GFARM_MSG_1001690, "operation is not permitted for from_client"); } else { giant_lock(); job_id = job_table_add(info, peer_get_jobs_ref(peer)); giant_unlock(); if (job_id < JOB_ID_MIN) { job_id = 0; error = GFARM_ERR_TOO_MANY_JOBS; gflog_debug(GFARM_MSG_1001691, "too many jobs"); } else { error = GFARM_ERR_NO_ERROR; } } return (gfj_server_put_reply(peer, xid, sizep, diag, error, "i", job_id)); }
gfarm_error_t gfj_server_register(struct peer *peer, int from_client, int skip) { gfarm_error_t e; struct gfp_xdr *client = peer_get_conn(peer); char *user = peer_get_username(peer); int i, eof; gfarm_int32_t flags, total_nodes, argc, error, job_id = 0; struct gfarm_job_info *info; GFARM_MALLOC(info); if (info == NULL) return (GFARM_ERR_NO_MEMORY); gfarm_job_info_clear(info, 1); e = gfj_server_get_request(peer, "register", "iisssi", &flags, &total_nodes, &info->job_type, &info->originate_host, &info->gfarm_url_for_scheduling, &argc); if (e != GFARM_ERR_NO_ERROR) return (e); /* XXX - currently `flags' is just igored */ info->total_nodes = total_nodes; info->argc = argc; GFARM_MALLOC_ARRAY(info->argv, argc + 1); GFARM_MALLOC_ARRAY(info->nodes, total_nodes); if (info->argv == NULL || info->nodes == NULL) { free(info->job_type); free(info->originate_host); free(info->gfarm_url_for_scheduling); if (info->argv != NULL) free(info->argv); if (info->nodes != NULL) free(info->nodes); free(info); return (GFARM_ERR_NO_MEMORY); } for (i = 0; i < argc; i++) { e = gfp_xdr_recv(client, 0, &eof, "s", &info->argv[i]); if (e != GFARM_ERR_NO_ERROR || eof) { if (e == GFARM_ERR_NO_ERROR) e = GFARM_ERR_PROTOCOL; while (--i >= 0) free(info->argv[i]); free(info->job_type); free(info->originate_host); free(info->gfarm_url_for_scheduling); free(info->argv); free(info->nodes); return (e); } } info->argv[i] = NULL; info->user = user; /* shared with file_table[].user */ for (i = 0; i < total_nodes; i++) { e = gfp_xdr_recv(client, 0, &eof, "s", &info->nodes[i].hostname); if (e != GFARM_ERR_NO_ERROR || eof) { if (e == GFARM_ERR_NO_ERROR) e = GFARM_ERR_PROTOCOL; while (--i >= 0) free(info->nodes[i].hostname); for (i = 0; i < argc; i++) free(info->argv[i]); free(info->job_type); free(info->originate_host); free(info->gfarm_url_for_scheduling); free(info->argv); free(info->nodes); return (e); } info->nodes[i].pid = 0; info->nodes[i].state = GFJ_NODE_NONE; } if (skip || !from_client) { for (i = 0; i < total_nodes; i++) free(info->nodes[i].hostname); for (i = 0; i < argc; i++) free(info->argv[i]); free(info->job_type); free(info->originate_host); free(info->gfarm_url_for_scheduling); free(info->argv); free(info->nodes); if (skip) return (GFARM_ERR_NO_ERROR); error = GFARM_ERR_OPERATION_NOT_PERMITTED; } else { giant_lock(); job_id = job_table_add(info, peer_get_jobs_ref(peer)); giant_unlock(); if (job_id < JOB_ID_MIN) { job_id = 0; error = GFARM_ERR_TOO_MANY_JOBS; } else { error = GFARM_ERR_NO_ERROR; } } return (gfj_server_put_reply(peer, "register", error, "i", job_id)); }