Skip to content

Commit

Permalink
Merge branch 'gabrielreid-jdk_classes_for_data_cache' into develop
Browse files Browse the repository at this point in the history
  • Loading branch information
brianhks committed Dec 5, 2019
2 parents d3082f8 + 0a47252 commit a441a51
Showing 1 changed file with 21 additions and 83 deletions.
104 changes: 21 additions & 83 deletions src/main/java/org/kairosdb/datastore/cassandra/DataCache.java
Expand Up @@ -16,7 +16,11 @@

package org.kairosdb.datastore.cassandra;

import java.util.HashMap;
import com.google.common.collect.ImmutableSet;

import java.util.Collections;
import java.util.LinkedHashMap;
import java.util.Map;
import java.util.Set;

/**
Expand All @@ -33,36 +37,17 @@
*/
public class DataCache<T>
{
private final Object m_lock = new Object();

private final LinkItem<T> m_front = new LinkItem<T>(null);
private final LinkItem<T> m_back = new LinkItem<T>(null);

private int m_maxSize;
private Map<T, T> m_internalMap;


private class LinkItem<T>
public DataCache(final int cacheSize)
{
private LinkItem<T> m_prev;
private LinkItem<T> m_next;

private final T m_data;

public LinkItem(T data)
{
m_data = data;
}
}

private HashMap<T, LinkItem<T>> m_hashMap;

public DataCache(int cacheSize)
{
m_hashMap = new HashMap<>();
m_maxSize = cacheSize;

m_front.m_next = m_back;
m_back.m_prev = m_front;
m_internalMap = Collections.synchronizedMap(new LinkedHashMap<T, T>(cacheSize, 1f, true) {
@Override
protected boolean removeEldestEntry(Map.Entry<T, T> eldest)
{
return size() > cacheSize;
}
});
}

/**
Expand All @@ -80,72 +65,25 @@ public DataCache(int cacheSize)
*/
public T cacheItem(T cacheData)
{
LinkItem<T> mappedItem = null;

synchronized (m_lock)
{
LinkItem<T> li = new LinkItem<T>(cacheData);
mappedItem = m_hashMap.putIfAbsent(cacheData, li);

if (mappedItem != null)
{
//moves item to top of list
remove(mappedItem);
addItem(mappedItem);
}
else
addItem(li);

if (m_hashMap.size() > m_maxSize)
{
LinkItem<T> last = m_back.m_prev;
remove(last);

m_hashMap.remove(last.m_data);
}
}

return (mappedItem == null ? null : mappedItem.m_data);
}

private void remove(LinkItem<T> li)
{
li.m_prev.m_next = li.m_next;
li.m_next.m_prev = li.m_prev;
return m_internalMap.putIfAbsent(cacheData, cacheData);
}

private void addItem(LinkItem<T> li)
{
li.m_prev = m_front;
li.m_next = m_front.m_next;

m_front.m_next = li;
li.m_next.m_prev = li;
}

public Set<T> getCachedKeys()
{
return (m_hashMap.keySet());
synchronized (m_internalMap)
{
return ImmutableSet.copyOf(m_internalMap.keySet());
}
}

public void removeKey(T key)
{
synchronized (m_lock)
{
LinkItem<T> li = m_hashMap.remove(key);
if (li != null)
remove(li);
}
m_internalMap.remove(key);
}

public void clear()
{
synchronized (m_lock)
{
m_front.m_next = m_back;
m_back.m_prev = m_front;

m_hashMap.clear();
}
m_internalMap.clear();
}
}

0 comments on commit a441a51

Please sign in to comment.