* 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.
This commit is contained in:
ragnarok
2005-10-24 06:27:56 +00:00
committed by zzz
parent 788998307a
commit ee9ac31c8b
3 changed files with 20 additions and 3 deletions

View File

@ -20,9 +20,9 @@ public class Updater {
_lastUpdate = System.currentTimeMillis(); _lastUpdate = System.currentTimeMillis();
_log.debug("Update started."); _log.debug("Update started.");
User user = new User(); User user = new User();
RemoteArchiveBean rab = new RemoteArchiveBean();
String[] archives = bm.getUpdateArchives(); String[] archives = bm.getUpdateArchives();
for (int i = 0; i < archives.length; i++) { for (int i = 0; i < archives.length; i++) {
RemoteArchiveBean rab = new RemoteArchiveBean();
_log.debug("Fetching " + archives[i]); _log.debug("Fetching " + archives[i]);
rab.fetchIndex(user, "web", archives[i], bm.getDefaultProxyHost(), bm.getDefaultProxyPort()); rab.fetchIndex(user, "web", archives[i], bm.getDefaultProxyHost(), bm.getDefaultProxyPort());
if (rab.getRemoteIndex() != null) { if (rab.getRemoteIndex() != null) {

View File

@ -134,6 +134,10 @@ public class RemoteArchiveBean {
} }
public void fetchSelectedBulk(User user, Map parameters) { 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 entries[] = ArchiveViewerBean.getStrings(parameters, "entry");
String action = ArchiveViewerBean.getString(parameters, "action"); String action = ArchiveViewerBean.getString(parameters, "action");
if ("Fetch all new entries".equals(action)) { if ("Fetch all new entries".equals(action)) {
@ -206,7 +210,7 @@ public class RemoteArchiveBean {
File t = File.createTempFile("fetchBulk", ".dat", BlogManager.instance().getTempDir()); File t = File.createTempFile("fetchBulk", ".dat", BlogManager.instance().getTempDir());
tmpFiles.add(t); tmpFiles.add(t);
} }
fetch(urls, tmpFiles, user, new BlogStatusListener()); fetch(urls, tmpFiles, user, new BlogStatusListener(), shouldBlock);
} catch (IOException ioe) { } catch (IOException ioe) {
_statusMessages.add("Internal error creating temporary file to fetch posts: " + HTMLRenderer.sanitizeString(urls.toString())); _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) { 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); 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) { public void fetchIndex(User user, String schema, String location, String proxyHost, String proxyPort) {

View File

@ -33,6 +33,15 @@ public class EepGetScheduler implements EepGet.StatusListener {
t.start(); 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() { private void fetchNext() {
_curURL++; _curURL++;
if (_curURL >= _urls.size()) return; if (_curURL >= _urls.size()) return;