Skip to content

Commit 5996009

Browse files
committed
Merge remote-tracking branch 'apache/main' into 4.21-reconcile-commands
2 parents 7952497 + 9dceae4 commit 5996009

File tree

39 files changed

+1159
-229
lines changed

39 files changed

+1159
-229
lines changed

agent/src/main/java/com/cloud/agent/Agent.java

Lines changed: 51 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -342,7 +342,7 @@ public void start() {
342342
logger.info("Attempted to connect to the server, but received an unexpected exception, trying again...", e);
343343
}
344344
}
345-
shell.updateConnectedHost();
345+
shell.updateConnectedHost(((NioClient)connection).getHost());
346346
scavengeOldAgentObjects();
347347
}
348348

@@ -617,15 +617,11 @@ public Task create(final Task.Type type, final Link link, final byte[] data) {
617617
}
618618

619619
protected void reconnect(final Link link) {
620-
reconnect(link, null, null, false);
620+
reconnect(link, null, false);
621621
}
622622

623-
protected void reconnect(final Link link, String preferredHost, List<String> avoidHostList, boolean forTransfer) {
623+
protected void reconnect(final Link link, String preferredMSHost, boolean forTransfer) {
624624
if (!(forTransfer || reconnectAllowed)) {
625-
return;
626-
}
627-
628-
if (!reconnectAllowed) {
629625
logger.debug("Reconnect requested but it is not allowed {}", () -> getLinkLog(link));
630626
return;
631627
}
@@ -637,19 +633,26 @@ protected void reconnect(final Link link, String preferredHost, List<String> avo
637633
serverResource.disconnected();
638634
logger.info("Lost connection to host: {}. Attempting reconnection while we still have {} commands in progress.", shell.getConnectedHost(), commandsInProgress.get());
639635
stopAndCleanupConnection(true);
636+
String host = preferredMSHost;
637+
if (org.apache.commons.lang3.StringUtils.isBlank(host)) {
638+
host = shell.getNextHost();
639+
}
640+
List<String> avoidMSHostList = shell.getAvoidHosts();
640641
do {
641-
final String host = shell.getNextHost();
642-
connection = new NioClient(getAgentName(), host, shell.getPort(), shell.getWorkers(), shell.getSslHandshakeTimeout(), this);
643-
logger.info("Reconnecting to host: {}", host);
644-
try {
645-
connection.start();
646-
} catch (final NioConnectionException e) {
647-
logger.info("Attempted to re-connect to the server, but received an unexpected exception, trying again...", e);
648-
stopAndCleanupConnection(false);
642+
if (CollectionUtils.isEmpty(avoidMSHostList) || !avoidMSHostList.contains(host)) {
643+
connection = new NioClient(getAgentName(), host, shell.getPort(), shell.getWorkers(), shell.getSslHandshakeTimeout(), this);
644+
logger.info("Reconnecting to host: {}", host);
645+
try {
646+
connection.start();
647+
} catch (final NioConnectionException e) {
648+
logger.info("Attempted to re-connect to the server, but received an unexpected exception, trying again...", e);
649+
stopAndCleanupConnection(false);
650+
}
649651
}
650652
shell.getBackoffAlgorithm().waitBeforeRetry();
653+
host = shell.getNextHost();
651654
} while (!connection.isStartup());
652-
shell.updateConnectedHost();
655+
shell.updateConnectedHost(((NioClient)connection).getHost());
653656
logger.info("Connected to the host: {}", shell.getConnectedHost());
654657
}
655658

@@ -925,7 +928,7 @@ private Answer setupAgentCertificate(final SetupCertificateCommand cmd) {
925928
return new SetupCertificateAnswer(true);
926929
}
927930

928-
private void processManagementServerList(final List<String> msList, final String lbAlgorithm, final Long lbCheckInterval) {
931+
private void processManagementServerList(final List<String> msList, final List<String> avoidMsList, final String lbAlgorithm, final Long lbCheckInterval) {
929932
if (CollectionUtils.isNotEmpty(msList) && StringUtils.isNotEmpty(lbAlgorithm)) {
930933
try {
931934
final String newMSHosts = String.format("%s%s%s", com.cloud.utils.StringUtils.toCSVList(msList), IAgentShell.hostLbAlgorithmSeparator, lbAlgorithm);
@@ -937,6 +940,7 @@ private void processManagementServerList(final List<String> msList, final String
937940
throw new CloudRuntimeException("Could not persist received management servers list", e);
938941
}
939942
}
943+
shell.setAvoidHosts(avoidMsList);
940944
if ("shuffle".equals(lbAlgorithm)) {
941945
scheduleHostLBCheckerTask(0);
942946
} else {
@@ -945,16 +949,18 @@ private void processManagementServerList(final List<String> msList, final String
945949
}
946950

947951
private Answer setupManagementServerList(final SetupMSListCommand cmd) {
948-
processManagementServerList(cmd.getMsList(), cmd.getLbAlgorithm(), cmd.getLbCheckInterval());
952+
processManagementServerList(cmd.getMsList(), cmd.getAvoidMsList(), cmd.getLbAlgorithm(), cmd.getLbCheckInterval());
949953
return new SetupMSListAnswer(true);
950954
}
951955

952956
private Answer migrateAgentToOtherMS(final MigrateAgentConnectionCommand cmd) {
953957
try {
954958
if (CollectionUtils.isNotEmpty(cmd.getMsList())) {
955-
processManagementServerList(cmd.getMsList(), cmd.getLbAlgorithm(), cmd.getLbCheckInterval());
959+
processManagementServerList(cmd.getMsList(), cmd.getAvoidMsList(), cmd.getLbAlgorithm(), cmd.getLbCheckInterval());
956960
}
957-
migrateAgentConnection(cmd.getAvoidMsList());
961+
Executors.newSingleThreadScheduledExecutor(new NamedThreadFactory("MigrateAgentConnection-Job")).schedule(() -> {
962+
migrateAgentConnection(cmd.getAvoidMsList());
963+
}, 3, TimeUnit.SECONDS);
958964
} catch (Exception e) {
959965
String errMsg = "Migrate agent connection failed, due to " + e.getMessage();
960966
logger.debug(errMsg, e);
@@ -975,25 +981,26 @@ private void migrateAgentConnection(List<String> avoidMsList) {
975981
throw new CloudRuntimeException("No other Management Server hosts to migrate");
976982
}
977983

978-
String preferredHost = null;
984+
String preferredMSHost = null;
979985
for (String msHost : msHostsList) {
980986
try (final Socket socket = new Socket()) {
981987
socket.connect(new InetSocketAddress(msHost, shell.getPort()), 5000);
982-
preferredHost = msHost;
988+
preferredMSHost = msHost;
983989
break;
984990
} catch (final IOException e) {
985991
throw new CloudRuntimeException("Management server host: " + msHost + " is not reachable, to migrate connection");
986992
}
987993
}
988994

989-
if (preferredHost == null) {
995+
if (preferredMSHost == null) {
990996
throw new CloudRuntimeException("Management server host(s) are not reachable, to migrate connection");
991997
}
992998

993-
logger.debug("Management server host " + preferredHost + " is found to be reachable, trying to reconnect");
999+
logger.debug("Management server host " + preferredMSHost + " is found to be reachable, trying to reconnect");
9941000
shell.resetHostCounter();
1001+
shell.setAvoidHosts(avoidMsList);
9951002
shell.setConnectionTransfer(true);
996-
reconnect(link, preferredHost, avoidMsList, true);
1003+
reconnect(link, preferredMSHost, true);
9971004
}
9981005

9991006
public void processResponse(final Response response, final Link link) {
@@ -1007,17 +1014,22 @@ public void processResponse(final Response response, final Link link) {
10071014
listener.processControlResponse(response, (AgentControlAnswer)answer);
10081015
}
10091016
} else if (answer instanceof PingAnswer) {
1010-
if (((PingAnswer) answer).isSendStartup() && reconnectAllowed) {
1011-
logger.info("Management server requested startup command to reinitialize the agent");
1012-
sendStartup(link);
1013-
} else {
1014-
serverResource.processPingAnswer((PingAnswer) answer);
1015-
}
1017+
processPingAnswer((PingAnswer) answer);
10161018
} else {
10171019
updateLastPingResponseTime();
10181020
}
10191021
}
10201022

1023+
private void processPingAnswer(final PingAnswer answer) {
1024+
if ((answer.isSendStartup()) && reconnectAllowed) {
1025+
logger.info("Management server requested startup command to reinitialize the agent");
1026+
sendStartup(link);
1027+
} else {
1028+
serverResource.processPingAnswer((PingAnswer) answer);
1029+
}
1030+
shell.setAvoidHosts(answer.getAvoidMsList());
1031+
}
1032+
10211033
public void processReadyCommand(final Command cmd) {
10221034
final ReadyCommand ready = (ReadyCommand)cmd;
10231035
// Set human readable sizes;
@@ -1034,7 +1046,7 @@ public void processReadyCommand(final Command cmd) {
10341046
}
10351047

10361048
verifyAgentArch(ready.getArch());
1037-
processManagementServerList(ready.getMsHostList(), ready.getLbAlgorithm(), ready.getLbCheckInterval());
1049+
processManagementServerList(ready.getMsHostList(), ready.getAvoidMsHostList(), ready.getLbAlgorithm(), ready.getLbCheckInterval());
10381050

10391051
logger.info("Ready command is processed for agent [id: {}, uuid: {}, name: {}]", getId(), getUuid(), getName());
10401052
}
@@ -1384,26 +1396,26 @@ protected void runInContext() {
13841396
if (msList == null || msList.length < 1) {
13851397
return;
13861398
}
1387-
final String preferredHost = msList[0];
1399+
final String preferredMSHost = msList[0];
13881400
final String connectedHost = shell.getConnectedHost();
13891401
logger.debug("Running preferred host checker task, connected host={}, preferred host={}",
1390-
connectedHost, preferredHost);
1391-
if (preferredHost == null || preferredHost.equals(connectedHost) || link == null) {
1402+
connectedHost, preferredMSHost);
1403+
if (preferredMSHost == null || preferredMSHost.equals(connectedHost) || link == null) {
13921404
return;
13931405
}
13941406
boolean isHostUp = false;
13951407
try (final Socket socket = new Socket()) {
1396-
socket.connect(new InetSocketAddress(preferredHost, shell.getPort()), 5000);
1408+
socket.connect(new InetSocketAddress(preferredMSHost, shell.getPort()), 5000);
13971409
isHostUp = true;
13981410
} catch (final IOException e) {
1399-
logger.debug("Host: {} is not reachable", preferredHost);
1411+
logger.debug("Host: {} is not reachable", preferredMSHost);
14001412
}
14011413
if (isHostUp && link != null && commandsInProgress.get() == 0) {
14021414
if (logger.isDebugEnabled()) {
1403-
logger.debug("Preferred host {} is found to be reachable, trying to reconnect", preferredHost);
1415+
logger.debug("Preferred host {} is found to be reachable, trying to reconnect", preferredMSHost);
14041416
}
14051417
shell.resetHostCounter();
1406-
reconnect(link);
1418+
reconnect(link, preferredMSHost, false);
14071419
}
14081420
} catch (Throwable t) {
14091421
logger.error("Error caught while attempting to connect to preferred host", t);

agent/src/main/java/com/cloud/agent/AgentShell.java

Lines changed: 14 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -66,6 +66,7 @@ public class AgentShell implements IAgentShell, Daemon {
6666
private String _zone;
6767
private String _pod;
6868
private String _host;
69+
private List<String> _avoidHosts;
6970
private String _privateIp;
7071
private int _port;
7172
private int _proxyPort;
@@ -76,7 +77,6 @@ public class AgentShell implements IAgentShell, Daemon {
7677
private volatile boolean _exit = false;
7778
private int _pingRetries;
7879
private final List<Agent> _agents = new ArrayList<Agent>();
79-
private String hostToConnect;
8080
private String connectedHost;
8181
private Long preferredHostCheckInterval;
8282
private boolean connectionTransfer = false;
@@ -121,7 +121,7 @@ public String getNextHost() {
121121
if (_hostCounter >= hosts.length) {
122122
_hostCounter = 0;
123123
}
124-
hostToConnect = hosts[_hostCounter % hosts.length];
124+
String hostToConnect = hosts[_hostCounter % hosts.length];
125125
_hostCounter++;
126126
return hostToConnect;
127127
}
@@ -143,11 +143,10 @@ public long getLbCheckerInterval(final Long receivedLbInterval) {
143143
}
144144

145145
@Override
146-
public void updateConnectedHost() {
147-
connectedHost = hostToConnect;
146+
public void updateConnectedHost(String connectedHost) {
147+
this.connectedHost = connectedHost;
148148
}
149149

150-
151150
@Override
152151
public void resetHostCounter() {
153152
_hostCounter = 0;
@@ -166,6 +165,16 @@ public void setHosts(final String host) {
166165
}
167166
}
168167

168+
@Override
169+
public void setAvoidHosts(List<String> avoidHosts) {
170+
_avoidHosts = avoidHosts;
171+
}
172+
173+
@Override
174+
public List<String> getAvoidHosts() {
175+
return _avoidHosts;
176+
}
177+
169178
@Override
170179
public String getPrivateIp() {
171180
return _privateIp;

agent/src/main/java/com/cloud/agent/IAgentShell.java

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
// under the License.
1717
package com.cloud.agent;
1818

19+
import java.util.List;
1920
import java.util.Map;
2021
import java.util.Properties;
2122

@@ -63,9 +64,13 @@ public interface IAgentShell {
6364

6465
String[] getHosts();
6566

67+
void setAvoidHosts(List<String> hosts);
68+
69+
List<String> getAvoidHosts();
70+
6671
long getLbCheckerInterval(Long receivedLbInterval);
6772

68-
void updateConnectedHost();
73+
void updateConnectedHost(String connectedHost);
6974

7075
String getConnectedHost();
7176

agent/src/main/java/com/cloud/agent/properties/AgentProperties.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -816,7 +816,7 @@ public Property<Integer> getWorkers() {
816816
* Data type: Integer.<br>
817817
* Default value: <code>null</code>
818818
*/
819-
public static final Property<Integer> SSL_HANDSHAKE_TIMEOUT = new Property<>("ssl.handshake.timeout", null, Integer.class);
819+
public static final Property<Integer> SSL_HANDSHAKE_TIMEOUT = new Property<>("ssl.handshake.timeout", 30, Integer.class);
820820

821821
public static class Property <T>{
822822
private String name;

agent/src/test/java/com/cloud/agent/AgentShellTest.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -358,7 +358,7 @@ public void updateAndGetConnectedHost() {
358358
AgentShell shell = new AgentShell();
359359
shell.setHosts("test");
360360
shell.getNextHost();
361-
shell.updateConnectedHost();
361+
shell.updateConnectedHost("test");
362362

363363
Assert.assertEquals(expected, shell.getConnectedHost());
364364
}

api/src/main/java/com/cloud/event/EventTypes.java

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -739,6 +739,13 @@ public class EventTypes {
739739
//Purge resources
740740
public static final String EVENT_PURGE_EXPUNGED_RESOURCES = "PURGE.EXPUNGED.RESOURCES";
741741

742+
// Management Server
743+
public static final String EVENT_MS_MAINTENANCE_PREPARE = "MS.MAINTENANCE.PREPARE";
744+
public static final String EVENT_MS_MAINTENANCE_CANCEL = "MS.MAINTENANCE.CANCEL";
745+
public static final String EVENT_MS_SHUTDOWN_PREPARE = "MS.SHUTDOWN.PREPARE";
746+
public static final String EVENT_MS_SHUTDOWN_CANCEL = "MS.SHUTDOWN.CANCEL";
747+
public static final String EVENT_MS_SHUTDOWN = "MS.SHUTDOWN";
748+
742749
// OBJECT STORE
743750
public static final String EVENT_OBJECT_STORE_CREATE = "OBJECT.STORE.CREATE";
744751
public static final String EVENT_OBJECT_STORE_DELETE = "OBJECT.STORE.DELETE";
@@ -1233,6 +1240,12 @@ public class EventTypes {
12331240
entityEventDetails.put(EVENT_UPDATE_IMAGE_STORE_ACCESS_STATE, ImageStore.class);
12341241
entityEventDetails.put(EVENT_LIVE_PATCH_SYSTEMVM, "SystemVMs");
12351242

1243+
entityEventDetails.put(EVENT_MS_MAINTENANCE_PREPARE, "ManagementServer");
1244+
entityEventDetails.put(EVENT_MS_MAINTENANCE_CANCEL, "ManagementServer");
1245+
entityEventDetails.put(EVENT_MS_SHUTDOWN_PREPARE, "ManagementServer");
1246+
entityEventDetails.put(EVENT_MS_SHUTDOWN_CANCEL, "ManagementServer");
1247+
entityEventDetails.put(EVENT_MS_SHUTDOWN, "ManagementServer");
1248+
12361249
//Object Store
12371250
entityEventDetails.put(EVENT_OBJECT_STORE_CREATE, ObjectStore.class);
12381251
entityEventDetails.put(EVENT_OBJECT_STORE_UPDATE, ObjectStore.class);

api/src/main/java/org/apache/cloudstack/api/ApiConstants.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1150,6 +1150,7 @@ public class ApiConstants {
11501150
public static final String PENDING_JOBS_COUNT = "pendingjobscount";
11511151
public static final String AGENTS_COUNT = "agentscount";
11521152
public static final String AGENTS = "agents";
1153+
public static final String LAST_AGENTS = "lastagents";
11531154

11541155
public static final String PUBLIC_MTU = "publicmtu";
11551156
public static final String PRIVATE_MTU = "privatemtu";

api/src/main/java/org/apache/cloudstack/api/ApiErrorCode.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@ public enum ApiErrorCode {
3030
UNSUPPORTED_ACTION_ERROR(432),
3131
API_LIMIT_EXCEED(429),
3232

33+
SERVICE_UNAVAILABLE(503),
3334
INTERNAL_ERROR(530),
3435
ACCOUNT_ERROR(531),
3536
ACCOUNT_RESOURCE_LIMIT_ERROR(532),

api/src/main/java/org/apache/cloudstack/api/command/user/vm/ListVMsCmd.java

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,7 @@
4141
import org.apache.cloudstack.api.response.SecurityGroupResponse;
4242
import org.apache.cloudstack.api.response.ServiceOfferingResponse;
4343
import org.apache.cloudstack.api.response.TemplateResponse;
44+
import org.apache.cloudstack.api.response.UserDataResponse;
4445
import org.apache.cloudstack.api.response.UserResponse;
4546
import org.apache.cloudstack.api.response.UserVmResponse;
4647
import org.apache.cloudstack.api.response.VpcResponse;
@@ -149,6 +150,9 @@ public class ListVMsCmd extends BaseListRetrieveOnlyResourceCountCmd implements
149150
@Parameter(name = ApiConstants.USER_DATA, type = CommandType.BOOLEAN, description = "Whether to return the VMs' user data or not. By default, user data will not be returned.", since = "4.18.0.0")
150151
private Boolean showUserData;
151152

153+
@Parameter(name = ApiConstants.USER_DATA_ID, type = CommandType.UUID, entityType = UserDataResponse.class, required = false, description = "the instances by userdata", since = "4.20.1")
154+
private Long userdataId;
155+
152156
/////////////////////////////////////////////////////
153157
/////////////////// Accessors ///////////////////////
154158
/////////////////////////////////////////////////////
@@ -243,6 +247,10 @@ protected boolean isViewDetailsEmpty() {
243247
return CollectionUtils.isEmpty(viewDetails);
244248
}
245249

250+
public Long getUserdataId() {
251+
return userdataId;
252+
}
253+
246254
public EnumSet<VMDetails> getDetails() throws InvalidParameterValueException {
247255
if (isViewDetailsEmpty()) {
248256
if (_queryService.ReturnVmStatsOnVmList.value()) {

0 commit comments

Comments
 (0)