/**
* Replication Benchmarker
* https://github.com/score-team/replication-benchmarker/
* Copyright (C) 2013 LORIA / Inria / SCORE Team
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* 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 General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package jbenchmarker.rga;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.LinkedHashMap;
import java.util.LinkedList;
import java.util.Map;
import java.util.TreeMap;
import collect.VectorClock;
import java.io.Serializable;
public class RGAPurger implements Serializable{
private Map<Integer, VectorClock> m_lastVC;
private Map<Integer, Integer> m_minseq;
private Map<Integer, Integer> m_sums;
private Map<Integer, Boolean> m_purgable;
private int m_minsum = Integer.MAX_VALUE;
private RGADocument doc;
//private Map<Integer, LinkedList<RGANode>> cemetery;
public RGAPurger(RGADocument doc){
//cemetery = new HashMap<Integer, LinkedList<RGANode>>();
m_lastVC = new HashMap<Integer, VectorClock>();
m_minseq = new HashMap<Integer, Integer>();
m_sums = new HashMap<Integer, Integer>();
m_purgable= new HashMap<Integer, Boolean>();
this.doc = doc;
}
private int getSafeMinSeq(int i){
Integer ret = m_minseq.get(i);
if(ret==null) {
m_sums.put(i, 0);
return 0;
}
return ret.intValue();
}
private int getSafeSums(int i){
Integer ret = m_sums.get(i);
if(ret==null) {
m_sums.put(i,0);
return 0;
}
return ret.intValue();
}
/*
public void enrol(RGANode tau){
int sid = tau.getTomb().sid;
LinkedList<RGANode> ar = cemetery.get(sid);
if(ar==null){
ar = new LinkedList<RGANode>();
cemetery.put(sid, ar);
}
ar.add(tau);
}*/
private void evaluateSEQ(int sid){
int seq=0;
int minseq = Integer.MAX_VALUE;
VectorClock vc;
for(Integer s1 : m_lastVC.keySet()){
vc = m_lastVC.get(s1);
seq = vc.getSafe(sid);
if(minseq > seq) minseq = seq;
}
if(this.getSafeMinSeq(sid)!=minseq) {
m_minseq.put(sid, minseq);
m_purgable.put(sid, true);
}
}
private void evaluate(int sid, VectorClock vv){
int sum = 0;
int s, vve;
Iterator<Integer> it=vv.keySet().iterator();
while(it.hasNext()){
s = it.next();
vve = vv.getSafe(s);
if(this.getSafeMinSeq(s) < vve) evaluateSEQ(s);
sum += vve;
}
if(this.getSafeSums(sid) != sum) {
m_sums.put(sid, sum);
m_purgable.put(sid, true);
}
m_minsum = Integer.MAX_VALUE;
it = m_sums.keySet().iterator();
for(Integer i: m_sums.keySet()){
int isum = m_sums.get(i);
if(m_minsum > isum) m_minsum = isum;
}
}
public void setLastVC(int sid, VectorClock newvc){
m_lastVC.put(sid, (VectorClock)newvc.clone());
//evaluate(sid, newvc);
}
private boolean isPurgable(RGANode tau){
int sid = tau.getTomb().sid;
RGANode next = tau.getNext();
if((tau.getTomb().seq < getSafeMinSeq(sid)) &&
(next==null || next.getKey().sum < m_minsum))
return true;
return false;
}
/*
public RGANode tryPurge(){
for(Integer i:m_purgable.keySet()){
if(m_purgable.get(i)){
}
}
return null;
}
*/
}