static int reset_and_reopen(GFS_File gf, void *closure) { gfarm_error_t e = GFARM_ERR_NO_ERROR; struct reset_and_reopen_info *ri = closure; struct gfm_connection *gfm_server = ri->gfm_server; struct gfm_connection *gfm_server1; struct gfs_connection *sc; struct gfarm_filesystem *fs = gfarm_filesystem_get_by_connection(gfm_server); int fc = gfarm_filesystem_failover_count(fs); if ((e = gfm_client_connection_acquire(gfm_client_hostname(gfm_server), gfm_client_port(gfm_server), gfm_client_username(gfm_server), &gfm_server1)) != GFARM_ERR_NO_ERROR) { gf->error = e; gflog_debug(GFARM_MSG_1003383, "gfm_client_connection_acquire: %s", gfarm_error_string(e)); return (1); } if (gfm_server != gfm_server1) { gfm_client_connection_free(gfm_server1); gflog_debug(GFARM_MSG_1003384, "reconnected to other gfmd or gfmd restarted"); ri->must_retry = 1; return (0); } /* if old gfm_connection is alive, fd must be closed */ (void)gfm_close_fd(gf->gfm_server, gf->fd); gf->fd = GFARM_DESCRIPTOR_INVALID; gfm_client_connection_free(gf->gfm_server); /* ref count of gfm_server is incremented above */ gf->gfm_server = gfm_server; if ((sc = get_storage_context(gf->view_context)) != NULL) { /* * pid will be 0 if gfarm_client_process_reset() resulted * in failure at reset_and_reopen() previously called with * the same gfs_connection. */ if (gfs_client_pid(sc) == 0) { gf->error = GFARM_ERR_CONNECTION_ABORTED; gflog_debug(GFARM_MSG_1003385, "%s", gfarm_error_string(gf->error)); return (1); } /* reset pid */ if (fc > gfs_client_connection_failover_count(sc)) { gfs_client_connection_set_failover_count(sc, fc); /* * gfs_file just in scheduling is not related to * gfs_server. * In that case, gfarm_client_process_reset() is * called in gfs_pio_open_section(). * * all fd will be closed in gfsd by * gfarm_client_process_reset(). */ e = gfarm_client_process_reset(sc, gfm_server); if (e != GFARM_ERR_NO_ERROR) { gf->error = e; gflog_debug(GFARM_MSG_1003386, "gfarm_client_process_reset: %s", gfarm_error_string(e)); return (1); } } } /* reopen file */ if (gfs_pio_error(gf) != GFARM_ERR_STALE_FILE_HANDLE && (e = gfs_pio_reopen(fs, gf)) != GFARM_ERR_NO_ERROR) { gflog_debug(GFARM_MSG_1003387, "gfs_pio_reopen: %s", gfarm_error_string(e)); } return (1); }
/* * the following function is for client, * server/daemon process shouldn't call it. * Because this function may read incorrect setting from user specified * $USER or $HOME. */ gfarm_error_t gfarm_initialize(int *argcp, char ***argvp) { gfarm_error_t e; enum gfarm_auth_method auth_method; #ifdef HAVE_GSI int saved_auth_verb; #endif e = gfarm_set_local_user_for_this_local_account(); if (e != GFARM_ERR_NO_ERROR) return (e); e = gfarm_config_read(); if (e != GFARM_ERR_NO_ERROR) return (e); #ifdef HAVE_GSI /* * Suppress verbose error messages. The message will be * displayed later in gfarm_auth_request_gsi(). */ saved_auth_verb = gflog_auth_set_verbose(0); (void)gfarm_gsi_client_initialize(); (void)gflog_auth_set_verbose(saved_auth_verb); #endif /* * In sharedsecret authentication, a global user name is * required to be set to access a metadata server. */ e = gfarm_set_global_user_for_sharedsecret(); if (e != GFARM_ERR_NO_ERROR) return (e); /* * XXX FIXME this shouldn't be necessary here * to support multiple metadata server */ e = gfm_client_connection_acquire(gfarm_metadb_server_name, gfarm_metadb_server_port, &gfarm_metadb_server); if (e != GFARM_ERR_NO_ERROR) { fprintf(stderr, "connecting gfmd: %s\n", gfarm_error_string(e)); exit(1); } gfarm_metadb_set_server(gfarm_metadb_server); /* metadb access is required to obtain a global user name by GSI */ auth_method = gfm_client_connection_auth_method(gfarm_metadb_server); if (GFARM_IS_AUTH_GSI(auth_method)) { e = gfarm_set_global_user_by_gsi(); if (e != GFARM_ERR_NO_ERROR) return (e); } if (argvp != NULL) { #if 0 /* not yet in gfarm v2 */ if (getenv("DISPLAY") != NULL) gfarm_debug_initialize((*argvp)[0]); e = gfarm_parse_argv(argcp, argvp); if (e != GFARM_ERR_NO_ERROR) return (e); #endif /* not yet in gfarm v2 */ } gfarm_auth_random(gfarm_client_pid_key, gfarm_client_pid_key_len); e = gfm_client_process_alloc(gfarm_metadb_server, gfarm_client_pid_key_type, gfarm_client_pid_key, gfarm_client_pid_key_len, &gfarm_client_pid); if (e != GFARM_ERR_NO_ERROR) gflog_fatal("failed to allocate gfarm PID: %s", gfarm_error_string(e)); #if 0 /* not yet in gfarm v2 */ gfarm_initialized = 1; #endif /* not yet in gfarm v2 */ return (GFARM_ERR_NO_ERROR); }