From: <n-...@us...> - 2012-10-31 04:04:03
|
Revision: 6975 http://gfarm.svn.sourceforge.net/gfarm/?rev=6975&view=rev Author: n-soda Date: 2012-10-31 04:03:53 +0000 (Wed, 31 Oct 2012) Log Message: ----------- merge r6824 from the 2.5 branch as the pullup #489: fix #488 - client-initiated replica creation fails, if the file is too large, this is a sub-ticket of #380 - network_receive_timeout is applied incorrectly. Revision Links: -------------- http://gfarm.svn.sourceforge.net/gfarm/?rev=6824&view=rev Modified Paths: -------------- gfarm_v2/branches/2.5.7/lib/libgfarm/gfarm/gfm_client.c gfarm_v2/branches/2.5.7/lib/libgfarm/gfarm/gfp_xdr.c gfarm_v2/branches/2.5.7/lib/libgfarm/gfarm/gfp_xdr.h gfarm_v2/branches/2.5.7/lib/libgfarm/gfarm/gfp_xdr_server.c gfarm_v2/branches/2.5.7/lib/libgfarm/gfarm/gfs_client.c gfarm_v2/branches/2.5.7/server/gfmd/abstract_host.c gfarm_v2/branches/2.5.7/server/gfmd/rpcsubr.c Modified: gfarm_v2/branches/2.5.7/lib/libgfarm/gfarm/gfm_client.c =================================================================== --- gfarm_v2/branches/2.5.7/lib/libgfarm/gfarm/gfm_client.c 2012-10-30 16:11:25 UTC (rev 6974) +++ gfarm_v2/branches/2.5.7/lib/libgfarm/gfarm/gfm_client.c 2012-10-31 04:03:53 UTC (rev 6975) @@ -876,7 +876,7 @@ } va_start(ap, format); - e = gfp_xdr_vrpc_result(gfm_server->conn, just, + e = gfp_xdr_vrpc_result(gfm_server->conn, just, 1, &errcode, &format, &ap); va_end(ap); @@ -912,7 +912,7 @@ gfm_client_connection_used(gfm_server); va_start(ap, format); - e = gfp_xdr_vrpc(gfm_server->conn, just, + e = gfp_xdr_vrpc(gfm_server->conn, just, 1, command, &errcode, &format, &ap); va_end(ap); Modified: gfarm_v2/branches/2.5.7/lib/libgfarm/gfarm/gfp_xdr.c =================================================================== --- gfarm_v2/branches/2.5.7/lib/libgfarm/gfarm/gfp_xdr.c 2012-10-30 16:11:25 UTC (rev 6974) +++ gfarm_v2/branches/2.5.7/lib/libgfarm/gfarm/gfp_xdr.c 2012-10-31 04:03:53 UTC (rev 6975) @@ -832,17 +832,19 @@ } gfarm_error_t -gfp_xdr_vrecv_sized(struct gfp_xdr *conn, int just, size_t *sizep, - int *eofp, const char **formatp, va_list *app) +gfp_xdr_vrecv_sized(struct gfp_xdr *conn, int just, int do_timeout, + size_t *sizep, int *eofp, const char **formatp, va_list *app) { - return gfp_xdr_vrecv_sized_x(conn, just, 1, sizep, eofp, formatp, app); + return (gfp_xdr_vrecv_sized_x(conn, just, do_timeout, + sizep, eofp, formatp, app)); } gfarm_error_t -gfp_xdr_vrecv(struct gfp_xdr *conn, int just, +gfp_xdr_vrecv(struct gfp_xdr *conn, int just, int do_timeout, int *eofp, const char **formatp, va_list *app) { - return (gfp_xdr_vrecv_sized_x(conn, just, 1, NULL, eofp, formatp, app)); + return (gfp_xdr_vrecv_sized_x(conn, just, do_timeout, + NULL, eofp, formatp, app)); } gfarm_error_t @@ -918,23 +920,26 @@ return (ntohl(n)); } -gfarm_error_t -gfp_xdr_recv_sized(struct gfp_xdr *conn, int just, size_t *sizep, - int *eofp, const char *format, ...) +static gfarm_error_t +gfp_xdr_vrecv_sized_x_check_format( + struct gfp_xdr *conn, int just, int do_timeout, + size_t *sizep, int *eofp, const char *format, va_list *app) { - va_list ap; gfarm_error_t e; - va_start(ap, format); - e = gfp_xdr_vrecv_sized_x(conn, just, 1, sizep, eofp, &format, &ap); - va_end(ap); - - if (e != GFARM_ERR_NO_ERROR) + e = gfp_xdr_vrecv_sized_x(conn, just, do_timeout, + sizep, eofp, &format, app); + if (e != GFARM_ERR_NO_ERROR) { + gflog_debug(GFARM_MSG_1001007, + "gfp_xdr_vrecv_sized_x() failed: %s", + gfarm_error_string(e)); return (e); + } if (*eofp) return (GFARM_ERR_NO_ERROR); if (*format != '\0') { - gflog_debug(GFARM_MSG_1001006, "gfp_xdr_recv_sized: " + gflog_debug(GFARM_MSG_1001008, + "gfp_xdr_vrecv_sized_x_check_format(): " "invalid format character: %c(%x)", *format, *format); return (GFARM_ERRMSG_GFP_XDR_RECV_INVALID_FORMAT_CHARACTER); } @@ -942,6 +947,20 @@ } gfarm_error_t +gfp_xdr_recv_sized(struct gfp_xdr *conn, int just, int do_timeout, + size_t *sizep, int *eofp, const char *format, ...) +{ + va_list ap; + gfarm_error_t e; + + va_start(ap, format); + e = gfp_xdr_vrecv_sized_x_check_format(conn, just, do_timeout, + sizep, eofp, format, &ap); + va_end(ap); + return (e); +} + +gfarm_error_t gfp_xdr_recv(struct gfp_xdr *conn, int just, int *eofp, const char *format, ...) { @@ -949,23 +968,10 @@ gfarm_error_t e; va_start(ap, format); - e = gfp_xdr_vrecv_sized_x(conn, just, 1, NULL, eofp, &format, &ap); + e = gfp_xdr_vrecv_sized_x_check_format(conn, just, 1, + NULL, eofp, format, &ap); va_end(ap); - - if (e != GFARM_ERR_NO_ERROR) { - gflog_debug(GFARM_MSG_1001007, - "gfp_xdr_vrecv_sized_x() failed: %s", - gfarm_error_string(e)); - return (e); - } - if (*eofp) - return (GFARM_ERR_NO_ERROR); - if (*format != '\0') { - gflog_debug(GFARM_MSG_1001008, "gfp_xdr_recv: " - "invalid format character: %c(%x)", *format, *format); - return (GFARM_ERRMSG_GFP_XDR_RECV_INVALID_FORMAT_CHARACTER); - } - return (GFARM_ERR_NO_ERROR); + return (e); } gfarm_error_t @@ -976,23 +982,10 @@ gfarm_error_t e; va_start(ap, format); - e = gfp_xdr_vrecv_sized_x(conn, just, 0, NULL, eofp, &format, &ap); + e = gfp_xdr_vrecv_sized_x_check_format(conn, just, 0, + NULL, eofp, format, &ap); va_end(ap); - - if (e != GFARM_ERR_NO_ERROR) { - gflog_debug(GFARM_MSG_1002559, - "gfp_xdr_vrecv_sized_x() failed: %s", - gfarm_error_string(e)); - return (e); - } - if (*eofp) - return (GFARM_ERR_NO_ERROR); - if (*format != '\0') { - gflog_debug(GFARM_MSG_1001008, "gfp_xdr_vrecv_sized_x: " - "invalid format character: %c(%x)", *format, *format); - return (GFARM_ERRMSG_GFP_XDR_RECV_INVALID_FORMAT_CHARACTER); - } - return (GFARM_ERR_NO_ERROR); + return (e); } gfarm_error_t @@ -1042,9 +1035,11 @@ * And if there is no remaining output parameter: * *sizep == 0 */ -gfarm_error_t -gfp_xdr_vrpc_result_sized(struct gfp_xdr *conn, int just, size_t *sizep, - gfarm_int32_t *errorp, const char **formatp, va_list *app) +static gfarm_error_t +gfp_xdr_vrpc_result_sized_internal( + struct gfp_xdr *conn, int just, int do_timeout, + size_t *sizep, gfarm_int32_t *errorp, + const char **formatp, va_list *app) { gfarm_error_t e; int eof; @@ -1052,7 +1047,11 @@ /* * receive response */ - e = gfp_xdr_recv_sized(conn, just, sizep, &eof, "i", errorp); + + /* timeout if it's asynchronous protocol, or do_timeout is specified */ + e = gfp_xdr_recv_sized(conn, just, + sizep != NULL || do_timeout, + sizep, &eof, "i", errorp); if (e != GFARM_ERR_NO_ERROR) { gflog_debug(GFARM_MSG_1001010, "receiving response (%d) failed: %s", @@ -1068,6 +1067,7 @@ if (*errorp != GFARM_ERR_NO_ERROR) return (GFARM_ERR_NO_ERROR); + /* always do timeout here, because error code is already received */ e = gfp_xdr_vrecv_sized_x(conn, just, 1, sizep, &eof, formatp, app); if (e != GFARM_ERR_NO_ERROR) { gflog_debug(GFARM_MSG_1001012, @@ -1089,23 +1089,37 @@ return (GFARM_ERR_NO_ERROR); } +gfarm_error_t +gfp_xdr_vrpc_result_sized(struct gfp_xdr *conn, int just, + size_t *sizep, gfarm_int32_t *errorp, + const char **formatp, va_list *app) +{ + /* + * always do timeout, because this is only called + * after asynchronous protocol header is received + */ + return (gfp_xdr_vrpc_result_sized_internal(conn, just, 1, + sizep, errorp, formatp, app)); +} + /* * get RPC result */ gfarm_error_t -gfp_xdr_vrpc_result(struct gfp_xdr *conn, - int just, gfarm_int32_t *errorp, const char **formatp, va_list *app) +gfp_xdr_vrpc_result(struct gfp_xdr *conn, int just, int do_timeout, + gfarm_int32_t *errorp, const char **formatp, va_list *app) { - return (gfp_xdr_vrpc_result_sized(conn, just, NULL, - errorp, formatp, app)); + return (gfp_xdr_vrpc_result_sized_internal(conn, just, do_timeout, + NULL, errorp, formatp, app)); } /* * do RPC with "request-args/result-args" format string. */ gfarm_error_t -gfp_xdr_vrpc(struct gfp_xdr *conn, int just, gfarm_int32_t command, - gfarm_int32_t *errorp, const char **formatp, va_list *app) +gfp_xdr_vrpc(struct gfp_xdr *conn, int just, int do_timeout, + gfarm_int32_t command, gfarm_int32_t *errorp, + const char **formatp, va_list *app) { gfarm_error_t e; @@ -1132,7 +1146,8 @@ } (*formatp)++; - return (gfp_xdr_vrpc_result(conn, just, errorp, formatp, app)); + return (gfp_xdr_vrpc_result(conn, just, do_timeout, + errorp, formatp, app)); } /* Modified: gfarm_v2/branches/2.5.7/lib/libgfarm/gfarm/gfp_xdr.h =================================================================== --- gfarm_v2/branches/2.5.7/lib/libgfarm/gfarm/gfp_xdr.h 2012-10-30 16:11:25 UTC (rev 6974) +++ gfarm_v2/branches/2.5.7/lib/libgfarm/gfarm/gfp_xdr.h 2012-10-31 04:03:53 UTC (rev 6975) @@ -68,16 +68,16 @@ const char **, va_list *); gfarm_error_t gfp_xdr_vrecv_sized_x(struct gfp_xdr *, int, int, size_t *, int *, const char **, va_list *); -gfarm_error_t gfp_xdr_vrecv_sized(struct gfp_xdr *, int, size_t *, +gfarm_error_t gfp_xdr_vrecv_sized(struct gfp_xdr *, int, int, size_t *, int *, const char **, va_list *); -gfarm_error_t gfp_xdr_vrecv(struct gfp_xdr *, int, +gfarm_error_t gfp_xdr_vrecv(struct gfp_xdr *, int, int, int *, const char **, va_list *); gfarm_error_t gfp_xdr_send_size_add(size_t *, const char *, ...); gfarm_error_t gfp_xdr_send(struct gfp_xdr *, const char *, ...); gfarm_uint32_t gfp_xdr_send_calc_crc32(struct gfp_xdr *, gfarm_uint32_t, int, size_t); -gfarm_error_t gfp_xdr_recv_sized(struct gfp_xdr *, int, size_t *, +gfarm_error_t gfp_xdr_recv_sized(struct gfp_xdr *, int, int, size_t *, int *, const char *, ...); gfarm_error_t gfp_xdr_recv(struct gfp_xdr *, int, int *, const char *, ...); @@ -91,10 +91,10 @@ const char **, va_list *); gfarm_error_t gfp_xdr_vrpc_result_sized(struct gfp_xdr *, int, size_t *, gfarm_int32_t *, const char **, va_list *); -gfarm_error_t gfp_xdr_vrpc_result(struct gfp_xdr *, int, +gfarm_error_t gfp_xdr_vrpc_result(struct gfp_xdr *, int, int, gfarm_int32_t *, const char **, va_list *); -gfarm_error_t gfp_xdr_vrpc(struct gfp_xdr *, - int, gfarm_int32_t, gfarm_int32_t *, const char **, va_list *); +gfarm_error_t gfp_xdr_vrpc(struct gfp_xdr *, int, int, + gfarm_int32_t, gfarm_int32_t *, const char **, va_list *); int gfp_xdr_recv_partial(struct gfp_xdr *, int, void *, int); gfarm_error_t gfp_xdr_recv_get_error(struct gfp_xdr *); Modified: gfarm_v2/branches/2.5.7/lib/libgfarm/gfarm/gfp_xdr_server.c =================================================================== --- gfarm_v2/branches/2.5.7/lib/libgfarm/gfarm/gfp_xdr_server.c 2012-10-30 16:11:25 UTC (rev 6974) +++ gfarm_v2/branches/2.5.7/lib/libgfarm/gfarm/gfp_xdr_server.c 2012-10-31 04:03:53 UTC (rev 6975) @@ -281,7 +281,13 @@ gfarm_error_t e; int eof; - e = gfp_xdr_recv_sized(client, just, sizep, &eof, "i", commandp); + /* + * always do timeout, because: + * - this is called when epoll(2) says it's ready to receive + * or + * - this is after async protocol header + */ + e = gfp_xdr_recv_sized(client, just, 1, sizep, &eof, "i", commandp); if (e != GFARM_ERR_NO_ERROR) return (e); if (eof) @@ -300,7 +306,8 @@ gfarm_error_t e; int eof; - e = gfp_xdr_vrecv_sized(client, just, sizep, &eof, &format, app); + /* always do timeout here, because request type is already received */ + e = gfp_xdr_vrecv_sized(client, just, 1, sizep, &eof, &format, app); if (e != GFARM_ERR_NO_ERROR) return (e); if (eof) Modified: gfarm_v2/branches/2.5.7/lib/libgfarm/gfarm/gfs_client.c =================================================================== --- gfarm_v2/branches/2.5.7/lib/libgfarm/gfarm/gfs_client.c 2012-10-30 16:11:25 UTC (rev 6974) +++ gfarm_v2/branches/2.5.7/lib/libgfarm/gfarm/gfs_client.c 2012-10-31 04:03:53 UTC (rev 6975) @@ -975,8 +975,8 @@ } va_start(ap, format); - e = gfp_xdr_vrpc_result(gfs_server->conn, just, - &errcode, &format, &ap); + e = gfp_xdr_vrpc_result(gfs_server->conn, just, 1, + &errcode, &format, &ap); va_end(ap); if (IS_CONNECTION_ERROR(e)) { @@ -1002,29 +1002,24 @@ return (GFARM_ERR_NO_ERROR); } -gfarm_error_t -gfs_client_rpc(struct gfs_connection *gfs_server, int just, int command, - const char *format, ...) +static gfarm_error_t +gfs_client_vrpc(struct gfs_connection *gfs_server, int just, int do_timeout, + int command, const char *format, va_list *app) { - va_list ap; gfarm_error_t e; int errcode; gfs_client_connection_used(gfs_server); - va_start(ap, format); - e = gfp_xdr_vrpc(gfs_server->conn, just, - command, &errcode, &format, &ap); - va_end(ap); - + e = gfp_xdr_vrpc(gfs_server->conn, just, do_timeout, + command, &errcode, &format, app); if (IS_CONNECTION_ERROR(e)) { gfs_client_execute_hook_for_connection_error(gfs_server); gfs_client_purge_from_cache(gfs_server); } if (e != GFARM_ERR_NO_ERROR) { - gflog_debug(GFARM_MSG_1001200, - "gfp_xdr_vrpc() failed: %s", - gfarm_error_string(e)); + gflog_debug(GFARM_MSG_UNFIXED, "gfp_xdr_vrpc(%d) failed: %s", + command, gfarm_error_string(e)); return (e); } if (errcode != 0) { @@ -1032,15 +1027,40 @@ * We just use gfarm_error_t as the errcode, * Note that GFARM_ERR_NO_ERROR == 0. */ - gflog_debug(GFARM_MSG_1001201, - "gfp_xdr_vrpc() errcode=%d", - errcode); + gflog_debug(GFARM_MSG_UNFIXED, "gfp_xdr_vrpc(%d) errcode=%d", + command, errcode); return (errcode); } return (GFARM_ERR_NO_ERROR); } gfarm_error_t +gfs_client_rpc(struct gfs_connection *gfs_server, int just, + int command, const char *format, ...) +{ + gfarm_error_t e; + va_list ap; + + va_start(ap, format); + e = gfs_client_vrpc(gfs_server, just, 1, command, format, &ap); + va_end(ap); + return (e); +} + +gfarm_error_t +gfs_client_rpc_notimeout(struct gfs_connection *gfs_server, int just, + int command, const char *format, ...) +{ + gfarm_error_t e; + va_list ap; + + va_start(ap, format); + e = gfs_client_vrpc(gfs_server, just, 0, command, format, &ap); + va_end(ap); + return (e); +} + +gfarm_error_t gfs_client_process_set(struct gfs_connection *gfs_server, gfarm_int32_t type, const char *key, size_t size, gfarm_pid_t pid) { @@ -1279,8 +1299,8 @@ gfs_client_replica_add_from(struct gfs_connection *gfs_server, char *host, gfarm_int32_t port, gfarm_int32_t fd) { - return (gfs_client_rpc(gfs_server, 0, GFS_PROTO_REPLICA_ADD_FROM, - "sii/", host, port, fd)); + return (gfs_client_rpc_notimeout(gfs_server, 0, + GFS_PROTO_REPLICA_ADD_FROM, "sii/", host, port, fd)); } gfarm_error_t Modified: gfarm_v2/branches/2.5.7/server/gfmd/abstract_host.c =================================================================== --- gfarm_v2/branches/2.5.7/server/gfmd/abstract_host.c 2012-10-30 16:11:25 UTC (rev 6974) +++ gfarm_v2/branches/2.5.7/server/gfmd/abstract_host.c 2012-10-31 04:03:53 UTC (rev 6975) @@ -927,7 +927,7 @@ e = gfp_xdr_vrpc_result_sized(conn, 0, &size, &errcode, formatp, app); } else { /* synchronous mode */ - e = gfp_xdr_vrpc_result(conn, 0, &errcode, formatp, app); + e = gfp_xdr_vrpc_result(conn, 0, 1, &errcode, formatp, app); abstract_host_sender_unlock(host, peer, back_channel_type_name(peer)); } Modified: gfarm_v2/branches/2.5.7/server/gfmd/rpcsubr.c =================================================================== --- gfarm_v2/branches/2.5.7/server/gfmd/rpcsubr.c 2012-10-30 16:11:25 UTC (rev 6974) +++ gfarm_v2/branches/2.5.7/server/gfmd/rpcsubr.c 2012-10-31 04:03:53 UTC (rev 6975) @@ -31,7 +31,7 @@ gflog_info(GFARM_MSG_1000225, "<%s> start receiving", diag); va_start(ap, format); - e = gfp_xdr_vrecv(client, 0, &eof, &format, &ap); + e = gfp_xdr_vrecv(client, 0, 1, &eof, &format, &ap); va_end(ap); if (e != GFARM_ERR_NO_ERROR) { This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |