sfpagent 0.4.1 → 0.4.2

Sign up to get free protection for your applications and to get access to all the features.

Potentially problematic release.


This version of sfpagent might be problematic. Click here for more details.

Files changed (4) hide show
  1. data/VERSION +1 -1
  2. data/bin/init_script +8 -1
  3. data/lib/sfpagent/bsig.rb +56 -6
  4. metadata +6 -6
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.4.1
1
+ 0.4.2
@@ -12,8 +12,15 @@
12
12
  set -e
13
13
 
14
14
  bin=`which sfpagent`
15
+ if [ $bin = "" ]; then
16
+ if [ -f "/usr/bin/sfpagent" ]; then
17
+ bin="/usr/bin/sfpagent"
18
+ elif [ -f "/usr/local/bin/sfpagent" ]; then
19
+ bin="/usr/local/bin/sfpagent"
20
+ fi
21
+ fi
15
22
 
16
- test -x $bin || exit 0
23
+ test -x $bin || exit 1
17
24
 
18
25
  umask 022
19
26
 
@@ -17,6 +17,7 @@ class Sfp::BSig
17
17
  @enabled = false
18
18
  @status = :stopped
19
19
  @lock_postprocess = Mutex.new
20
+ @locked_operators = []
20
21
  end
21
22
 
22
23
  def stop
@@ -53,6 +54,7 @@ class Sfp::BSig
53
54
  Sfp::Agent.logger.info "[main] Executing BSig model"
54
55
 
55
56
  previous_exec_status = exec_status = nil
57
+
56
58
  while @enabled
57
59
  begin
58
60
 
@@ -131,6 +133,10 @@ class Sfp::BSig
131
133
  # :repaired => some goal-flaws have been repaired, but the goal may have other flaws
132
134
  #
133
135
  def achieve_local_goal(id, goal, operators, pi, mode)
136
+ parallel_achieve_local_goal(id, goal, operators, pi, mode)
137
+ end
138
+
139
+ def parallel_achieve_local_goal(id, goal, operators, pi, mode)
134
140
  current = get_current_state
135
141
  flaws = compute_flaws(goal, current)
136
142
  #Sfp::Agent.logger.info "[#{mode}] flaws: #{flaws.inspect}"
@@ -282,7 +288,6 @@ class Sfp::BSig
282
288
  unregister_satisfier_thread
283
289
  end
284
290
 
285
- #protected
286
291
  def register_satisfier_thread(mode=nil)
287
292
  File.open(SatisfierLockFile, File::RDWR|File::CREAT, 0644) { |f|
288
293
  f.flock(File::LOCK_EX)
@@ -305,19 +310,31 @@ class Sfp::BSig
305
310
  }
306
311
  end
307
312
 
313
+ # lock given operator by creating a lock file to avoid another thread
314
+ # executing the same operator
315
+ #
316
+ # @param operator operator to be locked
317
+ #
308
318
  def lock_operator(operator)
309
319
  @lock.synchronize {
310
320
  operator_lock_file = "#{Home}/operator.#{operator['id']}.#{operator['name']}.lock"
311
321
  return false if File.exist?(operator_lock_file)
312
322
  File.open(operator_lock_file, 'w') { |f| f.write('1') }
323
+ @locked_operators << operator
313
324
  return true
314
325
  }
315
326
  end
316
327
 
328
+ # unlock given operator by deleting lock file in order to allow another thread
329
+ # executing the operator
330
+ #
331
+ # @param operator operator to be unlocked
332
+ #
317
333
  def unlock_operator(operator)
318
334
  @lock.synchronize {
319
335
  operator_lock_file = "#{Home}/operator.#{operator['id']}.#{operator['name']}.lock"
320
336
  File.delete(operator_lock_file) if File.exist?(operator_lock_file)
337
+ @lock_operators.delete(operator)
321
338
  }
322
339
  end
323
340
 
@@ -419,20 +436,28 @@ class Sfp::BSig
419
436
  # cannot be repaired by available operators
420
437
  #
421
438
  def select_operators(flaws, operators, pi)
422
- selected_operator = []
439
+ selected_operators = []
423
440
  repaired = {}
424
441
  operators.each do |op|
425
442
  next if op['pi'] < pi
426
- if can_repair?(op, flaws)
427
- selected_operator << op
443
+ if can_repair?(op, flaws) and # can the operator repair the flaws?
444
+ not threat?(op, selected_operators) and # does the operator threat other selected operators?
445
+ not threat?(op, @locked_operators) # does the operator threat locked (being executed) operators?
446
+ selected_operators << op
428
447
  op['effect'].each { |var,val| repaired[var] = val if flaws[var] == val }
429
448
  end
430
449
  break if repaired.length >= flaws.length
431
450
  end
432
451
  return :failure if repaired.length < flaws.length
433
- selected_operator
452
+ selected_operators
434
453
  end
435
-
454
+
455
+ # @param flaws a map of flaws (variable-value) that should be repaired
456
+ # @param operators a sorted-list of operators (sorted by 'pi')
457
+ # @param pi minimum priority-index value
458
+ #
459
+ # @return an operator that can repair the flaws
460
+ #
436
461
  def select_operator(flaws, operators, pi)
437
462
  operators.each do |op|
438
463
  next if op['pi'] < pi
@@ -441,11 +466,36 @@ class Sfp::BSig
441
466
  nil
442
467
  end
443
468
 
469
+ # An operator can repair the flaws iff there is an effect that fixes the flaw
470
+ #
444
471
  def can_repair?(operator, flaws)
445
472
  operator['effect'].each { |variable,value| return true if flaws[variable] == value }
446
473
  false
447
474
  end
448
475
 
476
+ # Check if an operator threats a set of operators.
477
+ #
478
+ # @param operator operator to be checked
479
+ # @param operators a set of operators
480
+ #
481
+ def threat_operators?(operator, operators)
482
+ operators.each do |op|
483
+ return true if threat?(operator, op)
484
+ end
485
+ false
486
+ end
487
+
488
+ # Return true if operator1 threats operator2: there is an effect's variable of operator1
489
+ # is in condition's or effect's variable of operator2
490
+ #
491
+ def threat?(operator1, operator2)
492
+ operator1['effect'].each_key do |variable1|
493
+ return true if operator2['condition'].keys.include?(variable1) or
494
+ operator2['effect'].keys.include?(variable1)
495
+ end
496
+ false
497
+ end
498
+
449
499
  def split_preconditions(operator)
450
500
  local = {}
451
501
  remote = {}
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: sfpagent
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.4.1
4
+ version: 0.4.2
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,11 +9,11 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2013-11-18 00:00:00.000000000 Z
12
+ date: 2013-11-22 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: sfp
16
- requirement: &20865400 !ruby/object:Gem::Requirement
16
+ requirement: &11401760 !ruby/object:Gem::Requirement
17
17
  none: false
18
18
  requirements:
19
19
  - - ~>
@@ -21,10 +21,10 @@ dependencies:
21
21
  version: 0.3.17
22
22
  type: :runtime
23
23
  prerelease: false
24
- version_requirements: *20865400
24
+ version_requirements: *11401760
25
25
  - !ruby/object:Gem::Dependency
26
26
  name: rake
27
- requirement: &20864580 !ruby/object:Gem::Requirement
27
+ requirement: &11401020 !ruby/object:Gem::Requirement
28
28
  none: false
29
29
  requirements:
30
30
  - - ! '>='
@@ -32,7 +32,7 @@ dependencies:
32
32
  version: '0'
33
33
  type: :development
34
34
  prerelease: false
35
- version_requirements: *20864580
35
+ version_requirements: *11401020
36
36
  description: A Ruby implementation of SFP agent.
37
37
  email: herry13@gmail.com
38
38
  executables: