From: <m-k...@us...> - 2012-05-28 07:30:48
|
Revision: 6338 http://gfarm.svn.sourceforge.net/gfarm/?rev=6338&view=rev Author: m-kasahr Date: 2012-05-28 07:30:41 +0000 (Mon, 28 May 2012) Log Message: ----------- Fix return codes of some protocol handlers in gfmd. They are now suitable for r6314 of 'doc/internal/ja/gfmd-internal.txt'. This patch also resolves #378, unexpectedly. Revision Links: -------------- http://gfarm.svn.sourceforge.net/gfarm/?rev=6314&view=rev Modified Paths: -------------- gfarm_v2/trunk/server/gfmd/fs.c gfarm_v2/trunk/server/gfmd/group.c gfarm_v2/trunk/server/gfmd/host.c gfarm_v2/trunk/server/gfmd/mdhost.c gfarm_v2/trunk/server/gfmd/xattr.c Modified: gfarm_v2/trunk/server/gfmd/fs.c =================================================================== --- gfarm_v2/trunk/server/gfmd/fs.c 2012-05-28 04:54:54 UTC (rev 6337) +++ gfarm_v2/trunk/server/gfmd/fs.c 2012-05-28 07:30:41 UTC (rev 6338) @@ -1724,12 +1724,14 @@ ret = gfm_server_get_request_with_vrelay( peer, sizep, skip, r, diag, "s", &cp->domain); - if (cp->domain == NULL) { + if (ret != GFARM_ERR_NO_ERROR) { + cp->req_error = ret; + } else if (cp->domain == NULL) { cp->req_error = GFARM_ERR_NO_MEMORY; } else if (*(cp->domain) != '\0') { cp->req_error = GFARM_ERR_FUNCTION_NOT_IMPLEMENTED; } else { - cp->req_error = ret; + cp->req_error = GFARM_ERR_NO_ERROR; } if (cp->req_error != GFARM_ERR_NO_ERROR) { @@ -1753,13 +1755,11 @@ GFM_PROTO_SCHEDULE_FILE_context *cp = (GFM_PROTO_SCHEDULE_FILE_context *)closure; gfarm_error_t ret = GFARM_ERR_UNKNOWN; - bool got_error = false; assert(cp != NULL); if (!skip) { gfarm_error_t rep_error = GFARM_ERR_UNKNOWN; - gfarm_error_t tmp; gfarm_int32_t i; if (mode != RELAY_TRANSFER) { @@ -1780,18 +1780,6 @@ * Check validness of the parameters just ONCE * in !RELAY_TRANSFER mode phase. */ - - rep_error = wait_db_update_info( - peer, DBUPDATE_HOST, diag); - if (rep_error != GFARM_ERR_NO_ERROR) { - gflog_error(GFARM_MSG_UNFIXED, - "%s: %s failed: %s", - diag, - "wait_db_update_info()", - gfarm_error_string(rep_error)); - goto calc_or_reply; - } - giant_lock(); if (!cp->from_client && @@ -1850,61 +1838,45 @@ } calc_or_reply: - tmp = gfm_server_put_reply_with_vrelay( + ret = gfm_server_put_reply_with_vrelay( peer, sizep, diag, "i", rep_error); + if (ret != GFARM_ERR_NO_ERROR) { + gflog_error(GFARM_MSG_UNFIXED, + "%s: %s failed: %s", + diag, + "gfm_server_put_reply_with_vrelay()", + gfarm_error_string(ret)); + goto done; + } if (rep_error != GFARM_ERR_NO_ERROR) { /* * Nothing to do anymore. */ - ret = tmp; goto done; } - /* - * Return the first reply error. - */ - if (tmp != GFARM_ERR_NO_ERROR) { - gflog_error(GFARM_MSG_UNFIXED, - "%s: %s failed: %s", - diag, - "gfm_server_put_reply_with_vrelay()", - gfarm_error_string(tmp)); - got_error = true; - } else { - ret = GFARM_ERR_NO_ERROR; - } - tmp = gfm_server_put_reply_with_vrelay( + ret = gfm_server_put_reply_with_vrelay( peer, sizep, diag, "i", cp->nhosts); - if (tmp != GFARM_ERR_NO_ERROR) { + if (ret != GFARM_ERR_NO_ERROR) { gflog_error(GFARM_MSG_UNFIXED, "%s: %s failed: %s", diag, "gfm_server_put_reply_with_vrelay()", - gfarm_error_string(tmp)); - if (got_error == false) { - ret = tmp; - got_error = true; - } - } else { - ret = GFARM_ERR_NO_ERROR; + gfarm_error_string(ret)); + goto done; } giant_lock(); for (i = 0; i < cp->nhosts; i++) { - tmp = host_schedule_reply_with_vrelay( + ret = host_schedule_reply_with_vrelay( cp->hosts[i], peer, sizep, diag); - if (tmp != GFARM_ERR_NO_ERROR) { + if (ret != GFARM_ERR_NO_ERROR) { gflog_error(GFARM_MSG_UNFIXED, "%s: %s failed: %s", diag, "host_schedule_reply_with_vrelay()", - gfarm_error_string(tmp)); - if (got_error == false) { - ret = tmp; - got_error = true; - } else { - ret = GFARM_ERR_NO_ERROR; - } + gfarm_error_string(ret)); + goto done; } } giant_unlock(); @@ -1937,11 +1909,13 @@ DBUPDATE_HOST, &c, diag); - GFM_PROTO_SCHEDULE_FILE_context_finalize(&c); if (e != GFARM_ERR_NO_ERROR) { gflog_debug(GFARM_MSG_UNFIXED, "%s: %s", diag, gfarm_error_string(e)); + } else { + e = c.rep_error; } + GFM_PROTO_SCHEDULE_FILE_context_finalize(&c); return (e); } @@ -4275,7 +4249,7 @@ gfm_server_replica_list_by_name(struct peer *peer, gfp_xdr_xid_t xid, size_t *sizep, int from_client, int skip) { - gfarm_error_t e = GFARM_ERR_NO_ERROR, e2; + gfarm_error_t e_ret, e_rpc; struct host *spool_host; struct process *process; int fd, i; @@ -4287,57 +4261,57 @@ if (skip) return (GFARM_ERR_NO_ERROR); - e = wait_db_update_info(peer, DBUPDATE_FS | DBUPDATE_HOST, diag); - if (e != GFARM_ERR_NO_ERROR) { + e_rpc = wait_db_update_info(peer, DBUPDATE_FS | DBUPDATE_HOST, diag); + if (e_rpc != GFARM_ERR_NO_ERROR) { gflog_error(GFARM_MSG_UNFIXED, "%s: failed to wait for the backend DB to be updated: %s", - diag, gfarm_error_string(e)); - /* Continue processing. */ + diag, gfarm_error_string(e_rpc)); } giant_lock(); - if (e != GFARM_ERR_NO_ERROR) { - ; /* Continue processing. */ + if (e_rpc != GFARM_ERR_NO_ERROR) { + ; } else if (!from_client && (spool_host = peer_get_host(peer)) == NULL) { gflog_debug(GFARM_MSG_1001948, "operation is not permitted"); - e = GFARM_ERR_OPERATION_NOT_PERMITTED; + e_rpc = GFARM_ERR_OPERATION_NOT_PERMITTED; } else if ((process = peer_get_process(peer)) == NULL) { gflog_debug(GFARM_MSG_1001949, "peer_get_process() failed"); - e = GFARM_ERR_OPERATION_NOT_PERMITTED; - } else if ((e = peer_fdpair_get_current(peer, &fd)) != + e_rpc = GFARM_ERR_OPERATION_NOT_PERMITTED; + } else if ((e_rpc = peer_fdpair_get_current(peer, &fd)) != GFARM_ERR_NO_ERROR) { gflog_debug(GFARM_MSG_1001950, "peer_fdpair_get_current() failed: %s", - gfarm_error_string(e)); - } else if ((e = process_get_file_inode(process, fd, &inode)) + gfarm_error_string(e_rpc)); + } else if ((e_rpc = process_get_file_inode(process, fd, &inode)) != GFARM_ERR_NO_ERROR) { gflog_debug(GFARM_MSG_1001951, "process_get_file_inode() failed: %s", - gfarm_error_string(e)); + gfarm_error_string(e_rpc)); } else - e2 = inode_replica_list_by_name(inode, &n, &hosts); + e_rpc = inode_replica_list_by_name(inode, &n, &hosts); giant_unlock(); - e2 = gfm_server_put_reply(peer, xid, sizep, diag, e, "i", n); - /* if network error doesn't happen, e2 == e here */ - if (e2 == GFARM_ERR_NO_ERROR) { + e_ret = gfm_server_put_reply(peer, xid, sizep, diag, e_rpc, "i", n); + if (e_ret == GFARM_ERR_NO_ERROR) { for (i = 0; i < n; ++i) { - e2 = gfp_xdr_send(peer_get_conn(peer), "s", hosts[i]); - if (e2 != GFARM_ERR_NO_ERROR) + e_ret = gfp_xdr_send(peer_get_conn(peer), "s", + hosts[i]); + if (e_ret != GFARM_ERR_NO_ERROR) break; } } - if (e == GFARM_ERR_NO_ERROR) { + if (e_rpc == GFARM_ERR_NO_ERROR) { for (i = 0; i < n; ++i) free(hosts[i]); free(hosts); } - return (e); + + return (e_ret); } gfarm_error_t @@ -4482,6 +4456,8 @@ */ struct replica_info_closure { gfarm_int32_t iflags; + gfarm_int32_t nhosts; + char **hosts; gfarm_error_t error; }; @@ -4489,6 +4465,8 @@ replica_info_closure_init(struct replica_info_closure *closure) { closure->iflags = 0; + closure->nhosts = 0; + closure->hosts = NULL; closure->error = GFARM_ERR_NO_ERROR; } @@ -4498,6 +4476,14 @@ return (closure->iflags); } +static void +replica_info_closure_get_hosts(struct replica_info_closure *closure, + gfarm_int32_t *nhosts, char ***hosts) +{ + *nhosts = closure->nhosts; + *hosts = closure->hosts; +} + static gfarm_error_t replica_info_closure_get_error(struct replica_info_closure *closure) { @@ -4505,17 +4491,37 @@ } static void -replica_info_closure_set_value(struct replica_info_closure *closure, - gfarm_int32_t iflags, gfarm_error_t e) +replica_info_closure_set_iflags(struct replica_info_closure *closure, + gfarm_int32_t iflags) { closure->iflags = iflags; +} + +static void +replica_info_closure_set_hosts(struct replica_info_closure *closure, + gfarm_int32_t nhosts, char **hosts) +{ + closure->nhosts = nhosts; + closure->hosts = hosts; +} + +static void +replica_info_closure_set_error(struct replica_info_closure *closure, + gfarm_error_t e) +{ closure->error = e; } static void replica_info_closure_term(struct replica_info_closure *closure) { - ; /* Nothing to do */ + gfarm_int32_t i; + + if (closure->hosts != NULL) { + for (i = 0; i < closure->nhosts; ++i) + free(closure->hosts[i]); + free(closure->hosts); + } } static gfarm_error_t @@ -4529,7 +4535,7 @@ e = gfm_server_get_request_with_vrelay(peer, sizep, skip, r, diag, "i", &iflags); if (mode != RELAY_TRANSFER) - replica_info_closure_set_value(closure, iflags, e); + replica_info_closure_set_iflags(closure, iflags); return (e); } @@ -4538,7 +4544,8 @@ struct peer *peer, size_t *sizep, int skip, void *closure, const char *diag) { - gfarm_error_t e = replica_info_closure_get_error(closure), e2; + gfarm_error_t e_ret; + gfarm_error_t e_rpc = replica_info_closure_get_error(closure); gfarm_int32_t iflags = replica_info_closure_get_iflags(closure); struct host *spool_host; struct process *process; @@ -4555,63 +4562,54 @@ return (GFARM_ERR_NO_ERROR); /* do not relay RPC to master gfmd */ - giant_lock(); - if (!from_client && (spool_host = peer_get_host(peer)) == NULL) { - if (e == GFARM_ERR_NO_ERROR) - e = GFARM_ERR_OPERATION_NOT_PERMITTED; - /* Continue processing. */ - } else if ((process = peer_get_process(peer)) == NULL) { - if (e == GFARM_ERR_NO_ERROR) - e = GFARM_ERR_OPERATION_NOT_PERMITTED; - /* Continue processing. */ - } else if ((e2 = peer_fdpair_get_current(peer, &fd)) != - GFARM_ERR_NO_ERROR) { - if (e == GFARM_ERR_NO_ERROR) - e = e2; - /* Continue processing. */ - } else if ((e2 = process_get_file_inode(process, fd, &inode)) - != GFARM_ERR_NO_ERROR) { - if (e == GFARM_ERR_NO_ERROR) - e = e2; - /* Continue processing. */ - } else if ((e2 = inode_replica_info_get(inode, iflags, &n, &hosts, - &gens, &oflags)) != GFARM_ERR_NO_ERROR) { - if (e == GFARM_ERR_NO_ERROR) - e = e2; - /* Continue processing. */ + if (mode == RELAY_TRANSFER) + replica_info_closure_get_hosts(closure, &n, &hosts); + else { + giant_lock(); + spool_host = peer_get_host(peer); + if (e_rpc != GFARM_ERR_NO_ERROR) + ; + else if (!from_client && spool_host == NULL) + e_rpc = GFARM_ERR_OPERATION_NOT_PERMITTED; + else if ((process = peer_get_process(peer)) == NULL) + e_rpc = GFARM_ERR_OPERATION_NOT_PERMITTED; + else if ((e_rpc = peer_fdpair_get_current(peer, &fd)) != + GFARM_ERR_NO_ERROR) + ; + else if ((e_rpc = process_get_file_inode(process, fd, + &inode)) != GFARM_ERR_NO_ERROR) + ; + else { + e_rpc = inode_replica_info_get(inode, iflags, &n, + &hosts, &gens, &oflags); + } + giant_unlock(); + replica_info_closure_set_error(closure, e_rpc); + /* + * It works fine even when inode_replica_info_get() has failed. + */ + replica_info_closure_set_hosts(closure, n, hosts); } - giant_unlock(); - e2 = gfm_server_put_reply_with_vrelay(peer, sizep, diag, "i", e); - if (e != GFARM_ERR_NO_ERROR || e2 != GFARM_ERR_NO_ERROR) { - if (e == GFARM_ERR_NO_ERROR) - e = e2; + e_ret = gfm_server_put_reply_with_vrelay(peer, sizep, diag, + "i", e_rpc); + if (e_ret != GFARM_ERR_NO_ERROR || e_rpc != GFARM_ERR_NO_ERROR) goto end; - } - e2 = gfm_server_put_reply_with_vrelay(peer, sizep, diag, "i", n); - if (e2 != GFARM_ERR_NO_ERROR) { - if (e == GFARM_ERR_NO_ERROR) - e = e2; + e_ret = gfm_server_put_reply_with_vrelay(peer, sizep, diag, "i", n); + if (e_ret != GFARM_ERR_NO_ERROR) goto end; - } for (i = 0; i < n; ++i) { - e2 = gfm_server_put_reply_with_vrelay(peer, sizep, diag, + e_ret = gfm_server_put_reply_with_vrelay(peer, sizep, diag, "sli", hosts[i], gens[i], oflags[i]); - if (e != GFARM_ERR_NO_ERROR) - break; + if (e_ret != GFARM_ERR_NO_ERROR) + goto end; } end: - if (hosts != NULL) { - for (i = 0; i < n; ++i) - free(hosts[i]); - free(hosts); - } free(gens); free(oflags); - - return (e); + return (e_ret); } gfarm_error_t @@ -4630,7 +4628,9 @@ diag)) != GFARM_ERR_NO_ERROR) { gflog_debug(GFARM_MSG_UNFIXED, "%s: %s", diag, gfarm_error_string(e)); - } + } else + e = replica_info_closure_get_error(&closure); + replica_info_closure_term(&closure); return (e); } Modified: gfarm_v2/trunk/server/gfmd/group.c =================================================================== --- gfarm_v2/trunk/server/gfmd/group.c 2012-05-28 04:54:54 UTC (rev 6337) +++ gfarm_v2/trunk/server/gfmd/group.c 2012-05-28 07:30:41 UTC (rev 6338) @@ -532,7 +532,7 @@ int from_client, int skip) { struct gfp_xdr *client = peer_get_conn(peer); - gfarm_error_t e; + gfarm_error_t e_ret, e_rpc; struct gfarm_hash_iterator it; gfarm_int32_t ngroups; struct group **gp; @@ -541,12 +541,11 @@ if (skip) return (GFARM_ERR_NO_ERROR); - e = wait_db_update_info(peer, DBUPDATE_GROUP, diag); - if (e != GFARM_ERR_NO_ERROR) { + e_rpc = wait_db_update_info(peer, DBUPDATE_GROUP, diag); + if (e_rpc != GFARM_ERR_NO_ERROR) { gflog_error(GFARM_MSG_UNFIXED, "%s: failed to wait for the backend DB to be updated: %s", - diag, gfarm_error_string(e)); - return (e); + diag, gfarm_error_string(e_rpc)); } /* XXX FIXME too long giant lock */ @@ -560,15 +559,15 @@ if (group_is_valid(*gp)) ++ngroups; } - /* XXXRELAY FIXME, reply size is not correct */ - e = gfm_server_put_reply(peer, xid, sizep, diag, - GFARM_ERR_NO_ERROR, "i", ngroups); - if (e != GFARM_ERR_NO_ERROR) { + + e_ret = gfm_server_put_reply(peer, xid, sizep, diag, e_rpc, + "i", ngroups); + if (e_ret != GFARM_ERR_NO_ERROR) { giant_unlock(); gflog_debug(GFARM_MSG_1001526, "gfm_server_put_reply(%s): %s", - diag, gfarm_error_string(e)); - return (e); + diag, gfarm_error_string(e_ret)); + return (e_ret); } for (gfarm_hash_iterator_begin(group_hashtab, &it); !gfarm_hash_iterator_is_end(&it); @@ -576,18 +575,18 @@ gp = gfarm_hash_entry_data(gfarm_hash_iterator_access(&it)); if (group_is_valid(*gp)) { /* XXXRELAY FIXME */ - e = group_info_send(client, *gp); - if (e != GFARM_ERR_NO_ERROR) { + e_ret = group_info_send(client, *gp); + if (e_ret != GFARM_ERR_NO_ERROR) { gflog_debug(GFARM_MSG_1001527, "group_info_send() failed: %s", - gfarm_error_string(e)); + gfarm_error_string(e_ret)); giant_unlock(); - return (e); + return (e_ret); } } } giant_unlock(); - return (GFARM_ERR_NO_ERROR); + return (e_ret); } gfarm_error_t @@ -785,7 +784,7 @@ struct peer *peer, size_t *sizep, int skip, struct relayed_request *r, void *closure, const char *diag) { - gfarm_error_t e = GFARM_ERR_NO_ERROR, e2; + gfarm_error_t e_ret, e_rpc = GFARM_ERR_NO_ERROR; struct gfarm_group_info *gi = NULL; int nusers; char *username; @@ -797,38 +796,32 @@ groupname = gi->groupname; nusers = gi->nusers; } - e2 = gfm_server_get_request_with_vrelay(peer, sizep, skip, r, diag, + e_ret = gfm_server_get_request_with_vrelay(peer, sizep, skip, r, diag, "si", &groupname, &nusers); - if (e2 != GFARM_ERR_NO_ERROR) { + if (e_ret != GFARM_ERR_NO_ERROR) { gflog_debug(GFARM_MSG_1001531, "%s request failure: %s", - diag, gfarm_error_string(e2)); - if (e == GFARM_ERR_NO_ERROR) - e = e2; - goto end; + diag, gfarm_error_string(e_ret)); + return (e_ret); } - if (nusers > 0 && mode != RELAY_TRANSFER) { - e2 = group_info_closure_alloc_nusers(closure, nusers); - if (e2 == GFARM_ERR_NO_ERROR) { + if (mode == RELAY_TRANSFER || nusers == 0) + free(groupname); + else { + e_rpc = group_info_closure_alloc_nusers(closure, nusers); + if (e_rpc == GFARM_ERR_NO_ERROR) { gi = group_info_closure_get_group_info(closure); gi->groupname = groupname; - } else { - if (e == GFARM_ERR_NO_ERROR) - e = e2; - /* Continue processing. */ } } for (i = 0; i < nusers; ++i) { username = NULL; - e2 = gfm_server_get_request_with_vrelay(peer, sizep, skip, r, - diag, "s", &username); - if (e2 != GFARM_ERR_NO_ERROR) { + e_ret = gfm_server_get_request_with_vrelay(peer, sizep, skip, + r, diag, "s", &username); + if (e_ret != GFARM_ERR_NO_ERROR) { gflog_debug(GFARM_MSG_1001533, "gfp_xdr_recv(usernames) failed: %s", - gfarm_error_string(e2)); + gfarm_error_string(e_ret)); free(username); - if (e2 == GFARM_ERR_NO_ERROR) - e = e2; - goto end; + return (e_ret); } if (mode == RELAY_TRANSFER || gi == NULL) { free(username); @@ -837,10 +830,8 @@ gi->usernames[i] = username; } -end: - if (e != GFARM_ERR_NO_ERROR) - group_info_closure_set_error(closure, e); - return (e); + group_info_closure_set_error(closure, e_rpc); + return (e_ret); } gfarm_error_t @@ -848,8 +839,8 @@ struct peer *peer, size_t *sizep, int skip, void *closure, const char *diag) { - gfarm_error_t e = group_info_closure_get_error(closure); - gfarm_error_t e2; + gfarm_error_t e_ret; + gfarm_error_t e_rpc = group_info_closure_get_error(closure); struct gfarm_group_info *gi = group_info_closure_get_group_info(closure); struct user *user = peer_get_user(peer); @@ -859,47 +850,48 @@ if (skip) return (GFARM_ERR_NO_ERROR); - giant_lock(); - if (e != GFARM_ERR_NO_ERROR) { - ; - } else if (!from_client || user == NULL || !user_is_admin(user)) { - gflog_debug(GFARM_MSG_1001535, - "operation is not permitted for user"); - if (e == GFARM_ERR_NO_ERROR) - e = GFARM_ERR_OPERATION_NOT_PERMITTED; - } else if (group_lookup(gi->groupname) != NULL) { - gflog_debug(GFARM_MSG_1001536, - "group already exists"); - if (e == GFARM_ERR_NO_ERROR) - e = GFARM_ERR_ALREADY_EXISTS; - } else if ((e2 = group_user_check(gi, diag)) != GFARM_ERR_NO_ERROR) { - gflog_debug(GFARM_MSG_1001537, - "group_user_check() failed: %s", - gfarm_error_string(e2)); - if (e == GFARM_ERR_NO_ERROR) - e = e2; - /* - * We have to call db_group_add() before group_info_add(), - * because group_info_add_and() frees the memory of 'gi'. - */ - } else if ((e2 = db_group_add(gi)) != GFARM_ERR_NO_ERROR) { - gflog_error(GFARM_MSG_1000254, - "failed to store group '%s' to storage: %s", - gi->groupname, gfarm_error_string(e2)); - if (e == GFARM_ERR_NO_ERROR) - e = e2; - } else { - e2 = group_info_add(gi); - if (e2 != GFARM_ERR_NO_ERROR) { - gflog_debug(GFARM_MSG_1002317, - "%s: group_info_add(): %s", - diag, gfarm_error_string(e2)); - if (e == GFARM_ERR_NO_ERROR) - e = e2; + if (mode != RELAY_TRANSFER) { + giant_lock(); + if (e_rpc != GFARM_ERR_NO_ERROR) { + ; + } else if (!from_client || user == NULL || + !user_is_admin(user)) { + gflog_debug(GFARM_MSG_1001535, + "operation is not permitted for user"); + e_rpc = GFARM_ERR_OPERATION_NOT_PERMITTED; + } else if (group_lookup(gi->groupname) != NULL) { + gflog_debug(GFARM_MSG_1001536, + "group already exists"); + e_rpc = GFARM_ERR_ALREADY_EXISTS; + } else if ((e_rpc = group_user_check(gi, diag)) + != GFARM_ERR_NO_ERROR) { + gflog_debug(GFARM_MSG_1001537, + "group_user_check() failed: %s", + gfarm_error_string(e_rpc)); + /* + * We have to call db_group_add() before + * group_info_add(), because group_info_add_and() + * frees the memory of 'gi'. + */ + } else if ((e_rpc = db_group_add(gi)) != GFARM_ERR_NO_ERROR) { + gflog_error(GFARM_MSG_1000254, + "failed to store group '%s' to storage: %s", + gi->groupname, gfarm_error_string(e_rpc)); + } else { + e_rpc = group_info_add(gi); + if (e_rpc != GFARM_ERR_NO_ERROR) { + gflog_debug(GFARM_MSG_1002317, + "%s: group_info_add(): %s", + diag, gfarm_error_string(e_rpc)); + } } + giant_unlock(); + group_info_closure_set_error(closure, e_rpc); } - giant_unlock(); - return (gfm_server_put_reply_with_vrelay(peer, sizep, diag, "i", e)); + + e_ret = gfm_server_put_reply_with_vrelay(peer, sizep, diag, + "i", e_rpc); + return (e_ret); } gfarm_error_t @@ -917,7 +909,9 @@ != GFARM_ERR_NO_ERROR) { gflog_debug(GFARM_MSG_UNFIXED, "%s: %s", diag, gfarm_error_string(e)); - } + } else + e = group_info_closure_get_error(&closure); + group_info_closure_term(&closure); return (e); } @@ -958,8 +952,8 @@ struct peer *peer, size_t *sizep, int skip, void *closure, const char *diag) { - gfarm_error_t e = group_info_closure_get_error(closure); - gfarm_error_t e2; + gfarm_error_t e_ret; + gfarm_error_t e_rpc = group_info_closure_get_error(closure); struct gfarm_group_info *gi = group_info_closure_get_group_info(closure); struct user *user = peer_get_user(peer); @@ -970,39 +964,41 @@ if (skip) return (GFARM_ERR_NO_ERROR); - giant_lock(); - if (e != GFARM_ERR_NO_ERROR) { - ; - } else if (!from_client || user == NULL || !user_is_admin(user)) { - gflog_debug(GFARM_MSG_1001540, - "operation is not permitted for user"); - if (e == GFARM_ERR_NO_ERROR) - e = GFARM_ERR_OPERATION_NOT_PERMITTED; - } else if ((group = group_lookup(gi->groupname)) == NULL) { - gflog_debug(GFARM_MSG_1001541, - "group_lookup() failed"); - if (e == GFARM_ERR_NO_ERROR) - e = GFARM_ERR_NO_SUCH_GROUP; - } else if ((e2 = group_user_check(gi, diag)) != GFARM_ERR_NO_ERROR) { - gflog_debug(GFARM_MSG_1001542, - "group_user_check() failed: %s", - gfarm_error_string(e2)); - if (e == GFARM_ERR_NO_ERROR) - e = e2; - } else { - group_modify(group, gi, diag); - /* change all entries */ - e2 = db_group_modify(gi, 0, 0, NULL, 0, NULL); - if (e2 != GFARM_ERR_NO_ERROR) { - gflog_error(GFARM_MSG_1000257, - "failed to modify group '%s' in db: %s", - gi->groupname, gfarm_error_string(e2)); - if (e == GFARM_ERR_NO_ERROR) - e = e2; + if (mode != RELAY_TRANSFER) { + giant_lock(); + if (e_rpc != GFARM_ERR_NO_ERROR) { + ; + } else if (!from_client || user == NULL || + !user_is_admin(user)) { + gflog_debug(GFARM_MSG_1001540, + "operation is not permitted for user"); + e_rpc = GFARM_ERR_OPERATION_NOT_PERMITTED; + } else if ((group = group_lookup(gi->groupname)) == NULL) { + gflog_debug(GFARM_MSG_1001541, + "group_lookup() failed"); + e_rpc = GFARM_ERR_NO_SUCH_GROUP; + } else if ((e_rpc = group_user_check(gi, diag)) + != GFARM_ERR_NO_ERROR) { + gflog_debug(GFARM_MSG_1001542, + "group_user_check() failed: %s", + gfarm_error_string(e_rpc)); + } else { + group_modify(group, gi, diag); + /* change all entries */ + e_rpc = db_group_modify(gi, 0, 0, NULL, 0, NULL); + if (e_rpc != GFARM_ERR_NO_ERROR) { + gflog_error(GFARM_MSG_1000257, + "failed to modify group '%s' in db: %s", + gi->groupname, gfarm_error_string(e_rpc)); + } } + giant_unlock(); + group_info_closure_set_error(closure, e_rpc); } - giant_unlock(); - return (gfm_server_put_reply_with_vrelay(peer, sizep, diag, "i", e)); + + e_ret = gfm_server_put_reply_with_vrelay(peer, sizep, diag, + "i", e_rpc); + return (e_ret); } gfarm_error_t @@ -1021,7 +1017,9 @@ != GFARM_ERR_NO_ERROR) { gflog_debug(GFARM_MSG_UNFIXED, "%s: %s", diag, gfarm_error_string(e)); - } + } else + e = group_info_closure_get_error(&closure); + group_info_closure_term(&closure); return (e); } Modified: gfarm_v2/trunk/server/gfmd/host.c =================================================================== --- gfarm_v2/trunk/server/gfmd/host.c 2012-05-28 04:54:54 UTC (rev 6337) +++ gfarm_v2/trunk/server/gfmd/host.c 2012-05-28 07:30:41 UTC (rev 6338) @@ -1284,22 +1284,30 @@ struct peer *peer, gfp_xdr_xid_t xid, size_t *sizep, int from_client, int skip) { - gfarm_error_t e; + gfarm_error_t e_ret, e_rpc; static const char diag[] = "GFM_PROTO_HOST_INFO_GET_ALL"; if (skip) return (GFARM_ERR_NO_ERROR); - e = wait_db_update_info(peer, DBUPDATE_HOST, diag); - if (e != GFARM_ERR_NO_ERROR) { + e_rpc = wait_db_update_info(peer, DBUPDATE_HOST, diag); + if (e_rpc != GFARM_ERR_NO_ERROR) { gflog_error(GFARM_MSG_UNFIXED, "%s: failed to wait for the backend DB to be updated: %s", - diag, gfarm_error_string(e)); - return (e); + diag, gfarm_error_string(e_rpc)); + return (e_rpc); } - return (gfm_server_host_info_get_common(peer, xid, sizep, - NULL, NULL, diag)); + if (e_rpc == GFARM_ERR_NO_ERROR) { + e_ret = gfm_server_host_info_get_common(peer, xid, sizep, + NULL, NULL, diag); + } else { + e_ret = gfm_server_put_reply(peer, xid, sizep, diag, e_rpc, + ""); + gflog_debug(GFARM_MSG_UNFIXED, "%s: gfm_server_put_reply: %s", + diag, gfarm_error_string(e_rpc)); + } + return (e_ret); } static int @@ -1315,33 +1323,39 @@ struct peer *peer, gfp_xdr_xid_t xid, size_t *sizep, int from_client, int skip) { - gfarm_error_t e; + gfarm_error_t e_ret, e_rpc; char *architecture; static const char diag[] = "GFM_PROTO_HOST_INFO_GET_BY_ARCHITECTURE"; - e = gfm_server_get_request(peer, sizep, diag, "s", &architecture); - if (e != GFARM_ERR_NO_ERROR) { + e_ret = gfm_server_get_request(peer, sizep, diag, "s", &architecture); + if (e_ret != GFARM_ERR_NO_ERROR) { gflog_debug(GFARM_MSG_UNFIXED, "gfm_server_get_request() failed: %s", - gfarm_error_string(e)); - return (e); + gfarm_error_string(e_ret)); + return (e_ret); } if (skip) { free(architecture); return (GFARM_ERR_NO_ERROR); } - e = wait_db_update_info(peer, DBUPDATE_HOST, diag); - if (e != GFARM_ERR_NO_ERROR) { + e_rpc = wait_db_update_info(peer, DBUPDATE_HOST, diag); + if (e_rpc != GFARM_ERR_NO_ERROR) { gflog_error(GFARM_MSG_UNFIXED, "%s: failed to wait for the backend DB to be updated: %s", - diag, gfarm_error_string(e)); - return (e); + diag, gfarm_error_string(e_rpc)); } - e = gfm_server_host_info_get_common(peer, xid, sizep, - arch_filter, architecture, diag); - return (e); + if (e_rpc == GFARM_ERR_NO_ERROR) { + e_ret = gfm_server_host_info_get_common(peer, xid, sizep, + arch_filter, architecture, diag); + } else { + e_ret = gfm_server_put_reply(peer, xid, sizep, diag, e_rpc, + ""); + gflog_debug(GFARM_MSG_UNFIXED, "%s: gfm_server_put_reply: %s", + diag, gfarm_error_string(e_rpc)); + } + return (e_ret); } gfarm_error_t @@ -1895,10 +1909,12 @@ /* * A null string is allowed as a domain name. */ - if (cp->domain == NULL) { + if (ret != GFARM_ERR_NO_ERROR) { + cp->req_error = ret; + } else if (cp->domain == NULL) { cp->req_error = GFARM_ERR_NO_MEMORY; } else { - cp->req_error = ret; + cp->req_error = GFARM_ERR_NO_ERROR; } if (cp->req_error != GFARM_ERR_NO_ERROR) { @@ -1949,13 +1965,11 @@ GFM_PROTO_SCHEDULE_HOST_DOMAIN_context *cp = (GFM_PROTO_SCHEDULE_HOST_DOMAIN_context *)closure; gfarm_error_t ret = GFARM_ERR_UNKNOWN; - bool got_error = false; assert(cp != NULL); if (!skip) { gfarm_error_t rep_error = GFARM_ERR_UNKNOWN; - gfarm_error_t tmp; gfarm_int32_t i; if (mode != RELAY_TRANSFER) { @@ -2003,61 +2017,45 @@ } calc_or_reply: - tmp = gfm_server_put_reply_with_vrelay( + ret = gfm_server_put_reply_with_vrelay( peer, sizep, diag, "i", rep_error); + if (ret != GFARM_ERR_NO_ERROR) { + gflog_error(GFARM_MSG_UNFIXED, + "%s: %s failed: %s", + diag, + "gfm_server_put_reply_with_vrelay()", + gfarm_error_string(ret)); + goto done; + } if (rep_error != GFARM_ERR_NO_ERROR) { /* * Nothing to do anymore. */ - ret = tmp; goto done; } - /* - * Return the first reply error. - */ - if (tmp != GFARM_ERR_NO_ERROR) { - gflog_error(GFARM_MSG_UNFIXED, - "%s: %s failed: %s", - diag, - "gfm_server_put_reply_with_vrelay()", - gfarm_error_string(tmp)); - got_error = true; - } else { - ret = GFARM_ERR_NO_ERROR; - } - tmp = gfm_server_put_reply_with_vrelay( + ret = gfm_server_put_reply_with_vrelay( peer, sizep, diag, "i", cp->nhosts); - if (tmp != GFARM_ERR_NO_ERROR) { + if (ret != GFARM_ERR_NO_ERROR) { gflog_error(GFARM_MSG_UNFIXED, "%s: %s failed: %s", diag, "gfm_server_put_reply_with_vrelay()", - gfarm_error_string(tmp)); - if (got_error == false) { - ret = tmp; - got_error = true; - } - } else { - ret = GFARM_ERR_NO_ERROR; + gfarm_error_string(ret)); + goto done; } giant_lock(); for (i = 0; i < cp->nhosts; i++) { - tmp = host_schedule_reply_with_vrelay( + ret = host_schedule_reply_with_vrelay( cp->hosts[i], peer, sizep, diag); - if (tmp != GFARM_ERR_NO_ERROR) { + if (ret != GFARM_ERR_NO_ERROR) { gflog_error(GFARM_MSG_UNFIXED, "%s: %s failed: %s", diag, "host_schedule_reply_with_vrelay()", - gfarm_error_string(tmp)); - if (got_error == false) { - ret = tmp; - got_error = true; - } else { - ret = GFARM_ERR_NO_ERROR; - } + gfarm_error_string(ret)); + goto done; } } giant_unlock(); Modified: gfarm_v2/trunk/server/gfmd/mdhost.c =================================================================== --- gfarm_v2/trunk/server/gfmd/mdhost.c 2012-05-28 04:54:54 UTC (rev 6337) +++ gfarm_v2/trunk/server/gfmd/mdhost.c 2012-05-28 07:30:41 UTC (rev 6338) @@ -899,9 +899,8 @@ return (n); } -/* PREREQUISITE: giant_lock */ static gfarm_error_t -metadb_server_get0(struct peer *peer, gfp_xdr_xid_t xid, size_t *sizep, +metadb_server_get(struct peer *peer, gfp_xdr_xid_t xid, size_t *sizep, int (*match_op)(struct mdhost *, void *), void *closure, const char *diag) { @@ -910,6 +909,7 @@ struct gfarm_hash_iterator it; struct mdhost *mh, **match; + giant_lock(); nhosts = mdhost_get_count(); assert(nhosts > 0); /* self host must be exist */ @@ -952,37 +952,11 @@ } } free(match); + giant_unlock(); return (e2); } -static gfarm_error_t -metadb_server_get(struct peer *peer, gfp_xdr_xid_t xid, size_t *sizep, - int (*match_op)(struct mdhost *, void *), void *closure, - const char *diag) -{ - gfarm_error_t e; - - if (!gfarm_get_metadb_replication_enabled()) { - e = gfm_server_put_reply(peer, xid, sizep, diag, - GFARM_ERR_OPERATION_NOT_PERMITTED, ""); - /* - * if network error doesn't happen, - * e == GFARM_ERR_OPERATION_NOT_PERMITTED here - */ - gflog_debug(GFARM_MSG_1002937, - "%s: gfm_server_put_reply: %s", - diag, gfarm_error_string(e)); - return (e); - } - - giant_lock(); - e = metadb_server_get0(peer, xid, sizep, match_op, closure, diag); - giant_unlock(); - - return (e); -} - static int match_all(struct mdhost *mh, void *closure) { @@ -1000,35 +974,44 @@ struct peer *peer, gfp_xdr_xid_t xid, size_t *sizep, int from_client, int skip) { - gfarm_error_t e = GFARM_ERR_NO_ERROR; + gfarm_error_t e_ret, e_rpc; char *name = NULL; static const char diag[] = "GFM_PROTO_METADB_SERVER_GET"; - e = gfm_server_get_request(peer, sizep, diag, "s", &name); - if (e != GFARM_ERR_NO_ERROR) { + e_ret = gfm_server_get_request(peer, sizep, diag, "s", &name); + if (e_ret != GFARM_ERR_NO_ERROR) { gflog_debug(GFARM_MSG_UNFIXED, "gfm_server_get_request() failed: %s", - gfarm_error_string(e)); + gfarm_error_string(e_ret)); goto end; } if (skip) { - e = GFARM_ERR_NO_ERROR; + e_ret = GFARM_ERR_NO_ERROR; goto end; } - e = wait_db_update_info(peer, DBUPDATE_HOST, diag); - if (e != GFARM_ERR_NO_ERROR) { + if (!gfarm_get_metadb_replication_enabled()) + e_rpc = GFARM_ERR_OPERATION_NOT_PERMITTED; + else if ((e_rpc = wait_db_update_info(peer, DBUPDATE_HOST, diag)) + != GFARM_ERR_NO_ERROR) { gflog_error(GFARM_MSG_UNFIXED, "%s: failed to wait for the backend DB to be updated: %s", - diag, gfarm_error_string(e)); - goto end; + diag, gfarm_error_string(e_rpc)); } - e = metadb_server_get(peer, xid, sizep, match_hostname, name, diag); + if (e_rpc == GFARM_ERR_NO_ERROR) { + e_ret = metadb_server_get(peer, xid, sizep, match_hostname, + name, diag); + } else { + e_ret = gfm_server_put_reply(peer, xid, sizep, diag, e_rpc, + ""); + gflog_debug(GFARM_MSG_1002937, "%s: gfm_server_put_reply: %s", + diag, gfarm_error_string(e_rpc)); + } end: free(name); - return (e); + return (e_ret); } #ifdef DEBUG_MDCLUSTER @@ -1045,28 +1028,36 @@ struct peer *peer, gfp_xdr_xid_t xid, size_t *sizep, int from_client, int skip) { - gfarm_error_t e; + gfarm_error_t e_ret, e_rpc; static const char diag[] = "GFM_PROTO_METADB_SERVER_GET_ALL"; - e = gfm_server_get_request(peer, sizep, diag, ""); - if (e != GFARM_ERR_NO_ERROR) - return (e); + e_ret = gfm_server_get_request(peer, sizep, diag, ""); + if (e_ret != GFARM_ERR_NO_ERROR) + return (e_ret); if (skip) return (GFARM_ERR_NO_ERROR); #ifdef DEBUG_CLUSTER mdcluster_foreach(mdcluster_dump, NULL); #endif - e = wait_db_update_info(peer, DBUPDATE_HOST, diag); - if (e != GFARM_ERR_NO_ERROR) { + e_rpc = wait_db_update_info(peer, DBUPDATE_HOST, diag); + if (e_rpc != GFARM_ERR_NO_ERROR) { gflog_error(GFARM_MSG_UNFIXED, "%s: failed to wait for the backend DB to be updated: %s", - diag, gfarm_error_string(e)); - return (e); + diag, gfarm_error_string(e_rpc)); } - e = metadb_server_get(peer, xid, sizep, match_all, NULL, diag); - return (e); + if (e_rpc == GFARM_ERR_NO_ERROR) { + e_ret = metadb_server_get(peer, xid, sizep, match_all, + NULL, diag); + } else { + e_ret = gfm_server_put_reply(peer, xid, sizep, diag, e_rpc, + ""); + gflog_debug(GFARM_MSG_UNFIXED, "%s: gfm_server_put_reply: %s", + diag, gfarm_error_string(e_rpc)); + } + + return (e_ret); } static gfarm_error_t Modified: gfarm_v2/trunk/server/gfmd/xattr.c =================================================================== --- gfarm_v2/trunk/server/gfmd/xattr.c 2012-05-28 04:54:54 UTC (rev 6337) +++ gfarm_v2/trunk/server/gfmd/xattr.c 2012-05-28 07:30:41 UTC (rev 6338) @@ -1324,7 +1324,7 @@ gfm_server_findxmlattr(struct peer *peer, gfp_xdr_xid_t xid, size_t *sizep, int from_client, int skip) { - gfarm_error_t e; + gfarm_error_t e_ret, e_rpc; static const char diag[] = "GFM_PROTO_XMLATTR_FIND"; char *expr = NULL, *ck_path = NULL, *ck_name = NULL; int depth, nalloc; @@ -1336,13 +1336,13 @@ struct inum_path_array *array = NULL; #endif - e = gfm_server_get_request(peer, sizep, diag, - "siiss", &expr, &depth, &nalloc, &ck_path, &ck_name); - if (e != GFARM_ERR_NO_ERROR) { + e_ret = gfm_server_get_request(peer, sizep, diag, + "siiss", &expr, &depth, &nalloc, &ck_path, &ck_name); + if (e_ret != GFARM_ERR_NO_ERROR) { gflog_debug(GFARM_MSG_1002110, - "%s request failed: %s", - diag, gfarm_error_string(e)); - return (e); + "%s request failed: %s", + diag, gfarm_error_string(e_ret)); + return (e_ret); } if (skip) { free(expr); @@ -1352,19 +1352,15 @@ } #ifdef ENABLE_XMLATTR - e = wait_db_update_info(peer, DBUPDATE_XMLATTR, diag); - if (e != GFARM_ERR_NO_ERROR) { + if ((e_rpc = wait_db_update_info(peer, DBUPDATE_XMLATTR, diag)) + != GFARM_ERR_NO_ERROR) { gflog_error(GFARM_MSG_UNFIXED, "%s: failed to wait for the backend DB to be updated: %s", - diag, gfarm_error_string(e)); - goto quit; - } - - if ((ctxp = gfs_xmlattr_ctx_alloc(nalloc)) == NULL) { - e = GFARM_ERR_NO_MEMORY; + diag, gfarm_error_string(e_rpc)); + } else if ((ctxp = gfs_xmlattr_ctx_alloc(nalloc)) == NULL) { + e_rpc = GFARM_ERR_NO_MEMORY; gflog_debug(GFARM_MSG_1002111, - "allocation of 'ctxp' failed"); - goto quit; + "allocation of 'ctxp' failed"); } ctxp->expr = expr; ctxp->depth = depth; @@ -1372,48 +1368,50 @@ ctxp->cookie_attrname = ck_name; giant_lock(); - if ((process = peer_get_process(peer)) == NULL) { - e = GFARM_ERR_OPERATION_NOT_PERMITTED; + if (e_rpc != GFARM_ERR_NO_ERROR) { + ; + } else if ((process = peer_get_process(peer)) == NULL) { + e_rpc = GFARM_ERR_OPERATION_NOT_PERMITTED; gflog_debug(GFARM_MSG_1002112, "peer_get_process() failed :%s", - gfarm_error_string(e)); - } else if ((e = peer_fdpair_get_current(peer, &fd)) != + gfarm_error_string(e_rpc)); + } else if ((e_rpc = peer_fdpair_get_current(peer, &fd)) != GFARM_ERR_NO_ERROR) { gflog_debug(GFARM_MSG_1002113, "peer_fdpair_get_current() failed: %s", - gfarm_error_string(e)); - } else if ((e = process_get_file_inode(process, fd, &inode)) != + gfarm_error_string(e_rpc)); + } else if ((e_rpc = process_get_file_inode(process, fd, &inode)) != GFARM_ERR_NO_ERROR) { gflog_debug(GFARM_MSG_1002114, "process_get_file_inode() failed: %s", - gfarm_error_string(e)); + gfarm_error_string(e_rpc)); } - if (e == GFARM_ERR_NO_ERROR) { + + if (e_rpc == GFARM_ERR_NO_ERROR) { // giant_unlock() is called in findxmlattr() - e = findxmlattr(peer, inode, ctxp, &array); + e_rpc = findxmlattr(peer, inode, ctxp, &array); } else giant_unlock(); -quit: - if ((e = gfm_server_put_reply(peer, xid, sizep, diag, e, "ii", + if ((e_ret = gfm_server_put_reply(peer, xid, sizep, diag, e_rpc, "ii", ctxp->eof, ctxp->nvalid)) == GFARM_ERR_NO_ERROR) { for (i = 0; i < ctxp->nvalid; i++) { - e = gfp_xdr_send(peer_get_conn(peer), "ss", + e_ret = gfp_xdr_send(peer_get_conn(peer), "ss", ctxp->entries[i].path, ctxp->entries[i].attrname); - if (e != GFARM_ERR_NO_ERROR) { + if (e_ret != GFARM_ERR_NO_ERROR) { gflog_warning(GFARM_MSG_1000420, "%s@%s: findxmlattr: %s", peer_get_username(peer), peer_get_hostname(peer), - gfarm_error_string(e)); + gfarm_error_string(e_ret)); break; } } } inum_path_array_free(array); gfs_xmlattr_ctx_free(ctxp, 0); - return e; + return (e_ret); #else free(expr); free(ck_path); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |