Commit 7e69c3ff authored by Georgios Dagkakis's avatar Georgios Dagkakis

failure can be of different types according to how TTF is measured

parent edb0a270
...@@ -34,7 +34,8 @@ from ObjectInterruption import ObjectInterruption ...@@ -34,7 +34,8 @@ from ObjectInterruption import ObjectInterruption
class Failure(ObjectInterruption): class Failure(ObjectInterruption):
def __init__(self, victim=None, distribution=None, index=0, repairman=None, offshift=False): def __init__(self, victim=None, distribution=None, index=0, repairman=None, offshift=False,
deteriorationType='constant'):
#Process.__init__(self) #Process.__init__(self)
ObjectInterruption.__init__(self,victim) ObjectInterruption.__init__(self,victim)
if distribution: if distribution:
...@@ -53,6 +54,12 @@ class Failure(ObjectInterruption): ...@@ -53,6 +54,12 @@ class Failure(ObjectInterruption):
self.type="Failure" self.type="Failure"
self.id=0 self.id=0
# shows how the time to failure is measured
# 'constant' means it counts not matter the state of the victim
# 'onShift' counts only if the victim is onShift
# 'working' counts only working time
self.deteriorationType=deteriorationType
if(self.distType=="Availability"): if(self.distType=="Availability"):
# -------------------------------------------------------------- # --------------------------------------------------------------
...@@ -95,25 +102,31 @@ class Failure(ObjectInterruption): ...@@ -95,25 +102,31 @@ class Failure(ObjectInterruption):
self.victim.expectedDownTime=self.env.now+remainingTimeToFailure self.victim.expectedDownTime=self.env.now+remainingTimeToFailure
failureNotTriggered=True failureNotTriggered=True
while failureNotTriggered: if self.deteriorationType=='constant':
timeRestartedCounting=self.env.now yield self.env.timeout(remainingTimeToFailure)
# TODO: can also wait for interruptionStart signal of the victim and check whether the interruption is caused by a shiftScheduler else:
receivedEvent=yield self.env.timeout(remainingTimeToFailure) | self.victim.interruptionStart #offShift while failureNotTriggered:
# the failure should receive a signal if there is a shift-off triggered timeRestartedCounting=self.env.now
if self.victim.interruptionStart in receivedEvent: # TODO: can also wait for interruptionStart signal of the victim and check whether the interruption is caused by a shiftScheduler
# TODO: the signal interruptionStart is reset by the time it is received by the victim. not sure if will be still triggered when it is checked here receivedEvent=yield self.env.timeout(remainingTimeToFailure) | self.victim.interruptionStart
assert self.victim.onShift==False, 'shiftFailure cannot recalculate TTF if the victim is onShift' # the failure should receive a signal if there is a shift-off triggered
remainingTimeToFailure=remainingTimeToFailure-(self.env.now-timeRestartedCounting) if self.victim.interruptionStart in receivedEvent:
self.victim.expectedDownTime=self.env.now+remainingTimeToFailure # TODO: the signal interruptionStart is reset by the time it is received by the victim. not sure if will be still triggered when it is checked here
assert self.victim.onShift==False, 'shiftFailure cannot recalculate TTF if the victim is onShift'
# wait for the shift to start again remainingTimeToFailure=remainingTimeToFailure-(self.env.now-timeRestartedCounting)
yield self.victim.interruptionEnd self.victim.expectedDownTime=self.env.now+remainingTimeToFailure
assert self.victim.onShift==True, 'the victim of shiftFailure must be onShift to continue counting the TTF'
# TODO: the signal interruptionStart is reset by the time it is received by the victim. not sure if will be still triggered when it is checked here # wait for the shift to start again
else: yield self.victim.interruptionEnd
failureNotTriggered=False assert self.victim.onShift==True, 'the victim of shiftFailure must be onShift to continue counting the TTF'
# TODO: the signal interruptionStart is reset by the time it is received by the victim. not sure if will be still triggered when it is checked here
else:
failureNotTriggered=False
self.interruptVictim() # interrupt the victim # interrupt the victim only if it was not previously interrupted
if not self.victim.interruptionStart.triggered:
self.interruptVictim() # interrupt the victim
self.victim.Up=False self.victim.Up=False
self.victim.timeLastFailure=self.env.now self.victim.timeLastFailure=self.env.now
self.outputTrace("is down") self.outputTrace("is down")
...@@ -147,7 +160,10 @@ class Failure(ObjectInterruption): ...@@ -147,7 +160,10 @@ class Failure(ObjectInterruption):
yield self.env.timeout(self.rngTTR.generateNumber()) # wait until the repairing process is over yield self.env.timeout(self.rngTTR.generateNumber()) # wait until the repairing process is over
self.victim.totalFailureTime+=self.env.now-failTime
# add the failure time only if the victim was interrupted by this failure
if self.victim.interruptedBy == 'Failure':
self.victim.totalFailureTime+=self.env.now-failTime
self.reactivateVictim() # since repairing is over, the Machine is reactivated self.reactivateVictim() # since repairing is over, the Machine is reactivated
self.victim.Up=True self.victim.Up=True
self.outputTrace("is up") self.outputTrace("is up")
......
...@@ -89,8 +89,10 @@ class ShiftScheduler(ObjectInterruption): ...@@ -89,8 +89,10 @@ class ShiftScheduler(ObjectInterruption):
self.waitingSignal=True self.waitingSignal=True
yield self.victim.endedLastProcessing yield self.victim.endedLastProcessing
self.victim.endedLastProcessing=self.env.event() self.victim.endedLastProcessing=self.env.event()
self.interruptVictim() # interrupt processing operations if any # interrupt the victim only if it was not previously interrupted
if not self.victim.interruptionStart.triggered:
self.interruptVictim() # interrupt the victim
self.victim.onShift=False # get the victim off-shift self.victim.onShift=False # get the victim off-shift
self.victim.timeLastShiftEnded=self.env.now self.victim.timeLastShiftEnded=self.env.now
self.outputTrace("is off shift") self.outputTrace("is off shift")
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment