From 3c09b063932bf8aa2699a7d0cce6f70f42b25f8c Mon Sep 17 00:00:00 2001 From: Stefano Mazzocchi Date: Fri, 25 Jun 2010 07:03:41 +0000 Subject: [PATCH] more work on the broker git-svn-id: http://google-refine.googlecode.com/svn/trunk@1036 7d457c2a-affb-35e4-300a-418c747d4874 --- broker/core/WEB-INF/web.xml | 5 +-- .../gridworks/broker/GridworksBroker.java | 21 +++++++--- .../gridworks/broker/GridworksBrokerImpl.java | 38 +++++++++++++------ build.xml | 18 ++------- gridworks | 5 ++- .../src/com/metaweb/gridworks/Gridworks.java | 18 +++++++-- 6 files changed, 65 insertions(+), 40 deletions(-) diff --git a/broker/core/WEB-INF/web.xml b/broker/core/WEB-INF/web.xml index 63b0c075a..133a9f960 100644 --- a/broker/core/WEB-INF/web.xml +++ b/broker/core/WEB-INF/web.xml @@ -7,13 +7,12 @@ - Butterfly + gridworks-broker edu.mit.simile.butterfly.Butterfly - 1 - Butterfly + gridworks-broker /* diff --git a/broker/core/src/com/metaweb/gridworks/broker/GridworksBroker.java b/broker/core/src/com/metaweb/gridworks/broker/GridworksBroker.java index 9629dadce..de358cc4b 100644 --- a/broker/core/src/com/metaweb/gridworks/broker/GridworksBroker.java +++ b/broker/core/src/com/metaweb/gridworks/broker/GridworksBroker.java @@ -67,12 +67,16 @@ public abstract class GridworksBroker extends ButterflyModuleImpl { protected HttpClient httpclient; + protected boolean developmentMode; + @Override public void init(ServletConfig config) throws Exception { super.init(config); httpclient = getHttpClient(); + developmentMode = Boolean.parseBoolean(config.getInitParameter("gridworks.development")); + if (developmentMode) logger.warn("Running in development mode"); } - + @Override public void destroy() throws Exception { httpclient.getConnectionManager().shutdown(); @@ -91,14 +95,14 @@ public abstract class GridworksBroker extends ButterflyModuleImpl { try { String uid = getUserId(request); - logger.debug("uid: {}", path); + logger.debug("uid: {}", uid); String pid = getParameter(request, "pid"); - logger.debug("pid: {}", path); + logger.debug("pid: {}", pid); // NOTE: conditionals should be ordered by call frequency estimate to (slightly) improve performance // we could be using a hashtable and some classes that implement the commands, but the complexity overhead // doesn't seem to justify the marginal benefit. - + if ("get_lock".equals(path)) { getLock(response, pid); } else if ("expire_locks".equals(path)) { @@ -159,6 +163,11 @@ public abstract class GridworksBroker extends ButterflyModuleImpl { @SuppressWarnings("unchecked") protected String getUserId(HttpServletRequest request) throws Exception { + // This is useful for testing + if (developmentMode) { + return getParameter(request, "uid"); + } + String oauth = request.getHeader(DELEGATED_OAUTH_HEADER); if (oauth == null) { throw new RuntimeException("The request needs to contain the '" + DELEGATED_OAUTH_HEADER + "' header set to obtain user identity via Freebase."); @@ -188,7 +197,7 @@ public abstract class GridworksBroker extends ButterflyModuleImpl { static protected String getParameter(HttpServletRequest request, String name) throws ServletException { String param = request.getParameter(name); if (param == null) { - throw new ServletException("request must come with a '" + name + "' parameter"); + throw new RuntimeException("request must come with a '" + name + "' parameter"); } return param; } @@ -206,7 +215,7 @@ public abstract class GridworksBroker extends ButterflyModuleImpl { static protected int getInteger(HttpServletRequest request, String name) throws ServletException, JSONException { return Integer.parseInt(getParameter(request, name)); } - + static protected void respondError(HttpServletResponse response, String error) throws IOException, ServletException { if (response == null) { diff --git a/broker/core/src/com/metaweb/gridworks/broker/GridworksBrokerImpl.java b/broker/core/src/com/metaweb/gridworks/broker/GridworksBrokerImpl.java index a4fedc155..11b6fd827 100644 --- a/broker/core/src/com/metaweb/gridworks/broker/GridworksBrokerImpl.java +++ b/broker/core/src/com/metaweb/gridworks/broker/GridworksBrokerImpl.java @@ -21,6 +21,7 @@ import org.slf4j.LoggerFactory; import com.sleepycat.je.Environment; import com.sleepycat.je.EnvironmentConfig; import com.sleepycat.je.Transaction; +import com.sleepycat.persist.EntityCursor; import com.sleepycat.persist.EntityStore; import com.sleepycat.persist.PrimaryIndex; import com.sleepycat.persist.StoreConfig; @@ -40,7 +41,7 @@ public class GridworksBrokerImpl extends GridworksBroker { Timer timer; LockExpirer expirer; - + @Override public void init(ServletConfig config) throws Exception { super.init(config); @@ -49,9 +50,11 @@ public class GridworksBrokerImpl extends GridworksBroker { expirer = new LockExpirer(); timer.schedule(expirer, LOCK_EXPIRATION_CHECK_DELAY, LOCK_EXPIRATION_CHECK_DELAY); - File dataPath = new File("data"); // FIXME: data should be configurable; + String dataDir = config.getInitParameter("gridworks.data"); + if (dataDir == null) dataDir = "data"; + File dataPath = new File(dataDir); if (!dataPath.exists()) dataPath.mkdirs(); - + EnvironmentConfig envConfig = new EnvironmentConfig(); envConfig.setAllowCreate(true); envConfig.setTransactional(true); @@ -73,30 +76,43 @@ public class GridworksBrokerImpl extends GridworksBroker { if (projectStore != null) { projectStore.close(); + projectById = null; } if (lockStore != null) { lockStore.close(); + lockByProject = null; } + if (timer != null) { + timer.cancel(); + timer.purge(); + timer = null; + } + if (env != null) { - env.cleanLog(); env.close(); + env = null; } } class LockExpirer extends TimerTask { public void run() { if (lockByProject != null) { - for (Lock lock : lockByProject.entities()) { - if (lock.timestamp + LOCK_DURATION < System.currentTimeMillis()) { - try { - releaseLock(null, lock.pid, lock.uid, lock.id); - } catch (Exception e) { - logger.error("Exception while expiring lock for project '" + lock.pid + "'", e); + EntityCursor cursor = lockByProject.entities(); + try { + for (Lock lock = cursor.first(); lock != null; lock = cursor.next()) { + if (lock.timestamp + LOCK_DURATION < System.currentTimeMillis()) { + try { + releaseLock(null, lock.pid, lock.uid, lock.id); + } catch (Exception e) { + logger.error("Exception while expiring lock for project '" + lock.pid + "'", e); + } } } - } + } finally { + cursor.close(); + } } } } diff --git a/build.xml b/build.xml index 84b09a5d1..8a9041558 100644 --- a/build.xml +++ b/build.xml @@ -118,11 +118,6 @@ - - - - - @@ -178,14 +173,6 @@ - - - - - - - - @@ -194,7 +181,7 @@ - + @@ -451,7 +438,7 @@ - + @@ -537,6 +524,7 @@ + diff --git a/gridworks b/gridworks index 94ee79352..923d8dc8c 100755 --- a/gridworks +++ b/gridworks @@ -585,7 +585,7 @@ run() { fi if [ -d $GRIDWORKS_CLASSES_DIR ]; then - add_option "-Dgridworks.autoreloading=true" + add_option "-Dgridworks.autoreload=true -Dbutterfly.autoreload=true" fi if $DARWIN ; then @@ -650,7 +650,8 @@ broker_run() { fi if [ -d $GRIDWORKS_CLASSES_DIR ]; then - add_option "-Dgridworks.autoreloading=true" + add_option "-Dgridworks.autoreload=true -Dbutterfly.autoreload=true" + add_option "-Dgridworks.development=true" fi add_option "-Dgridworks.webapp=broker/core" diff --git a/server/src/com/metaweb/gridworks/Gridworks.java b/server/src/com/metaweb/gridworks/Gridworks.java index f02d05153..09de902e0 100644 --- a/server/src/com/metaweb/gridworks/Gridworks.java +++ b/server/src/com/metaweb/gridworks/Gridworks.java @@ -156,7 +156,7 @@ class GridworksServer extends Server { this.setSendServerVersion(true); // Enable context autoreloading - if (Configurations.getBoolean("gridworks.autoreloading",false)) { + if (Configurations.getBoolean("gridworks.autoreload",false)) { scanForUpdates(webapp, context); } @@ -191,6 +191,7 @@ class GridworksServer extends Server { scanList.add(new File(contextRoot, "WEB-INF/web.xml")); findFiles(".class", new File(contextRoot, "WEB-INF/classes"), scanList); + findFiles(".jar", new File(contextRoot, "WEB-INF/lib"), scanList); logger.info("Starting autoreloading scanner... "); @@ -237,8 +238,19 @@ class GridworksServer extends Server { // parameters if we set them in the webapp context upon reading the web.xml file static private void configure(WebAppContext context) throws Exception { ServletHolder servlet = context.getServletHandler().getServlet("gridworks"); - servlet.setInitParameter("gridworks.data", getDataDir()); - servlet.doStart(); + if (servlet != null) { + servlet.setInitParameter("gridworks.data", getDataDir()); + servlet.setInitOrder(1); + servlet.doStart(); + } + + servlet = context.getServletHandler().getServlet("gridworks-broker"); + if (servlet != null) { + servlet.setInitParameter("gridworks.data", getDataDir() + "/broker"); + servlet.setInitParameter("gridworks.development", Configurations.get("gridworks.development","false")); + servlet.setInitOrder(1); + servlet.doStart(); + } } static private String getDataDir() {