summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorwolff1 <wolff1@ae88bc3d-4319-0410-8dbf-d08b4c9d3795>2009-04-29 19:10:53 +0000
committerwolff1 <wolff1@ae88bc3d-4319-0410-8dbf-d08b4c9d3795>2009-04-29 19:10:53 +0000
commitfc36e7f9746436721ce9820e817ca3e52776370f (patch)
tree1dc9cdf92b2f6fe379984814a366308296dd578d
parent86b033296fa5f6ee0432186fb5457eec588112a6 (diff)
downloadATCD-fc36e7f9746436721ce9820e817ca3e52776370f.tar.gz
added forward ranking algorithm
-rwxr-xr-xTAO/orbsvcs/examples/FaultTolerance/FLARe/DeCoRAM/experiments/packing/generate.sh8
-rwxr-xr-xTAO/orbsvcs/examples/FaultTolerance/FLARe/DeCoRAM/experiments/packing/processor_util.sh4
-rw-r--r--TAO/orbsvcs/examples/FaultTolerance/FLARe/DeCoRAM/src/Algorithms.cpp1
-rw-r--r--TAO/orbsvcs/examples/FaultTolerance/FLARe/DeCoRAM/src/CTT_Enhanced.cpp9
-rw-r--r--TAO/orbsvcs/examples/FaultTolerance/FLARe/DeCoRAM/src/DeCoRAM.mpc58
-rw-r--r--TAO/orbsvcs/examples/FaultTolerance/FLARe/DeCoRAM/src/FTRMFF_Forward_Packing.cpp35
-rw-r--r--TAO/orbsvcs/examples/FaultTolerance/FLARe/DeCoRAM/src/FTRMFF_Forward_Packing.h12
-rw-r--r--TAO/orbsvcs/examples/FaultTolerance/FLARe/DeCoRAM/src/Forward_Ranking_Scheduler.cpp380
-rw-r--r--TAO/orbsvcs/examples/FaultTolerance/FLARe/DeCoRAM/src/Forward_Ranking_Scheduler.h61
-rw-r--r--TAO/orbsvcs/examples/FaultTolerance/FLARe/DeCoRAM/src/Scheduler.cpp18
-rw-r--r--TAO/orbsvcs/examples/FaultTolerance/FLARe/DeCoRAM/src/Scheduler.h34
-rw-r--r--TAO/orbsvcs/examples/FaultTolerance/FLARe/DeCoRAM/src/primary_ftrmff.cpp80
12 files changed, 666 insertions, 34 deletions
diff --git a/TAO/orbsvcs/examples/FaultTolerance/FLARe/DeCoRAM/experiments/packing/generate.sh b/TAO/orbsvcs/examples/FaultTolerance/FLARe/DeCoRAM/experiments/packing/generate.sh
index 0e6a48cd60d..9a98572a32b 100755
--- a/TAO/orbsvcs/examples/FaultTolerance/FLARe/DeCoRAM/experiments/packing/generate.sh
+++ b/TAO/orbsvcs/examples/FaultTolerance/FLARe/DeCoRAM/experiments/packing/generate.sh
@@ -3,10 +3,8 @@ DECORAM_BIN=../../bin
DATA_DIR=$1
#experiment parameters
-PROCESSOR_NO=10
-TASK_NUMBER=160
INTERVAL_NUMBER=1
-MAXIMUM_LOAD=0.20
+MAXIMUM_LOAD=0.25
PERIOD_UPPER=1000.0
PERIOD_LOWER=1.0
SS_UPPER=0.01
@@ -15,7 +13,7 @@ SS_LOWER=0.005
if [ ! -d ./$DATA_DIR ]; then mkdir ./$DATA_DIR; fi
for TASK_NO in 10 20 40 80 160; do \
- echo "run tgen for $TASK_NUMBER tasks..." && \
+ echo "run tgen for $TASK_NO tasks..." && \
$DECORAM_BIN/tgen \
-n $TASK_NO \
-i $INTERVAL_NUMBER \
@@ -25,7 +23,7 @@ for TASK_NO in 10 20 40 80 160; do \
-s $SS_UPPER \
-z $SS_LOWER > ./$DATA_DIR/$TASK_NO-tasks.input && \
for BACKUP_NO in 1 2 3 4 5; do \
- for ALGORITHM in bftrmff pkftrmff fpftrmff; do \
+ for ALGORITHM in pftrmff aftrmff frftrmff; do \
echo "run $ALGORITHM for $BACKUP_NO backups..." && \
$DECORAM_BIN/$ALGORITHM \
./$DATA_DIR/$TASK_NO-tasks.input \
diff --git a/TAO/orbsvcs/examples/FaultTolerance/FLARe/DeCoRAM/experiments/packing/processor_util.sh b/TAO/orbsvcs/examples/FaultTolerance/FLARe/DeCoRAM/experiments/packing/processor_util.sh
index 2108a4a2fc9..e3b7eb7edb1 100755
--- a/TAO/orbsvcs/examples/FaultTolerance/FLARe/DeCoRAM/experiments/packing/processor_util.sh
+++ b/TAO/orbsvcs/examples/FaultTolerance/FLARe/DeCoRAM/experiments/packing/processor_util.sh
@@ -1,4 +1,4 @@
-#!/bin/bash
+zf#!/bin/bash
EXPERIMENT_NAME=processor_util
DECORAM_BIN=../../bin
DATA_DIR=$1
@@ -7,7 +7,7 @@ RESULT_DIR=$DATA_DIR/$EXPERIMENT_NAME
if [ ! -d ./$DATA_DIR ]; then echo Directory $DATA_DIR does not exist && exit; fi
if [ ! -d ./$RESULT_DIR ]; then mkdir -p ./$RESULT_DIR; fi
-for ALGORITHM in bftrmff pkftrmff fpftrmff; do \
+for ALGORITHM in pftrmff bftrmff frftrmff; do \
for TASK_NO in 10 20 40 80 160; do \
echo "$TASK_NO tasks:" >> ./$RESULT_DIR/$EXPERIMENT_NAME-$ALGORITHM.dat && \
for BACKUP_NO in 1 2 3 4 5; do \
diff --git a/TAO/orbsvcs/examples/FaultTolerance/FLARe/DeCoRAM/src/Algorithms.cpp b/TAO/orbsvcs/examples/FaultTolerance/FLARe/DeCoRAM/src/Algorithms.cpp
index f70d0febebe..dae94e0ee65 100644
--- a/TAO/orbsvcs/examples/FaultTolerance/FLARe/DeCoRAM/src/Algorithms.cpp
+++ b/TAO/orbsvcs/examples/FaultTolerance/FLARe/DeCoRAM/src/Algorithms.cpp
@@ -178,4 +178,3 @@ PrimaryConversion::operator () (const Task & task)
return t;
}
-
diff --git a/TAO/orbsvcs/examples/FaultTolerance/FLARe/DeCoRAM/src/CTT_Enhanced.cpp b/TAO/orbsvcs/examples/FaultTolerance/FLARe/DeCoRAM/src/CTT_Enhanced.cpp
index eb354bff8bd..41d8212439b 100644
--- a/TAO/orbsvcs/examples/FaultTolerance/FLARe/DeCoRAM/src/CTT_Enhanced.cpp
+++ b/TAO/orbsvcs/examples/FaultTolerance/FLARe/DeCoRAM/src/CTT_Enhanced.cpp
@@ -21,8 +21,6 @@ CTT_Enhanced::~CTT_Enhanced ()
double
CTT_Enhanced::operator () (const TASK_LIST & tasks)
{
- TRACE ("(" << tasks << ")");
-
// copy tasks for local modifications
TASK_LIST scheduled_tasks = tasks;
@@ -34,10 +32,15 @@ CTT_Enhanced::operator () (const TASK_LIST & tasks)
Task t = scheduled_tasks [scheduled_tasks.size () - 1];
scheduled_tasks.pop_back ();
+ double wcrt = this->worst_case_response_time_check (t, scheduled_tasks);
+
+ TRACE ("(" << tasks << ") = " << wcrt);
+
// return the wcrt for this task
- return this->worst_case_response_time_check (t, scheduled_tasks);
+ return wcrt;
}
+ TRACE ("(" << tasks << ") = 0");
return .0;
}
diff --git a/TAO/orbsvcs/examples/FaultTolerance/FLARe/DeCoRAM/src/DeCoRAM.mpc b/TAO/orbsvcs/examples/FaultTolerance/FLARe/DeCoRAM/src/DeCoRAM.mpc
index 66ee46ec688..01e51783f18 100644
--- a/TAO/orbsvcs/examples/FaultTolerance/FLARe/DeCoRAM/src/DeCoRAM.mpc
+++ b/TAO/orbsvcs/examples/FaultTolerance/FLARe/DeCoRAM/src/DeCoRAM.mpc
@@ -1,6 +1,21 @@
-project (basic_ftrmff) {
+project (primary_ftrmff) {
- exename = bftrmff
+ exename = pftrmff
+ exeout = ../bin
+ macros += DO_DEBUG
+
+ Source_Files {
+ Algorithms.cpp
+ Schedule.cpp
+ CTT_Basic.cpp
+ FTRMFF_Primary.cpp
+ primary_ftrmff.cpp
+ }
+}
+
+project (active_ftrmff) {
+
+ exename = aftrmff
exeout = ../bin
macros += DO_DEBUG
@@ -34,11 +49,11 @@ project (statesync_only_ftrmff) {
}
}
-project (enhanced_ftrmff) {
+project (unranked_ftrmff) {
after += statesync_only_ftrmff
- exename = eftrmff
+ exename = uftrmff
exeout = ../bin
macros += DO_DEBUG
@@ -56,7 +71,7 @@ project (enhanced_ftrmff) {
project (ranked_ftrmff) {
- after += enhanced_ftrmff
+ after += unranked_ftrmff
exename = rftrmff
exeout = ../bin
@@ -76,9 +91,9 @@ project (ranked_ftrmff) {
}
}
-project (bestfit_ftrmff) {
+project (worstfit_ranked_ftrmff) {
- exename = ftrmbf
+ exename = rftrmwf
exeout = ../bin
macros += DO_DEBUG
@@ -96,9 +111,9 @@ project (bestfit_ftrmff) {
}
}
-project (binary_ftrmff) {
+project (binary_ranked_ftrmff) {
- exename = bsftrmff
+ exename = bsftrmwf
exeout = ../bin
macros += DO_DEBUG
@@ -120,9 +135,9 @@ project (binary_ftrmff) {
}
}
-project (packing_ftrmff) {
+project (backward_packing_ftrmff) {
- exename = pkftrmff
+ exename = bpftrmff
exeout = ../bin
macros += DO_DEBUG
@@ -153,10 +168,31 @@ project (forward_packing_ftrmff) {
Scheduler.cpp
Packing_Scheduler.cpp
FTRMFF_Forward_Packing.cpp
+ Forward_Ranking_Scheduler.cpp
forward_packing_ftrmff.cpp
}
}
+project (forward_ranking_ftrmff) {
+
+ exename = frftrmff
+ exeout = ../bin
+
+ macros += DO_DEBUGu
+
+ Source_Files {
+ Algorithms.cpp
+ Schedule.cpp
+ CTT_Basic.cpp
+ CTT_Enhanced.cpp
+ Scheduler.cpp
+ Packing_Scheduler.cpp
+ Forward_Ranking_Scheduler.cpp
+ FTRMFF_Forward_Packing.cpp
+ forward_ranking_ftrmff.cpp
+ }
+}
+
project (schedulability_check) : acelib {
exename = scheck
diff --git a/TAO/orbsvcs/examples/FaultTolerance/FLARe/DeCoRAM/src/FTRMFF_Forward_Packing.cpp b/TAO/orbsvcs/examples/FaultTolerance/FLARe/DeCoRAM/src/FTRMFF_Forward_Packing.cpp
index f5558b1d975..4459149188d 100644
--- a/TAO/orbsvcs/examples/FaultTolerance/FLARe/DeCoRAM/src/FTRMFF_Forward_Packing.cpp
+++ b/TAO/orbsvcs/examples/FaultTolerance/FLARe/DeCoRAM/src/FTRMFF_Forward_Packing.cpp
@@ -13,6 +13,14 @@
#include <sstream>
#include "FTRMFF_Forward_Packing.h"
+#include "Forward_Ranking_Scheduler.h"
+#include "Packing_Scheduler.h"
+
+FTRMFF_Forward_Packing::FTRMFF_Forward_Packing (const std::string & algorithm)
+ : algorithm_ (algorithm)
+{
+}
+
FTRMFF_Forward_Packing::~FTRMFF_Forward_Packing ()
{
}
@@ -21,7 +29,8 @@ FTRMFF_Output
FTRMFF_Forward_Packing::operator () (const FTRMFF_Input & input)
{
FTRMFF_Forward_Packing_Algorithm algorithm (input.processors,
- input.backup_count);
+ input.backup_count,
+ algorithm_);
FTRMFF_Output output;
output.schedule = algorithm (input.tasks);
@@ -34,10 +43,20 @@ FTRMFF_Forward_Packing::operator () (const FTRMFF_Input & input)
FTRMFF_Forward_Packing_Algorithm::FTRMFF_Forward_Packing_Algorithm (
const PROCESSOR_LIST & processors,
- unsigned int consistency_level)
- : consistency_level_ (consistency_level),
- scheduler_ (processors, consistency_level)
+ unsigned int consistency_level,
+ const std::string & scheduler)
+ : consistency_level_ (consistency_level)
{
+ if (scheduler == "Forward_Ranking")
+ {
+ scheduler_.reset (new Forward_Ranking_Scheduler (processors,
+ consistency_level_));
+ }
+ else
+ {
+ scheduler_.reset (new Packing_Scheduler (processors,
+ consistency_level_));
+ }
}
FTRMFF_Forward_Packing_Algorithm::~FTRMFF_Forward_Packing_Algorithm ()
@@ -46,7 +65,7 @@ FTRMFF_Forward_Packing_Algorithm::~FTRMFF_Forward_Packing_Algorithm ()
SCHEDULING_MAP
FTRMFF_Forward_Packing_Algorithm::operator () (const TASK_LIST & tasks)
-{
+{
// sort tasks based on their periods, which results in a priority
// ordered list since we do rate monotonic scheduling
TASK_LIST sorted_input = tasks;
@@ -67,7 +86,7 @@ FTRMFF_Forward_Packing_Algorithm::operator () (const TASK_LIST & tasks)
task_it != task_group.end ();
++task_it)
{
- ScheduleResult r = scheduler_ (*task_it);
+ ScheduleResult r = (*scheduler_) (*task_it);
if (r.wcrt <= .0)
{
ScheduleProgress pg = {*task_it,
@@ -80,7 +99,7 @@ FTRMFF_Forward_Packing_Algorithm::operator () (const TASK_LIST & tasks)
}
}
- return transform_schedule (scheduler_.schedule ());
+ return transform_schedule (scheduler_->schedule ());
}
SCHEDULE_PROGRESS_LIST
@@ -92,7 +111,7 @@ FTRMFF_Forward_Packing_Algorithm::get_unschedulable ()
SCHEDULE
FTRMFF_Forward_Packing_Algorithm::schedule () const
{
- return scheduler_.schedule ();
+ return scheduler_->schedule ();
}
TASK_LIST
diff --git a/TAO/orbsvcs/examples/FaultTolerance/FLARe/DeCoRAM/src/FTRMFF_Forward_Packing.h b/TAO/orbsvcs/examples/FaultTolerance/FLARe/DeCoRAM/src/FTRMFF_Forward_Packing.h
index f0844934a94..be8a3c5b4aa 100644
--- a/TAO/orbsvcs/examples/FaultTolerance/FLARe/DeCoRAM/src/FTRMFF_Forward_Packing.h
+++ b/TAO/orbsvcs/examples/FaultTolerance/FLARe/DeCoRAM/src/FTRMFF_Forward_Packing.h
@@ -13,15 +13,18 @@
#ifndef FTRMFF_FORWARD_PACKING_ALGORITHM_H_
#define FTRMFF_FORWARD_PACKING_ALGORITHM_H_
-#include "Schedule.h"
-#include "Packing_Scheduler.h"
+#include "Scheduler.h"
class FTRMFF_Forward_Packing : public FTRMFF_Algorithm
{
public:
+ FTRMFF_Forward_Packing (const std::string & algorithm = "Forward_Packing");
+
virtual ~FTRMFF_Forward_Packing ();
virtual FTRMFF_Output operator () (const FTRMFF_Input & input);
+private:
+ std::string algorithm_;
};
class FTRMFF_Forward_Packing_Algorithm :
@@ -30,7 +33,8 @@ class FTRMFF_Forward_Packing_Algorithm :
{
public:
FTRMFF_Forward_Packing_Algorithm (const PROCESSOR_LIST & processors,
- unsigned int consistency_level);
+ unsigned int consistency_level,
+ const std::string & scheduler);
virtual ~FTRMFF_Forward_Packing_Algorithm ();
@@ -45,7 +49,7 @@ private:
private:
SCHEDULE_PROGRESS_LIST unschedulable_;
unsigned int consistency_level_;
- Packing_Scheduler scheduler_;
+ std::auto_ptr<Scheduler> scheduler_;
};
#endif /* FTRMFF_FORWARD_PACKING_ALGORITHM_H_ */
diff --git a/TAO/orbsvcs/examples/FaultTolerance/FLARe/DeCoRAM/src/Forward_Ranking_Scheduler.cpp b/TAO/orbsvcs/examples/FaultTolerance/FLARe/DeCoRAM/src/Forward_Ranking_Scheduler.cpp
new file mode 100644
index 00000000000..08e46b73165
--- /dev/null
+++ b/TAO/orbsvcs/examples/FaultTolerance/FLARe/DeCoRAM/src/Forward_Ranking_Scheduler.cpp
@@ -0,0 +1,380 @@
+// -*- C++ -*-
+
+//=============================================================================
+/**
+ * @file Foward_Ranking_Scheduler.cpp
+ *
+ * $Id$
+ *
+ * @author Friedhelm Wolf (fwolf@dre.vanderbilt.edu)
+ */
+//=============================================================================
+
+#include <numeric>
+#include "Forward_Ranking_Scheduler.h"
+#include "Combination_T.h"
+
+Forward_Ranking_Scheduler::Forward_Ranking_Scheduler (
+ const PROCESSOR_LIST & processors,
+ unsigned int max_failures)
+ : Scheduler (processors, max_failures)
+{
+}
+
+double
+Forward_Ranking_Scheduler::schedule_task (const Task & task,
+ const Processor & processor)
+{
+ TRACE ("(" << task << "," << processor << ")");
+
+ // check if there is already a replica of this task on the processor
+ if (this->check_for_existing_replicas (task, processor))
+ {
+ TRACE ("already contains replica of \"" << primary_name (task) << "\"");
+ return .0;
+ }
+
+ // add task to local copy of the processor tasks
+ TASK_LIST local_tasks = schedule_[processor];
+ local_tasks.push_back (task);
+
+ TRACE ("Tasks: " << local_tasks);
+
+ // determine processors that need to fail necessarily to become active
+ // this applies only for backups and depends on their rank
+ PROCESSOR_SET fixed_failures = this->replica_processors (task);
+
+ TRACE ("Fixed Failures: " << fixed_failures);
+
+ // find other processors that affect the backups on this processor
+ // if they fail
+ PROCESSOR_SET additional_failures =
+ this->relevant_processors (local_tasks,
+ fixed_failures);
+
+ TRACE ("Additional Failures: " << additional_failures);
+
+ PROCESSOR_SETS failure_scenarios =
+ this->permute_processors (fixed_failures,
+ additional_failures,
+ max_failures_ - fixed_failures.size ());
+
+ TRACE ("Relevant Failure Scenarios: " << failure_scenarios);
+
+ TASK_SCENARIOS activation_scenarios =
+ this->activate_tasks (local_tasks,
+ failure_scenarios);
+
+ TRACE ("Task Scenarios: " << activation_scenarios);
+
+ double wcrt = this->accumulate_wcrt (activation_scenarios);
+
+ TRACE ("Maximum wcrt: " << wcrt);
+
+ return wcrt;
+}
+
+bool
+Forward_Ranking_Scheduler::check_for_existing_replicas (
+ const Task & task,
+ const Processor & processor)
+{
+ TASK_POSITIONS replica_group =
+ replica_groups_[primary_name (task)];
+
+ return std::accumulate (replica_group.begin (),
+ replica_group.end (),
+ false,
+ ProcessorNameComparison (processor));
+}
+
+class ReplicaFinder : public std::unary_function <Task,
+ PROCESSOR_SET>
+{
+public:
+ ReplicaFinder (const REPLICA_GROUPS & rep_groups)
+ : rep_groups_ (rep_groups) {}
+
+ PROCESSOR_SET operator () (const Task & task)
+ {
+ PROCESSOR_SET result;
+
+ REPLICA_GROUPS::const_iterator replicas =
+ rep_groups_.find (primary_name (task));
+
+ if (replicas != rep_groups_.end ())
+ {
+ std::transform (replicas->second.begin (),
+ replicas->second.begin () + task.rank,
+ std::inserter (result,
+ result.begin ()),
+ ProcessorPicker ());
+ }
+
+ return result;
+ }
+
+private:
+ const REPLICA_GROUPS rep_groups_;
+};
+
+PROCESSOR_SET
+Forward_Ranking_Scheduler::replica_processors (const Task & task)
+{
+ ReplicaFinder finder (replica_groups_);
+
+ return finder (task);
+}
+
+class RelevantProcessorAccumulator : std::binary_function <PROCESSOR_SET,
+ Task,
+ PROCESSOR_SET>
+{
+public:
+ RelevantProcessorAccumulator (const REPLICA_GROUPS & rep_groups)
+ : rep_groups_ (rep_groups)
+ {
+ }
+
+ PROCESSOR_SET operator () (const PROCESSOR_SET & previous,
+ const Task & task)
+ {
+ PROCESSOR_SET result = previous;
+
+ std::transform (rep_groups_.find (primary_name (task))->second.begin (),
+ rep_groups_.find (primary_name (task))->second.begin () + task.rank,
+ std::inserter (result,
+ result.begin ()),
+ ProcessorPicker ());
+
+ return result;
+ }
+
+private:
+ const REPLICA_GROUPS & rep_groups_;
+};
+
+PROCESSOR_SET
+Forward_Ranking_Scheduler::relevant_processors (
+ const TASK_LIST & tasks,
+ const PROCESSOR_SET & ignored_processors)
+{
+ PROCESSOR_SET relevant =
+ std::accumulate (tasks.begin (),
+ tasks.end (),
+ PROCESSOR_SET (),
+ RelevantProcessorAccumulator (replica_groups_));
+
+ PROCESSOR_SET result;
+
+ // remove the processors from the result that should not be
+ // permutated here
+ std::set_difference (relevant.begin (),
+ relevant.end (),
+ ignored_processors.begin (),
+ ignored_processors.end (),
+ std::inserter (result,
+ result.begin ()));
+
+ return result;
+}
+
+PROCESSOR_SETS
+Forward_Ranking_Scheduler::permute_processors (
+ const PROCESSOR_SET & fixed,
+ const PROCESSOR_SET & exchangeable,
+ unsigned int failure_number)
+{
+ PROCESSOR_SETS failure_sets;
+ PROCESSOR_LIST combination;
+ unsigned int tupel_size =
+ std::min (failure_number,
+ static_cast <unsigned int> (exchangeable.size ()));
+
+ PROCESSOR_SET::iterator it = exchangeable.begin ();
+ for (unsigned int c_index = 0;
+ c_index < tupel_size;
+ ++c_index, ++it)
+ {
+ combination.push_back (*it);
+ }
+
+ PROCESSOR_LIST failure_elements;
+ std::copy (exchangeable.begin (),
+ exchangeable.end (),
+ std::inserter (failure_elements,
+ failure_elements.begin ()));
+
+ do
+ {
+ PROCESSOR_SET set;
+ // add a permutation of the relevant failures
+ std::copy (combination.begin (),
+ combination.end (),
+ std::inserter (set,
+ set.begin ()));
+
+ // add the fixed aspects
+ std::copy (fixed.begin (),
+ fixed.end (),
+ std::inserter (set,
+ set.begin ()));
+
+ failure_sets.push_back (set);
+ }
+ while (next_combination (failure_elements.begin (),
+ failure_elements.end (),
+ combination.begin (),
+ combination.end ()));
+
+ return failure_sets;
+}
+
+class ActivateFailedTask : public std::unary_function <PROCESSOR_SET,
+ Task>
+{
+public:
+ ActivateFailedTask (const PROCESSOR_SET & failures,
+ const REPLICA_GROUPS & rep_groups)
+ : failures_ (failures),
+ rep_groups_ (rep_groups),
+ find_replicas_ (rep_groups_) {}
+
+ Task operator () (const Task & task)
+ {
+ // check in the replica map if all previous tasks get activated
+ // and switch the task to primary if this is the case
+ PROCESSOR_SET necessary_failures = find_replicas_ (task);
+
+ PROCESSOR_SET difference;
+ std::set_intersection (failures_.begin (),
+ failures_.end (),
+ necessary_failures.begin (),
+ necessary_failures.end (),
+ std::inserter (difference,
+ difference.begin ()));
+
+ // If all necessary processors are failing, make the task primary.
+ // This is the case if all necessary_failures are contained in the
+ // difference set.
+ if (difference.size () == necessary_failures.size ())
+ return convert_ (task);
+
+ return task;
+ }
+
+private:
+ const PROCESSOR_SET & failures_;
+ const REPLICA_GROUPS & rep_groups_;
+ PrimaryConversion convert_;
+ ReplicaFinder find_replicas_;
+};
+
+class ActivateFailedTasks : public std::unary_function <PROCESSOR_SET,
+ TASK_LIST>
+{
+public:
+ ActivateFailedTasks (const TASK_LIST & tasks,
+ const REPLICA_GROUPS & rep_groups)
+ : tasks_ (tasks),
+ rep_groups_ (rep_groups) {}
+
+ TASK_LIST operator () (const PROCESSOR_SET & scenario)
+ {
+ TASK_LIST result;
+
+ // for each backup check whether it is activated
+ std::transform (tasks_.begin (),
+ tasks_.end (),
+ std::inserter (result,
+ result.begin ()),
+ ActivateFailedTask (scenario,
+ rep_groups_));
+
+ return result;
+ }
+
+private:
+ const TASK_LIST & tasks_;
+ const REPLICA_GROUPS & rep_groups_;
+};
+
+TASK_SCENARIOS
+Forward_Ranking_Scheduler::activate_tasks (const TASK_LIST & tasks,
+ const PROCESSOR_SETS & failures)
+{
+ TASK_SCENARIOS result;
+
+ // add an empty one for the primary case
+ result.push_back (tasks);
+
+ // add a case for each failure scenario
+ std::transform (failures.begin (),
+ failures.end (),
+ std::inserter (result,
+ result.begin ()),
+ ActivateFailedTasks (tasks,
+ replica_groups_));
+
+ return result;
+}
+
+class WCRTAccumulator : public std::binary_function <double,
+ TASK_LIST,
+ double>
+{
+public:
+ double operator () (double previous,
+ const TASK_LIST & tasks)
+ {
+ double result = ctt_ (tasks);
+
+ if ((result > .0) && (previous != .0))
+ return std::max(result,
+ previous);
+ else
+ return .0;
+ }
+
+private:
+ CTT_Enhanced ctt_;
+};
+
+double
+Forward_Ranking_Scheduler::accumulate_wcrt (const TASK_SCENARIOS & scenarios)
+{
+ return std::accumulate (scenarios.begin (),
+ scenarios.end (),
+ -1.0,
+ WCRTAccumulator ());
+}
+
+std::ostream & operator<< (std::ostream & ostr,
+ const PROCESSOR_SETS & ps)
+{
+ ostr << "{";
+ for (PROCESSOR_SETS::const_iterator it = ps.begin ();
+ it != ps.end ();
+ ++it)
+ {
+ ostr << *it << "| ";
+ }
+ ostr << "}";
+
+ return ostr;
+}
+
+std::ostream & operator<< (std::ostream & ostr,
+ const TASK_SCENARIOS & ts)
+{
+ ostr << "{";
+ for (TASK_SCENARIOS::const_iterator it = ts.begin ();
+ it != ts.end ();
+ ++it)
+ {
+ ostr << *it << "| ";
+ }
+ ostr << "}";
+
+ return ostr;
+}
diff --git a/TAO/orbsvcs/examples/FaultTolerance/FLARe/DeCoRAM/src/Forward_Ranking_Scheduler.h b/TAO/orbsvcs/examples/FaultTolerance/FLARe/DeCoRAM/src/Forward_Ranking_Scheduler.h
new file mode 100644
index 00000000000..6174361e835
--- /dev/null
+++ b/TAO/orbsvcs/examples/FaultTolerance/FLARe/DeCoRAM/src/Forward_Ranking_Scheduler.h
@@ -0,0 +1,61 @@
+// -*- C++ -*-
+
+//=============================================================================
+/**
+ * @file Foward_Ranking_Scheduler.h
+ *
+ * $Id$
+ *
+ * @author Friedhelm Wolf (fwolf@dre.vanderbilt.edu)
+ */
+//=============================================================================
+
+#ifndef FORWARD_RANKING_SCHEDULER_H_
+#define FORWARD_RANKING_SCHEDULER_H_
+
+#include "Scheduler.h"
+#include "CTT_Enhanced.h"
+
+typedef std::list<PROCESSOR_SET> PROCESSOR_SETS;
+
+typedef std::list<TASK_LIST> TASK_SCENARIOS;
+
+class Forward_Ranking_Scheduler : public Scheduler
+{
+public:
+ /// default ctor
+ Forward_Ranking_Scheduler (const PROCESSOR_LIST & processors,
+ unsigned int max_failures);
+
+ virtual double schedule_task (const Task & task,
+ const Processor & processor);
+private:
+ bool check_for_existing_replicas (const Task & task,
+ const Processor & processor);
+
+ PROCESSOR_SET replica_processors (const Task & task);
+
+ PROCESSOR_SET relevant_processors (const TASK_LIST & tasks,
+ const PROCESSOR_SET & ignored_processors);
+
+ PROCESSOR_SETS permute_processors (const PROCESSOR_SET & fixed,
+ const PROCESSOR_SET & exchangeable,
+ unsigned int failure_number);
+
+ TASK_SCENARIOS activate_tasks (const TASK_LIST & tasks,
+ const PROCESSOR_SETS & failures);
+
+ double accumulate_wcrt (const TASK_SCENARIOS & scenarios);
+
+private:
+ CTT_Enhanced ctt_;
+};
+
+// streaming operators for data structures defined in this header
+std::ostream & operator<< (std::ostream & ostr,
+ const PROCESSOR_SETS & ps);
+
+std::ostream & operator<< (std::ostream & ostr,
+ const TASK_SCENARIOS & ts);
+
+#endif /* FORWARD_RANKING_SCHEDULER_H_ */
diff --git a/TAO/orbsvcs/examples/FaultTolerance/FLARe/DeCoRAM/src/Scheduler.cpp b/TAO/orbsvcs/examples/FaultTolerance/FLARe/DeCoRAM/src/Scheduler.cpp
index 4f623270b3a..6c7459d8aa1 100644
--- a/TAO/orbsvcs/examples/FaultTolerance/FLARe/DeCoRAM/src/Scheduler.cpp
+++ b/TAO/orbsvcs/examples/FaultTolerance/FLARe/DeCoRAM/src/Scheduler.cpp
@@ -92,6 +92,24 @@ Scheduler::schedule (void) const
return schedule_;
}
+ProcessorNameComparison::ProcessorNameComparison (const Processor & p)
+ :p_ (p)
+{
+}
+
+Processor
+ProcessorPicker::operator () (const TASK_POSITIONS::value_type & entry)
+{
+ return entry.first;
+}
+
+bool
+ProcessorNameComparison::operator () (bool equal,
+ const TASK_POSITIONS::value_type & pos)
+{
+ return (equal || (pos.first.compare (p_) == 0));
+}
+
std::ostream & operator<< (std::ostream & ostr,
const TASK_POSITION & tp)
{
diff --git a/TAO/orbsvcs/examples/FaultTolerance/FLARe/DeCoRAM/src/Scheduler.h b/TAO/orbsvcs/examples/FaultTolerance/FLARe/DeCoRAM/src/Scheduler.h
index 4bcd4685431..ac4ede69472 100644
--- a/TAO/orbsvcs/examples/FaultTolerance/FLARe/DeCoRAM/src/Scheduler.h
+++ b/TAO/orbsvcs/examples/FaultTolerance/FLARe/DeCoRAM/src/Scheduler.h
@@ -55,7 +55,41 @@ protected:
REPLICA_GROUPS replica_groups_;
};
+/*** Helper classes and operators ***/
+/**
+ * @class ProcessorNameComparison
+ *
+ * @brief Can be used with the accumulate algorithm to find out if a
+ * processor name belongs to a list of task positions
+ */
+class ProcessorNameComparison : public std::binary_function <
+ bool,
+ TASK_POSITIONS::value_type,
+ bool>
+{
+public:
+ ProcessorNameComparison (const Processor & p);
+
+ bool operator () (bool equal, const TASK_POSITIONS::value_type & pos);
+private:
+ Processor p_;
+};
+
+/**
+ * @class ProcessorPicker
+ *
+ * @brief can be used within transform to extract the
+ * processor names from a TASK_POSITIONS structure.
+ */
+class ProcessorPicker : public std::unary_function<REPLICA_GROUPS::value_type,
+ Processor>
+{
+public:
+ Processor operator () (const TASK_POSITIONS::value_type & entry);
+};
+
+// streaming operators for used data structures
std::ostream & operator<< (std::ostream & ostr,
const TASK_POSITION & tp);
diff --git a/TAO/orbsvcs/examples/FaultTolerance/FLARe/DeCoRAM/src/primary_ftrmff.cpp b/TAO/orbsvcs/examples/FaultTolerance/FLARe/DeCoRAM/src/primary_ftrmff.cpp
new file mode 100644
index 00000000000..ec815d3a013
--- /dev/null
+++ b/TAO/orbsvcs/examples/FaultTolerance/FLARe/DeCoRAM/src/primary_ftrmff.cpp
@@ -0,0 +1,80 @@
+// -*- C++ -*-
+
+//=============================================================================
+/**
+ * @file basic_ftrmff.cpp
+ *
+ * $Id$
+ *
+ * @author Friedhelm Wolf (fwolf@dre.vanderbilt.edu)
+ */
+//=============================================================================
+
+#include <fstream>
+#include <sstream>
+#include <iostream>
+#include <ace/Get_Opt.h>
+#include "FTRMFF_Primary.h"
+
+std::string filename = "test.sd"; // filename of task list input
+unsigned int m = 4; // number of processors
+unsigned int c = 2; // consitency level
+
+int ACE_TMAIN (int argc, ACE_TCHAR *argv[])
+{
+ if (argc > 1)
+ filename = argv[1];
+
+ if (argc > 2)
+ m = atoi (argv[2]);
+
+ if (argc > 3)
+ c = atoi (argv[3]);
+
+ TASK_LIST tasks;
+ PROCESSOR_LIST procs;
+ for (unsigned int i = 1; i <= m; ++i)
+ {
+ std::stringstream ss;
+ ss << "P";
+ if (i < 10)
+ ss << "00";
+ else if (i < 100)
+ ss << "0";
+ ss << i;
+ procs.push_back (ss.str ());
+ }
+
+ std::ifstream ifile;
+ ifile.open (filename.c_str ());
+
+ std::transform (
+ std::istream_iterator <std::string> (ifile),
+ std::istream_iterator <std::string> (),
+ std::inserter <TASK_LIST> (tasks,
+ tasks.begin ()),
+ string_to_task ());
+
+ ifile.close ();
+
+ FTRMFF_Primary ftrmff;
+
+ FTRMFF_Input input;
+ input.tasks = tasks;
+ input.processors = procs;
+ input.backup_count = c;
+ FTRMFF_Output result = ftrmff (input);
+
+ if (result.unscheduled_tasks.size () > 0)
+ {
+ std::cout << "Could not schedule :"
+ << std::endl
+ << result.unscheduled_tasks
+ << std::endl;
+
+ return 1;
+ }
+
+ return 0;
+}
+