From: <sot...@us...> - 2012-02-14 11:30:09
|
Revision: 5927 http://gfarm.svn.sourceforge.net/gfarm/?rev=5927&view=rev Author: sotoyama Date: 2012-02-14 11:29:56 +0000 (Tue, 14 Feb 2012) Log Message: ----------- implement part of #287 - inter-gfmd RPC forwarding reduce redundant code segments of following functions by replacing stubs with those which r5923 added - gfm_server_seek() - gfm_server_host_info_get_by_architecture() - gfm_server_host_info_set - gfm_server_host_info_modify() - gfm_server_host_info_remove - gfm_server_user_info_set() - gfm_server_user_info_modify() - gfm_server_user_info_remove() - gfm_server_user_info_get_by_gsi_dn() - gfm_server_group_info_remove() add request from slave to master and reply to these functions - gfm_server_compound_begin() - gfm_server_compound_end() - gfm_server_compound_on_error() skip - gfm_server_get_fd() - gfm_server_put_fd() - gfm_server_save_fd() - gfm_server_restore_fd() - gfm_server_create() - gfm_server_open() - gfm_server_open_root() - gfm_server_open_parent() - gfm_server_close()user Revision Links: -------------- http://gfarm.svn.sourceforge.net/gfarm/?rev=5923&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/user.c Modified: gfarm_v2/trunk/server/gfmd/fs.c =================================================================== --- gfarm_v2/trunk/server/gfmd/fs.c 2012-02-14 08:56:31 UTC (rev 5926) +++ gfarm_v2/trunk/server/gfmd/fs.c 2012-02-14 11:29:56 UTC (rev 5927) @@ -47,28 +47,46 @@ gfm_server_compound_begin(struct peer *peer, gfp_xdr_xid_t xid, size_t *sizep, int from_client, int skip, int level) { - gfarm_error_t e = GFARM_ERR_NO_ERROR; + gfarm_error_t e; + struct relayed_request *relay; static const char diag[] = "GFM_PROTO_COMPOUND_BEGIN"; + e = gfm_server_get_request_with_relay(peer, sizep, skip, &relay, diag, + GFM_PROTO_COMPOUND_BEGIN, ""); + if (e != GFARM_ERR_NO_ERROR) + return (e); if (skip) return (GFARM_ERR_NO_ERROR); - if (level > 0) /* We don't allow nesting */ - e = GFARM_ERR_INVALID_ARGUMENT; - return (gfm_server_put_reply(peer, xid, sizep, diag, e, "")); + + if (relay == NULL) { + if (level > 0) /* We don't allow nesting */ + e = GFARM_ERR_INVALID_ARGUMENT; + } + return (gfm_server_put_reply_with_relay(peer, xid, sizep, relay, diag, + &e, "")); } gfarm_error_t gfm_server_compound_end(struct peer *peer, gfp_xdr_xid_t xid, size_t *sizep, int from_client, int skip, int level) { - gfarm_error_t e = GFARM_ERR_NO_ERROR; + gfarm_error_t e; + struct relayed_request *relay; static const char diag[] = "GFM_PROTO_COMPOUND_END"; + e = gfm_server_get_request_with_relay(peer, sizep, skip, &relay, diag, + GFM_PROTO_COMPOUND_END, ""); + if (e != GFARM_ERR_NO_ERROR) + return (e); if (skip) return (GFARM_ERR_NO_ERROR); - if (level < 1) /* nesting doesn't match */ - e = GFARM_ERR_INVALID_ARGUMENT; - return (gfm_server_put_reply(peer, xid, sizep, diag, e, "")); + + if (relay == NULL) { + if (level < 1) /* nesting doesn't match */ + e = GFARM_ERR_INVALID_ARGUMENT; + } + return (gfm_server_put_reply_with_relay(peer, xid, sizep, relay, diag, + &e, "")); } gfarm_error_t @@ -86,6 +104,9 @@ gfarm_error_string(e)); return (e); } + + /* XXX RELAY - needs special procedure */ + if (level < 1) /* there isn't COMPOUND_BEGIN ... END block around */ e = GFARM_ERR_INVALID_ARGUMENT; else @@ -100,29 +121,31 @@ gfarm_error_t e; gfarm_int32_t fd; struct process *process; + struct relayed_request *relay; static const char diag[] = "GFM_PROTO_GET_FD"; - e = gfm_server_get_request(peer, sizep, diag, ""); - if (e != GFARM_ERR_NO_ERROR) { - gflog_debug(GFARM_MSG_1001785, - "get_fd request failed: %s", - gfarm_error_string(e)); + e = gfm_server_get_request_with_relay(peer, sizep, skip, &relay, diag, + GFM_PROTO_GET_FD, ""); + if (e != GFARM_ERR_NO_ERROR) return (e); - } if (skip) return (GFARM_ERR_NO_ERROR); - giant_lock(); - if ((process = peer_get_process(peer)) == NULL) - e = GFARM_ERR_OPERATION_NOT_PERMITTED; - else if ((e = peer_fdpair_get_current(peer, &fd)) != - GFARM_ERR_NO_ERROR) - ; - else - e = peer_fdpair_externalize_current(peer); - giant_unlock(); + if (relay == NULL) { + /* do not relay RPC to master gfmd */ + giant_lock(); + if ((process = peer_get_process(peer)) == NULL) + e = GFARM_ERR_OPERATION_NOT_PERMITTED; + else if ((e = peer_fdpair_get_current(peer, &fd)) != + GFARM_ERR_NO_ERROR) + ; + else + e = peer_fdpair_externalize_current(peer); + giant_unlock(); + } - return (gfm_server_put_reply(peer, xid, sizep, diag, e, "i", fd)); + return (gfm_server_put_reply_with_relay(peer, xid, sizep, relay, diag, + &e, "i", &fd)); } gfarm_error_t @@ -132,30 +155,33 @@ gfarm_error_t e; gfarm_int32_t fd; struct process *process; + struct relayed_request *relay; static const char diag[] = "GFM_PROTO_PUT_FD"; - e = gfm_server_get_request(peer, sizep, diag, "i", &fd); - if (e != GFARM_ERR_NO_ERROR) { - gflog_debug(GFARM_MSG_1001786, - "put_fd request failed: %s", - gfarm_error_string(e)); + e = gfm_server_get_request_with_relay(peer, sizep, skip, &relay, diag, + GFM_PROTO_PUT_FD, "i", &fd); + if (e != GFARM_ERR_NO_ERROR) return (e); - } if (skip) return (GFARM_ERR_NO_ERROR); - giant_lock(); - if ((process = peer_get_process(peer)) == NULL) - e = GFARM_ERR_OPERATION_NOT_PERMITTED; - else if ((e = process_verify_fd(process, fd)) != GFARM_ERR_NO_ERROR) - ; - else { - peer_fdpair_set_current(peer, fd); - e = peer_fdpair_externalize_current(peer); + if (relay == NULL) { + /* do not relay RPC to master gfmd */ + giant_lock(); + if ((process = peer_get_process(peer)) == NULL) + e = GFARM_ERR_OPERATION_NOT_PERMITTED; + else if ((e = process_verify_fd(process, fd)) != + GFARM_ERR_NO_ERROR) + ; + else { + peer_fdpair_set_current(peer, fd); + e = peer_fdpair_externalize_current(peer); + } + giant_unlock(); } - giant_unlock(); - return (gfm_server_put_reply(peer, xid, sizep, diag, e, "")); + return (gfm_server_put_reply_with_relay(peer, xid, sizep, relay, diag, + &e, "")); } gfarm_error_t @@ -164,26 +190,28 @@ { gfarm_error_t e; struct process *process; + struct relayed_request *relay; static const char diag[] = "GFM_PROTO_SAVE_FD"; - e = gfm_server_get_request(peer, sizep, diag, ""); - if (e != GFARM_ERR_NO_ERROR) { - gflog_debug(GFARM_MSG_1001787, - "save_fd request failed: %s", - gfarm_error_string(e)); + e = gfm_server_get_request_with_relay(peer, sizep, skip, &relay, diag, + GFM_PROTO_SAVE_FD, ""); + if (e != GFARM_ERR_NO_ERROR) return (e); - } if (skip) return (GFARM_ERR_NO_ERROR); - giant_lock(); - if ((process = peer_get_process(peer)) == NULL) - e = GFARM_ERR_OPERATION_NOT_PERMITTED; - else - e = peer_fdpair_save(peer); - giant_unlock(); + if (relay == NULL) { + /* do not relay RPC to master gfmd */ + giant_lock(); + if ((process = peer_get_process(peer)) == NULL) + e = GFARM_ERR_OPERATION_NOT_PERMITTED; + else + e = peer_fdpair_save(peer); + giant_unlock(); + } - return (gfm_server_put_reply(peer, xid, sizep, diag, e, "")); + return (gfm_server_put_reply_with_relay(peer, xid, sizep, relay, diag, + &e, "")); } gfarm_error_t @@ -192,25 +220,28 @@ { gfarm_error_t e; struct process *process; + struct relayed_request *relay; static const char diag[] = "GFM_PROTO_RESTORE_FD"; - e = gfm_server_get_request(peer, sizep, diag, ""); - if (e != GFARM_ERR_NO_ERROR) { - gflog_debug(GFARM_MSG_1001788, "restore_fd request failed: %s", - gfarm_error_string(e)); + e = gfm_server_get_request_with_relay(peer, sizep, skip, &relay, diag, + GFM_PROTO_RESTORE_FD, ""); + if (e != GFARM_ERR_NO_ERROR) return (e); - } if (skip) return (GFARM_ERR_NO_ERROR); - giant_lock(); - if ((process = peer_get_process(peer)) == NULL) - e = GFARM_ERR_OPERATION_NOT_PERMITTED; - else - e = peer_fdpair_restore(peer); - giant_unlock(); + if (relay == NULL) { + /* do not relay RPC to master gfmd */ + giant_lock(); + if ((process = peer_get_process(peer)) == NULL) + e = GFARM_ERR_OPERATION_NOT_PERMITTED; + else + e = peer_fdpair_restore(peer); + giant_unlock(); + } - return (gfm_server_put_reply(peer, xid, sizep, diag, e, "")); + return (gfm_server_put_reply_with_relay(peer, xid, sizep, relay, diag, + &e, "")); } char * @@ -481,45 +512,46 @@ gfarm_uint64_t gen = 0; gfarm_int32_t mode = 0; char *create_log = NULL, *remove_log = NULL; + struct relayed_request *relay; static const char diag[] = "GFM_PROTO_CREATE"; - e = gfm_server_get_request(peer, sizep, diag, - "sii", &name, &flag, &perm); - if (e != GFARM_ERR_NO_ERROR) { - gflog_debug(GFARM_MSG_1001799, "create request failed: %s", - gfarm_error_string(e)); + e = gfm_server_get_request_with_relay(peer, sizep, skip, &relay, diag, + GFM_PROTO_CREATE, "sii", &name, &flag, &perm); + if (e != GFARM_ERR_NO_ERROR) return (e); - } if (skip) { free(name); return (GFARM_ERR_NO_ERROR); } - giant_lock(); - e = gfm_server_open_common(diag, peer, from_client, - name, flag, 1, perm, &inum, &gen, &mode, - &create_log, &remove_log); + if (relay == NULL) { + /* do not relay RPC to master gfmd */ + giant_lock(); + e = gfm_server_open_common(diag, peer, from_client, + name, flag, 1, perm, &inum, &gen, &mode, + &create_log, &remove_log); - if (debug_mode) { - if (e != GFARM_ERR_NO_ERROR) { - gflog_info(GFARM_MSG_1000376, - "create(%s) -> error: %s", - name, gfarm_error_string(e)); - } else { - gfarm_int32_t fd; - peer_fdpair_get_current(peer, &fd); - gflog_info(GFARM_MSG_1000377, - "create(%s) -> %d, %lld:%lld, %3o", - name, fd, (unsigned long long)inum, - (unsigned long long)gen, mode); + if (debug_mode) { + if (e != GFARM_ERR_NO_ERROR) { + gflog_info(GFARM_MSG_1000376, + "create(%s) -> error: %s", + name, gfarm_error_string(e)); + } else { + gfarm_int32_t fd; + peer_fdpair_get_current(peer, &fd); + gflog_info(GFARM_MSG_1000377, + "create(%s) -> %d, %lld:%lld, %3o", + name, fd, (unsigned long long)inum, + (unsigned long long)gen, mode); + } } + + free(name); + giant_unlock(); } + e2 = gfm_server_put_reply_with_relay(peer, xid, sizep, relay, diag, + &e, "lli", &inum, &gen, &mode); - free(name); - giant_unlock(); - e2 = gfm_server_put_reply(peer, xid, sizep, diag, e, "lli", - inum, gen, mode); - if (gfarm_ctxp->file_trace && create_log != NULL) { gflog_trace(GFARM_MSG_1003293, "%s", create_log); free(create_log); @@ -542,41 +574,45 @@ gfarm_ino_t inum = 0; gfarm_uint64_t gen = 0; gfarm_int32_t mode = 0; + struct relayed_request *relay; static const char diag[] = "GFM_PROTO_OPEN"; - e = gfm_server_get_request(peer, sizep, "open", "si", &name, &flag); - if (e != GFARM_ERR_NO_ERROR) { - gflog_debug(GFARM_MSG_1001800, "open request failed: %s", - gfarm_error_string(e)); + e = gfm_server_get_request_with_relay(peer, sizep, skip, &relay, diag, + GFM_PROTO_OPEN, "si", &name, &flag); + if (e != GFARM_ERR_NO_ERROR) return (e); - } if (skip) { free(name); return (GFARM_ERR_NO_ERROR); } - giant_lock(); - e = gfm_server_open_common(diag, peer, from_client, - name, flag, 0, 0, &inum, &gen, &mode, NULL, NULL); + if (relay == NULL) { + /* do not relay RPC to master gfmd */ + giant_lock(); - if (debug_mode) { - if (e != GFARM_ERR_NO_ERROR) { - gflog_info(GFARM_MSG_1000378, "open(%s) -> error: %s", - name, gfarm_error_string(e)); - } else { - gfarm_int32_t fd; - peer_fdpair_get_current(peer, &fd); - gflog_info(GFARM_MSG_1000379, - "open(%s) -> %d, %lld:%lld, %3o", - name, fd, (unsigned long long)inum, - (unsigned long long)gen, mode); + e = gfm_server_open_common(diag, peer, from_client, + name, flag, 0, 0, &inum, &gen, &mode, NULL, NULL); + + if (debug_mode) { + if (e != GFARM_ERR_NO_ERROR) { + gflog_info(GFARM_MSG_1000378, + "open(%s) -> error: %s", + name, gfarm_error_string(e)); + } else { + gfarm_int32_t fd; + peer_fdpair_get_current(peer, &fd); + gflog_info(GFARM_MSG_1000379, + "open(%s) -> %d, %lld:%lld, %3o", + name, fd, (unsigned long long)inum, + (unsigned long long)gen, mode); + } } + + free(name); + giant_unlock(); } - - free(name); - giant_unlock(); - return (gfm_server_put_reply(peer, xid, sizep, diag, e, "lli", - inum, gen, mode)); + return (gfm_server_put_reply_with_relay(peer, xid, sizep, relay, diag, + &e, "lli", &inum, &gen, &mode)); } gfarm_error_t @@ -590,49 +626,54 @@ struct inode *inode; gfarm_uint32_t flag; gfarm_int32_t fd = -1; + struct relayed_request *relay; static const char diag[] = "GFM_PROTO_OPEN_ROOT"; - e = gfm_server_get_request(peer, sizep, diag, "i", &flag); - if (e != GFARM_ERR_NO_ERROR) { - gflog_debug(GFARM_MSG_1001801, "open_root request failed: %s", - gfarm_error_string(e)); + e = gfm_server_get_request_with_relay(peer, sizep, skip, &relay, diag, + GFM_PROTO_OPEN_ROOT, "i", &flag); + if (e != GFARM_ERR_NO_ERROR) return (e); - } if (skip) return (GFARM_ERR_NO_ERROR); - giant_lock(); - if (flag & ~GFARM_FILE_USER_MODE) - e = GFARM_ERR_INVALID_ARGUMENT; - else if ((op = accmode_to_op(flag)) & GFS_W_OK) - e = GFARM_ERR_IS_A_DIRECTORY; - else if (!from_client && (spool_host = peer_get_host(peer)) == NULL) { - if (debug_mode) - gflog_info(GFARM_MSG_1000380, - "open_root: from_client=%d, spool?:%d\n", - from_client, spool_host != NULL); - e = GFARM_ERR_OPERATION_NOT_PERMITTED; - } else if ((process = peer_get_process(peer)) == NULL) { - if (debug_mode) - gflog_info(GFARM_MSG_1000381, - "get_process?:%d\n", process != NULL); - e = GFARM_ERR_OPERATION_NOT_PERMITTED; + if (relay == NULL) { + /* do not relay RPC to master gfmd */ + giant_lock(); - } else if ((e = inode_lookup_root(process, op, &inode)) != - GFARM_ERR_NO_ERROR) { - if (debug_mode) - gflog_info(GFARM_MSG_1000382, - "inode_lookup_root?:%s\n", + if (flag & ~GFARM_FILE_USER_MODE) + e = GFARM_ERR_INVALID_ARGUMENT; + else if ((op = accmode_to_op(flag)) & GFS_W_OK) + e = GFARM_ERR_IS_A_DIRECTORY; + else if (!from_client && + (spool_host = peer_get_host(peer)) == NULL) { + if (debug_mode) + gflog_info(GFARM_MSG_1000380, + "open_root: from_client=%d, spool?:%d\n", + from_client, spool_host != NULL); + e = GFARM_ERR_OPERATION_NOT_PERMITTED; + } else if ((process = peer_get_process(peer)) == NULL) { + if (debug_mode) + gflog_info(GFARM_MSG_1000381, + "get_process?:%d\n", process != NULL); + e = GFARM_ERR_OPERATION_NOT_PERMITTED; + } else if ((e = inode_lookup_root(process, op, &inode)) != + GFARM_ERR_NO_ERROR) { + if (debug_mode) + gflog_info(GFARM_MSG_1000382, + "inode_lookup_root?:%s\n", + gfarm_error_string(e)); + } else if ((e = process_open_file(process, inode, flag, 0, + peer, spool_host, &fd)) != GFARM_ERR_NO_ERROR) { + gflog_debug(GFARM_MSG_1001802, + "process_open_file() failed: %s", gfarm_error_string(e)); - } else if ((e = process_open_file(process, inode, flag, 0, - peer, spool_host, &fd)) != GFARM_ERR_NO_ERROR) { - gflog_debug(GFARM_MSG_1001802, "process_open_file() failed: %s", - gfarm_error_string(e)); - } else - peer_fdpair_set_current(peer, fd); + } else + peer_fdpair_set_current(peer, fd); - giant_unlock(); - return (gfm_server_put_reply(peer, xid, sizep, diag, e, "")); + giant_unlock(); + } + return (gfm_server_put_reply_with_relay(peer, xid, sizep, relay, diag, + &e, "")); } gfarm_error_t @@ -646,55 +687,61 @@ gfarm_uint32_t flag; gfarm_int32_t cfd, fd = -1; struct inode *base, *inode; + struct relayed_request *relay; static const char diag[] = "GFM_PROTO_OPEN_PARENT"; - e = gfm_server_get_request(peer, sizep, diag, "i", &flag); - if (e != GFARM_ERR_NO_ERROR) { - gflog_debug(GFARM_MSG_1001803, - "open_parent request failed: %s", - gfarm_error_string(e)); + e = gfm_server_get_request_with_relay(peer, sizep, skip, &relay, diag, + GFM_PROTO_OPEN_PARENT, "i", &flag); + if (e != GFARM_ERR_NO_ERROR) return (e); - } if (skip) return (GFARM_ERR_NO_ERROR); - giant_lock(); - if (flag & ~GFARM_FILE_USER_MODE) { - gflog_debug(GFARM_MSG_1001804, "argument 'flag' is invalid"); - e = GFARM_ERR_INVALID_ARGUMENT; - } else if ((op = accmode_to_op(flag)) & GFS_W_OK) { - gflog_debug(GFARM_MSG_1001805, "inode is a directory"); - e = GFARM_ERR_IS_A_DIRECTORY; - } else if (!from_client && (spool_host = peer_get_host(peer)) == NULL) { - gflog_debug(GFARM_MSG_1001806, - "operation is not permitted"); - e = GFARM_ERR_OPERATION_NOT_PERMITTED; - } else if ((process = peer_get_process(peer)) == NULL) { - gflog_debug(GFARM_MSG_1001807, - "operation is not permitted: peer_get_process()" - "failed"); - e = GFARM_ERR_OPERATION_NOT_PERMITTED; - } else if ((e = peer_fdpair_get_current(peer, &cfd)) != - GFARM_ERR_NO_ERROR) { - gflog_debug(GFARM_MSG_1001808, "peer_fdpair_get_current() " - "failed: %s", gfarm_error_string(e)); - } else if ((e = process_get_file_inode(process, cfd, &base)) != - GFARM_ERR_NO_ERROR) { - gflog_debug(GFARM_MSG_1001809, "process_get_file_inode() " - "failed: %s", gfarm_error_string(e)); - } else if ((e = inode_lookup_parent(base, process, op, &inode)) != - GFARM_ERR_NO_ERROR) { - gflog_debug(GFARM_MSG_1001810, "inode_lookup_parent() failed" - ": %s", gfarm_error_string(e)); - } else if ((e = process_open_file(process, inode, flag, 0, - peer, spool_host, &fd)) != GFARM_ERR_NO_ERROR) { - gflog_debug(GFARM_MSG_1001811, "process_open_file() failed: " - "%s", gfarm_error_string(e)); - } else - peer_fdpair_set_current(peer, fd); - - giant_unlock(); - return (gfm_server_put_reply(peer, xid, sizep, diag, e, "")); + if (relay == NULL) { + /* do not relay RPC to master gfmd */ + giant_lock(); + if (flag & ~GFARM_FILE_USER_MODE) { + gflog_debug(GFARM_MSG_1001804, + "argument 'flag' is invalid"); + e = GFARM_ERR_INVALID_ARGUMENT; + } else if ((op = accmode_to_op(flag)) & GFS_W_OK) { + gflog_debug(GFARM_MSG_1001805, "inode is a directory"); + e = GFARM_ERR_IS_A_DIRECTORY; + } else if (!from_client && + (spool_host = peer_get_host(peer)) == NULL) { + gflog_debug(GFARM_MSG_1001806, + "operation is not permitted"); + e = GFARM_ERR_OPERATION_NOT_PERMITTED; + } else if ((process = peer_get_process(peer)) == NULL) { + gflog_debug(GFARM_MSG_1001807, + "operation is not permitted: peer_get_process()" + "failed"); + e = GFARM_ERR_OPERATION_NOT_PERMITTED; + } else if ((e = peer_fdpair_get_current(peer, &cfd)) != + GFARM_ERR_NO_ERROR) { + gflog_debug(GFARM_MSG_1001808, + "peer_fdpair_get_current() " + "failed: %s", gfarm_error_string(e)); + } else if ((e = process_get_file_inode(process, cfd, &base)) != + GFARM_ERR_NO_ERROR) { + gflog_debug(GFARM_MSG_1001809, "process_get_file_inode() " + "failed: %s", gfarm_error_string(e)); + } else if ((e = inode_lookup_parent(base, process, op, &inode)) != + GFARM_ERR_NO_ERROR) { + gflog_debug(GFARM_MSG_1001810, + "inode_lookup_parent() failed" + ": %s", gfarm_error_string(e)); + } else if ((e = process_open_file(process, inode, flag, 0, + peer, spool_host, &fd)) != GFARM_ERR_NO_ERROR) { + gflog_debug(GFARM_MSG_1001811, + "process_open_file() failed: " + "%s", gfarm_error_string(e)); + } else + peer_fdpair_set_current(peer, fd); + giant_unlock(); + } + return (gfm_server_put_reply_with_relay(peer, xid, sizep, relay, diag, + &e, "")); } gfarm_error_t @@ -707,42 +754,53 @@ gfarm_int32_t fd = -1; int transaction = 0; char *trace_log = NULL; + struct relayed_request *relay; static const char diag[] = "GFM_PROTO_CLOSE"; + e = gfm_server_get_request_with_relay(peer, sizep, skip, &relay, diag, + GFM_PROTO_CLOSE, ""); + if (e != GFARM_ERR_NO_ERROR) + return (e); if (skip) return (GFARM_ERR_NO_ERROR); - giant_lock(); - if (!from_client && (spool_host = peer_get_host(peer)) == NULL) { - gflog_debug(GFARM_MSG_1001812, - "operation is not permitted"); - e = GFARM_ERR_OPERATION_NOT_PERMITTED; - } else if ((process = peer_get_process(peer)) == NULL) { - gflog_debug(GFARM_MSG_1001813, - "operation is not permitted : peer_get_process() " - "failed"); - e = GFARM_ERR_OPERATION_NOT_PERMITTED; - } else if ((e = peer_fdpair_get_current(peer, &fd)) != - GFARM_ERR_NO_ERROR) { - gflog_debug(GFARM_MSG_1001814, - "peer_fdpair_get_current() failed: %s", - gfarm_error_string(e)); - } else { - if (db_begin(diag) == GFARM_ERR_NO_ERROR) - transaction = 1; - /* - * closing must be done regardless of the result of db_begin(). - * because not closing may cause descriptor leak. - */ - e = process_close_file(process, peer, fd, &trace_log); - if (transaction) - db_end(diag); - if (e == GFARM_ERR_NO_ERROR) /* permission ok */ - e = peer_fdpair_close_current(peer); + if (relay == NULL) { + /* do not relay RPC to master gfmd */ + giant_lock(); + + if (!from_client && (spool_host = peer_get_host(peer)) == NULL) { + gflog_debug(GFARM_MSG_1001812, + "operation is not permitted"); + e = GFARM_ERR_OPERATION_NOT_PERMITTED; + } else if ((process = peer_get_process(peer)) == NULL) { + gflog_debug(GFARM_MSG_1001813, + "operation is not permitted : peer_get_process() " + "failed"); + e = GFARM_ERR_OPERATION_NOT_PERMITTED; + } else if ((e = peer_fdpair_get_current(peer, &fd)) != + GFARM_ERR_NO_ERROR) { + gflog_debug(GFARM_MSG_1001814, + "peer_fdpair_get_current() failed: %s", + gfarm_error_string(e)); + } else { + if (db_begin(diag) == GFARM_ERR_NO_ERROR) + transaction = 1; + /* + * closing must be done regardless of the result + * of db_begin(). + * because not closing may cause descriptor leak. + */ + e = process_close_file(process, peer, fd, &trace_log); + if (transaction) + db_end(diag); + if (e == GFARM_ERR_NO_ERROR) /* permission ok */ + e = peer_fdpair_close_current(peer); + } + + giant_unlock(); } - - giant_unlock(); - e2 = gfm_server_put_reply(peer, xid, sizep, diag, e, ""); + e2 = gfm_server_put_reply_with_relay(peer, xid, sizep, relay, diag, &e, + ""); if (gfarm_ctxp->file_trace && trace_log != NULL) gflog_trace(GFARM_MSG_1003295, "%s", trace_log); return (e2); @@ -1534,7 +1592,7 @@ if (e != GFARM_ERR_NO_ERROR) return (gfm_server_put_reply(peer, xid, sizep, diag, e, "")); - + /* XXXRELAY FIXME, reply size is not correct */ e_save = gfm_server_put_reply(peer, xid, sizep, diag, e, "i", nhosts); for (i = 0; i < nhosts; i++) { @@ -2637,89 +2695,82 @@ gfm_server_seek(struct peer *peer, gfp_xdr_xid_t xid, size_t *sizep, int from_client, int skip) { - gfarm_error_t e, erelay; + gfarm_error_t e; gfarm_int32_t fd, whence; gfarm_off_t offset, current, max; struct host *spool_host = NULL; struct process *process; struct inode *inode; Dir dir; - struct relayed_reqeust *req; + struct relayed_request *relay; static const char diag[] = "GFM_PROTO_SEEK"; - e = gfm_server_get_request(peer, sizep, diag, "li", &offset, &whence); - if (e != GFARM_ERR_NO_ERROR) { - gflog_debug(GFARM_MSG_1001927, "seek request failed: %s", - gfarm_error_string(e)); + e = gfm_server_get_request_with_relay(peer, sizep, skip, &relay, diag, + GFM_PROTO_SEEK, "li", &offset, &whence); + if (e != GFARM_ERR_NO_ERROR) return (e); - } - if (!mdhost_self_is_master()) { - erelay = relay_put_request(&req, diag, - GFM_PROTO_SEEK, "li", offset, whence); - if (erelay != GFARM_ERR_NO_ERROR) - return (e); - erelay = relay_get_reply(req, diag, &e, "l", &offset); - if (erelay != GFARM_ERR_NO_ERROR) - return (gfm_server_put_reply(peer, xid, sizep, - diag, erelay, "")); - return (gfm_server_put_reply(peer, xid, sizep, diag, - e, "l", offset)); - } if (skip) return (GFARM_ERR_NO_ERROR); - giant_lock(); - if (!from_client && (spool_host = peer_get_host(peer)) == NULL) { - gflog_debug(GFARM_MSG_1001928, "operation is not permitted"); - e = GFARM_ERR_OPERATION_NOT_PERMITTED; - } else if ((process = peer_get_process(peer)) == NULL) { - gflog_debug(GFARM_MSG_1001929, - "operation is not permitted: peer_get_process() " - "failed"); - e = GFARM_ERR_OPERATION_NOT_PERMITTED; - } else if ((e = peer_fdpair_get_current(peer, &fd)) != - GFARM_ERR_NO_ERROR) { - gflog_debug(GFARM_MSG_1001930, - "peer_fdpair_get_current() failed: %s", - gfarm_error_string(e)); - } else if ((e = process_get_file_inode(process, fd, &inode)) - != GFARM_ERR_NO_ERROR) { - gflog_debug(GFARM_MSG_1001931, - "process_get_file_inode() failed: %s", - gfarm_error_string(e)); - } else if ((dir = inode_get_dir(inode)) == NULL) { - gflog_debug(GFARM_MSG_1001932, "inode_get_dir() failed"); - e = GFARM_ERR_NOT_A_DIRECTORY; - } else if ((e = process_get_dir_offset(process, peer, fd, - ¤t)) != GFARM_ERR_NO_ERROR) { - gflog_debug(GFARM_MSG_1001933, - "process_get_dir_offset() failed: %s", - gfarm_error_string(e)); - } else if (whence < 0 || whence > 2) { - gflog_debug(GFARM_MSG_1001934, - "argument 'whence' is invalid"); - e = GFARM_ERR_INVALID_ARGUMENT; - } else { - max = dir_get_entry_count(dir); - switch (whence) { - case 0: break; - case 1: offset += current; break; - case 2: offset += max; break; - default: assert(0); + if (relay == NULL) { + /* do not relay RPC to master gfmd */ + giant_lock(); + if (!from_client && + (spool_host = peer_get_host(peer)) == NULL) { + gflog_debug(GFARM_MSG_1001928, + "operation is not permitted"); + e = GFARM_ERR_OPERATION_NOT_PERMITTED; + } else if ((process = peer_get_process(peer)) == NULL) { + gflog_debug(GFARM_MSG_1001929, + "operation is not permitted: peer_get_process() " + "failed"); + e = GFARM_ERR_OPERATION_NOT_PERMITTED; + } else if ((e = peer_fdpair_get_current(peer, &fd)) != + GFARM_ERR_NO_ERROR) { + gflog_debug(GFARM_MSG_1001930, + "peer_fdpair_get_current() failed: %s", + gfarm_error_string(e)); + } else if ((e = process_get_file_inode(process, fd, &inode)) + != GFARM_ERR_NO_ERROR) { + gflog_debug(GFARM_MSG_1001931, + "process_get_file_inode() failed: %s", + gfarm_error_string(e)); + } else if ((dir = inode_get_dir(inode)) == NULL) { + gflog_debug(GFARM_MSG_1001932, + "inode_get_dir() failed"); + e = GFARM_ERR_NOT_A_DIRECTORY; + } else if ((e = process_get_dir_offset(process, peer, fd, + ¤t)) != GFARM_ERR_NO_ERROR) { + gflog_debug(GFARM_MSG_1001933, + "process_get_dir_offset() failed: %s", + gfarm_error_string(e)); + } else if (whence < 0 || whence > 2) { + gflog_debug(GFARM_MSG_1001934, + "argument 'whence' is invalid"); + e = GFARM_ERR_INVALID_ARGUMENT; + } else { + max = dir_get_entry_count(dir); + switch (whence) { + case 0: break; + case 1: offset += current; break; + case 2: offset += max; break; + default: assert(0); + } + if (offset != current) { + if (offset < 0) + offset = 0; + else if (offset > max) + offset = max; + process_clear_dir_key(process, peer, fd); + process_set_dir_offset(process, peer, fd, + offset); + } } - if (offset != current) { - if (offset < 0) - offset = 0; - else if (offset > max) - offset = max; - process_clear_dir_key(process, peer, fd); - process_set_dir_offset(process, peer, fd, - offset); - } + giant_unlock(); } - giant_unlock(); - return (gfm_server_put_reply(peer, xid, sizep, diag, e, "l", offset)); + return (gfm_server_put_reply_with_relay(peer, xid, sizep, relay, diag, + &e, "l", &offset)); } struct reopen_resume_arg { Modified: gfarm_v2/trunk/server/gfmd/group.c =================================================================== --- gfarm_v2/trunk/server/gfmd/group.c 2012-02-14 08:56:31 UTC (rev 5926) +++ gfarm_v2/trunk/server/gfmd/group.c 2012-02-14 11:29:56 UTC (rev 5927) @@ -910,56 +910,42 @@ int from_client, int skip) { char *groupname; - gfarm_error_t e, erelay; + gfarm_error_t e; struct user *user = peer_get_user(peer); - struct relayed_reqeust *req; + struct relayed_request *relay; static const char diag[] = "GFM_PROTO_GROUP_INFO_REMOVE"; - e = gfm_server_get_request(peer, sizep, diag, "s", &groupname); - if (e != GFARM_ERR_NO_ERROR) { - gflog_debug(GFARM_MSG_1001543, - "group_info_remove request failed: %s", - gfarm_error_string(e)); + e = gfm_server_get_request_with_relay(peer, sizep, skip, &relay, diag, + GFM_PROTO_GROUP_INFO_REMOVE, "s", &groupname); + if (e != GFARM_ERR_NO_ERROR) return (e); - } - if (!mdhost_self_is_master()) { - erelay = relay_put_request(&req, diag, - GFM_PROTO_GROUP_INFO_REMOVE, "s", &groupname); - if (erelay != GFARM_ERR_NO_ERROR) { - free(groupname); - return (e); - } - erelay = relay_get_reply(req, diag, &e, "s", &groupname); - if (erelay != GFARM_ERR_NO_ERROR) { - free(groupname); - return (gfm_server_put_reply(peer, xid, sizep, - diag, erelay, "")); - } - e = gfm_server_put_reply(peer, xid, sizep, diag, e, - "s", &groupname); - free(groupname); - return (e); - } if (skip) { free(groupname); return (GFARM_ERR_NO_ERROR); } - giant_lock(); - if (!from_client || user == NULL || !user_is_admin(user)) { - gflog_debug(GFARM_MSG_1001544, - "operation is not permitted for user"); - e = GFARM_ERR_OPERATION_NOT_PERMITTED; - } else if (strcmp(groupname, ADMIN_GROUP_NAME) == 0 || - strcmp(groupname, ROOT_GROUP_NAME) == 0) { - gflog_debug(GFARM_MSG_1002211, - "%s: administrator group \"%s\" should not be deleted", - diag, groupname); - e = GFARM_ERR_OPERATION_NOT_PERMITTED; - } else - e = group_info_remove(groupname, diag); - free(groupname); - giant_unlock(); - return (gfm_server_put_reply(peer, xid, sizep, diag, e, "")); + + if (relay != NULL) { + free(groupname); + } else { + giant_lock(); + if (!from_client || user == NULL || !user_is_admin(user)) { + gflog_debug(GFARM_MSG_1001544, + "operation is not permitted for user"); + e = GFARM_ERR_OPERATION_NOT_PERMITTED; + } else if (strcmp(groupname, ADMIN_GROUP_NAME) == 0 || + strcmp(groupname, ROOT_GROUP_NAME) == 0) { + gflog_debug(GFARM_MSG_1002211, + "%s: administrator group \"%s\" " + "should not be deleted", diag, groupname); + e = GFARM_ERR_OPERATION_NOT_PERMITTED; + } else + e = group_info_remove(groupname, diag); + free(groupname); + giant_unlock(); + } + + return (gfm_server_put_reply_with_relay(peer, xid, sizep, relay, diag, + &e, "")); } gfarm_error_t Modified: gfarm_v2/trunk/server/gfmd/host.c =================================================================== --- gfarm_v2/trunk/server/gfmd/host.c 2012-02-14 08:56:31 UTC (rev 5926) +++ gfarm_v2/trunk/server/gfmd/host.c 2012-02-14 11:29:56 UTC (rev 5927) @@ -802,7 +802,7 @@ else if (*h1 > *h2) return (1); else - return (0); + return (0); } static void @@ -1281,47 +1281,28 @@ struct peer *peer, gfp_xdr_xid_t xid, size_t *sizep, int from_client, int skip) { - gfarm_error_t e, erelay; + gfarm_error_t e; char *architecture; - struct relayed_reqeust *req; + struct relayed_request *relay; 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) { - gflog_debug(GFARM_MSG_1001555, - "host_info_get_by_architecture request failure: %s", - gfarm_error_string(e)); + e = gfm_server_get_request_with_relay(peer, sizep, skip, &relay, diag, + GFM_PROTO_HOST_INFO_GET_BY_ARCHITECTURE, "s", &architecture); + if (e != GFARM_ERR_NO_ERROR) return (e); - } - if (!mdhost_self_is_master()) { - erelay = relay_put_request(&req, diag, - GFM_PROTO_HOST_INFO_GET_BY_ARCHITECTURE, - "s", &architecture); - if (erelay != GFARM_ERR_NO_ERROR) { - free(architecture); - return (e); - } - erelay = relay_get_reply(req, diag, &e, "s", &architecture); - if (erelay != GFARM_ERR_NO_ERROR) { - free(architecture); - return (gfm_server_put_reply(peer, xid, sizep, - diag, erelay, "")); - } - e = gfm_server_put_reply(peer, xid, sizep, diag, - e, "s", &architecture); - free(architecture); - return (e); - } if (skip) { free(architecture); return (GFARM_ERR_NO_ERROR); } - e = gfm_server_host_info_get_common(peer, xid, sizep, - arch_filter, architecture, diag); + if (relay == NULL) { + /* do not relay RPC to master gfmd */ + e = gfm_server_host_info_get_common(peer, xid, sizep, + arch_filter, architecture, diag); + } - free(architecture); - return (e); + return (gfm_server_put_reply_with_relay(peer, xid, sizep, relay, diag, + &e, "s", &architecture)); } gfarm_error_t @@ -1484,88 +1465,70 @@ gfm_server_host_info_set(struct peer *peer, gfp_xdr_xid_t xid, size_t *sizep, int from_client, int skip) { - gfarm_error_t e, erelay; + gfarm_error_t e; struct user *user = peer_get_user(peer); gfarm_int32_t ncpu, port, flags; struct gfarm_host_info hi; - struct relayed_reqeust *req; + struct relayed_request *relay; static const char diag[] = "GFM_PROTO_HOST_INFO_SET"; - e = gfm_server_get_request(peer, sizep, diag, "ssiii", + e = gfm_server_get_request_with_relay(peer, sizep, skip, &relay, diag, + GFM_PROTO_HOST_INFO_SET, "ssiii", &hi.hostname, &hi.architecture, &ncpu, &port, &flags); - if (e != GFARM_ERR_NO_ERROR) { - gflog_debug(GFARM_MSG_1001562, - "host_info_set request failure: %s", - gfarm_error_string(e)); + if (e != GFARM_ERR_NO_ERROR) return (e); - } - if (!mdhost_self_is_master()) { - erelay = relay_put_request(&req, diag, - GFM_PROTO_HOST_INFO_SET, "ssiii", - &hi.hostname, &hi.architecture, &ncpu, &port, &flags); - if (erelay != GFARM_ERR_NO_ERROR) { - free(hi.hostname); - free(hi.architecture); - return (e); - } - erelay = relay_get_reply(req, diag, &e, "ssiii", - &hi.hostname, &hi.architecture, &ncpu, &port, &flags); - if (erelay != GFARM_ERR_NO_ERROR) { - free(hi.hostname); - free(hi.architecture); - return (gfm_server_put_reply(peer, xid, sizep, - diag, erelay, "")); - } - e = gfm_server_put_reply(peer, xid, sizep, diag, e, - "ssiii", - &hi.hostname, &hi.architecture, &ncpu, &port, &flags); - free(hi.hostname); - free(hi.architecture); - return (e); - } if (skip) { free(hi.hostname); free(hi.architecture); return (GFARM_ERR_NO_ERROR); } - hi.ncpu = ncpu; - hi.port = port; - hi.flags = flags; - /* XXX FIXME missing hostaliases */ - hi.nhostaliases = 0; - hi.hostaliases = NULL; - giant_lock(); - if (!from_client || user == NULL || !user_is_admin(user)) { - gflog_debug(GFARM_MSG_1001563, - "operation is not permitted"); - e = GFARM_ERR_OPERATION_NOT_PERMITTED; - } else if (host_lookup(hi.hostname) != NULL) { - gflog_debug(GFARM_MSG_1001564, - "host already exists"); - e = GFARM_ERR_ALREADY_EXISTS; - } else if ((e = host_info_verify(&hi, diag)) != GFARM_ERR_NO_ERROR) { - /* nothing to do */ - } else if ((e = host_enter(&hi, NULL)) != GFARM_ERR_NO_ERROR) { - /* nothing to do */ - } else if ((e = db_host_add(&hi)) != GFARM_ERR_NO_ERROR) { - gflog_debug(GFARM_MSG_1001565, - "db_host_add() failed: %s", - gfarm_error_string(e)); - host_remove(hi.hostname); - hi.hostname = hi.architecture = NULL; + if (relay != NULL) { + free(hi.hostname); + free(hi.architecture); + } else { + /* do not relay RPC to master gfmd */ + hi.ncpu = ncpu; + hi.port = port; + hi.flags = flags; + /* XXX FIXME missing hostaliases */ + hi.nhostaliases = 0; + hi.hostaliases = NULL; + + giant_lock(); + if (!from_client || user == NULL || !user_is_admin(user)) { + gflog_debug(GFARM_MSG_1001563, + "operation is not permitted"); + e = GFARM_ERR_OPERATION_NOT_PERMITTED; + } else if (host_lookup(hi.hostname) != NULL) { + gflog_debug(GFARM_MSG_1001564, + "host already exists"); + e = GFARM_ERR_ALREADY_EXISTS; + } else if ((e = host_info_verify(&hi, diag)) != + GFARM_ERR_NO_ERROR) { + /* nothing to do */ + } else if ((e = host_enter(&hi, NULL)) != GFARM_ERR_NO_ERROR) { + /* nothing to do */ + } else if ((e = db_host_add(&hi)) != GFARM_ERR_NO_ERROR) { + gflog_debug(GFARM_MSG_1001565, + "db_host_add() failed: %s", + gfarm_error_string(e)); + host_remove(hi.hostname); + hi.hostname = hi.architecture = NULL; + } + if (e != GFARM_ERR_NO_ERROR) { + gflog_debug(GFARM_MSG_1001566, + "error occurred during process: %s", + gfarm_error_string(e)); + if (hi.hostname != NULL) + free(hi.hostname); + if (hi.architecture != NULL) + free(hi.architecture); + } + giant_unlock(); } - if (e != GFARM_ERR_NO_ERROR) { - gflog_debug(GFARM_MSG_1001566, - "error occurred during process: %s", - gfarm_error_string(e)); - if (hi.hostname != NULL) - free(hi.hostname); - if (hi.architecture != NULL) - free(hi.architecture); - } - giant_unlock(); - return (gfm_server_put_reply(peer, xid, sizep, diag, e, "")); + return (gfm_server_put_reply_with_relay(peer, xid, sizep, relay, diag, + &e, "")); } void @@ -1584,88 +1547,70 @@ struct peer *peer, gfp_xdr_xid_t xid, size_t *sizep, int from_client, int skip) { - gfarm_error_t e, erelay; + gfarm_error_t e; struct user *user = peer_get_user(peer); gfarm_int32_t ncpu, port, flags; struct gfarm_host_info hi; struct host *h; int needs_free = 0; - struct relayed_reqeust *req; + struct relayed_request *relay; static const char diag[] = "GFM_PROTO_HOST_INFO_MODIFY"; - e = gfm_server_get_request(peer, sizep, diag, "ssiii", - &hi.hostname, &hi.architecture, &ncpu, &port, &flags); - if (e != GFARM_ERR_NO_ERROR) { - gflog_debug(GFARM_MSG_1001567, - "host_info_modify request failed: %s", - gfarm_error_string(e)); + e = gfm_server_get_request_with_relay(peer, sizep, skip, &relay, diag, + GFM_PROTO_HOST_INFO_MODIFY, + "ssiii", &hi.hostname, &hi.architecture, &ncpu, &port, &flags); + if (e != GFARM_ERR_NO_ERROR) return (e); - } - if (!mdhost_self_is_master()) { - erelay = relay_put_request(&req, diag, - GFM_PROTO_HOST_INFO_MODIFY, "ssiii", - &hi.hostname, &hi.architecture, &ncpu, &port, &flags); - if (erelay != GFARM_ERR_NO_ERROR) { - free(hi.hostname); - free(hi.architecture); - return (e); - } - erelay = relay_get_reply(req, diag, &e, "ssiii", - &hi.hostname, &hi.architecture, &ncpu, &port, &flags); - if (erelay != GFARM_ERR_NO_ERROR) { - free(hi.hostname); - free(hi.architecture); - return (gfm_server_put_reply(peer, xid, sizep, - diag, erelay, "")); - } - e = gfm_server_put_reply(peer, xid, sizep, diag, e, - "ssiii", - &hi.hostname, &hi.architecture, &ncpu, &port, &flags); - free(hi.hostname); - free(hi.architecture); - return (e); - } if (skip) { free(hi.hostname); free(hi.architecture); return (GFARM_ERR_NO_ERROR); } - hi.ncpu = ncpu; - hi.port = port; - hi.flags = flags; - /* XXX FIXME missing hostaliases */ - /* XXX should we disconnect a back channel to the host? */ - giant_lock(); - if (!from_client || user == NULL || !user_is_admin(user)) { - gflog_debug(GFARM_MSG_1001568, - "operation is not permitted"); - e = GFARM_ERR_OPERATION_NOT_PERMITTED; - needs_free = 1; - } else if ((h = host_lookup(hi.hostname)) == NULL) { - gflog_debug(GFARM_MSG_1001569, "host does not exists"); - e = GFARM_ERR_NO_SUCH_OBJECT; - needs_free = 1; - } else if ((e = host_info_verify(&hi, diag)) != GFARM_ERR_NO_ERROR) { - needs_free = 1; - } else if ((e = db_host_modify(&hi, - DB_HOST_MOD_ARCHITECTURE|DB_HOST_MOD_NCPU|DB_HOST_MOD_FLAGS, - /* XXX */ 0, NULL, 0, NULL)) != GFARM_ERR_NO_ERROR) { - gflog_debug(GFARM_MSG_1001570, - "db_host_modify failed: %s", - gfarm_error_string(e)); - needs_free = 1; - } else { - host_modify(h, &hi); + if (relay != NULL) { free(hi.hostname); - } - if (needs_free) { - free(hi.hostname); free(hi.architecture); - } - giant_unlock(); + } else { + /* do not relay RPC to master gfmd */ + hi.ncpu = ncpu; + hi.port = port; + hi.flags = flags; + /* XXX FIXME missing hostaliases */ - return (gfm_server_put_reply(peer, xid, sizep, diag, e, "")); + /* XXX should we disconnect a back channel to the host? */ + giant_lock(); + if (!from_client || user == NULL || !user_is_admin(user)) { + gflog_debug(GFARM_MSG_1001568, + "operation is not permitted"); + e = GFARM_ERR_OPERATION_NOT_PERMITTED; + needs_free = 1; + } else if ((h = host_lookup(hi.hostname)) == NULL) { + gflog_debug(GFARM_MSG_1001569, + "host does not exists"); + e = GFARM_ERR_NO_SUCH_OBJECT; + needs_free = 1; + } else if ((e = host_info_verify(&hi, diag)) != + GFARM_ERR_NO_ERROR) { + needs_free = 1; + } else if ((e = db_host_modify(&hi, + DB_HOST_MOD_ARCHITECTURE|DB_HOST_MOD_NCPU|DB_HOST_MOD_FLAGS, + /* XXX */ 0, NULL, 0, NULL)) != GFARM_ERR_NO_ERROR) { + gflog_debug(GFARM_MSG_1001570, + "db_host_modify failed: %s", + gfarm_error_string(e)); + needs_free = 1; + } else { + host_modify(h, &hi); + free(hi.hostname); + } + if (needs_free) { + free(hi.hostname); + free(hi.architecture); + } + giant_unlock(); + } + return (gfm_server_put_reply_with_relay(peer, xid, sizep, relay, diag, + &e, "")); } /* this interface is exported for a use from a private extension */ @@ -1702,56 +1647,40 @@ struct peer *peer, gfp_xdr_xid_t xid, size_t *sizep, int from_client, int skip) { - gfarm_error_t e, erelay; + gfarm_error_t e; struct user *user = peer_get_user(peer); char *hostname; - struct relayed_reqeust *req; + struct relayed_request *relay; static const char diag[] = "GFM_PROTO_HOST_INFO_REMOVE"; - e = gfm_server_get_request(peer, sizep, diag, "s", &hostname); - if (e != GFARM_ERR_NO_ERROR) { - gflog_debug(GFARM_MSG_1001571, - "host_info_remove request failure: %s", - gfarm_error_string(e)); + e = gfm_server_get_request_with_relay(peer, sizep, skip, &relay, diag, + GFM_PROTO_HOST_INFO_REMOVE, "s", &hostname); + if (e != GFARM_ERR_NO_ERROR) return (e); - } - if (!mdhost_self_is_master()) { - erelay = relay_put_request(&req, diag, - GFM_PROTO_HOST_INFO_REMOVE, "s", &hostname); - if (erelay != GFARM_ERR_NO_ERROR) { - free(hostname); - return (e); - } - erelay = relay_get_reply(req, diag, &e, "s", &hostname); - if (erelay != GFARM_ERR_NO_ERROR) { - free(hostname); - return (gfm_server_put_reply(peer, xid, sizep, - diag, erelay, "")); - } - e = gfm_server_put_reply(peer, xid, sizep, diag, - e, "s", &hostname); - free(hostname); - return (e); - } if (skip) { free(hostname); return (GFARM_ERR_NO_ERROR); } - /* - * XXX should we remove all file copy entries stored on the - * specified host? - */ - giant_lock(); - if (!from_client || user == NULL || !user_is_admin(user)) { - gflog_debug(GFARM_MSG_1001572, - "operation is not permitted"); - e = GFARM_ERR_OPERATION_NOT_PERMITTED; - } else - e = host_info_remove(hostname, diag); - free(hostname); - giant_unlock(); - return (gfm_server_put_reply(peer, xid, sizep, diag, e, "")); + if (relay != NULL) { + free(hostname); + } else { + /* + * XXX should we remove all file copy entries stored on the + * specified host? + */ + giant_lock(); + if (!from_client || user == NULL || !user_is_admin(user)) { + gflog_debug(GFARM_MSG_1001572, + "operation is not permitted"); + e = GFARM_ERR_OPERATION_NOT_PERMITTED; + } else + e = host_info_remove(hostname, diag); + free(hostname); + giant_unlock(); + } + return (gfm_server_put_reply_with_relay(peer, xid, sizep, relay, diag, + &e, "")); } /* called from fs.c:gfm_server_schedule_file() as well */ Modified: gfarm_v2/trunk/server/gfmd/user.c =================================================================== --- gfarm_v2/trunk/server/gfmd/user.c 2012-02-14 08:56:31 UTC (rev 5926) +++ gfarm_v2/trunk/server/gfmd/user.c 2012-02-14 11:29:56 UTC (rev 5927) @@ -763,55 +763,39 @@ struct peer *peer, gfp_xdr_xid_t xid, size_t *sizep, int from_client, int skip) { - gfarm_error_t e, erelay; + gfarm_error_t e, e2; char *gsi_dn; struct user *u; struct gfarm_user_info *ui; - struct relayed_reqeust *req; + struct relayed_request *relay; static const char diag[] = "GFM_PROTO_USER_INFO_GET_BY_GSI_DN"; - e = gfm_server_get_request(peer, sizep, diag, "s", &gsi_dn); - if (e != GFARM_ERR_NO_ERROR) { - gflog_debug(GFARM_MSG_1001503, - "%s request: %s", diag, gfarm_error_string(e)); + e = gfm_server_get_request_with_relay(peer, sizep, skip, &relay, diag, + GFM_PROTO_USER_INFO_GET_BY_GSI_DN, "s", &gsi_dn); + if (e != GFARM_ERR_NO_ERROR) return (e); - } - if (!mdhost_self_is_master()) { - erelay = relay_put_request(&req, diag, - GFM_PROTO_USER_INFO_GET_BY_GSI_DN, "s", &gsi_dn); - if (erelay != GFARM_ERR_NO_ERROR) { - free(gsi_dn); - return (e); - } - erelay = relay_get_reply(req, diag, &e, "s", &gsi_dn); - if (erelay != GFARM_ERR_NO_ERROR) { - free(gsi_dn); - return (gfm_server_put_reply(peer, xid, sizep, - diag, erelay, "")); - } - e = gfm_server_put_reply(peer, xid, sizep, diag, e, - "s", &gsi_dn); - free(gsi_dn); - return (e); - } if (skip) { free(gsi_dn); return (GFARM_ERR_NO_ERROR); } - /* XXX FIXME too long giant lock */ - giant_lock(); - u = user_lookup_gsi_dn(gsi_dn); - if (u == NULL) { - e = gfm_server_put_reply(peer, xid, sizep, diag, - GFARM_ERR_NO_SUCH_USER, ""); - } else { - ui = &u->ui; - e = gfm_server_put_reply(peer, xid, sizep, diag, e, - "ssss", ui->username, ui->realname, ui->homedir, - ui->gsi_dn); + if (relay == NULL) { + /* XXX FIXME too long giant lock */ + giant_lock(); + u = user_lookup_gsi_dn(gsi_dn); + if (u == NULL) { + e2 = GFARM_ERR_NO_SUCH_USER; + e = gfm_server_put_reply_with_relay(peer, xid, sizep, + relay, diag, &e2, ""); + } else { + ui = &u->ui; + e2 = e; + e = gfm_server_put_reply_with_relay(peer, xid, sizep, + relay, diag, &e2, "ssss", &ui->username, + &ui->realname, &ui->homedir, &ui->gsi_dn); + } + giant_unlock(); } - giant_unlock(); free(gsi_dn); return (e); } @@ -837,73 +821,58 @@ int from_client, int skip) { struct gfarm_user_info ui; - gfarm_error_t e, erelay; + gfarm_error_t e; struct user *user = peer_get_user(peer); int do_not_free = 0; - struct relayed_reqeust *req; + struct relayed_request *relay; static const char diag[] = "GFM_PROTO_USER_INFO_SET"; - e = gfm_server_get_request(peer, sizep, diag, + e = gfm_server_get_request_with_relay(peer, sizep, skip, &relay, diag, + GFM_PROTO_USER_INFO_SET, "ssss", &ui.username, &ui.realname, &ui.homedir, &ui.gsi_dn); - if (e != GFARM_ERR_NO_ERROR) { - gflog_debug(GFARM_MSG_1001504, - "USER_INFO_SET request failed: %s", - gfarm_error_string(e)); + if (e != GFARM_ERR_NO_ERROR) return (e); - } - if (!mdhost_self_is_master()) { - erelay = relay_put_request(&req, diag, - GFM_PROTO_USER_INFO_SET, "ssss", - &ui.username, &ui.realname, &ui.homedir, &ui.gsi_dn); - if (erelay != GFARM_ERR_NO_ERROR) { - gfarm_user_info_free(&ui); - return (e); - } - erelay = relay_get_reply(req, diag, &e, "ssss", - &ui.username, &ui.realname, &ui.homedir, &ui.gsi_dn); - if (erelay != GFARM_ERR_NO_ERROR) { - gfarm_user_info_free(&ui); - return (gfm_server_put_reply(peer, xid, sizep, - diag, erelay, "")); - } - e = gfm_server_put_reply(peer, xid, sizep, diag, e, "ssss", - &ui.username, &ui.realname, &ui.homedir, &ui.gsi_dn); - gfarm_user_info_free(&ui); - return (e); - } if (skip) { gfarm_user_info_free(&ui); return (GFARM_ERR_NO_ERROR); } - giant_lock(); - if (!from_client || user == NULL || !user_is_admin(user)) { - gflog_debug(GFARM_MSG_1001505, - "Operation is not permitted"); - e = GFARM_ERR_OPERATION_NOT_PERMITTED; - } else if (user_lookup(ui.username) != NULL) { - e = GFARM_ERR_ALREADY_EXISTS; - gflog_debug(GFARM_MSG_1001506, - "User already exists"); - } else if ((e = user_info_verify(&ui, diag)) != GFARM_ERR_NO_ERROR) { - /* nothing to do */ + + if (relay != NULL) { + gfarm_user_info_free(&ui); } else { - e = user_enter(&ui, NULL); - if (e == GFARM_ERR_NO_ERROR) { - e = db_user_add(&ui); - if (e != GFARM_ERR_NO_ERROR) { - gflog_debug(GFARM_MSG_1001507, - "db_user_add(): %s", - gfarm_error_string(e)); - user_remove(ui.username); + /* do not relay RPC to master gfmd */ + giant_lock(); + if (!from_client || user == NULL || !user_is_admin(user)) { + gflog_debug(GFARM_MSG_1001505, + "Operation is not permitted"); + e = GFARM_ERR_OPERATION_NOT_PERMITTED; + } else if (user_lookup(ui.username) != NULL) { + e = GFARM_ERR_ALREADY_EXISTS; + gflog_debug(GFARM_MSG_1001506, + "User already exists"); + } else if ((e = user_info_verify(&ui, diag)) != + GFARM_ERR_NO_ERROR) { + /* nothing to do */ + } else { + e = user_enter(&ui, NULL); + if (e == GFARM_ERR_NO_ERROR) { + e = db_user_add(&ui); + if (e != GFARM_ERR_NO_ERROR) { + gflog_debug(GFARM_MSG_1001507, + "db_user_add(): %s", + gfarm_error_string(e)); + user_remove(ui.username); /* do not free since ui still used in hash */ - do_not_free = 1; + do_not_free = 1; + } } } + if (e != GFARM_ERR_NO_ERROR && !do_not_free) + gfarm_user_info_free(&ui); + giant_unlock(); } - if (e != GFARM_ERR_NO_ERROR && !do_not_free) - gfarm_user_info_free(&ui); - giant_unlock(); - return (gfm_server_put_reply(peer, xid, sizep, diag, e, "")); + return (gfm_server_put_reply_with_relay(peer, xid, sizep, relay, diag, + &e, "")); } void @@ -926,71 +895,57 @@ { struct gfarm_user_info ui; struct user *u, *user = peer_get_user(peer); - gfarm_error_t e, erelay; + gfarm_error_t e; int needs_free = 0; - struct relayed_reqeust *req; + struct relayed_request *relay; static const char diag[] = "GFM_PROTO_USER_INFO_MODIFY"; - e = gfm_server_get_request(peer, sizep, diag, + e = gfm_server_get_request_with_relay(peer, sizep, skip, &relay, diag, + GFM_PROTO_USER_INFO_MODIFY, "ssss", &ui.username, &ui.realname, &ui.homedir, &ui.gsi_dn); - if (e != GFARM_ERR_NO_ERROR) { - gflog_debug(GFARM_MSG_1001508, - "USER_INFO_MODIFY request failed: %s", - gfarm_error_string(e)); + if (e != GFARM_ERR_NO_ERROR) return (e); - } - if (!mdhost_self_is_master()) { - erelay = relay_put_request(&req, diag, - GFM_PROTO_USER_INFO_MODIFY, "ssss", - &ui.username, &ui.realname, &ui.homedir, &ui.gsi_dn); - if (erelay != GFARM_ERR_NO_ERROR) { - gfarm_user_info_free(&ui); - return (e); - } - erelay = relay_get_reply(req, diag, &e, "ssss", - &ui.username, &ui.realname, &ui.homedir, &ui.gsi_dn); - if (erelay != GFARM_ERR_NO_ERROR) { - gfarm_user_info_free(&ui); - return (gfm_server_put_reply(peer, xid, sizep, - diag, erelay, "")); - } - e = gfm_server_put_reply(peer, xid, sizep, diag, e, "ssss", - &ui.username, &ui.realname, &ui.homedir, &ui.gsi_dn); - gfarm_user_info_free(&ui); - return (e); - } if (skip) { gfarm_user_info_free(&ui); return (GFARM_ERR_NO_ERROR); } - giant_lock(); - if (!from_client || user == NULL || !user_is_admin(user)) { - e = GFARM_ERR_OPERATION_NOT_PERMITTED; - gflog_debug(GFARM_MSG_1001509, - "operation is not permitted"); - needs_free = 1; - } else if ((u = user_lookup(ui.username)) == NULL) { - e = GFARM_ERR_NO_SUCH_USER; - gflog_debug(GFARM_MSG_1001510, - "user_lookup() failed"); - needs_free = 1; - } else if ((e = user_info_verify(&ui, diag)) != GFARM_ERR_NO_ERROR) { - needs_free = 1; - } else if ((e = db_user_modify(&ui, - DB_USER_MOD_REALNAME|DB_USER_MOD_HOMEDIR|DB_USER_MOD_GSI_DN)) != - GFARM_ERR_NO_ERROR) { - gflog_debug(GFARM_MSG_1001511, - "db_user_modify() failed:%s", - gfarm_error_string(e)); - needs_free = 1; + + if (relay != NULL) { + gfarm_user_info_free(&ui); } else { - user_modify(u, &ui); - free(ui.username); + /* do not relay RPC to master gfmd */ + giant_lock(); + if (!from_client || user == NULL || !user_is_admin(user)) { + e = GFARM_ERR_OPERATION_NOT_PERMITTED; + gflog_debug(GFARM_MSG_1001509, + "operation is not permitted"); + needs_free = 1; + } else if ((u = user_lookup(ui.username)) == NULL) { + e = GFARM_ERR_NO_SUCH_USER; + gflog_debug(GFARM_MSG_1001510, + "user_lookup() failed"); + needs_free = 1; + } else if ((e = user_info_verify(&ui, diag)) != + GFARM_ERR_NO_ERROR) { + needs_free = 1; + } else if ((e = db_user_modify(&ui, + DB_USER_MOD_REALNAME|DB_USER_MOD_HOMEDIR|DB_USER_MOD_GSI_DN)) != + GFARM_ERR_NO_ERROR) { + gflog_debug(GFARM_MSG_1001511, + "db_user_modify() failed:%s", + gfarm_error_string(e)); + needs_free = 1; + } else { + user_modify(u, &ui); + free(ui.username); + } + if (needs_free) + gfarm_user_info_free(&ui); + giant_unlock(); } - if (needs_free) - gfarm_user_info_free(&ui); - giant_unlock(); - return (gfm_server_put_reply(peer, xid, sizep, diag, e, "")); + + return (gfm_server_put_reply_with_relay(peer, xid, sizep, relay, diag, + &e, "")); } gfarm_error_t @@ -1016,50 +971,37 @@ int from_client, int skip) { char *username; - gfarm_error_t e, erelay; + gfarm_error_t e; struct user *user = peer_get_user(peer); - struct relayed_reqeust *req; + struct relayed_request *relay; static const char diag[] = "GFM_PROTO_USER_INFO_REMOVE"; - e = gfm_server_get_request(peer, sizep, diag, - "s", &username); - if (e != GFARM_ERR_NO_ERROR) { - gflog_debug(GFARM_MSG_1001512, - "USER_INFO_REMOVE request failed:%s", - gfarm_error_string(e)); + e = gfm_server_get_request_with_relay(peer, sizep, skip, &relay, diag, + GFM_PROTO_USER_INFO_REMOVE, "s", &username); + if (e != GFARM_ERR_NO_ERROR) return (e); - } - if (!mdhost_self_is_master()) { - erelay = relay_put_request(&req, diag, - GFM_PROTO_USER_INFO_REMOVE, "s", &username); - if (erelay != GFARM_ERR_NO_ERROR) { - free(username); - return (e); - } - erelay = relay_get_reply(req, diag, &e, "s", &username); - if (erelay != GFARM_ERR_NO_ERROR) { - free(username); - return (gfm_server_put_reply(peer, xid, sizep, - diag, erelay, "")); - } - e = gfm_server_put_reply(peer, xid, sizep, diag, e, - "s", &username); - free(username); - return (e); - } if (skip) { free(username); return (GFARM_ERR_NO_ERROR); } - giant_lock(); - if (!from_client || user == NULL || !user_is_admin(user)) { - gflog_debug(GFARM_MSG_1001513, - "operation is not permitted"); - e = GFARM_ERR_OPERATION_NOT_PERMITTED; - } else - e = user_info_remove(username, diag); - free(username); - giant_unlock(); - return (gfm_server_put_reply(peer, xid, sizep, diag, e, "")); + + if (relay != NULL) { + free(username); + } else { + /* do not relay RPC to master gfmd */ + giant_lock(); + if (!from_client || user == NULL || !user_is_admin(user)) { + gflog_debug(GFARM_MSG_1001513, + "operation is not permitted"); + e = GFARM_ERR_OPERATION_NOT_PERMITTED; + } else + e = user_info_remove(username, diag); + free(username); + giant_unlock(); + } + + return (gfm_server_put_reply_with_relay(peer, xid, sizep, relay, diag, + &e, "")); + } #endif /* TEST */ This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |