modules/core/client-api/src/main/java/org/rhq/core/clientapi/server/core/ConnectAgentResults.java
| 23 ++++++++--
modules/enterprise/agent/src/main/java/org/rhq/enterprise/agent/AgentMain.java
| 12 +++++
modules/enterprise/agent/src/main/java/org/rhq/enterprise/agent/i18n/AgentI18NResourceKeys.java
| 3 +
modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/core/CoreServerServiceImpl.java
| 3 -
4 files changed, 36 insertions(+), 5 deletions(-)
New commits:
commit 277c8b1fc4379e6a652931b7db1bbdd4ce3ce5ac
Author: John Mazzitelli <mazz(a)redhat.com>
Date: Thu Feb 21 16:25:40 2013 -0500
[BZ 913606] agent will send a full avail report if the server tells it at connect time
that it has been backfilled.
the server will also update the last ping time of the agent when the connect comes
in.
diff --git
a/modules/core/client-api/src/main/java/org/rhq/core/clientapi/server/core/ConnectAgentResults.java
b/modules/core/client-api/src/main/java/org/rhq/core/clientapi/server/core/ConnectAgentResults.java
index 47be78b..3bcf47b 100644
---
a/modules/core/client-api/src/main/java/org/rhq/core/clientapi/server/core/ConnectAgentResults.java
+++
b/modules/core/client-api/src/main/java/org/rhq/core/clientapi/server/core/ConnectAgentResults.java
@@ -32,10 +32,12 @@ import java.io.Serializable;
public class ConnectAgentResults implements Serializable {
private static final long serialVersionUID = 1L;
- private long serverTime;
+ private final long serverTime;
+ private final boolean isDown;
- public ConnectAgentResults(long serverTime) {
+ public ConnectAgentResults(long serverTime, boolean isDown) {
this.serverTime = serverTime;
+ this.isDown = isDown;
}
/**
@@ -49,10 +51,23 @@ public class ConnectAgentResults implements Serializable {
}
/**
- * @see java.lang.Object#toString()
+ * If true, this indicates if the server thinks the agent is down. This happens if
the agent
+ * hasn't connected in a long time and the server had "backfilled" the
agent's resources
+ * as DOWN/UNKNOWN.
+ *
+ * When an agent connects to a server, and the server thinks that agent was down, the
agent needs
+ * to prepare to notify the server of its state - for example, the agent should soon
send up
+ * a full availability report so the server can get the up-to-date availability
statuses of all
+ * resources.
+ *
+ * @return true if the server had this agent's resources marked as DOWN/UNKNOWN.
*/
+ public boolean isDown() {
+ return isDown;
+ }
+
@Override
public String toString() {
- return "ConnectAgentResults: [server-time=" + this.serverTime +
"]";
+ return "ConnectAgentResults: [server-time=" + this.serverTime + ",
is-down=" + this.isDown + "]";
}
}
\ No newline at end of file
diff --git
a/modules/enterprise/agent/src/main/java/org/rhq/enterprise/agent/AgentMain.java
b/modules/enterprise/agent/src/main/java/org/rhq/enterprise/agent/AgentMain.java
index 6c01d67..0c95199 100644
--- a/modules/enterprise/agent/src/main/java/org/rhq/enterprise/agent/AgentMain.java
+++ b/modules/enterprise/agent/src/main/java/org/rhq/enterprise/agent/AgentMain.java
@@ -2146,6 +2146,18 @@ public class AgentMain {
ConnectAgentResults results = (ConnectAgentResults)
connectResponse.getResults();
long serverTime = results.getServerTime();
serverClockNotification(serverTime);
+
+ // If the server thinks we are down, we need to do some things to get
this agent in sync with the server.
+ // Anything we do in here should be very fast.
+ boolean serverThinksWeAreDown = results.isDown();
+ if (serverThinksWeAreDown) {
+ LOG.warn(AgentI18NResourceKeys.SERVER_THINKS_AGENT_IS_DOWN);
+ PluginContainer plugin_container = PluginContainer.getInstance();
+ if (plugin_container.isStarted()) {
+ // tell the plugin container to send a full avail report up so
the server knows we are UP
+
plugin_container.getInventoryManager().requestFullAvailabilityReport();
+ }
+ }
} catch (Throwable t) {
// should never happen, should always cast to non-null
ConnectAgentResults
LOG.error(AgentI18NResourceKeys.TIME_UNKNOWN,
ThrowableUtil.getAllMessages(t));
diff --git
a/modules/enterprise/agent/src/main/java/org/rhq/enterprise/agent/i18n/AgentI18NResourceKeys.java
b/modules/enterprise/agent/src/main/java/org/rhq/enterprise/agent/i18n/AgentI18NResourceKeys.java
index 57f427c..10761ff 100644
---
a/modules/enterprise/agent/src/main/java/org/rhq/enterprise/agent/i18n/AgentI18NResourceKeys.java
+++
b/modules/enterprise/agent/src/main/java/org/rhq/enterprise/agent/i18n/AgentI18NResourceKeys.java
@@ -170,6 +170,9 @@ public interface AgentI18NResourceKeys {
@I18NMessage("Failed to determine the server time. Cause: {0}")
String TIME_UNKNOWN = "AgentMain.time-unknown";
+ @I18NMessage("The server thinks this agent is down. Will notify the server of
up-to-date information when possible.")
+ String SERVER_THINKS_AGENT_IS_DOWN =
"AgentMain.server-thinks-agent-is-down";
+
@I18NMessage("Timed out waiting for the connectAgent R/W lock to avoid a
possible deadlock")
String TIMEOUT_WAITING_FOR_CONNECT_LOCK =
"AgentMain.connect-lock-timeout";
diff --git
a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/core/CoreServerServiceImpl.java
b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/core/CoreServerServiceImpl.java
index 23bcbcf..9818ac3 100644
---
a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/core/CoreServerServiceImpl.java
+++
b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/core/CoreServerServiceImpl.java
@@ -320,6 +320,7 @@ public class CoreServerServiceImpl implements CoreServerService {
Server server = getServerManager().getServer();
agent.setServer(server);
+ agent.setLastAvailabilityPing(Long.valueOf(System.currentTimeMillis()));
getAgentManager().updateAgent(agent);
getAlertConditionCacheManager().reloadCachesForAgent(agent.getId());
@@ -328,7 +329,7 @@ public class CoreServerServiceImpl implements CoreServerService {
PartitionEventType.AGENT_CONNECT, agentName + " - " +
server.getName());
log.info("Agent [" + agentName + "] has connected to this server
at " + new Date());
- return new ConnectAgentResults(System.currentTimeMillis());
+ return new ConnectAgentResults(System.currentTimeMillis(),
agent.isBackFilled());
}
/**
Show replies by date