* @return The inserted table
*/
ILispDAO putNestedTable(Object key, String valueKey);
+
+ /**
+ * Check if the DAO is empty.
+ *
+ * @return true if empty
+ */
+ boolean isEmpty();
}
@Override
public void removeSpecific(Object key, String valueKey) {
- if (data.containsKey(key) && data.get(key).containsKey(valueKey)) {
- data.get(key).remove(valueKey);
+ Map<String, Object> keyToValues = data.get(key);
+ if (keyToValues == null) {
+ return;
+ }
+
+ synchronized (keyToValues) {
+ if (keyToValues.containsKey(valueKey)) {
+ keyToValues.remove(valueKey);
+ if (keyToValues.isEmpty()) {
+ remove(key);
+ }
+ }
}
}
put(TABLES, new MappingEntry<>(key, table));
return table;
}
+
+ @Override
+ public boolean isEmpty() {
+ return data.isEmpty();
+ }
}
map.removeSpecific(dbEntryKey, mapKey3);
Assert.assertNull("Entry should not be present in DB", map.getSpecific(dbEntryKey, mapKey3));
- Assert.assertEquals("MapEntry should be empty after removal the last entry", 0, map.get(dbEntryKey).size());
+ Assert.assertNull("MapEntry should not be present after removal the last entry", map.get(dbEntryKey));
}
@Test
this.dao = dao;
}
- private ILispDAO getVniTable(Eid eid) {
- long vni = 0;
+ private long getVni(Eid eid) {
if (eid.getVirtualNetworkId() == null) {
- vni = 0;
+ return 0;
} else {
- vni = eid.getVirtualNetworkId().getValue();
+ return eid.getVirtualNetworkId().getValue();
}
- return (ILispDAO) dao.getSpecific(vni, SubKeys.VNI);
+ }
+
+ private ILispDAO getVniTable(Eid eid) {
+ return (ILispDAO) dao.getSpecific(getVni(eid), SubKeys.VNI);
+ }
+
+ private void removeVniTable(Eid eid) {
+ dao.removeSpecific(getVni(eid), SubKeys.VNI);
}
private ILispDAO getOrInstantiateVniTable(Eid eid) {
- long vni = 0;
- if (eid.getVirtualNetworkId() == null) {
- vni = 0;
- } else {
- vni = eid.getVirtualNetworkId().getValue();
- }
+ long vni = getVni(eid);
ILispDAO table = (ILispDAO) dao.getSpecific(vni, SubKeys.VNI);
if (table == null) {
table = dao.putNestedTable(vni, SubKeys.VNI);
return;
}
table.removeSpecific(key, SubKeys.AUTH_KEY);
+ if (table.isEmpty()) {
+ removeVniTable(eid);
+ }
}
@Override
this.dao = dao;
}
- private ILispDAO getVniTable(Eid eid) {
- long vni = 0;
+ private long getVni(Eid eid) {
if (eid.getVirtualNetworkId() == null) {
- vni = 0;
+ return 0;
} else {
- vni = eid.getVirtualNetworkId().getValue();
+ return eid.getVirtualNetworkId().getValue();
}
- return (ILispDAO) dao.getSpecific(vni, SubKeys.VNI);
+ }
+
+ private ILispDAO getVniTable(Eid eid) {
+ return (ILispDAO) dao.getSpecific(getVni(eid), SubKeys.VNI);
+ }
+
+ private void removeVniTable(Eid eid) {
+ dao.removeSpecific(getVni(eid), SubKeys.VNI);
}
private ILispDAO getOrInstantiateVniTable(Eid eid) {
- long vni = 0;
- if (eid.getVirtualNetworkId() == null) {
- vni = 0;
- } else {
- vni = eid.getVirtualNetworkId().getValue();
- }
+ long vni = getVni(eid);
ILispDAO table = (ILispDAO) dao.getSpecific(vni, SubKeys.VNI);
if (table == null) {
table = dao.putNestedTable(vni, SubKeys.VNI);
ILispDAO db = getSDInnerDao(key, table);
if (db != null) {
db.remove(SourceDestKeyHelper.getSrcBinary(key));
+ if (db.isEmpty()) {
+ removeSDInnerDao(key, table);
+ }
}
} else {
table.remove(key);
}
+ if (table.isEmpty()) {
+ removeVniTable(eid);
+ }
}
// SrcDst LCAFs are stored in a 2-tier DAO with dst having priority over src.
return (ILispDAO) mappingsDb.getSpecific(SourceDestKeyHelper.getDstBinary(address), SubKeys.LCAF_SRCDST);
}
+ private void removeSDInnerDao(Eid address, ILispDAO mappingsDb) {
+ mappingsDb.removeSpecific(SourceDestKeyHelper.getDstBinary(address), SubKeys.LCAF_SRCDST);
+ }
+
@Override
public void addData(Eid eid, String subKey, Object data) {
Eid key = MaskUtil.normalize(eid);
ILispDAO db = getSDInnerDao(key, table);
if (db != null) {
db.removeSpecific(SourceDestKeyHelper.getSrcBinary(key), subKey);
+ if (db.isEmpty()) {
+ removeSDInnerDao(key, table);
+ }
}
} else {
table.removeSpecific(key, subKey);
}
+ if (table.isEmpty()) {
+ removeVniTable(eid);
+ }
}
@Override
import java.util.AbstractMap.SimpleImmutableEntry;
import java.util.ArrayList;
+import java.util.Arrays;
import java.util.List;
import java.util.Map;
import java.util.Set;
this.dao = dao;
}
- private ILispDAO getVniTable(Eid eid) {
- long vni = 0;
+ private long getVni(Eid eid) {
if (eid.getVirtualNetworkId() == null) {
- vni = 0;
+ return 0;
} else {
- vni = eid.getVirtualNetworkId().getValue();
+ return eid.getVirtualNetworkId().getValue();
}
- return (ILispDAO) dao.getSpecific(vni, SubKeys.VNI);
+ }
+
+ private ILispDAO getVniTable(Eid eid) {
+ return (ILispDAO) dao.getSpecific(getVni(eid), SubKeys.VNI);
+ }
+
+ private void removeVniTable(Eid eid) {
+ dao.removeSpecific(getVni(eid), SubKeys.VNI);
}
private ILispDAO getOrInstantiateVniTable(Eid eid) {
- long vni = 0;
- if (eid.getVirtualNetworkId() == null) {
- vni = 0;
- } else {
- vni = eid.getVirtualNetworkId().getValue();
- }
+ long vni = getVni(eid);
ILispDAO table = (ILispDAO) dao.getSpecific(vni, SubKeys.VNI);
if (table == null) {
table = dao.putNestedTable(vni, SubKeys.VNI);
Eid key = MaskUtil.normalize(eid);
table.remove(key);
+ if (table.isEmpty()) {
+ removeVniTable(eid);
+ }
}
@Override
public void removeMapping(Eid eid, XtrId xtrId) {
- ILispDAO table = getVniTable(eid);
- if (table == null) {
- return;
- }
- Eid key = MaskUtil.normalize(eid);
- ILispDAO xtrIdTable = (ILispDAO) table.getSpecific(key, SubKeys.XTRID_RECORDS);
- if (xtrIdTable == null) {
- return;
- }
- xtrIdTable.removeSpecific(xtrId, SubKeys.RECORD);
+ List<XtrId> xtrIds = Arrays.asList(xtrId);
+ removeXtrIdMappings(eid, xtrIds);
}
@Override
for (XtrId xtrId : xtrIds) {
xtrIdTable.removeSpecific(xtrId, SubKeys.RECORD);
}
+ if (xtrIdTable.isEmpty()) {
+ table.removeSpecific(key, SubKeys.XTRID_RECORDS);
+ if (table.isEmpty()) {
+ removeVniTable(eid);
+ }
+ }
}
@Override
@Override
public Object getData(Eid eid, String subKey) {
- ILispDAO table = getOrInstantiateVniTable(eid);
+ ILispDAO table = getVniTable(eid);
if (table == null) {
return null;
}
@Override
public void removeData(Eid eid, String subKey) {
- ILispDAO table = getOrInstantiateVniTable(eid);
+ ILispDAO table = getVniTable(eid);
if (table == null) {
return;
}
Eid key = MaskUtil.normalize(eid);
table.removeSpecific(key, subKey);
+ if (table.isEmpty()) {
+ removeVniTable(eid);
+ }
}
@Override
simpleMapCache.removeMapping(EID_IPV4);
Mockito.verify(tableMock).remove(MaskUtil.normalize(EID_IPV4));
+ Mockito.verify(tableMock).isEmpty();
Mockito.verifyNoMoreInteractions(tableMock);
}