/* * Re-Configure the system: if someone has noticed that the status * version has been updated, they call this to verify that they've got * the right configuration. * * NOTE: This *always* destroys gangs. And also attempts to inform the * fault-prober to do a full scan. */ void FtsReConfigureMPP(bool create_new_gangs) { /* need to scan to pick up the latest view */ detectFailedConnections(); local_fts_statusVersion = ftsProbeInfo->fts_statusVersion; ereport(LOG, (errmsg_internal("FTS: reconfiguration is in progress"), errSendAlert(true))); disconnectAndDestroyAllGangs(); /* Caller should throw an error. */ return; }
/* * performs all necessary cleanup required when leaving Greenplum * Database mode. This is also called when the process exits. * * NOTE: the arguments to this function are here only so that we can * register it with on_proc_exit(). These parameters should not * be used since there are some callers to this that pass them * as NULL. * */ void cdb_cleanup(int code __attribute__((unused)) , Datum arg __attribute__((unused)) ) { elog(DEBUG1, "Cleaning up Greenplum components..."); disconnectAndDestroyAllGangs(); if (Gp_role == GP_ROLE_DISPATCH) { if (cdb_total_plans > 0) { elog(DEBUG1, "session dispatched %d plans %d slices (%f), largest plan %d", cdb_total_plans, cdb_total_slices, ((double)cdb_total_slices/(double)cdb_total_plans), cdb_max_slices); } } if (Gp_role != GP_ROLE_UTILITY) { /* shutdown our listener socket */ CleanUpMotionLayerIPC(); } }
bool assign_gp_use_dispatch_agent(bool newval, bool doit, GucSource source __attribute__((unused)) ) { if (newval != gp_use_dispatch_agent && doit) elog(LOG, "assign_gp_use_dispatch_agent: gp_use_dispatch_agent old=%s, newval=%s, doit=%s", (gp_use_dispatch_agent ? "true" : "false"), (newval ? "true" : "false"), (doit ? "true" : "false")); if (doit) { /* * If we are switching, we must get rid of all existing gangs. * TODO: check for being in a transaction, or owning temp tables, as disconnecting all gangs * will wipe them out. */ if (newval != gp_use_dispatch_agent && Gp_role != GP_ROLE_UTILITY) disconnectAndDestroyAllGangs(true); gp_use_dispatch_agent = newval; } return true; }
/* * FtsHandleGangConnectionFailure is called by createGang during * creating connections return true if error need to be thrown */ bool FtsHandleGangConnectionFailure(SegmentDatabaseDescriptor * segdbDesc, int size) { int i; bool dtx_active; bool reportError = false; bool realFaultFound = false; bool forceRescan=true; for (i = 0; i < size; i++) { if (PQstatus(segdbDesc[i].conn) != CONNECTION_OK) { CdbComponentDatabaseInfo *segInfo = segdbDesc[i].segment_database_info; elog(DEBUG2, "FtsHandleGangConnectionFailure: looking for real fault on segment dbid %d", segInfo->dbid); if (!FtsTestConnection(segInfo, forceRescan)) { elog(DEBUG2, "found fault with segment dbid %d", segInfo->dbid); realFaultFound = true; /* that at least one fault exists is enough, for now */ break; } forceRescan = false; /* only force the rescan on the first call. */ } } if (!realFaultFound) { /* If we successfully tested the gang and didn't notice a * failure, our caller must've seen some kind of transient * failure when the gang was originally constructed ... */ elog(DEBUG2, "FtsHandleGangConnectionFailure: no real fault found!"); return false; } if (!isFTSEnabled()) { return false; } ereport(LOG, (errmsg_internal("FTS: reconfiguration is in progress"))); forceRescan = true; for (i = 0; i < size; i++) { CdbComponentDatabaseInfo *segInfo = segdbDesc[i].segment_database_info; if (PQstatus(segdbDesc[i].conn) != CONNECTION_OK) { if (!FtsTestConnection(segInfo, forceRescan)) { ereport(LOG, (errmsg_internal("FTS: found bad segment with dbid %d", segInfo->dbid), errSendAlert(true))); /* probe process has already marked segment down. */ } forceRescan = false; /* only force rescan on first call. */ } } if (gangsExist()) { reportError = true; disconnectAndDestroyAllGangs(); } /* * KLUDGE: Do not error out if we are attempting a DTM protocol retry */ if (DistributedTransactionContext == DTX_CONTEXT_QD_RETRY_PHASE_2) { return false; } /* is there a transaction active ? */ dtx_active = isCurrentDtxActive(); /* When the error is raised, it will abort the current DTM transaction */ if (dtx_active) { elog((Debug_print_full_dtm ? LOG : DEBUG5), "FtsHandleGangConnectionFailure found an active DTM transaction (returning true)."); return true; } /* * error out if this sets read only flag, at this stage the read only * transaction checking has passed, so error out, but do not error out if * tm is in recovery */ if ((*ftsReadOnlyFlag && !isTMInRecovery()) || reportError) return true; elog((Debug_print_full_dtm ? LOG : DEBUG5), "FtsHandleGangConnectionFailure returning false."); return false; }