mirror of https://gitee.com/bigwinds/arangodb
agencycommanager ran in locks when ::redirect called ::failed
This commit is contained in:
parent
84415bb508
commit
84fa31a39d
|
@ -484,6 +484,14 @@ void AgencyCommManager::failed(
|
||||||
std::unique_ptr<httpclient::GeneralClientConnection> connection,
|
std::unique_ptr<httpclient::GeneralClientConnection> connection,
|
||||||
std::string const& endpoint) {
|
std::string const& endpoint) {
|
||||||
MUTEX_LOCKER(locker, _lock);
|
MUTEX_LOCKER(locker, _lock);
|
||||||
|
failedNonLocking(std::move(connection), endpoint);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void AgencyCommManager::failedNonLocking(
|
||||||
|
std::unique_ptr<httpclient::GeneralClientConnection> connection,
|
||||||
|
std::string const& endpoint) {
|
||||||
|
|
||||||
if (_endpoints.front() == endpoint) {
|
if (_endpoints.front() == endpoint) {
|
||||||
LOG_TOPIC(TRACE, Logger::AGENCYCOMM)
|
LOG_TOPIC(TRACE, Logger::AGENCYCOMM)
|
||||||
|
@ -501,6 +509,8 @@ void AgencyCommManager::failed(
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
std::string AgencyCommManager::redirect(
|
std::string AgencyCommManager::redirect(
|
||||||
std::unique_ptr<httpclient::GeneralClientConnection> connection,
|
std::unique_ptr<httpclient::GeneralClientConnection> connection,
|
||||||
std::string const& endpoint, std::string const& location,
|
std::string const& endpoint, std::string const& location,
|
||||||
|
@ -520,7 +530,7 @@ std::string AgencyCommManager::redirect(
|
||||||
|
|
||||||
// invalid location header
|
// invalid location header
|
||||||
if (delim == std::string::npos) {
|
if (delim == std::string::npos) {
|
||||||
failed(std::move(connection), endpoint);
|
failedNonLocking(std::move(connection), endpoint);
|
||||||
return "";
|
return "";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -534,7 +544,7 @@ std::string AgencyCommManager::redirect(
|
||||||
if (endpoint == specification) {
|
if (endpoint == specification) {
|
||||||
LOG_TOPIC(WARN, Logger::AGENCYCOMM)
|
LOG_TOPIC(WARN, Logger::AGENCYCOMM)
|
||||||
<< "got an agency redirect back to the old agency '" << endpoint << "'";
|
<< "got an agency redirect back to the old agency '" << endpoint << "'";
|
||||||
failed(std::move(connection), endpoint);
|
failedNonLocking(std::move(connection), endpoint);
|
||||||
return "";
|
return "";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -560,6 +570,7 @@ std::string AgencyCommManager::redirect(
|
||||||
<< "'";
|
<< "'";
|
||||||
|
|
||||||
_endpoints.push_front(specification);
|
_endpoints.push_front(specification);
|
||||||
|
LOG(WARN) << __FILE__ << __LINE__;
|
||||||
return specification;
|
return specification;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1219,9 +1230,9 @@ AgencyCommResult AgencyComm::sendWithFailover(
|
||||||
// in this case we have to pick it up and use the new location returned
|
// in this case we have to pick it up and use the new location returned
|
||||||
if (result._statusCode ==
|
if (result._statusCode ==
|
||||||
(int)arangodb::rest::ResponseCode::TEMPORARY_REDIRECT) {
|
(int)arangodb::rest::ResponseCode::TEMPORARY_REDIRECT) {
|
||||||
std::string red = AgencyCommManager::MANAGER->redirect(
|
endpoint = AgencyCommManager::MANAGER->redirect(
|
||||||
std::move(connection), endpoint, result._location, url);
|
std::move(connection), endpoint, result._location, url);
|
||||||
connection = AgencyCommManager::MANAGER->acquire(red);
|
connection = AgencyCommManager::MANAGER->acquire(endpoint);
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -441,6 +441,11 @@ class AgencyCommManager {
|
||||||
std::vector<std::string> endpoints() const;
|
std::vector<std::string> endpoints() const;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
|
||||||
|
// caller must hold _lock
|
||||||
|
void failedNonLocking(std::unique_ptr<httpclient::GeneralClientConnection>,
|
||||||
|
std::string const& endpoint);
|
||||||
|
|
||||||
// caller must hold _lock
|
// caller must hold _lock
|
||||||
std::unique_ptr<httpclient::GeneralClientConnection> createNewConnection();
|
std::unique_ptr<httpclient::GeneralClientConnection> createNewConnection();
|
||||||
|
|
||||||
|
|
|
@ -177,6 +177,7 @@ fi
|
||||||
echo Starting agency ...
|
echo Starting agency ...
|
||||||
for aid in `seq 0 $(( $NRAGENTS - 1 ))`; do
|
for aid in `seq 0 $(( $NRAGENTS - 1 ))`; do
|
||||||
port=$(( $BASE + $aid ))
|
port=$(( $BASE + $aid ))
|
||||||
|
AGENCY_ENDPOINTS+="--cluster.agency-endpoint $TRANSPORT://localhost:$port "
|
||||||
${BUILD}/bin/arangod \
|
${BUILD}/bin/arangod \
|
||||||
-c none \
|
-c none \
|
||||||
--agency.activate true \
|
--agency.activate true \
|
||||||
|
@ -221,7 +222,7 @@ start() {
|
||||||
${BUILD}/bin/arangod \
|
${BUILD}/bin/arangod \
|
||||||
-c none \
|
-c none \
|
||||||
--database.directory cluster/data$PORT \
|
--database.directory cluster/data$PORT \
|
||||||
--cluster.agency-endpoint $TRANSPORT://127.0.0.1:$BASE \
|
$AGENCY_ENDPOINTS \
|
||||||
--cluster.my-address $TRANSPORT://127.0.0.1:$PORT \
|
--cluster.my-address $TRANSPORT://127.0.0.1:$PORT \
|
||||||
--server.endpoint $TRANSPORT://0.0.0.0:$PORT \
|
--server.endpoint $TRANSPORT://0.0.0.0:$PORT \
|
||||||
--cluster.my-role $ROLE \
|
--cluster.my-role $ROLE \
|
||||||
|
@ -233,6 +234,7 @@ start() {
|
||||||
--javascript.module-directory ./enterprise/js \
|
--javascript.module-directory ./enterprise/js \
|
||||||
--javascript.app-path cluster/apps$PORT \
|
--javascript.app-path cluster/apps$PORT \
|
||||||
--log.force-direct true \
|
--log.force-direct true \
|
||||||
|
--log.thread true \
|
||||||
$LOG_LEVEL_CLUSTER \
|
$LOG_LEVEL_CLUSTER \
|
||||||
$AUTHENTICATION \
|
$AUTHENTICATION \
|
||||||
$SSLKEYFILE \
|
$SSLKEYFILE \
|
||||||
|
@ -252,7 +254,7 @@ startTerminal() {
|
||||||
$XTERM $XTERMOPTIONS -e ${BUILD}/bin/arangod \
|
$XTERM $XTERMOPTIONS -e ${BUILD}/bin/arangod \
|
||||||
-c none \
|
-c none \
|
||||||
--database.directory cluster/data$PORT \
|
--database.directory cluster/data$PORT \
|
||||||
--cluster.agency-endpoint $TRANSPORT://127.0.0.1:$BASE \
|
$AGENCY_ENDPOINTS \
|
||||||
--cluster.my-address $TRANSPORT://127.0.0.1:$PORT \
|
--cluster.my-address $TRANSPORT://127.0.0.1:$PORT \
|
||||||
--server.endpoint $TRANSPORT://0.0.0.0:$PORT \
|
--server.endpoint $TRANSPORT://0.0.0.0:$PORT \
|
||||||
--cluster.my-role $ROLE \
|
--cluster.my-role $ROLE \
|
||||||
|
@ -281,7 +283,7 @@ startDebugger() {
|
||||||
${BUILD}/bin/arangod \
|
${BUILD}/bin/arangod \
|
||||||
-c none \
|
-c none \
|
||||||
--database.directory cluster/data$PORT \
|
--database.directory cluster/data$PORT \
|
||||||
--cluster.agency-endpoint $TRANSPORT://127.0.0.1:$BASE \
|
$AGENCY_ENDPOINTS \
|
||||||
--cluster.my-address $TRANSPORT://127.0.0.1:$PORT \
|
--cluster.my-address $TRANSPORT://127.0.0.1:$PORT \
|
||||||
--server.endpoint $TRANSPORT://0.0.0.0:$PORT \
|
--server.endpoint $TRANSPORT://0.0.0.0:$PORT \
|
||||||
--cluster.my-role $ROLE \
|
--cluster.my-role $ROLE \
|
||||||
|
@ -310,7 +312,7 @@ startRR() {
|
||||||
$XTERM $XTERMOPTIONS -e rr ${BUILD}/bin/arangod \
|
$XTERM $XTERMOPTIONS -e rr ${BUILD}/bin/arangod \
|
||||||
-c none \
|
-c none \
|
||||||
--database.directory cluster/data$PORT \
|
--database.directory cluster/data$PORT \
|
||||||
--cluster.agency-endpoint $TRANSPORT://127.0.0.1:$BASE \
|
$AGENCY_ENDPOINTS \
|
||||||
--cluster.my-address $TRANSPORT://127.0.0.1:$PORT \
|
--cluster.my-address $TRANSPORT://127.0.0.1:$PORT \
|
||||||
--server.endpoint $TRANSPORT://0.0.0.0:$PORT \
|
--server.endpoint $TRANSPORT://0.0.0.0:$PORT \
|
||||||
--cluster.my-role $ROLE \
|
--cluster.my-role $ROLE \
|
||||||
|
@ -395,7 +397,7 @@ if [ "$SECONDARIES" == "1" ] ; then
|
||||||
${BUILD}/bin/arangod \
|
${BUILD}/bin/arangod \
|
||||||
-c none \
|
-c none \
|
||||||
--database.directory cluster/data$PORT \
|
--database.directory cluster/data$PORT \
|
||||||
--cluster.agency-endpoint $TRANSPORT://127.0.0.1:$BASE \
|
$AGENCY_ENDPOINTS \
|
||||||
--cluster.my-address $TRANSPORT://127.0.0.1:$PORT \
|
--cluster.my-address $TRANSPORT://127.0.0.1:$PORT \
|
||||||
--server.endpoint $TRANSPORT://0.0.0.0:$PORT \
|
--server.endpoint $TRANSPORT://0.0.0.0:$PORT \
|
||||||
--cluster.my-id $CLUSTER_ID \
|
--cluster.my-id $CLUSTER_ID \
|
||||||
|
|
Loading…
Reference in New Issue