gfarm_error_t gfs_statfsnode(char *host, int port, gfarm_int32_t *bsize, gfarm_off_t *blocks, gfarm_off_t *bfree, gfarm_off_t *bavail, gfarm_off_t *files, gfarm_off_t *ffree, gfarm_off_t *favail) { gfarm_error_t e; struct gfm_connection *gfm_server; struct gfs_connection *gfs_server; int retry = 0; for (;;) { if ((e = gfm_client_connection_and_process_acquire( gfarm_metadb_server_name, gfarm_metadb_server_port, &gfm_server)) != GFARM_ERR_NO_ERROR) return (e); if ((e = gfs_client_connection_acquire_by_host(gfm_server, host, port, &gfs_server, NULL))!= GFARM_ERR_NO_ERROR) goto free_gfm_connection; if (gfs_client_pid(gfs_server) == 0) e = gfarm_client_process_set(gfs_server, gfm_server); if (e == GFARM_ERR_NO_ERROR) { /* "/" is actually not used */ e = gfs_client_statfs(gfs_server, "/", bsize, blocks, bfree, bavail, files, ffree, favail); if (gfs_client_is_connection_error(e) && ++retry<=1) { gfs_client_connection_free(gfs_server); continue; } } break; } gfs_client_connection_free(gfs_server); free_gfm_connection: gfm_client_connection_free(gfm_server); return (e); }
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); }