Changeset 3eb035


Ignore:
Timestamp:
Jul 2, 2012, 7:54:13 AM (13 years ago)
Author:
Frederik Heber <heber@…>
Branches:
Action_Thermostats, Add_AtomRandomPerturbation, Add_FitFragmentPartialChargesAction, Add_RotateAroundBondAction, Add_SelectAtomByNameAction, Added_ParseSaveFragmentResults, AddingActions_SaveParseParticleParameters, Adding_Graph_to_ChangeBondActions, Adding_MD_integration_tests, Adding_ParticleName_to_Atom, Adding_StructOpt_integration_tests, AtomFragments, Automaking_mpqc_open, AutomationFragmentation_failures, Candidate_v1.5.4, Candidate_v1.6.0, Candidate_v1.6.1, ChangeBugEmailaddress, ChangingTestPorts, ChemicalSpaceEvaluator, CombiningParticlePotentialParsing, Combining_Subpackages, Debian_Package_split, Debian_package_split_molecuildergui_only, Disabling_MemDebug, Docu_Python_wait, EmpiricalPotential_contain_HomologyGraph, EmpiricalPotential_contain_HomologyGraph_documentation, Enable_parallel_make_install, Enhance_userguide, Enhanced_StructuralOptimization, Enhanced_StructuralOptimization_continued, Example_ManyWaysToTranslateAtom, Exclude_Hydrogens_annealWithBondGraph, FitPartialCharges_GlobalError, Fix_BoundInBox_CenterInBox_MoleculeActions, Fix_ChargeSampling_PBC, Fix_ChronosMutex, Fix_FitPartialCharges, Fix_FitPotential_needs_atomicnumbers, Fix_ForceAnnealing, Fix_IndependentFragmentGrids, Fix_ParseParticles, Fix_ParseParticles_split_forward_backward_Actions, Fix_PopActions, Fix_QtFragmentList_sorted_selection, Fix_Restrictedkeyset_FragmentMolecule, Fix_StatusMsg, Fix_StepWorldTime_single_argument, Fix_Verbose_Codepatterns, Fix_fitting_potentials, Fixes, ForceAnnealing_goodresults, ForceAnnealing_oldresults, ForceAnnealing_tocheck, ForceAnnealing_with_BondGraph, ForceAnnealing_with_BondGraph_continued, ForceAnnealing_with_BondGraph_continued_betteresults, ForceAnnealing_with_BondGraph_contraction-expansion, FragmentAction_writes_AtomFragments, FragmentMolecule_checks_bonddegrees, GeometryObjects, Gui_Fixes, Gui_displays_atomic_force_velocity, ImplicitCharges, IndependentFragmentGrids, IndependentFragmentGrids_IndividualZeroInstances, IndependentFragmentGrids_IntegrationTest, IndependentFragmentGrids_Sole_NN_Calculation, JobMarket_RobustOnKillsSegFaults, JobMarket_StableWorkerPool, JobMarket_unresolvable_hostname_fix, MoreRobust_FragmentAutomation, ODR_violation_mpqc_open, PartialCharges_OrthogonalSummation, PdbParser_setsAtomName, PythonUI_with_named_parameters, QtGui_reactivate_TimeChanged_changes, Recreated_GuiChecks, Rewrite_FitPartialCharges, RotateToPrincipalAxisSystem_UndoRedo, SaturateAtoms_findBestMatching, SaturateAtoms_singleDegree, StoppableMakroAction, Subpackage_CodePatterns, Subpackage_JobMarket, Subpackage_LinearAlgebra, Subpackage_levmar, Subpackage_mpqc_open, Subpackage_vmg, Switchable_LogView, ThirdParty_MPQC_rebuilt_buildsystem, TrajectoryDependenant_MaxOrder, TremoloParser_IncreasedPrecision, TremoloParser_MultipleTimesteps, TremoloParser_setsAtomName, Ubuntu_1604_changes, stable
Children:
86a1e8
Parents:
d76161
git-author:
Frederik Heber <heber@…> (04/24/12 10:38:54)
git-committer:
Frederik Heber <heber@…> (07/02/12 07:54:13)
Message:

FIX: Removed channel WorkerRemoved in WorkerPool as it may cause cyclic updates in FragmentScheduler.

  • If jobs are already present in the queue and an idle worker arrices, then marking a worker busy will cause an update inside the callback that is used to send the job to the new idle worker. This will trigger the same notification that is not yet removed to be called in notifyAll(). This causes a cycle in the updates.
Location:
src/Fragmentation/Automation
Files:
4 edited

Legend:

Unmodified
Added
Removed
  • src/Fragmentation/Automation/Pool/WorkerPool.cpp

    rd76161 r3eb035  
    154154  Pool_t::iterator iter = pool.find( address );
    155155  if (iter != pool.end()) {
    156     OBSERVE;
    157     NOTIFY(WorkerRemoved);
    158156    Idle_Queue_t::iterator idleiter = getIdleWorker(address);
    159157    if (idleiter != idle_queue.end())
     
    182180void WorkerPool::removeAllWorkers()
    183181{
    184   OBSERVE;
    185   NOTIFY(WorkerRemoved);
    186182  // empty pool and queue
    187183  idle_queue.clear();
  • src/Fragmentation/Automation/Pool/WorkerPool.hpp

    rd76161 r3eb035  
    3939  ~WorkerPool();
    4040
     41  /** Channels for this observable.
     42   *
     43   * \note Be especially cautious of cyclic updates here as the updates are
     44   *       used by \ref FragmentScheduler to send new jobs to idle workers!
     45   *       If e.g. WorkerRemoved is added, then the marking of the one idle
     46   *       worker as now busy inside the callback will cause a cycle in the
     47   *       update, as the notification for WorkerIdle/Added is not yet
     48   *       removed because we are still inside the callback!
     49   */
    4150  enum NotificationType {
    4251    WorkerIdle,
    4352    WorkerAdded,
    44     WorkerRemoved,
    4553    NotificationType_MAX  // denotes the maximum of available notification types
    4654  };
  • src/Fragmentation/Automation/unittests/WorkerPoolUnitTest.cpp

    rd76161 r3eb035  
    5252  pool = new WorkerPool();
    5353  addobserver = new NotificationObserver(pool->getChannel(WorkerPool::WorkerAdded));
    54   removeobserver = new NotificationObserver(pool->getChannel(WorkerPool::WorkerRemoved));
    5554  idleobserver = new NotificationObserver(pool->getChannel(WorkerPool::WorkerIdle));
    5655
    5756  // and sign on
    5857  pool->signOn(addobserver, WorkerPool::WorkerAdded);
    59   pool->signOn(removeobserver, WorkerPool::WorkerRemoved);
    6058  pool->signOn(idleobserver, WorkerPool::WorkerIdle);
    6159}
     
    6462{
    6563  pool->signOff(addobserver, WorkerPool::WorkerAdded);
    66   pool->signOff(removeobserver, WorkerPool::WorkerRemoved);
    6764  pool->signOff(idleobserver, WorkerPool::WorkerIdle);
    6865
    69   delete removeobserver;
    7066  delete addobserver;
    7167  delete idleobserver;
     
    9288  CPPUNIT_ASSERT_EQUAL( address, pool->begin_idle()->second );
    9389  CPPUNIT_ASSERT( addobserver->wasNotified );
    94   CPPUNIT_ASSERT( !removeobserver->wasNotified );
    9590  CPPUNIT_ASSERT( idleobserver->wasNotified );
    9691  addobserver->wasNotified = false;
     
    10196  CPPUNIT_ASSERT( !pool->removeWorker(otheraddress) );
    10297  CPPUNIT_ASSERT( !addobserver->wasNotified );
    103   CPPUNIT_ASSERT( !removeobserver->wasNotified );
    10498  CPPUNIT_ASSERT( !idleobserver->wasNotified );
    10599
     
    114108  CPPUNIT_ASSERT_EQUAL( (size_t)0, pool->pool.size() );
    115109  CPPUNIT_ASSERT( !addobserver->wasNotified );
    116   CPPUNIT_ASSERT( removeobserver->wasNotified );
    117110  CPPUNIT_ASSERT( !idleobserver->wasNotified );
    118   removeobserver->wasNotified = false;
    119111}
    120112
     
    133125  CPPUNIT_ASSERT_EQUAL( (size_t)1, pool->pool.size() );
    134126  CPPUNIT_ASSERT( addobserver->wasNotified );
    135   CPPUNIT_ASSERT( !removeobserver->wasNotified );
    136127  CPPUNIT_ASSERT( idleobserver->wasNotified );
    137128  addobserver->wasNotified = false;
     
    163154  CPPUNIT_ASSERT_EQUAL( (size_t)1, pool->busy_queue.size() );
    164155  CPPUNIT_ASSERT( !addobserver->wasNotified );
    165   CPPUNIT_ASSERT( !removeobserver->wasNotified );
    166156  CPPUNIT_ASSERT( !idleobserver->wasNotified );
    167157
     
    172162  CPPUNIT_ASSERT_EQUAL( (size_t)0, pool->busy_queue.size() );
    173163  CPPUNIT_ASSERT( !addobserver->wasNotified );
    174   CPPUNIT_ASSERT( !removeobserver->wasNotified );
    175164  CPPUNIT_ASSERT( idleobserver->wasNotified );
    176165}
  • src/Fragmentation/Automation/unittests/WorkerPoolUnitTest.hpp

    rd76161 r3eb035  
    3838      WorkerPool *pool;
    3939      NotificationObserver *addobserver;
    40       NotificationObserver *removeobserver;
    4140      NotificationObserver *idleobserver;
    4241};
Note: See TracChangeset for help on using the changeset viewer.