com.tesora.dve.groupmanager.SimpleMembershipView.java Source code

Java tutorial

Introduction

Here is the source code for com.tesora.dve.groupmanager.SimpleMembershipView.java

Source

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);
    }

}