Merge pull request #583 from metamx/fix-filtered-server-view

fix memory issues in FilteredServerView
diff --git a/server/src/main/java/io/druid/client/BatchServerInventoryView.java b/server/src/main/java/io/druid/client/BatchServerInventoryView.java
index 509c4a5..a2a3c42 100644
--- a/server/src/main/java/io/druid/client/BatchServerInventoryView.java
+++ b/server/src/main/java/io/druid/client/BatchServerInventoryView.java
@@ -24,6 +24,7 @@
 import com.google.api.client.repackaged.com.google.common.base.Preconditions;
 import com.google.common.base.Predicate;
 import com.google.common.base.Predicates;
+import com.google.common.collect.Iterables;
 import com.google.common.collect.MapMaker;
 import com.google.common.collect.Sets;
 import com.google.inject.Inject;
@@ -79,7 +80,8 @@
   )
   {
     Predicate<DataSegment> predicate = Predicates.or(defaultFilter, Predicates.or(segmentPredicates.values()));
-    Set<DataSegment> filteredInventory = Sets.filter(inventory, predicate);
+    // make a copy of the set and not just a filtered view, in order to not keep all the segment data in memory
+    Set<DataSegment> filteredInventory = Sets.newHashSet(Iterables.filter(inventory, predicate));
 
     zNodes.put(inventoryKey, filteredInventory);
     for (DataSegment segment : filteredInventory) {
@@ -94,7 +96,8 @@
   )
   {
     Predicate<DataSegment> predicate = Predicates.or(defaultFilter, Predicates.or(segmentPredicates.values()));
-    Set<DataSegment> filteredInventory = Sets.filter(inventory, predicate);
+    // make a copy of the set and not just a filtered view, in order to not keep all the segment data in memory
+    Set<DataSegment> filteredInventory = Sets.newHashSet(Iterables.filter(inventory, predicate));
 
     Set<DataSegment> existing = zNodes.get(inventoryKey);
     if (existing == null) {