From: <ta...@us...> - 2010-11-23 15:49:45
|
Revision: 4932 http://gfarm.svn.sourceforge.net/gfarm/?rev=4932&view=rev Author: tatebe Date: 2010-11-23 15:49:38 +0000 (Tue, 23 Nov 2010) Log Message: ----------- merge r4930 * known_network directive to specify a network for file system nodes. * File system nodes not specified by the known_network directive are assumed to be in an IPv4 class C network as same as before. * do not merge adjacent networks since the class C network is already too large. Modified Paths: -------------- gfarm_v2/branches/2.3/doc/docbook/en/ref/man5/gfarm2.conf.5.docbook gfarm_v2/branches/2.3/doc/docbook/ja/ref/man5/gfarm2.conf.5.docbook gfarm_v2/branches/2.3/lib/libgfarm/gfarm/config.c gfarm_v2/branches/2.3/lib/libgfarm/gfarm/host.c gfarm_v2/branches/2.3/lib/libgfarm/gfarm/host.h gfarm_v2/branches/2.3/lib/libgfarm/gfarm/hostspec.c gfarm_v2/branches/2.3/lib/libgfarm/gfarm/hostspec.h gfarm_v2/branches/2.3/lib/libgfarm/gfarm/schedule.c Modified: gfarm_v2/branches/2.3/doc/docbook/en/ref/man5/gfarm2.conf.5.docbook =================================================================== --- gfarm_v2/branches/2.3/doc/docbook/en/ref/man5/gfarm2.conf.5.docbook 2010-11-23 15:40:56 UTC (rev 4931) +++ gfarm_v2/branches/2.3/doc/docbook/en/ref/man5/gfarm2.conf.5.docbook 2010-11-23 15:49:38 UTC (rev 4932) @@ -809,6 +809,21 @@ --> <varlistentry> +<term><token>known_network</token> <parameter>Host_specification</parameter></term> +<listitem> +<para>The <token>known_network</token> statement specifies a network +address for file system nodes. It is used to group file system nodes +at file systen node scheduling. +File system nodes that are not specified in this directive are assumed +to be in an IPv4 class C network.</para> +<para>For example,</para> +<literallayout> + known_network 192.168.0.0/24 +</literallayout> +</listitem> +</varlistentry> + +<varlistentry> <term><token>admin_user</token> <parameter>user</parameter></term> <listitem> <para> @@ -1174,6 +1189,7 @@ <!-- <address_use_statement> | --> <!-- <client_architecture_statement> | --> <!-- <option_statement> | --> + <known_network_statement> | <admin_user_statement> | <admin_user_gsi_dn_statement> | <local_user_map_statement> | @@ -1246,6 +1262,7 @@ <!-- "client_architecture" <architecture> <hostspec> --> <!-- <option_statement> ::= "option" <an_option> --> <!-- <an_option> ::= "noatime" --> + <known_network_statement> ::= "known_network" <hostspec> <admin_user_statement> ::= "admin_user" <string> <admin_user_gsi_dn_statement> ::= "admin_user_gsi_dn" <string> <local_user_map_statement> ::= "local_user_map" <pathname> Modified: gfarm_v2/branches/2.3/doc/docbook/ja/ref/man5/gfarm2.conf.5.docbook =================================================================== --- gfarm_v2/branches/2.3/doc/docbook/ja/ref/man5/gfarm2.conf.5.docbook 2010-11-23 15:40:56 UTC (rev 4931) +++ gfarm_v2/branches/2.3/doc/docbook/ja/ref/man5/gfarm2.conf.5.docbook 2010-11-23 15:49:38 UTC (rev 4932) @@ -779,6 +779,21 @@ --> <varlistentry> +<term><token>known_network</token> <parameter>\xA5ۥ\xB9\xA5Ȼ\xD8\xC4\xEA</parameter></term> +<listitem> +<para>\xA5ե\xA1\xA5\xA4\xA5륷\xA5\xB9\xA5ƥ\xE0\xA5Ρ\xBC\xA5ɤΥͥåȥ\xA5\xAF\xA4\xF2\xBB\xD8\xC4ꤷ\xA4ޤ\xB9\xA1\xA3 +\xCBܥͥåȥ\xA5\xAF\xA4ϡ\xA2 +\xA5ե\xA1\xA5\xA4\xA5륷\xA5\xB9\xA5ƥ\xE0\xA5Ρ\xBC\xA5\xC9\xC1\xAA\xC2\xF2\xBB\xFE\xA4Υ\xB0\xA5롼\xA5ԥ\xCB\xCD\xF8\xCDѤ\xB5\xA4\xEC\xA4ޤ\xB9\xA1\xA3 +\xA4\xB3\xA4\xCEʸ\xA4ǻ\xD8\xC4ꤷ\xA4\xBF\xA5\xA2\xA5ɥ쥹\xA4\xCBŬ\xB9礷\xA4ʤ\xA4IP\xA5\xA2\xA5ɥ쥹\xA4ξ\xEC\xB9硢 +IPv4\xA4Υ\xAF\xA5饹C\xA5ͥåȥ\xA5\xAF\xA4\xAC\xB2\xBE\xC4ꤵ\xA4\xEC\xA4ޤ\xB9\xA1\xA3</para> +<para>\xCE\xE3:</para> +<literallayout> + known_network 192.168.0.0/24 +</literallayout> +</listitem> +</varlistentry> + +<varlistentry> <term><token>admin_user</token> <parameter>\xA5桼\xA5\xB6̾</parameter></term> <listitem> <para> @@ -1137,6 +1152,7 @@ <!-- <address_use_statement> | --> <!-- <client_architecture_statement> | --> <!-- <option_statement> | --> + <known_network_statement> | <admin_user_statement> | <admin_user_gsi_dn_statement> | <local_user_map_statement> | @@ -1209,6 +1225,7 @@ <!-- "client_architecture" <architecture> <hostspec> --> <!-- <option_statement> ::= "option" <an_option> --> <!-- <an_option> ::= "noatime" --> + <known_network_statement> ::= "known_network" <hostspec> <admin_user_statement> ::= "admin_user" <string> <admin_user_gsi_dn_statement> ::= "admin_user_gsi_dn" <string> <local_user_map_statement> ::= "local_user_map" <pathname> Modified: gfarm_v2/branches/2.3/lib/libgfarm/gfarm/config.c =================================================================== --- gfarm_v2/branches/2.3/lib/libgfarm/gfarm/config.c 2010-11-23 15:40:56 UTC (rev 4931) +++ gfarm_v2/branches/2.3/lib/libgfarm/gfarm/config.c 2010-11-23 15:49:38 UTC (rev 4932) @@ -827,6 +827,49 @@ #endif static gfarm_error_t +parse_known_network_arguments(char *p, char **op) +{ + gfarm_error_t e; + char *tmp, *address; + struct gfarm_hostspec *hostspecp; + + /* assert(strcmp(*op, "known_network") == 0); */ + + e = gfarm_strtoken(&p, &address); + if (e != GFARM_ERR_NO_ERROR) + return (e); + if (address == NULL) + return (GFARM_ERRMSG_MISSING_ADDRESS_ARGUMENT); + e = gfarm_strtoken(&p, &tmp); + if (e != GFARM_ERR_NO_ERROR) + return (e); + if (tmp != NULL) + return (GFARM_ERRMSG_TOO_MANY_ARGUMENTS); + + e = gfarm_hostspec_parse(address, &hostspecp); + if (e != GFARM_ERR_NO_ERROR) { + /* + * we don't return `host' to *op here, + * because it may be too long. + */ + *op = "1st(address) argument"; + return (e); + } + + e = gfarm_known_network_list_add(hostspecp); + if (e != GFARM_ERR_NO_ERROR) { + /* + * we don't return `option' to *op here, + * because it may be too long. + */ + *op = "1st(address) argument"; + gfarm_hostspec_free(hostspecp); + return (e); + } + return (GFARM_ERR_NO_ERROR); +} + +static gfarm_error_t parse_local_user_map(char *p, char **op) { gfarm_error_t e; @@ -1206,6 +1249,8 @@ } else if (strcmp(s, o = "address_use") == 0) { e = parse_address_use_arguments(p, &o); #endif + } else if (strcmp(s, o = "known_network") == 0) { + e = parse_known_network_arguments(p, &o); } else if (strcmp(s, o = "local_user_map") == 0) { e = parse_local_user_map(p, &o); } else if (strcmp(s, o = "local_group_map") == 0) { Modified: gfarm_v2/branches/2.3/lib/libgfarm/gfarm/host.c =================================================================== --- gfarm_v2/branches/2.3/lib/libgfarm/gfarm/host.c 2010-11-23 15:40:56 UTC (rev 4931) +++ gfarm_v2/branches/2.3/lib/libgfarm/gfarm/host.c 2010-11-23 15:49:38 UTC (rev 4932) @@ -666,24 +666,69 @@ return (0); } -gfarm_error_t -gfarm_addr_range_get(struct sockaddr *addr, - struct sockaddr *min, struct sockaddr *max) +struct known_network { + struct known_network *next; + struct gfarm_hostspec *network; +}; + +struct known_network *known_network_list = NULL; +struct known_network **known_network_list_last = &known_network_list; + +void +gfarm_known_network_dump(void) { - gfarm_uint32_t addr_in, addr_net; + char network[GFARM_HOSTSPEC_STRLEN]; + struct known_network *n; - assert(addr->sa_family == AF_INET); - addr_in = ntohl(((struct sockaddr_in *)addr)->sin_addr.s_addr); - /* XXX - get IPv4 C class part */ - addr_net = addr_in & 0xffffff00; + for (n = known_network_list; n != NULL; n = n->next) { + gfarm_hostspec_to_string(n->network, network, sizeof network); + gflog_info(GFARM_MSG_UNFIXED, "%s", network); + } +} - /* XXX - minimum & maximum address in the IPv4 C class net */ - memset(min, 0, sizeof(*min)); - min->sa_family = AF_INET; - ((struct sockaddr_in *)min)->sin_addr.s_addr = htonl(addr_net); +gfarm_error_t +gfarm_known_network_list_add(struct gfarm_hostspec *network) +{ + struct known_network *known_network = malloc(sizeof(*known_network)); - memset(max, 0, sizeof(*max)); - max->sa_family = AF_INET; - ((struct sockaddr_in *)max)->sin_addr.s_addr = htonl(addr_net | 0xff); + if (known_network == NULL) + return (GFARM_ERR_NO_MEMORY); + known_network->network = network; + known_network->next = NULL; + *known_network_list_last = known_network; + known_network_list_last = &known_network->next; return (GFARM_ERR_NO_ERROR); } + +gfarm_error_t +gfarm_addr_network_get(struct sockaddr *addr, + struct gfarm_hostspec **networkp) +{ + gfarm_uint32_t addr_in; + struct known_network *n; + struct gfarm_hostspec *network; + gfarm_uint32_t mask; + gfarm_error_t e; + + /* search in the known network list */ + for (n = known_network_list; n != NULL; n = n->next) { + if (gfarm_hostspec_match(n->network, NULL, addr)) { + if (networkp != NULL) + *networkp = n->network; + return (GFARM_ERR_NO_ERROR); + } + } + /* XXX - assume IPv4 class C network */ + assert(addr->sa_family == AF_INET); + addr_in = ntohl(((struct sockaddr_in *)addr)->sin_addr.s_addr); + mask = 0xffffff00; + e = gfarm_hostspec_af_inet4_new(htonl(addr_in & mask), htonl(mask), + &network); + if (e == GFARM_ERR_NO_ERROR) { + e = gfarm_known_network_list_add(network); + if (e == GFARM_ERR_NO_ERROR) + if (networkp != NULL) + *networkp = network; + } + return (e); +} Modified: gfarm_v2/branches/2.3/lib/libgfarm/gfarm/host.h =================================================================== --- gfarm_v2/branches/2.3/lib/libgfarm/gfarm/host.h 2010-11-23 15:40:56 UTC (rev 4931) +++ gfarm_v2/branches/2.3/lib/libgfarm/gfarm/host.h 2010-11-23 15:49:38 UTC (rev 4932) @@ -1,5 +1,6 @@ struct gfm_connection; struct gfarm_host_info; +struct gfarm_hostspec; gfarm_error_t gfm_host_info_get_by_name_alias( struct gfm_connection *, const char *, struct gfarm_host_info *); @@ -27,8 +28,6 @@ struct sockaddr; #if 0 /* XXX for now */ -struct gfarm_hostspec; - gfarm_error_t gfarm_host_address_use(struct gfarm_hostspec *); #endif /* for now */ @@ -36,11 +35,9 @@ const char *, int, struct gfarm_host_info *, struct sockaddr *, char **); -struct sockaddr; gfarm_error_t gfm_host_address_get(struct gfm_connection *, const char *, int, struct sockaddr *, char **); -int gfarm_addr_is_same_net(struct sockaddr *, - struct sockaddr *, struct sockaddr *, int, int *); -gfarm_error_t gfarm_addr_range_get(struct sockaddr *, - struct sockaddr *, struct sockaddr *); +gfarm_error_t gfarm_known_network_list_add(struct gfarm_hostspec *); +gfarm_error_t gfarm_addr_network_get(struct sockaddr *, + struct gfarm_hostspec **); Modified: gfarm_v2/branches/2.3/lib/libgfarm/gfarm/hostspec.c =================================================================== --- gfarm_v2/branches/2.3/lib/libgfarm/gfarm/hostspec.c 2010-11-23 15:40:56 UTC (rev 4931) +++ gfarm_v2/branches/2.3/lib/libgfarm/gfarm/hostspec.c 2010-11-23 15:49:38 UTC (rev 4932) @@ -262,6 +262,33 @@ return (0); } +void +gfarm_hostspec_to_string(struct gfarm_hostspec *hostspec, + char *string, size_t size) +{ + unsigned char *a, *m; + + if (size <= 0) + return; + + switch (hostspec->type) { + case GFHS_ANY: + string[0] = '\0'; + return; + case GFHS_NAME: + strncpy(string, hostspec->u.name, size); + return; + case GFHS_AF_INET4: + a = (unsigned char *)&hostspec->u.in4_addr.addr.s_addr; + m = (unsigned char *)&hostspec->u.in4_addr.mask.s_addr; + snprintf(string, size, "%d.%d.%d.%d/%d.%d.%d.%d", + a[0], a[1], a[2], a[3], m[0], m[1], m[2], m[3]); + return; + } + /* assert(0); */ + return; +} + gfarm_error_t gfarm_sockaddr_to_name(struct sockaddr *addr, char **namep) { Modified: gfarm_v2/branches/2.3/lib/libgfarm/gfarm/hostspec.h =================================================================== --- gfarm_v2/branches/2.3/lib/libgfarm/gfarm/hostspec.h 2010-11-23 15:40:56 UTC (rev 4931) +++ gfarm_v2/branches/2.3/lib/libgfarm/gfarm/hostspec.h 2010-11-23 15:49:38 UTC (rev 4932) @@ -5,11 +5,19 @@ struct gfarm_hostspec; struct sockaddr; +gfarm_error_t gfarm_hostspec_af_inet4_new(gfarm_uint32_t, gfarm_uint32_t, + struct gfarm_hostspec **); +void gfarm_hostspec_free(struct gfarm_hostspec *); + gfarm_error_t gfarm_hostspec_parse(char *, struct gfarm_hostspec **); void gfarm_hostspec_free(struct gfarm_hostspec *); int gfarm_hostspec_match(struct gfarm_hostspec *, const char *, struct sockaddr *); +/* 41 "IPv6 address" + 1 '/' + 41 + 1 '\0' */ +#define GFARM_HOSTSPEC_STRLEN 84 +void gfarm_hostspec_to_string(struct gfarm_hostspec *, char *, size_t); + gfarm_error_t gfarm_sockaddr_to_name(struct sockaddr *, char **); /* "[ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff]" */ Modified: gfarm_v2/branches/2.3/lib/libgfarm/gfarm/schedule.c =================================================================== --- gfarm_v2/branches/2.3/lib/libgfarm/gfarm/schedule.c 2010-11-23 15:40:56 UTC (rev 4931) +++ gfarm_v2/branches/2.3/lib/libgfarm/gfarm/schedule.c 2010-11-23 15:49:38 UTC (rev 4932) @@ -33,6 +33,7 @@ #include "liberror.h" #include "conn_hash.h" #include "host.h" /* gfarm_host_info_address_get() */ +#include "hostspec.h" #include "config.h" #include "gfm_proto.h" #include "gfm_client.h" @@ -286,7 +287,7 @@ struct search_idle_network { struct search_idle_network *next; - struct sockaddr min, max; + struct gfarm_hostspec *network; int rtt_usec; /* if NET_FLAG_RTT_AVAIL */ int flags; @@ -364,19 +365,9 @@ if (net == NULL) return (GFARM_ERR_NO_MEMORY); net->rtt_usec = 0; /* i.e. local network */ -#if 0 /* XXX not implemented yet */ - /* - * XXX should get the netmark of the local network. - * but gfarm_addr_range_get_localnet() isn't implemented yet, and - * the algorithm to merge networks in search_idle_network_list_add() - * doesn't work for a network which is smaller than IPv4 C class. - */ - gfarm_addr_range_get_localnet(&peer_addr, &net->min, &net->max); + /* XXX - gfarm_addr_network_get() may assume IPv4 class C network */ + gfarm_addr_network_get(&peer_addr, &net->network); net->flags = NET_FLAG_NETMASK_KNOWN | NET_FLAG_RTT_AVAIL; -#else - gfarm_addr_range_get(&peer_addr, &net->min, &net->max); - net->flags = NET_FLAG_RTT_AVAIL; -#endif net->candidate_list = NULL; net->candidate_last = &net->candidate_list; net->next = NULL; @@ -389,77 +380,14 @@ search_idle_network_list_add(struct sockaddr *addr, struct search_idle_network **netp) { - struct sockaddr min, max; - struct search_idle_network *net, *net2, **net2p; - int widened, widened2; + struct search_idle_network *net; + gfarm_error_t e; - gfarm_addr_range_get(addr, &min, &max); - /* XXX - if there are lots of networks, this is too slow */ for (net = search_idle_network_list; net != NULL; net = net->next) { - if (!gfarm_addr_is_same_net(addr, &net->min, &net->max, - (net->flags & NET_FLAG_NETMASK_KNOWN) == 0, - &widened)) - continue;; - if (widened != 0) { - /* widen the net to make it include the addr */ - if (widened < 0) - net->min = min; - else - net->max = max; - for (net2p = &net->next; (net2 = *net2p) != NULL; - net2p = &net2->next) { - struct gfarm_hash_iterator it; - struct gfarm_hash_entry *entry; - struct search_idle_host_state *h; - - if (!gfarm_addr_is_same_net(addr, - &net2->min, &net2->max, - (net2->flags & NET_FLAG_NETMASK_KNOWN)== 0, - &widened2)) - continue; - - /* merge net2 into net */ - assert(widened2 == 0 || widened2 == -widened); - if (widened < 0) - net->min = net2->min; - else - net->max = net2->max; - - /* choose shorter RTT between net & net2 */ - if ((net2->flags & NET_FLAG_RTT_AVAIL) == 0) { - /* not need to update net->rtt_usec */ - } else if ((net->flags&NET_FLAG_RTT_AVAIL)==0){ - net->flags |= NET_FLAG_RTT_AVAIL; - net->rtt_usec = net2->rtt_usec; - } else if (net->rtt_usec > net2->rtt_usec) { - net->rtt_usec = net2->rtt_usec; - } - net->flags |= net2->flags; - - /* adjust hosts_state appropriately */ - for (gfarm_hash_iterator_begin( - search_idle_hosts_state, &it); - !gfarm_hash_iterator_is_end(&it); - gfarm_hash_iterator_next(&it)) { - entry = - gfarm_hash_iterator_access(&it); - h = gfarm_hash_entry_data(entry); - if (h->net == net2) - h->net = net; - } - *net->candidate_last = net2->candidate_list; - net->candidate_last = net2->candidate_last; - - if (search_idle_local_net == net2) - search_idle_local_net = net; - - *net2p = net2->next; - free(net2); - break; - } - } + if (!gfarm_hostspec_match(net->network, NULL, addr)) + continue; *netp = net; return (GFARM_ERR_NO_ERROR); } @@ -467,9 +395,15 @@ GFARM_MALLOC(net); if (net == NULL) return (GFARM_ERR_NO_MEMORY); - net->min = min; - net->max = max; - net->flags = 0; + e = gfarm_addr_network_get(addr, &net->network); + if (e != GFARM_ERR_NO_ERROR) { + free(net); + gflog_debug(GFARM_MSG_UNFIXED, + "search_idle_network_list_add: no memory"); + return (GFARM_ERR_NO_MEMORY); + } + /* XXX - may assume IPv4 class C network */ + net->flags = NET_FLAG_NETMASK_KNOWN; net->candidate_list = NULL; net->candidate_last = &net->candidate_list; net->ongoing = 0; @@ -1652,7 +1586,6 @@ { gfarm_error_t e; struct sockaddr addr; - int widened; /* XXX it's desirable to use struct sockaddr in the scheduling cache */ @@ -1665,11 +1598,8 @@ search_idle_network_list_init(gfm_server) != GFARM_ERR_NO_ERROR) return (0); - return (gfarm_addr_is_same_net(&addr, - &search_idle_local_net->min, - &search_idle_local_net->max, - (search_idle_local_net->flags & NET_FLAG_NETMASK_KNOWN) == 0, - &widened)); + return (gfarm_hostspec_match(search_idle_local_net->network, + NULL, &addr)); } /* @@ -1679,29 +1609,21 @@ gfarm_schedule_network_cache_dump(void) { struct search_idle_network *n; - unsigned char *ip_min, *ip_max; + char addr[GFARM_HOSTSPEC_STRLEN]; for (n = search_idle_network_list; n != NULL; n = n->next) { - ip_min = (unsigned char *) - &((struct sockaddr_in *)&n->min)->sin_addr.s_addr; - ip_max = (unsigned char *) - &((struct sockaddr_in *)&n->max)->sin_addr.s_addr; /* * the reason why we don't use inet_ntoa() here is * because inet_ntoa() uses static work area, so it cannot be * called for two instances (ip_min and ip_max) at once. */ + gfarm_hostspec_to_string(n->network, addr, sizeof addr); if (n->flags & NET_FLAG_RTT_AVAIL) gflog_info(GFARM_MSG_1000174, - "%d.%d.%d.%d - %d.%d.%d.%d: RTT %d usec", - ip_min[0], ip_min[1], ip_min[2], ip_min[3], - ip_max[0], ip_max[1], ip_max[2], ip_max[3], - n->rtt_usec); + "%s: RTT %d usec", addr, n->rtt_usec); else gflog_info(GFARM_MSG_1000175, - "%d.%d.%d.%d - %d.%d.%d.%d: RTT unavailable", - ip_min[0], ip_min[1], ip_min[2], ip_min[3], - ip_max[0], ip_max[1], ip_max[2], ip_max[3]); + "%s: RTT unavailable", addr); } } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |