Synchronizing share Acl pushing

getModifiedDocIds & getDocIds can both be called concurrently so pushShareAcls
needs to be synchronized when called by both of these since it reads and
updates the member variable lastPushedShareAcls.
diff --git a/src/com/google/enterprise/adaptor/fs/FsAdaptor.java b/src/com/google/enterprise/adaptor/fs/FsAdaptor.java
index d8a6103..224e902 100644
--- a/src/com/google/enterprise/adaptor/fs/FsAdaptor.java
+++ b/src/com/google/enterprise/adaptor/fs/FsAdaptor.java
@@ -332,8 +332,12 @@
     log.exiting("FsAdaptor", "getModifiedDocIds", pusher);
   }
 
-  private void pushShareAcls(DocIdPusher pusher, boolean forcePush)
-      throws InterruptedException, IOException {
+  private synchronized void pushShareAcls(DocIdPusher pusher,
+      boolean forcePush) throws InterruptedException, IOException {
+    // The share Acls may not have been pushed yet. So if lastPushedShareAcls
+    // is null, we want to force a push if there are any share Acls.
+    forcePush = forcePush || (lastPushedShareAcls == null);
+
     // The pusher does not support fragments in named resources.
     // Feed a DocId that is just the SHARE_ACL fragment to avoid
     // collisions with the root docid.