package com.tesora.dve.groupmanager;
/*
* #%L
* Tesora Inc.
* Database Virtualization Engine
* %%
* Copyright (C) 2011 - 2014 Tesora Inc.
* %%
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License, version 3,
* as published by the Free Software Foundation.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
* #L%
*/
import com.google.common.collect.Sets;
import com.tesora.dve.common.catalog.CatalogDAO;
import com.tesora.dve.common.catalog.ServerRegistration;
import com.tesora.dve.locking.impl.CoordinationServices;
import com.tesora.dve.membership.MembershipView;
import java.net.InetSocketAddress;
import java.util.*;
public class SimpleMembershipView implements MembershipView {
InetSocketAddress myAddress;
Set<InetSocketAddress> catalogRegistered;
Set<InetSocketAddress> clusterReachable;
boolean isInQuorum;
public SimpleMembershipView() {
this.myAddress = null;
this.catalogRegistered = Collections.unmodifiableSet(new HashSet<InetSocketAddress>());
this.clusterReachable = Collections.unmodifiableSet(new HashSet<InetSocketAddress>());
this.isInQuorum = false;
}
public SimpleMembershipView(InetSocketAddress myAddress, Collection<InetSocketAddress> catalogRegistered, Collection<InetSocketAddress> clusterReachable) {
this.myAddress = myAddress;
this.catalogRegistered = Collections.unmodifiableSet(new HashSet<InetSocketAddress>(catalogRegistered));
this.clusterReachable = Collections.unmodifiableSet(new HashSet<InetSocketAddress>(clusterReachable));
this.isInQuorum = (activeQuorumMembers().size() > inactiveQuorumMembers().size());//quorum only determined by catalog registered members.
}
@Override
public InetSocketAddress getMyAddress(){
return myAddress;
}
@Override
public boolean isInQuorum(){
return isInQuorum;
}
@Override
public Set<InetSocketAddress> quorumMembers(){
return catalogRegistered;
}
@Override
public Set<InetSocketAddress> reachableMembers(){
return clusterReachable;
}
@Override
public Set<InetSocketAddress> allMembers(){
return Sets.union(catalogRegistered,clusterReachable);
}
@Override
public Set<InetSocketAddress> activeQuorumMembers(){
return Sets.intersection(catalogRegistered,clusterReachable);
}
@Override
public Set<InetSocketAddress> inactiveQuorumMembers(){
return Sets.difference(catalogRegistered, clusterReachable);
}
@Override
public Set<InetSocketAddress> disabledMembers(){
return Sets.difference(allMembers(), activeQuorumMembers());
}
public static SimpleMembershipView disabledView(){
return new SimpleMembershipView();
}
public static MembershipView buildView(InetSocketAddress myAddress, Collection<InetSocketAddress> registered, Collection<InetSocketAddress> reachable){
return new SimpleMembershipView(myAddress,registered,reachable);
}
public static SimpleMembershipView buildView(CatalogDAO catalog, CoordinationServices coord){
List<ServerRegistration> registeredServers = catalog.findAllRegisteredServers();
Set<InetSocketAddress> serverIps = new HashSet<InetSocketAddress>();
for (ServerRegistration serverReg : registeredServers) {
String addrPort = serverReg.getIpAddress();
String[] split = addrPort.split(":");
if (split.length != 2){
// logger.warn("expected host:port in server registration, "+ addrPort);
continue;
}
InetSocketAddress address = new InetSocketAddress(split[0],Integer.parseInt(split[1]));
serverIps.add(address);
}
return new SimpleMembershipView(coord.getMemberAddress(),serverIps, coord.getMembers());
}
public String toString(){
return String.format("[myAddress=%s, inQuorum=%s, catalog=%s, reachable=%s]",myAddress,isInQuorum,catalogRegistered,clusterReachable);
}
}