Tighten up shutdown of zoom file processing during reload

This commit is contained in:
Mike Primm 2011-07-27 08:04:53 -05:00
parent c135a669a8
commit df9d3494c3
4 changed files with 23 additions and 3 deletions

View File

@ -44,6 +44,7 @@ public class DynmapWorld {
@SuppressWarnings("unchecked") @SuppressWarnings("unchecked")
private HashSet<String> zoomoutupdates[] = new HashSet[0]; private HashSet<String> zoomoutupdates[] = new HashSet[0];
private boolean checkts = true; /* Check timestamps on first run with new configuration */ private boolean checkts = true; /* Check timestamps on first run with new configuration */
private boolean cancelled;
@SuppressWarnings("unchecked") @SuppressWarnings("unchecked")
public void setExtraZoomOutLevels(int lvl) { public void setExtraZoomOutLevels(int lvl) {
@ -118,7 +119,7 @@ public class DynmapWorld {
public void freshenZoomOutFiles() { public void freshenZoomOutFiles() {
boolean done = false; boolean done = false;
int last_done = 0; int last_done = 0;
for(int i = 0; (!done); i++) { for(int i = 0; (!cancelled) && (!done); i++) {
done = freshenZoomOutFilesByLevel(i); done = freshenZoomOutFilesByLevel(i);
last_done = i; last_done = i;
} }
@ -129,6 +130,10 @@ public class DynmapWorld {
checkts = false; /* Just handle queued updates after first scan */ checkts = false; /* Just handle queued updates after first scan */
} }
public void cancelZoomOutFreshen() {
cancelled = true;
}
private static class PrefixData { private static class PrefixData {
int stepsize; int stepsize;
int[] stepseq; int[] stepseq;
@ -153,6 +158,7 @@ public class DynmapWorld {
if(checkts) { /* If doing timestamp based scan (initial) */ if(checkts) { /* If doing timestamp based scan (initial) */
DirFilter df = new DirFilter(); DirFilter df = new DirFilter();
for(String pfx : maptab.keySet()) { /* Walk through prefixes */ for(String pfx : maptab.keySet()) { /* Walk through prefixes */
if(cancelled) return true;
PrefixData pd = maptab.get(pfx); PrefixData pd = maptab.get(pfx);
if(pd.isbigmap) { /* If big world, next directories are map name specific */ if(pd.isbigmap) { /* If big world, next directories are map name specific */
File dname = new File(worldtilepath, pfx); File dname = new File(worldtilepath, pfx);
@ -160,6 +166,7 @@ public class DynmapWorld {
String[] subdir = dname.list(df); String[] subdir = dname.list(df);
if(subdir == null) continue; if(subdir == null) continue;
for(String s : subdir) { for(String s : subdir) {
if(cancelled) return true;
File sdname = new File(dname, s); File sdname = new File(dname, s);
cnt += processZoomDirectory(sdname, pd); cnt += processZoomDirectory(sdname, pd);
} }
@ -175,9 +182,11 @@ public class DynmapWorld {
HashMap<String, ProcessTileRec> toprocess = new HashMap<String, ProcessTileRec>(); HashMap<String, ProcessTileRec> toprocess = new HashMap<String, ProcessTileRec>();
/* Accumulate zoomed tiles to be processed (combine triggering subtiles) */ /* Accumulate zoomed tiles to be processed (combine triggering subtiles) */
for(String p : paths) { for(String p : paths) {
if(cancelled) return true;
File f = new File(p); /* Make file */ File f = new File(p); /* Make file */
/* Find matching prefix */ /* Find matching prefix */
for(PrefixData pd : maptab.values()) { /* Walk through prefixes */ for(PrefixData pd : maptab.values()) { /* Walk through prefixes */
if(cancelled) return true;
ProcessTileRec tr = null; ProcessTileRec tr = null;
/* If big map and matches name pattern */ /* If big map and matches name pattern */
if(pd.isbigmap && f.getName().startsWith(pd.fnprefix) && if(pd.isbigmap && f.getName().startsWith(pd.fnprefix) &&
@ -198,6 +207,7 @@ public class DynmapWorld {
} }
/* Do processing */ /* Do processing */
for(ProcessTileRec s : toprocess.values()) { for(ProcessTileRec s : toprocess.values()) {
if(cancelled) return true;
processZoomTile(s.pd, s.zf, s.zfname, s.x, s.y); processZoomTile(s.pd, s.zf, s.zfname, s.x, s.y);
} }
} }
@ -412,12 +422,15 @@ public class DynmapWorld {
} }
FileLockManager.getWriteLock(zf); FileLockManager.getWriteLock(zf);
try { try {
TileHashManager hashman = MapManager.mapman.hashman; MapManager mm = MapManager.mapman;
if(mm == null)
return;
TileHashManager hashman = mm.hashman;
long crc = hashman.calculateTileHash(kzIm.argb_buf); /* Get hash of tile */ long crc = hashman.calculateTileHash(kzIm.argb_buf); /* Get hash of tile */
int tilex = ztx/step/2; int tilex = ztx/step/2;
int tiley = zty/step/2; int tiley = zty/step/2;
String key = world.getName()+".z"+pd.zoomprefix+pd.baseprefix; String key = world.getName()+".z"+pd.zoomprefix+pd.baseprefix;
if((!zf.exists()) || (crc != MapManager.mapman.hashman.getImageHashCode(key, null, tilex, tiley))) { if((!zf.exists()) || (crc != mm.hashman.getImageHashCode(key, null, tilex, tiley))) {
try { try {
if(!zf.getParentFile().exists()) if(!zf.getParentFile().exists())
zf.getParentFile().mkdirs(); zf.getParentFile().mkdirs();

View File

@ -45,6 +45,8 @@ public class InternalClientUpdateComponent extends ClientUpdateComponent {
} }
protected void webChat(String name, String message) { protected void webChat(String name, String message) {
if(plugin.mapManager == null)
return;
// TODO: Change null to something meaningful. // TODO: Change null to something meaningful.
plugin.mapManager.pushUpdate(new Client.ChatMessage("web", null, name, message, null)); plugin.mapManager.pushUpdate(new Client.ChatMessage("web", null, name, message, null));
Log.info(unescapeString(plugin.configuration.getString("webprefix", "\u00A72[WEB] ")) + name + ": " + unescapeString(plugin.configuration.getString("websuffix", "\u00A7f")) + message); Log.info(unescapeString(plugin.configuration.getString("webprefix", "\u00A72[WEB] ")) + name + ": " + unescapeString(plugin.configuration.getString("websuffix", "\u00A7f")) + message);

View File

@ -117,6 +117,7 @@ public class JsonFileClientUpdateComponent extends ClientUpdateComponent {
protected void writeUpdates() { protected void writeUpdates() {
File outputFile; File outputFile;
File outputTempFile; File outputTempFile;
if(plugin.mapManager == null) return;
//Handles Updates //Handles Updates
for (DynmapWorld dynmapWorld : plugin.mapManager.getWorlds()) { for (DynmapWorld dynmapWorld : plugin.mapManager.getWorlds()) {
World world = dynmapWorld.world; World world = dynmapWorld.world;
@ -195,6 +196,7 @@ public class JsonFileClientUpdateComponent extends ClientUpdateComponent {
} }
protected void webChat(String name, String message) { protected void webChat(String name, String message) {
if(plugin.mapManager == null) return;
// TODO: Change null to something meaningful. // TODO: Change null to something meaningful.
plugin.mapManager.pushUpdate(new Client.ChatMessage("web", null, name, message, null)); plugin.mapManager.pushUpdate(new Client.ChatMessage("web", null, name, message, null));
Log.info(unescapeString(plugin.configuration.getString("webprefix", "\u00A2[WEB] ")) + name + ": " + unescapeString(plugin.configuration.getString("websuffix", "\u00A7f")) + message); Log.info(unescapeString(plugin.configuration.getString("webprefix", "\u00A2[WEB] ")) + name + ": " + unescapeString(plugin.configuration.getString("websuffix", "\u00A7f")) + message);

View File

@ -634,6 +634,9 @@ public class MapManager {
} }
public void stopRendering() { public void stopRendering() {
/* Tell all worlds to cancel any zoom out processing */
for(DynmapWorld w: worlds)
w.cancelZoomOutFreshen();
render_pool.shutdown(); render_pool.shutdown();
try { try {
render_pool.awaitTermination(5, TimeUnit.SECONDS); render_pool.awaitTermination(5, TimeUnit.SECONDS);