Merge branch 'master' of https://code.google.com/p/plexi
diff --git a/src/com/google/enterprise/adaptor/AsyncDocIdSender.java b/src/com/google/enterprise/adaptor/AsyncDocIdSender.java
index d1342ad..7aa0f77 100644
--- a/src/com/google/enterprise/adaptor/AsyncDocIdSender.java
+++ b/src/com/google/enterprise/adaptor/AsyncDocIdSender.java
@@ -74,13 +74,13 @@
   private class WorkerRunnable implements Runnable {
     @Override
     public void run() {
-      List<DocIdSender.Item> list = new ArrayList<DocIdSender.Item>();
+      Set<DocIdSender.Item> items = new LinkedHashSet<DocIdSender.Item>();
       try {
         while (true) {
           BlockingQueueBatcher.take(
-              queue, list, maxBatchSize, maxLatency, maxLatencyUnit);
-          itemPusher.pushItems(list.iterator(), null);
-          list.clear();
+              queue, items, maxBatchSize, maxLatency, maxLatencyUnit);
+          itemPusher.pushItems(items.iterator(), null);
+          items.clear();
         }
       } catch (InterruptedException ex) {
         log.log(Level.FINE, "AsyncDocIdSender worker shutting down", ex);
@@ -90,8 +90,8 @@
           // If we were interrupted between calls to take(), then take() may
           // have interrupted itself before draining the queue; might as well
           // send everything that was put on the queue.
-          queue.drainTo(list);
-          itemPusher.pushItems(list.iterator(),
+          queue.drainTo(items);
+          itemPusher.pushItems(items.iterator(),
               ExceptionHandlers.noRetryHandler());
         } catch (InterruptedException ex2) {
           // Ignore, because we are going to interrupt anyway. This should