# HG changeset patch # User robcast # Date 1098388855 -7200 # Node ID 1cec876f27885d4afb407177c84638504204c481 # Parent 5d0c0da080ecfef3149cf92c5ab1ae7c30dbe797 servlet version 2b1 ("scaleable digilib") - only using Semaphore to limit max number of threads diff -r 5d0c0da080ec -r 1cec876f2788 servlet/src/digilib/servlet/DigilibConfiguration.java --- a/servlet/src/digilib/servlet/DigilibConfiguration.java Thu Oct 21 20:53:37 2004 +0200 +++ b/servlet/src/digilib/servlet/DigilibConfiguration.java Thu Oct 21 22:00:55 2004 +0200 @@ -91,9 +91,6 @@ 's'); // AuthOps instance for authentication newParameter("servlet.auth.op", null, null, 's'); - // worker queues - newParameter("servlet.fast.queue", null, null, 's'); - newParameter("servlet.slow.queue", null, null, 's'); /* * parameters that can be read from config file have a type 'f' @@ -144,14 +141,8 @@ newParameter("max-image-size", new Integer(0), null, 'f'); // use safe (but slower) directory indexing newParameter("safe-dir-index", Boolean.FALSE, null, 'f'); - // number of fast worker threads - newParameter("worker-fast-lanes", new Integer(2), null, 'f'); - // length of fast worker queue - newParameter("worker-fast-queue", new Integer(100), null, 'f'); - // number of slow worker threads - newParameter("worker-slow-lanes", new Integer(2), null, 'f'); - // length of slow worker queue - newParameter("worker-slow-queue", new Integer(100), null, 'f'); + // number of working threads + newParameter("worker-threads", new Integer(1), null, 'f'); } diff -r 5d0c0da080ec -r 1cec876f2788 servlet/src/digilib/servlet/DigilibJob.java --- a/servlet/src/digilib/servlet/DigilibJob.java Thu Oct 21 20:53:37 2004 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,75 +0,0 @@ -/* DigilibJob.java -- digilib job for worker - * - * Digital Image Library servlet components - * - * Copyright (C) 2004 Robert Casties (robcast@mail.berlios.de) - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * Please read license.txt for the full details. A copy of the GPL may be found - * at http://www.gnu.org/copyleft/lgpl.html - * - * You should have received a copy of the GNU General Public License along with - * this program; if not, write to the Free Software Foundation, Inc., 59 Temple - * Place, Suite 330, Boston, MA 02111-1307 USA - * - * Created on 18.10.2004 - */ -package digilib.servlet; - -import digilib.image.DocuImage; - -/** digilib job for worker. - * - * @author casties - * - */ -public class DigilibJob { - - private DigilibConfiguration config; - - private DigilibRequest request; - - private DocuImage image; - - - /** - * @return Returns the config. - */ - public DigilibConfiguration getConfig() { - return config; - } - /** - * @param config The config to set. - */ - public void setConfig(DigilibConfiguration config) { - this.config = config; - } - /** - * @return Returns the image. - */ - public DocuImage getImage() { - return image; - } - /** - * @param image The image to set. - */ - public void setImage(DocuImage image) { - this.image = image; - } - /** - * @return Returns the request. - */ - public DigilibRequest getRequest() { - return request; - } - /** - * @param request The request to set. - */ - public void setRequest(DigilibRequest request) { - this.request = request; - } -} diff -r 5d0c0da080ec -r 1cec876f2788 servlet/src/digilib/servlet/DigilibManager.java --- a/servlet/src/digilib/servlet/DigilibManager.java Thu Oct 21 20:53:37 2004 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,62 +0,0 @@ -/* DigilibManager.java -- work queue manager - * - * Digital Image Library servlet components - * - * Copyright (C) 2004 Robert Casties (robcast@mail.berlios.de) - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * Please read license.txt for the full details. A copy of the GPL may be found - * at http://www.gnu.org/copyleft/lgpl.html - * - * You should have received a copy of the GNU General Public License along with - * this program; if not, write to the Free Software Foundation, Inc., 59 Temple - * Place, Suite 330, Boston, MA 02111-1307 USA - * - * Created on 18.10.2004 - */ - -package digilib.servlet; - -import EDU.oswego.cs.dl.util.concurrent.BoundedBuffer; -import EDU.oswego.cs.dl.util.concurrent.Executor; -import EDU.oswego.cs.dl.util.concurrent.PooledExecutor; - -/** work queue manager. - * - * @author casties - * - */ -public class DigilibManager implements Executor { - - private PooledExecutor workerQueue = null; - - private BoundedBuffer jobQueue = null; - - /** - * @param numFastLanes - * @param numSlowLanes - */ - public DigilibManager(int numLanes, int queueMax) { - super(); - - // create job queue - jobQueue = new BoundedBuffer(queueMax); - // create work queue - workerQueue = new PooledExecutor(jobQueue, numLanes); - workerQueue.abortWhenBlocked(); - - } - - - public void execute(Runnable worker) throws InterruptedException { - workerQueue.execute(worker); - } - - public int getQueueSize() { - return jobQueue.size(); - } -} diff -r 5d0c0da080ec -r 1cec876f2788 servlet/src/digilib/servlet/DigilibSender.java --- a/servlet/src/digilib/servlet/DigilibSender.java Thu Oct 21 20:53:37 2004 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,73 +0,0 @@ -/* DigilibSender.java -- image file send worker - * - * Digital Image Library servlet components - * - * Copyright (C) 2004 Robert Casties (robcast@mail.berlios.de) - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * Please read license.txt for the full details. A copy of the GPL may be found - * at http://www.gnu.org/copyleft/lgpl.html - * - * You should have received a copy of the GNU General Public License along with - * this program; if not, write to the Free Software Foundation, Inc., 59 Temple - * Place, Suite 330, Boston, MA 02111-1307 USA - * - * Created on 18.10.2004 - */ -package digilib.servlet; - -import java.io.File; - -import javax.servlet.http.HttpServletResponse; - -import digilib.io.FileOpException; - -/** - * image file send worker. - * - * @author casties - * - */ -public class DigilibSender extends DigilibWorker { - - private File file; - - private String mimetype; - - private HttpServletResponse response; - - /** - * @param file - * @param mimetype - * @param response - */ - public DigilibSender(File file, String mimetype, - HttpServletResponse response) { - super(); - this.file = file; - this.mimetype = mimetype; - this.response = response; - } - - /** - * Actually send the file. - * - */ - public void work() { - logger.debug("worker " + this.getName() + " sending file:" - + file.getName()); - try { - //sleep(2000); - ServletOps.sendFileImmediately(file, mimetype, response); - } catch (FileOpException e) { - logger.error("Unable to send file " + file.getPath() + " because " - + e); - } - logger.debug("worker "+this.getName()+" done"); - } - -} diff -r 5d0c0da080ec -r 1cec876f2788 servlet/src/digilib/servlet/DigilibWorker.java --- a/servlet/src/digilib/servlet/DigilibWorker.java Thu Oct 21 20:53:37 2004 +0200 +++ b/servlet/src/digilib/servlet/DigilibWorker.java Thu Oct 21 22:00:55 2004 +0200 @@ -25,25 +25,24 @@ import EDU.oswego.cs.dl.util.concurrent.FIFOSemaphore; import EDU.oswego.cs.dl.util.concurrent.Semaphore; - - -/** image operation worker. +/** + * image operation worker. * * @author casties - * + * */ -public abstract class DigilibWorker extends Thread { - +public abstract class DigilibWorker { + protected static Logger logger = Logger.getLogger(DigilibWorker.class); private static int runningThreads = 0; - - public static Semaphore lock = new FIFOSemaphore(4); + + public static Semaphore lock = new FIFOSemaphore(1); protected boolean busy = false; - - protected Exception error; - + + protected Exception error; + /** * @param job */ @@ -52,34 +51,39 @@ busy = true; error = null; } - - + public abstract void work() throws Exception; - - /** Actually do the work. - * - * @see java.lang.Runnable#run() + + /** + * Do the work. */ public void run() { try { lock.acquire(); - logger.debug((++runningThreads)+" running threads"); + } catch (InterruptedException e) { + error = e; + busy = false; + return; + } + logger.debug((++runningThreads) + " running threads"); try { work(); } catch (Exception e) { error = e; logger.error(e); } - synchronized (this) { - busy = false; - this.notify(); - } + busy = false; runningThreads--; lock.release(); - } catch (InterruptedException e1) { - // TODO Auto-generated catch block - e1.printStackTrace(); - } + } + + + /** Returns the name of this thread. + * + * @return + */ + public String getName() { + return Thread.currentThread().getName(); } /** @@ -89,19 +93,34 @@ return busy; } - /** returns if an error occurred. + /** + * returns if an error occurred. * * @return */ public boolean hasError() { return (error != null); } - + /** * @return Returns the error. */ public Exception getError() { return error; } - + + /** + * @return Returns the lock. + */ + public static Semaphore getLock() { + return lock; + } + + /** + * @param lock + * The lock to set. + */ + public static void setLock(Semaphore lock) { + DigilibWorker.lock = lock; + } } diff -r 5d0c0da080ec -r 1cec876f2788 servlet/src/digilib/servlet/Initialiser.java --- a/servlet/src/digilib/servlet/Initialiser.java Thu Oct 21 20:53:37 2004 +0200 +++ b/servlet/src/digilib/servlet/Initialiser.java Thu Oct 21 22:00:55 2004 +0200 @@ -30,6 +30,8 @@ import org.apache.log4j.Logger; import org.apache.log4j.xml.DOMConfigurator; +import EDU.oswego.cs.dl.util.concurrent.FIFOSemaphore; +import EDU.oswego.cs.dl.util.concurrent.Semaphore; import digilib.auth.AuthOps; import digilib.auth.XMLAuthOps; import digilib.io.AliasingDocuDirCache; @@ -47,7 +49,7 @@ private static final long serialVersionUID = -5126621114382549343L; /** servlet version */ - public static final String iniVersion = "0.1a1"; + public static final String iniVersion = "0.1b1"; /** gengeral logger for this class */ private static Logger logger = Logger.getLogger("digilib.init"); @@ -64,10 +66,6 @@ /** use authorization database */ boolean useAuthentication = false; - private DigilibManager fastQueue; - - private DigilibManager slowQueue; - /** * Initialisation on first run. * @@ -135,15 +133,10 @@ .getAsString("docuimage-class")); dlConfig.setDocuImageClass(cl); dlConfig.setValue("servlet.docuimage.class", cl.getName()); - // DigilibManager work queue - int fl = dlConfig.getAsInt("worker-fast-lanes"); - int fq = dlConfig.getAsInt("worker-fast-queue"); - fastQueue = new DigilibManager(fl, fq); - dlConfig.setValue("servlet.fast.queue", fastQueue); - int sl = dlConfig.getAsInt("worker-slow-lanes"); - int sq = dlConfig.getAsInt("worker-slow-queue"); - slowQueue = new DigilibManager(sl, sq); - dlConfig.setValue("servlet.slow.queue", slowQueue); + // worker threads + int nt = dlConfig.getAsInt("worker-threads"); + Semaphore lck = new FIFOSemaphore(nt); + DigilibWorker.setLock(lck); // set as the servlets main config context.setAttribute("digilib.servlet.configuration", dlConfig); @@ -162,11 +155,6 @@ authOp = (AuthOps) dlConfig.getValue("servlet.auth.op"); // DocuDirCache instance dirCache = (DocuDirCache) dlConfig.getValue("servlet.dir.cache"); - // work queues - fastQueue = (DigilibManager) dlConfig - .getValue("servlet.fast.queue"); - slowQueue = (DigilibManager) dlConfig - .getValue("servlet.slow.queue"); } } diff -r 5d0c0da080ec -r 1cec876f2788 servlet/src/digilib/servlet/Scaler.java --- a/servlet/src/digilib/servlet/Scaler.java Thu Oct 21 20:53:37 2004 +0200 +++ b/servlet/src/digilib/servlet/Scaler.java Thu Oct 21 22:00:55 2004 +0200 @@ -59,7 +59,7 @@ private static final long serialVersionUID = -325080527268912852L; /** digilib servlet version (for all components) */ - public static final String dlVersion = "2.0a6"; + public static final String dlVersion = "2.0b1"; /** logger for accounting requests */ private static Logger accountlog = Logger.getLogger("account.request"); @@ -103,12 +103,6 @@ /** DigilibConfiguration instance */ DigilibConfiguration dlConfig; - /** fast worker queue */ - DigilibManager fastQueue; - - /** slow image worker queue */ - DigilibManager slowQueue; - /** use authorization database */ boolean useAuthorization = true; @@ -147,9 +141,6 @@ // set our AuthOps useAuthorization = dlConfig.getAsBoolean("use-authorization"); authOp = (AuthOps) dlConfig.getValue("servlet.auth.op"); - // work queues - fastQueue = (DigilibManager) dlConfig.getValue("servlet.fast.queue"); - slowQueue = (DigilibManager) dlConfig.getValue("servlet.slow.queue"); // DocuDirCache instance dirCache = (DocuDirCache) dlConfig.getValue("servlet.dir.cache"); @@ -189,7 +180,7 @@ } /** main request handler. */ -void processRequest(HttpServletRequest request, HttpServletResponse response) + void processRequest(HttpServletRequest request, HttpServletResponse response) throws ServletException { if (dlConfig == null) { @@ -401,7 +392,7 @@ fileToLoad = fileset.getBiggest(); } } - logger.info("Loading: " + fileToLoad.getFile()); + logger.info("Planning to load: " + fileToLoad.getFile()); /* * send the image if its mo=(raw)file @@ -414,8 +405,7 @@ mt = "application/octet-stream"; } logger.debug("Sending RAW File as is."); - ServletOps.sendFile(fileToLoad.getFile(), mt, response, - fastQueue); + ServletOps.sendFile(fileToLoad.getFile(), mt, response); logger.info("Done in " + (System.currentTimeMillis() - startTime) + "ms"); return; @@ -472,8 +462,7 @@ logger.debug("Sending File as is."); - ServletOps.sendFile(fileToLoad.getFile(), null, response, - fastQueue); + ServletOps.sendFile(fileToLoad.getFile(), null, response); logger.info("Done in " + (System.currentTimeMillis() - startTime) + "ms"); @@ -581,8 +570,10 @@ outerUserImgArea = outerUserImgArea.createIntersection(imgBounds); // check image parameters sanity - if ((outerUserImgArea.getWidth() < 1) || (outerUserImgArea.getHeight() < 1) - || (scaleXY * outerUserImgArea.getWidth() < 2) || (scaleXY * outerUserImgArea.getHeight() < 2)) { + if ((outerUserImgArea.getWidth() < 1) + || (outerUserImgArea.getHeight() < 1) + || (scaleXY * outerUserImgArea.getWidth() < 2) + || (scaleXY * outerUserImgArea.getHeight() < 2)) { logger.error("ERROR: invalid scale parameter set!"); throw new ImageOpException("Invalid scale parameter set!"); } @@ -593,34 +584,14 @@ DigilibWorker job = new DigilibImageWorker(dlConfig, response, mimeType, scaleQual, dlRequest, paramROT, paramCONT, - paramBRGT, paramRGBM, paramRGBA, fileToLoad, scaleXY, outerUserImgArea, - innerUserImgArea, minSubsample, wholeRotArea); - - try { - // we're cheating - job.run(); - } catch (Exception e1) { - throw new ImageOpException(e1.toString()); + paramBRGT, paramRGBM, paramRGBA, fileToLoad, scaleXY, + outerUserImgArea, innerUserImgArea, minSubsample, + wholeRotArea); + + job.run(); + if (job.hasError()) { + throw new ImageOpException(job.getError().toString()); } - - /* - try { - slowQueue.execute(job); - logger.debug("servlet job submitted by " - + Thread.currentThread().getName() + " (" - + slowQueue.getQueueSize() + " in queue)"); - - synchronized (job) { - while (job.isBusy()) { - Thread.yield(); - job.wait(); - } - } - } catch (InterruptedException e1) { - throw new ImageOpException("INTERRUPTED: " + e1.getMessage()); - } - */ - logger.debug("servlet done in " + (System.currentTimeMillis() - startTime)); @@ -647,6 +618,7 @@ "ERROR: Other Image Operation Error: " + e, response); } } + /** * Sends an error to the client as text or image. * @@ -673,7 +645,7 @@ if (asHTML && (img != null)) { ServletOps.htmlMessage(msg, response); } else { - ServletOps.sendFile(img, null, response, fastQueue); + ServletOps.sendFile(img, null, response); } } catch (IOException e) { logger.error("Error sending error!", e); diff -r 5d0c0da080ec -r 1cec876f2788 servlet/src/digilib/servlet/ServletOps.java --- a/servlet/src/digilib/servlet/ServletOps.java Thu Oct 21 20:53:37 2004 +0200 +++ b/servlet/src/digilib/servlet/ServletOps.java Thu Oct 21 22:00:55 2004 +0200 @@ -33,7 +33,6 @@ import org.apache.log4j.Logger; -import EDU.oswego.cs.dl.util.concurrent.Executor; import digilib.io.FileOpException; import digilib.io.FileOps; @@ -141,7 +140,7 @@ * @throws FileOpException * Exception is thrown for a IOException. */ - public static void sendFileImmediately(File f, String mt, + public static void sendFile(File f, String mt, HttpServletResponse response) throws FileOpException { logger.debug("sendRawFile(" + mt + ", " + f + ")"); if (mt == null) { @@ -173,45 +172,4 @@ } } - /** - * Transfers an image file as-is with the mime type mt using a work queue. - * - * The local file is copied to the OutputStream of the - * ServletResponse. If mt is null then the mime-type is - * auto-detected with mimeForFile. - * - * @param mt - * mime-type of the file. - * @param f - * Image file to be sent. - * @param res - * ServletResponse where the image file will be sent. - * @throws FileOpException - * Exception is thrown for a IOException. - */ - public static void sendFile(File f, String mimetype, - HttpServletResponse response, Executor workQueue) - throws FileOpException { - // we're cheating - sendFileImmediately(f, mimetype, response); - /* - // create worker - DigilibSender job = new DigilibSender(f, null, response); - try { - logger.debug("queue size: " - + ((DigilibManager) workQueue).getQueueSize()); - workQueue.execute(job); - logger.debug("job sent!"); - synchronized (job) { - while (job.isBusy()) { - job.wait(); - } - } - } catch (InterruptedException e) { - throw new FileOpException("INTERRUPTED: Unable to send file. " + e); - } - */ - - } - } \ No newline at end of file diff -r 5d0c0da080ec -r 1cec876f2788 servlet/src/digilib/servlet/Texter.java --- a/servlet/src/digilib/servlet/Texter.java Thu Oct 21 20:53:37 2004 +0200 +++ b/servlet/src/digilib/servlet/Texter.java Thu Oct 21 22:00:55 2004 +0200 @@ -149,11 +149,11 @@ */ TextFile f = getTextFile(dlRequest, "/txt"); if (f != null) { - ServletOps.sendFileImmediately(f.getFile(), null, response); + ServletOps.sendFile(f.getFile(), null, response); } else { f = getTextFile(dlRequest, ""); if (f != null) { - ServletOps.sendFileImmediately(f.getFile(), null, response); + ServletOps.sendFile(f.getFile(), null, response); } else { ServletOps.htmlMessage("No Text-File!", response); }