Changeset 5749


Ignore:
Timestamp:
Nov 22, 2019, 11:02:50 AM (2 years ago)
Author:
Nicklas Nordborg
Message:

Fixes #1203: Resolve thread deadlocks

This should hopefully fix the deadlock problem.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • extensions/net.sf.basedb.reggie/branches/4.24-stable/src/net/sf/basedb/reggie/Reggie.java

    r5741 r5749  
    463463  }
    464464 
     465  private static Object configLock = new Object();
    465466  private static volatile XmlConfig rootConfig;
    466467  private static volatile Map<String, XmlConfig> openGridConfig;
     
    489490    Force reload the Reggie configuration.
    490491  */
    491   public static synchronized XmlConfig reloadConfig()
    492   {
    493     loadConfig(true);
    494     ActivityLog.getInstance().reloadConfig();
    495     CounterService.getInstance().reloadConfig();
     492  public static XmlConfig reloadConfig()
     493  {
     494    synchronized (configLock)
     495    {
     496      loadConfig(true);
     497      ActivityLog.getInstance().reloadConfig();
     498      CounterService.getInstance().reloadConfig();
     499    }
    496500    return rootConfig;
    497501  }
    498502 
    499   public static synchronized void unloadConfig()
    500   {
    501     rootConfig = null;
    502     openGridConfig = null;
    503     if (reloadConfig != null)
    504     {
    505       Application.getExtensionsManager().getRegistry().unregisterEventHandler(reloadConfig);
    506       reloadConfig = null;
     503  public static void unloadConfig()
     504  {
     505    synchronized (configLock)
     506    {
     507      rootConfig = null;
     508      openGridConfig = null;
     509      if (reloadConfig != null)
     510      {
     511        Application.getExtensionsManager().getRegistry().unregisterEventHandler(reloadConfig);
     512        reloadConfig = null;
     513      }
    507514    }
    508515  }
     
    527534
    528535 
     536  private static Object sessionLock = new Object();
    529537  private static SessionControl rootSc;
    530538  /**
     
    540548    @since 3.0
    541549  */
    542   public static synchronized SessionControl getRootSessionControl(SessionControl systemSc)
    543   {
    544     if (rootSc == null || rootSc.isClosed())
    545     {
    546       SessionControl tmp = systemSc.impersonateLogin(SystemItems.getId(User.ROOT), "Reggie services");
    547       DbControl dc = tmp.newDbControl();
    548       try
    549       {
    550         ItemQuery<Project> q = Project.getQuery();
    551         q.setIncludes(Include.ALL);
    552         q.restrict(Restrictions.eq(Hql.property("name"), Expressions.string("SCAN-B")));
    553         List<Project> projects = q.list(dc);
    554         if (projects.size() == 1)
     550  public static SessionControl getRootSessionControl(SessionControl systemSc)
     551  {
     552    synchronized (sessionLock)
     553    {
     554      if (rootSc == null || rootSc.isClosed())
     555      {
     556        SessionControl tmp = systemSc.impersonateLogin(SystemItems.getId(User.ROOT), "Reggie services");
     557        DbControl dc = tmp.newDbControl();
     558        try
    555559        {
    556           tmp.setActiveProject(projects.get(0));
     560          ItemQuery<Project> q = Project.getQuery();
     561          q.setIncludes(Include.ALL);
     562          q.restrict(Restrictions.eq(Hql.property("name"), Expressions.string("SCAN-B")));
     563          List<Project> projects = q.list(dc);
     564          if (projects.size() == 1)
     565          {
     566            tmp.setActiveProject(projects.get(0));
     567          }
    557568        }
    558       }
    559       finally
    560       {
    561         if (dc != null) dc.close();
    562       }
    563      
    564       // Set active project
    565       rootSc = tmp;
    566     }
    567     else
    568     {
    569       rootSc.updateLastAccess();
     569        finally
     570        {
     571          if (dc != null) dc.close();
     572        }
     573       
     574        // Set active project
     575        rootSc = tmp;
     576      }
     577      else
     578      {
     579        rootSc.updateLastAccess();
     580      }
    570581    }
    571582    return rootSc;
     
    577588    @since 3.0
    578589  */
    579   public static synchronized void closeRootSessionControl()
    580   {
    581     if (rootSc != null)
    582     {
    583       rootSc.close();
    584       rootSc = null;
    585     }
    586   }
    587  
    588   private static synchronized void loadConfig(boolean force)
     590  public static void closeRootSessionControl()
     591  {
     592    synchronized (sessionLock)
     593    {
     594      if (rootSc != null)
     595      {
     596        rootSc.close();
     597        rootSc = null;
     598      }
     599    }
     600  }
     601 
     602  private static void loadConfig(boolean force)
    589603  {
    590604    URL configUrl = Reggie.class.getResource("/reggie-config.xml");
    591605    if (rootConfig != null && !force) return;
    592     InputStream is = null;
    593     try
    594     {
    595       logger.debug("Loading configuration from; " + configUrl);
    596       is = configUrl == null ? null : configUrl.openStream();
    597       if (is == null)
    598       {
    599         throw new ConfigurationException("Can't find the configuration file. " +
    600             "Make sure 'reggie-config.xml' is in the CLASSPATH.");
    601       }
    602      
    603       Document dom = XmlUtil2.getValidatedXml(configUrl, null);
    604       rootConfig = new XmlConfig(dom.getRootElement(), "[reggie]");
    605       openGridConfig = new HashMap<String, XmlConfig>();
    606      
    607       OpenGridService ogs = OpenGridService.getInstance();
    608       if (!ogs.isRunning()) logger.warn("Open Grid Service is no running");
    609      
    610       Element hosts = dom.getRootElement().getChild("remote-hosts");
    611       List<Element> allHosts = hosts.getChildren("host");
    612       for (Element h : allHosts)
    613       {
    614         String[] idList = h.getAttributeValue("id").split(",");
    615         for (String id : idList)
     606    synchronized (configLock)
     607    {
     608      InputStream is = null;
     609      try
     610      {
     611        logger.debug("Loading configuration from; " + configUrl);
     612        is = configUrl == null ? null : configUrl.openStream();
     613        if (is == null)
    616614        {
    617           if (!ogs.isDefined(id))
     615          throw new ConfigurationException("Can't find the configuration file. " +
     616              "Make sure 'reggie-config.xml' is in the CLASSPATH.");
     617        }
     618       
     619        Document dom = XmlUtil2.getValidatedXml(configUrl, null);
     620        rootConfig = new XmlConfig(dom.getRootElement(), "[reggie]");
     621        openGridConfig = new HashMap<String, XmlConfig>();
     622       
     623        OpenGridService ogs = OpenGridService.getInstance();
     624        if (!ogs.isRunning()) logger.warn("Open Grid Service is no running");
     625       
     626        Element hosts = dom.getRootElement().getChild("remote-hosts");
     627        List<Element> allHosts = hosts.getChildren("host");
     628        for (Element h : allHosts)
     629        {
     630          String[] idList = h.getAttributeValue("id").split(",");
     631          for (String id : idList)
    618632          {
    619             logger.warn("No cluster defined for id=" + id);
     633            if (!ogs.isDefined(id))
     634            {
     635              logger.warn("No cluster defined for id=" + id);
     636            }
     637            openGridConfig.put(id, new XmlConfig(h, "[" + id + "]"));
    620638          }
    621           openGridConfig.put(id, new XmlConfig(h, "[" + id + "]"));
    622639        }
    623       }
    624      
    625       if (reloadConfig == null)
    626       {
    627         // Create and register an event handler that re-load the Reggie configuration
    628         // whenever a SERVICE_STARTED event is sent for the Open Grid Service
    629         Registry registry = Application.getExtensionsManager().getRegistry();
    630         reloadConfig = new ReloadConfigEventHandler();
    631         EventFilter whenOpenGridServiceStarted = new ExtensionEventFilter("net.sf.basedb.opengrid.service", Services.SERVICE_STARTED);
    632         registry.registerEventHandler(reloadConfig, whenOpenGridServiceStarted, Reggie.class.getClassLoader());
    633       }
    634      
    635     }
    636     catch (Exception ex)
    637     {
    638       logger.error("Could not load configuration", ex);
    639       throw new RuntimeException(ex);
    640     }
    641     finally
    642     {
    643       FileUtil.close(is);
     640       
     641        if (reloadConfig == null)
     642        {
     643          // Create and register an event handler that re-load the Reggie configuration
     644          // whenever a SERVICE_STARTED event is sent for the Open Grid Service
     645          Registry registry = Application.getExtensionsManager().getRegistry();
     646          reloadConfig = new ReloadConfigEventHandler();
     647          EventFilter whenOpenGridServiceStarted = new ExtensionEventFilter("net.sf.basedb.opengrid.service", Services.SERVICE_STARTED);
     648          registry.registerEventHandler(reloadConfig, whenOpenGridServiceStarted, Reggie.class.getClassLoader());
     649        }
     650       
     651      }
     652      catch (Exception ex)
     653      {
     654        logger.error("Could not load configuration", ex);
     655        throw new RuntimeException(ex);
     656      }
     657      finally
     658      {
     659        FileUtil.close(is);
     660      }
    644661    }
    645662  }
Note: See TracChangeset for help on using the changeset viewer.