Skip to content

Commit

Permalink
1) Remove stale Xmpp Servers i.e the ones different from the list ret…
Browse files Browse the repository at this point in the history
…urned

   from Discovery Servers only if DOWN.
   (Note: Responses from discovery server are not applied if the
    current XMPP connection is UP)
2) Remove checkum code in discovery client library so all
   responses from Discovery Server are delivered to the end client.
3) Add introspect to show the responses from Discovery Server and
   currently connected Xmpp servers for both control-node and dns.

Change-Id: I80c9a8446ef94db73db36144109e80b2432a07fd
Closes-Bug:1471002
Closes-Bug:1396807
  • Loading branch information
nipak committed Jul 7, 2015
1 parent 0e2f30f commit ee40372
Show file tree
Hide file tree
Showing 5 changed files with 193 additions and 39 deletions.
8 changes: 5 additions & 3 deletions src/discovery/client/discovery_client.cc
Expand Up @@ -644,7 +644,7 @@ void DiscoveryServiceClient::SubscribeResponseHandler(std::string &xmls,

hdr->sub_rcvd_++;
hdr->attempts_ = 0;
if ((hdr->chksum_ == gen_chksum) || (ds_response.size() == 0)) {
if (ds_response.size() == 0) {
//Restart Subscribe Timer
hdr->StartSubscribeTimer(ttl);
DISCOVERY_CLIENT_TRACE(DiscoveryClientMsg, "SubscribeResponseHandler",
Expand All @@ -656,8 +656,10 @@ void DiscoveryServiceClient::SubscribeResponseHandler(std::string &xmls,
return; //No change in message, ignore
}

DISCOVERY_CLIENT_TRACE(DiscoveryClientMsg, "SubscribeResponseHandler",
serviceName, xmls);
if (hdr->chksum_ != gen_chksum) {
DISCOVERY_CLIENT_TRACE(DiscoveryClientMsg, "SubscribeResponseHandler",
serviceName, xmls);
}
// Update connection info
ConnectionState::GetInstance()->Update(ConnectionType::DISCOVERY,
serviceName, ConnectionStatus::UP, ds_endpoint_,
Expand Down
49 changes: 49 additions & 0 deletions src/vnsw/agent/cmn/agent.h
Expand Up @@ -391,6 +391,50 @@ class Agent {

// TODO: Should they be moved under controller/dns/cfg?

// Discovery Control-Node Server Response
const std::string &controller_ifmap_discovery_xmpp_server(uint8_t idx) const {
return xs_disc_addr_[idx];
}
void set_controller_ifmap_discovery_xmpp_server(const std::string &addr, uint8_t idx) {
xs_disc_addr_[idx] = addr;
}
const uint32_t controller_ifmap_discovery_xmpp_port(uint8_t idx) const {
return xs_disc_port_[idx];
}
void set_controller_ifmap_discovery_xmpp_port(uint32_t port, uint8_t idx) {
xs_disc_port_[idx] = port;
}
void reset_controller_ifmap_discovery_xmpp_servers() {
uint8_t count = 0;
while (count < MAX_XMPP_SERVERS) {
xs_disc_addr_[count].clear();
xs_disc_port_[count] = 0;
count++;
}
}

// Discovery Dns Server Response
const std::string &dns_discovery_server(uint8_t idx) const {
return dns_disc_addr_[idx];
}
void set_dns_discovery_server(const std::string &addr, uint8_t idx) {
dns_disc_addr_[idx] = addr;
}
const uint32_t dns_discovery_port(uint8_t idx) const {
return dns_disc_port_[idx];
}
void set_dns_discovery_port(uint32_t port, uint8_t idx) {
dns_disc_port_[idx] = port;
}
void reset_dns_discovery_servers() {
uint8_t count = 0;
while (count < MAX_XMPP_SERVERS) {
dns_disc_addr_[count].clear();
dns_disc_port_[count] = 0;
count++;
}
}

// Common XMPP Client for control-node and config clients
const std::string &controller_ifmap_xmpp_server(uint8_t idx) const {
return xs_addr_[idx];
Expand Down Expand Up @@ -983,6 +1027,11 @@ class Agent {
uint32_t dns_port_[MAX_XMPP_SERVERS];
bool dns_auth_enable_[MAX_XMPP_SERVERS];
std::string dns_server_cert_[MAX_XMPP_SERVERS];
// Discovery Responses
std::string xs_disc_addr_[MAX_XMPP_SERVERS];
uint32_t xs_disc_port_[MAX_XMPP_SERVERS];
std::string dns_disc_addr_[MAX_XMPP_SERVERS];
uint32_t dns_disc_port_[MAX_XMPP_SERVERS];
// Discovery
std::string dss_addr_;
uint32_t dss_port_;
Expand Down
20 changes: 20 additions & 0 deletions src/vnsw/agent/controller/controller.sandesh
Expand Up @@ -41,6 +41,12 @@ struct AgentXmppDnsData {
12: string xmpp_auth_type;
}

struct AgentDiscoveryXmppConnections {
1: string agent_controller_ip;
2: u32 agent_controller_port;
3: string discovery_controller_ip;
4: u32 discovery_controller_port;
}

traceobject sandesh AgentXmppTrace {
1: string peer;
Expand Down Expand Up @@ -126,3 +132,17 @@ request sandesh AgentDnsXmppConnectionStatusReq {
response sandesh AgentDnsXmppConnectionStatus {
1: list<AgentXmppDnsData>peer;
}

request sandesh AgentDiscoveryXmppConnectionsRequest {
}

response sandesh AgentDiscoveryXmppConnectionsResponse {
1: list<AgentDiscoveryXmppConnections>xmppc;
}

request sandesh AgentDiscoveryDnsXmppConnectionsRequest {
}

response sandesh AgentDiscoveryDnsXmppConnectionsResponse {
1: list<AgentDiscoveryXmppConnections>xmppc;
}
85 changes: 50 additions & 35 deletions src/vnsw/agent/controller/controller_init.cc
Expand Up @@ -310,31 +310,30 @@ void VNController::DeleteConnectionInfo(const std::string &addr, bool is_dns)

void VNController::DisConnectControllerIfmapServer(uint8_t idx) {

DeleteConnectionInfo(agent_->controller_ifmap_xmpp_server(idx),
false);

// Managed Delete of XmppClient object, which deletes the
// dependent XmppClientConnection object and
// scoped XmppChannel object
XmppClient *xc = agent_->controller_ifmap_xmpp_client(idx);
xc->UnRegisterConnectionEvent(xmps::BGP);
xc->Shutdown(); // ManagedDelete
agent_->set_controller_ifmap_xmpp_client(NULL, idx);

//cleanup AgentXmppChannel
agent_->ResetAgentMcastLabelRange(idx);
DeleteConnectionInfo(agent_->controller_ifmap_xmpp_server(idx), false);

// Managed Delete of XmppClient object, which deletes the
// dependent XmppClientConnection object and
// scoped XmppChannel object
XmppClient *xc = agent_->controller_ifmap_xmpp_client(idx);
xc->UnRegisterConnectionEvent(xmps::BGP);
xc->Shutdown(); // ManagedDelete
agent_->set_controller_ifmap_xmpp_client(NULL, idx);

//cleanup AgentXmppChannel
agent_->ResetAgentMcastLabelRange(idx);
DeleteAgentXmppChannel(agent_->controller_xmpp_channel(idx));
agent_->set_controller_xmpp_channel(NULL, idx);
agent_->set_controller_xmpp_channel(NULL, idx);

//cleanup AgentIfmapXmppChannel
//cleanup AgentIfmapXmppChannel
delete agent_->ifmap_xmpp_channel(idx);
agent_->set_ifmap_xmpp_channel(NULL, idx);
agent_->set_ifmap_xmpp_channel(NULL, idx);

agent_->controller_ifmap_xmpp_init(idx)->Reset();
delete agent_->controller_ifmap_xmpp_init(idx);
agent_->set_controller_ifmap_xmpp_init(NULL, idx);
agent_->controller_ifmap_xmpp_init(idx)->Reset();
delete agent_->controller_ifmap_xmpp_init(idx);
agent_->set_controller_ifmap_xmpp_init(NULL, idx);

agent_->reset_controller_ifmap_xmpp_server(idx);
agent_->reset_controller_ifmap_xmpp_server(idx);
}

bool VNController::AgentXmppServerExists(const std::string &server_ip,
Expand All @@ -360,12 +359,17 @@ void VNController::ApplyDiscoveryXmppServices(std::vector<DSResponse> resp) {
bool VNController::ApplyDiscoveryXmppServicesInternal(std::vector<DSResponse> resp) {
std::vector<DSResponse>::iterator iter;
int8_t count = -1;
agent_->reset_controller_ifmap_discovery_xmpp_servers();
for (iter = resp.begin(); iter != resp.end(); iter++) {
DSResponse dr = *iter;
count ++;

CONTROLLER_TRACE(DiscoveryConnection, "XMPP Discovery Server Response",
count, dr.ep.address().to_string(), integerToString(dr.ep.port()));
agent_->set_controller_ifmap_discovery_xmpp_server(
dr.ep.address().to_string(), count);
agent_->set_controller_ifmap_discovery_xmpp_port(
dr.ep.port(), count);

AgentXmppChannel *chnl = FindAgentXmppChannel(dr.ep.address().to_string());
if (chnl) {
Expand Down Expand Up @@ -425,17 +429,21 @@ bool VNController::ApplyDiscoveryXmppServicesInternal(std::vector<DSResponse> re
}
}

/* Remove stale Servers */
/* Remove stale Servers if DOWN */
for (uint8_t idx = 0; idx < MAX_XMPP_SERVERS; idx++) {
if (agent_->controller_xmpp_channel(idx) != NULL) {

if (!AgentXmppServerExists(
agent_->controller_ifmap_xmpp_server(idx), resp)) {
agent_->controller_ifmap_xmpp_server(idx), resp)) {

CONTROLLER_TRACE(DiscoveryConnection, "Cleanup Older Xmpp ",
idx, agent_->controller_ifmap_xmpp_server(idx), "");
DisConnectControllerIfmapServer(idx);
agent_->reset_controller_ifmap_xmpp_server(idx);
if (agent_->controller_xmpp_channel(idx)->GetXmppChannel()->
GetPeerState() == xmps::NOT_READY) {

CONTROLLER_TRACE(DiscoveryConnection, "Cleanup Older Xmpp ",
idx, agent_->controller_ifmap_xmpp_server(idx), "");
DisConnectControllerIfmapServer(idx);
agent_->reset_controller_ifmap_xmpp_server(idx);
}
}
}
}
Expand Down Expand Up @@ -488,12 +496,15 @@ void VNController::ApplyDiscoveryDnsXmppServices(std::vector<DSResponse> resp) {

std::vector<DSResponse>::iterator iter;
int8_t count = -1;
agent_->reset_dns_discovery_servers();
for (iter = resp.begin(); iter != resp.end(); iter++) {
DSResponse dr = *iter;
count++;

CONTROLLER_TRACE(DiscoveryConnection, "DNS Discovery Server Response", count,
dr.ep.address().to_string(), integerToString(dr.ep.port()));
agent_->set_dns_discovery_server(dr.ep.address().to_string(), count);
agent_->set_dns_discovery_port(dr.ep.port(), count);

AgentDnsXmppChannel *chnl = FindAgentDnsXmppChannel(dr.ep.address().to_string());
if (chnl) {
Expand Down Expand Up @@ -551,21 +562,25 @@ void VNController::ApplyDiscoveryDnsXmppServices(std::vector<DSResponse> resp) {
}
}

/* Remove stale Servers */
/* Remove stale Servers if DOWN*/
for (uint8_t idx = 0; idx < MAX_XMPP_SERVERS; idx++) {
if (agent_->dns_xmpp_channel(idx) != NULL) {

if (AgentXmppServerExists(
agent_->dns_server(idx), resp)) {

CONTROLLER_TRACE(DiscoveryConnection, "Cleanup Older Dns Xmpp",
idx, agent_->dns_server(idx), "");
DisConnectDnsServer(idx);
agent_->reset_dns_server(idx);
if (!AgentXmppServerExists(
agent_->dns_server(idx), resp)) {

if (agent_->dns_xmpp_channel(idx)->GetXmppChannel()->
GetPeerState() == xmps::NOT_READY) {

CONTROLLER_TRACE(DiscoveryConnection, "Cleanup Older Dns Xmpp",
idx, agent_->dns_server(idx), "");
DisConnectDnsServer(idx);
agent_->reset_dns_server(idx);
}
}
}
}

DnsXmppServerConnect();
}

Expand Down
70 changes: 69 additions & 1 deletion src/vnsw/agent/controller/controller_sandesh.cc
Expand Up @@ -34,7 +34,8 @@ void AgentXmppConnectionStatusReq::HandleRequest() const {
data.set_mcast_controller("No");
}

if (Agent::GetInstance()->ifmap_active_xmpp_server().compare(Agent::GetInstance()->controller_ifmap_xmpp_server(count)) == 0) {
if (Agent::GetInstance()->ifmap_active_xmpp_server().compare
(Agent::GetInstance()->controller_ifmap_xmpp_server(count)) == 0) {
data.set_cfg_controller("Yes");
} else {
data.set_cfg_controller("No");
Expand Down Expand Up @@ -128,3 +129,70 @@ void AgentDnsXmppConnectionStatusReq::HandleRequest() const {
resp->set_more(false);
resp->Response();
}

void AgentDiscoveryXmppConnectionsRequest::HandleRequest() const {
uint8_t count = 0;
AgentDiscoveryXmppConnectionsResponse *resp =
new AgentDiscoveryXmppConnectionsResponse();

while (count < MAX_XMPP_SERVERS) {

AgentDiscoveryXmppConnections data;
if (!Agent::GetInstance()->controller_ifmap_xmpp_server(count).empty()) {
data.set_agent_controller_ip(
Agent::GetInstance()->controller_ifmap_xmpp_server(count));
data.set_agent_controller_port(
Agent::GetInstance()->controller_ifmap_xmpp_port(count));
}
if (!Agent::GetInstance()->
controller_ifmap_discovery_xmpp_server(count).empty()) {
data.set_discovery_controller_ip(Agent::GetInstance()->
controller_ifmap_discovery_xmpp_server(count));
data.set_discovery_controller_port(Agent::GetInstance()->
controller_ifmap_discovery_xmpp_port(count));
}

std::vector<AgentDiscoveryXmppConnections> &list =
const_cast<std::vector<AgentDiscoveryXmppConnections>&>(resp->get_xmppc());
list.push_back(data);

count++;
}

resp->set_context(context());
resp->set_more(false);
resp->Response();
}

void AgentDiscoveryDnsXmppConnectionsRequest::HandleRequest() const {
uint8_t dns_count = 0;
AgentDiscoveryDnsXmppConnectionsResponse *resp =
new AgentDiscoveryDnsXmppConnectionsResponse();

while (dns_count < MAX_XMPP_SERVERS) {

AgentDiscoveryXmppConnections data;
if (!Agent::GetInstance()->dns_server(dns_count).empty()) {
data.set_agent_controller_ip(
Agent::GetInstance()->dns_server(dns_count));
data.set_agent_controller_port(
Agent::GetInstance()->dns_server_port(dns_count));
}
if (!Agent::GetInstance()->dns_discovery_server(dns_count).empty()) {
data.set_discovery_controller_ip(
Agent::GetInstance()->dns_discovery_server(dns_count));
data.set_discovery_controller_port(
Agent::GetInstance()->dns_discovery_port(dns_count));
}

std::vector<AgentDiscoveryXmppConnections> &list =
const_cast<std::vector<AgentDiscoveryXmppConnections>&>(resp->get_xmppc());
list.push_back(data);

dns_count++;
}

resp->set_context(context());
resp->set_more(false);
resp->Response();
}

0 comments on commit ee40372

Please sign in to comment.