From ee9ac31c8b934c77170075a4ee07a3d017012c24 Mon Sep 17 00:00:00 2001
From: ragnarok <ragnarok>
Date: Mon, 24 Oct 2005 06:27:56 +0000
Subject: [PATCH] * Instantiate new RemoteArchiveBean for each archive fetched
 by the updater, to prevent weirdness if the index fetch for archive n+1
 fails.

* Add a blocking fetch to EepGetScheduler and RemoteArchiveBean and use them from the updater, to prevent race conditions with multiple archive fetches.
---
 apps/syndie/java/src/net/i2p/syndie/Updater.java     |  2 +-
 .../src/net/i2p/syndie/web/RemoteArchiveBean.java    | 12 ++++++++++--
 core/java/src/net/i2p/util/EepGetScheduler.java      |  9 +++++++++
 3 files changed, 20 insertions(+), 3 deletions(-)

diff --git a/apps/syndie/java/src/net/i2p/syndie/Updater.java b/apps/syndie/java/src/net/i2p/syndie/Updater.java
index 722c0c16b3..a430ec460a 100644
--- a/apps/syndie/java/src/net/i2p/syndie/Updater.java
+++ b/apps/syndie/java/src/net/i2p/syndie/Updater.java
@@ -20,9 +20,9 @@ public class Updater {
         _lastUpdate = System.currentTimeMillis();
         _log.debug("Update started.");
         User user = new User();
-        RemoteArchiveBean rab = new RemoteArchiveBean();
         String[] archives = bm.getUpdateArchives();
         for (int i = 0; i < archives.length; i++) {
+            RemoteArchiveBean rab = new RemoteArchiveBean();
             _log.debug("Fetching " + archives[i]);
             rab.fetchIndex(user, "web", archives[i], bm.getDefaultProxyHost(), bm.getDefaultProxyPort());
             if (rab.getRemoteIndex() != null) {
diff --git a/apps/syndie/java/src/net/i2p/syndie/web/RemoteArchiveBean.java b/apps/syndie/java/src/net/i2p/syndie/web/RemoteArchiveBean.java
index 40447f11cb..7577979596 100644
--- a/apps/syndie/java/src/net/i2p/syndie/web/RemoteArchiveBean.java
+++ b/apps/syndie/java/src/net/i2p/syndie/web/RemoteArchiveBean.java
@@ -134,6 +134,10 @@ public class RemoteArchiveBean {
     }
     
     public void fetchSelectedBulk(User user, Map parameters) {
+        fetchSelectedBulk(user, parameters, false);
+    }
+    
+    public void fetchSelectedBulk(User user, Map parameters, boolean shouldBlock) {
         String entries[] = ArchiveViewerBean.getStrings(parameters, "entry");
         String action = ArchiveViewerBean.getString(parameters, "action");
         if ("Fetch all new entries".equals(action)) {
@@ -206,7 +210,7 @@ public class RemoteArchiveBean {
                     File t = File.createTempFile("fetchBulk", ".dat", BlogManager.instance().getTempDir());
                     tmpFiles.add(t);
                 }
-                fetch(urls, tmpFiles, user, new BlogStatusListener());
+                fetch(urls, tmpFiles, user, new BlogStatusListener(), shouldBlock);
             } catch (IOException ioe) {
                 _statusMessages.add("Internal error creating temporary file to fetch posts: " + HTMLRenderer.sanitizeString(urls.toString()));
             }
@@ -258,8 +262,12 @@ public class RemoteArchiveBean {
     }
     
     private void fetch(List urls, List tmpFiles, User user, EepGet.StatusListener lsnr) {
+        fetch(urls, tmpFiles, user, lsnr, false);
+    }
+    
+    private void fetch(List urls, List tmpFiles, User user, EepGet.StatusListener lsnr, boolean shouldBlock) {
         EepGetScheduler scheduler = new EepGetScheduler(I2PAppContext.getGlobalContext(), urls, tmpFiles, _proxyHost, _proxyPort, lsnr);
-        scheduler.fetch();
+        scheduler.fetch(shouldBlock);
     }
     
     public void fetchIndex(User user, String schema, String location, String proxyHost, String proxyPort) {
diff --git a/core/java/src/net/i2p/util/EepGetScheduler.java b/core/java/src/net/i2p/util/EepGetScheduler.java
index f3aa173cd6..e39dfafee3 100644
--- a/core/java/src/net/i2p/util/EepGetScheduler.java
+++ b/core/java/src/net/i2p/util/EepGetScheduler.java
@@ -33,6 +33,15 @@ public class EepGetScheduler implements EepGet.StatusListener {
         t.start();
     }
     
+    public void fetch(boolean shouldBlock) {
+        //Checking for a valid index is done in fetchNext, so we don't have to worry about it.
+        if (shouldBlock) {
+            fetchNext();
+        } else {
+            fetch();
+        }
+    }
+    
     private void fetchNext() {
         _curURL++;
         if (_curURL >= _urls.size()) return;
-- 
GitLab