2 * Copyright IBM Corporation, 2013. All rights reserved.
4 * This program and the accompanying materials are made available under the
5 * terms of the Eclipse Public License v1.0 which accompanies this distribution,
6 * and is available at http://www.eclipse.org/legal/epl-v10.html
8 package org.opendaylight.controller.samples.loadbalancer.policies;
10 import java.util.ArrayList;
11 import java.util.HashMap;
12 import java.util.Random;
14 import org.opendaylight.controller.samples.loadbalancer.ConfigManager;
15 import org.opendaylight.controller.samples.loadbalancer.entities.Client;
16 import org.opendaylight.controller.samples.loadbalancer.entities.Pool;
17 import org.opendaylight.controller.samples.loadbalancer.entities.PoolMember;
18 import org.opendaylight.controller.samples.loadbalancer.entities.VIP;
19 import org.slf4j.Logger;
20 import org.slf4j.LoggerFactory;
23 * This class implements the random load balancing policy.
26 public class RandomLBPolicy implements ILoadBalancingPolicy {
31 private static final Logger rLogger = LoggerFactory.getLogger(RandomLBPolicy.class);
34 * Reference to the configuration manager. This reference is passed from load balancer
37 private ConfigManager cmgr;
40 * Mapping between the client and the pool member that serves all traffic for that client.
42 private HashMap<Client, PoolMember> clientMemberMap;
47 Random randomGenerator = null;
49 @SuppressWarnings("unused")
50 private RandomLBPolicy(){}
52 public RandomLBPolicy(ConfigManager cmgr){
54 this.clientMemberMap = new HashMap<Client, PoolMember>();
55 randomGenerator = new Random();
58 public String getPoolMemberForClient(Client source, VIP dest){
60 rLogger.info("Received traffic from client : {} for VIP : {} ",source, dest);
62 syncWithLoadBalancerData();
66 if(this.clientMemberMap.containsKey(source)){
67 pm= this.clientMemberMap.get(source);
68 rLogger.info("Client {} had sent traffic before,new traffic will be routed to the same pool member {}",source,pm);
71 pool = this.cmgr.getPool(dest.getPoolName());
72 int memberNum = this.randomGenerator.nextInt(pool.getAllMembers().size()-1);
73 pm = pool.getAllMembers().get(memberNum);
74 this.clientMemberMap.put(source, pm );
75 rLogger.info("Network traffic from client {} will be directed to pool member {}",pm);
81 * This method does the clean up. Whenever a new client packet arrives with a given VIP,
82 * this method checks the current configuration to see if any pool members have been deleted and
83 * cleans up the metadata stored by this loadbalancing algorithm.
85 private void syncWithLoadBalancerData(){
86 rLogger.debug("[Client - PoolMember] table before cleanup : {}",this.clientMemberMap.toString());
88 ArrayList<Client> removeClient = new ArrayList<Client>();
90 if(this.clientMemberMap.size() != 0){
91 for(Client client : this.clientMemberMap.keySet()){
93 if(!this.cmgr.memberExists(this.clientMemberMap.get(client).getName(),
94 this.clientMemberMap.get(client).getPoolName())){
95 removeClient.add(client);
100 for(Client client : removeClient){
101 this.clientMemberMap.remove(client);
103 rLogger.debug("Removed client : {} ",client);
105 rLogger.debug("[Client - PoolMember] table after cleanup : {}",this.clientMemberMap.toString());