mirror of
https://github.com/webbukkit/dynmap.git
synced 2024-11-24 19:25:15 +01:00
Add delay-retry loop for handling temporarily locked image file writes
This commit is contained in:
parent
6efbf3a3df
commit
e584e3202b
@ -281,7 +281,7 @@ public class FlatMap extends MapType {
|
||||
if(!outputFile.getParentFile().exists())
|
||||
outputFile.getParentFile().mkdirs();
|
||||
try {
|
||||
ImageIO.write(im.buf_img, "png", outputFile);
|
||||
FileLockManager.imageIOWrite(im.buf_img, "png", outputFile);
|
||||
} catch (IOException e) {
|
||||
Debug.error("Failed to save image: " + outputFile.getPath(), e);
|
||||
} catch (java.lang.NullPointerException e) {
|
||||
@ -308,7 +308,7 @@ public class FlatMap extends MapType {
|
||||
if(!dayfile.getParentFile().exists())
|
||||
dayfile.getParentFile().mkdirs();
|
||||
try {
|
||||
ImageIO.write(im_day.buf_img, "png", dayfile);
|
||||
FileLockManager.imageIOWrite(im_day.buf_img, "png", dayfile);
|
||||
} catch (IOException e) {
|
||||
Debug.error("Failed to save image: " + dayfile.getPath(), e);
|
||||
} catch (java.lang.NullPointerException e) {
|
||||
|
@ -265,7 +265,7 @@ public class DefaultTileRenderer implements MapTileRenderer {
|
||||
if(!fname.getParentFile().exists())
|
||||
fname.getParentFile().mkdirs();
|
||||
try {
|
||||
ImageIO.write(img.buf_img, "png", fname);
|
||||
FileLockManager.imageIOWrite(img.buf_img, "png", fname);
|
||||
} catch (IOException e) {
|
||||
Debug.error("Failed to save image: " + fname.getPath(), e);
|
||||
} catch (java.lang.NullPointerException e) {
|
||||
@ -291,7 +291,7 @@ public class DefaultTileRenderer implements MapTileRenderer {
|
||||
if(!dfname.getParentFile().exists())
|
||||
dfname.getParentFile().mkdirs();
|
||||
try {
|
||||
ImageIO.write(img_day.buf_img, "png", dfname);
|
||||
FileLockManager.imageIOWrite(img_day.buf_img, "png", dfname);
|
||||
} catch (IOException e) {
|
||||
Debug.error("Failed to save image: " + dfname.getPath(), e);
|
||||
} catch (java.lang.NullPointerException e) {
|
||||
@ -365,7 +365,7 @@ public class DefaultTileRenderer implements MapTileRenderer {
|
||||
zoomFile.getParentFile().mkdirs();
|
||||
|
||||
try {
|
||||
ImageIO.write(zIm, "png", zoomFile);
|
||||
FileLockManager.imageIOWrite(zIm, "png", zoomFile);
|
||||
Debug.debug("Saved zoom-out tile at " + zoomFile.getName());
|
||||
} catch (IOException e) {
|
||||
Debug.error("Failed to save zoom-out tile: " + zoomFile.getName(), e);
|
||||
|
@ -1,6 +1,10 @@
|
||||
package org.dynmap.utils;
|
||||
import java.io.File;
|
||||
import java.io.FileNotFoundException;
|
||||
import java.util.HashMap;
|
||||
import java.awt.image.BufferedImage;
|
||||
import java.io.IOException;
|
||||
import javax.imageio.ImageIO;
|
||||
|
||||
import org.dynmap.Log;
|
||||
/**
|
||||
@ -102,4 +106,29 @@ public class FileLockManager {
|
||||
}
|
||||
//Log.info("releaseReadLock(" + f + ")");
|
||||
}
|
||||
private static final int MAX_WRITE_RETRIES = 6;
|
||||
/**
|
||||
* Wrapper for IOImage.write - implements retries for busy files
|
||||
*/
|
||||
public static void imageIOWrite(BufferedImage img, String type, File fname) throws IOException {
|
||||
int retrycnt = 0;
|
||||
boolean done = false;
|
||||
|
||||
while(!done) {
|
||||
try {
|
||||
ImageIO.write(img, type, fname);
|
||||
done = true;
|
||||
} catch (FileNotFoundException fnfx) { /* This seems to be what we get when file is locked by reader */
|
||||
if(retrycnt < MAX_WRITE_RETRIES) {
|
||||
Log.info("Image file " + fname.getPath() + " - unable to write - retry #" + retrycnt);
|
||||
try { Thread.sleep(50 << retrycnt); } catch (InterruptedException ix) { throw fnfx; }
|
||||
retrycnt++;
|
||||
}
|
||||
else {
|
||||
Log.info("Image file " + fname.getPath() + " - unable to write - failed");
|
||||
throw fnfx;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user