/** * Append the replicable table-cf config of the specified peer * * @param id a short that identifies the cluster * @param tableCfs A map from tableName to column family names * @throws ReplicationException */ public void appendPeerTableCFs(String id, Map<TableName, ? extends Collection<String>> tableCfs) throws ReplicationException { if (tableCfs == null) { throw new ReplicationException("tableCfs is null"); } Map<TableName, List<String>> preTableCfs = parseTableCFsFromConfig(getPeerTableCFs(id)); if (preTableCfs == null) { setPeerTableCFs(id, tableCfs); return; } for (Map.Entry<TableName, ? extends Collection<String>> entry : tableCfs.entrySet()) { TableName table = entry.getKey(); Collection<String> appendCfs = entry.getValue(); if (preTableCfs.containsKey(table)) { List<String> cfs = preTableCfs.get(table); if (cfs == null || appendCfs == null) { preTableCfs.put(table, null); } else { Set<String> cfSet = new HashSet<String>(cfs); cfSet.addAll(appendCfs); preTableCfs.put(table, Lists.newArrayList(cfSet)); } } else { if (appendCfs == null || appendCfs.isEmpty()) { preTableCfs.put(table, null); } else { preTableCfs.put(table, Lists.newArrayList(appendCfs)); } } } setPeerTableCFs(id, preTableCfs); }
/** * Remove some table-cfs from config of the specified peer * * @param id a short name that identifies the cluster * @param tableCfs A map from tableName to column family names * @throws ReplicationException */ public void removePeerTableCFs(String id, Map<TableName, ? extends Collection<String>> tableCfs) throws ReplicationException { if (tableCfs == null) { throw new ReplicationException("tableCfs is null"); } Map<TableName, List<String>> preTableCfs = parseTableCFsFromConfig(getPeerTableCFs(id)); if (preTableCfs == null) { throw new ReplicationException("Table-Cfs for peer" + id + " is null"); } for (Map.Entry<TableName, ? extends Collection<String>> entry : tableCfs.entrySet()) { TableName table = entry.getKey(); Collection<String> removeCfs = entry.getValue(); if (preTableCfs.containsKey(table)) { List<String> cfs = preTableCfs.get(table); if (cfs == null && removeCfs == null) { preTableCfs.remove(table); } else if (cfs != null && removeCfs != null) { Set<String> cfSet = new HashSet<String>(cfs); cfSet.removeAll(removeCfs); if (cfSet.isEmpty()) { preTableCfs.remove(table); } else { preTableCfs.put(table, Lists.newArrayList(cfSet)); } } else if (cfs == null && removeCfs != null) { throw new ReplicationException( "Cannot remove cf of table: " + table + " which doesn't specify cfs from table-cfs config in peer: " + id); } else if (cfs != null && removeCfs == null) { throw new ReplicationException( "Cannot remove table: " + table + " which has specified cfs from table-cfs config in peer: " + id); } } else { throw new ReplicationException( "No table: " + table + " in table-cfs config of peer: " + id); } } setPeerTableCFs(id, preTableCfs); }
@Test public void testRemovePeerTableCFs() throws Exception { // Add a valid peer admin.addPeer(ID_ONE, KEY_ONE); try { admin.removePeerTableCFs(ID_ONE, "t3"); assertTrue(false); } catch (ReplicationException e) { } assertEquals("", admin.getPeerTableCFs(ID_ONE)); admin.setPeerTableCFs(ID_ONE, "t1;t2:cf1"); try { admin.removePeerTableCFs(ID_ONE, "t3"); assertTrue(false); } catch (ReplicationException e) { } assertEquals("t1;t2:cf1", admin.getPeerTableCFs(ID_ONE)); try { admin.removePeerTableCFs(ID_ONE, "t1:f1"); assertTrue(false); } catch (ReplicationException e) { } admin.removePeerTableCFs(ID_ONE, "t1"); assertEquals("t2:cf1", admin.getPeerTableCFs(ID_ONE)); try { admin.removePeerTableCFs(ID_ONE, "t2"); assertTrue(false); } catch (ReplicationException e) { } admin.removePeerTableCFs(ID_ONE, "t2:cf1"); assertEquals("", admin.getPeerTableCFs(ID_ONE)); admin.removePeer(ID_ONE); }