/*
* Copyright (C) 2015 hops.io.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package io.hops.leaderElection;
import io.hops.leader_election.node.SortedActiveNodeList;
import io.hops.metadata.election.entity.LeDescriptor;
import io.hops.metadata.election.entity.LeDescriptorFactory;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
public class LEContext {
protected LeaderElectionRole.Role role;
protected long last_hb_time;
protected long leader;
protected long time_period;
protected List<HashMap<Long, LeDescriptor>> history;
protected long id;
protected boolean init_phase;
protected int max_missed_hb_threshold;
protected String rpc_address;
protected String http_address;
protected SortedActiveNodeList memberShip;
protected long time_period_increment;
protected boolean nextTimeTakeStrongerLocks;
private LEContext() {
}
public LEContext(LEContext context, LeDescriptorFactory leFactory) {
role = context.role;
last_hb_time = context.last_hb_time;
leader = context.leader;
time_period = context.time_period;
id = context.id;
init_phase = context.init_phase;
max_missed_hb_threshold = context.max_missed_hb_threshold;
rpc_address = context.rpc_address;
http_address = context.http_address;
time_period_increment = context.time_period_increment;
nextTimeTakeStrongerLocks = context.nextTimeTakeStrongerLocks;
//clone history
history = new ArrayList<HashMap<Long, LeDescriptor>>();
if (!context.history.isEmpty()) {
for (HashMap<Long, LeDescriptor> map : context.history) {
HashMap<Long, LeDescriptor> newMap = new HashMap<Long, LeDescriptor>();
for (LeDescriptor process : map.values()) {
LeDescriptor processClone =
(LeDescriptor) leFactory.cloneDescriptor(process);
newMap.put(processClone.getId(), processClone);
}
history.add(newMap);
}
}
//ToDo clone membership
memberShip = context.memberShip;
}
public static LEContext initialContext() {
LEContext context = new LEContext();
context.role = LeaderElectionRole.Role.NON_LEADER;
context.last_hb_time = 0;
context.leader = -1;
context.time_period = 0;
context.history = new ArrayList<HashMap<Long, LeDescriptor>>();
context.id = LeaderElection.LEADER_INITIALIZATION_ID;
context.init_phase = false;
context.max_missed_hb_threshold = 2;
context.memberShip = null;
context.http_address = null;
context.rpc_address = null;
context.time_period_increment = 0;
context.nextTimeTakeStrongerLocks = false;
return context;
}
}