/** * send a command to a sync server and wait for a response. * * @param[in] state pointer to sync client handle * @param[in] com command object * @param[out] res response object * * @return operation status * @retval SYNC_OK success * @retval SYNC_COM_ERROR communications error * @retval SYNC_BAD_COMMAND server did not recognize command code * * @note this routine merely handles error processing; SYNC_ask_internal() * handles the low-level details of communicating with the SYNC server. * * @see SYNC_ask_internal */ afs_int32 SYNC_ask(SYNC_client_state * state, SYNC_command * com, SYNC_response * res) { int tries; afs_uint32 now, timeout, code=SYNC_OK; if (state->fatal_error) { return SYNC_COM_ERROR; } if (state->fd == -1) { SYNC_connect(state); } if (state->fd == -1) { state->fatal_error = 1; return SYNC_COM_ERROR; } #ifdef AFS_DEMAND_ATTACH_FS com->hdr.flags |= SYNC_FLAG_DAFS_EXTENSIONS; #endif now = FT_ApproxTime(); timeout = now + state->hard_timeout; for (tries = 0; (tries <= state->retry_limit) && (now <= timeout); tries++, now = FT_ApproxTime()) { code = SYNC_ask_internal(state, com, res); if (code == SYNC_OK) { break; } else if (code == SYNC_BAD_COMMAND) { Log("SYNC_ask: protocol mismatch on circuit '%s'; make sure " "fileserver, volserver, salvageserver and salvager are same " "version\n", state->proto_name); break; } else if ((code == SYNC_COM_ERROR) && (tries < state->retry_limit)) { Log("SYNC_ask: protocol communications failure on circuit '%s'; " "attempting reconnect to server\n", state->proto_name); SYNC_reconnect(state); /* try again */ } else { /* * unknown (probably protocol-specific) response code, pass it up to * the caller, and let them deal with it */ break; } } if (code == SYNC_COM_ERROR) { Log("SYNC_ask: fatal protocol error on circuit '%s'; disabling sync " "protocol until next server restart\n", state->proto_name); state->fatal_error = 1; } return code; }
int FSYNC_clientChildProcReconnect(void) { return SYNC_reconnect(&fssync_state); }
int SALVSYNC_clientReconnect(void) { return SYNC_reconnect(&salvsync_client_state); }