Skip to content
Snippets Groups Projects
timers.py 1.59 KiB
Newer Older
WinJ's avatar
WinJ committed
import sys
from typing import Callable, List
WinJ's avatar
WinJ committed

from message import P1A, P2A, PaxosRequest
from paxos_utils import BallotNumber
import threading

"""
Timers for retrying certain operations (e.g. resending messages)
"""


class Timer:
    def __init__(self) -> None:
        pass

    def __str__(self) -> str:
        return f"timer: {self.__class__.__name__}\n"


class ClientTimer(Timer):
WinJ's avatar
WinJ committed

    def __init__(self, request: PaxosRequest, req_num: int) -> None:
        super().__init__()
        self.paxos_req: PaxosRequest = request
        self.req_num: int = req_num


class P2ATimer(Timer):
WinJ's avatar
WinJ committed

    def __init__(self, p2a: P2A) -> None:
        super().__init__()
        self.p2a: P2A = p2a


class HeartBeatTimer(Timer):
    HEARTBEAT_RETRY_MILLIS = 1000
WinJ's avatar
WinJ committed

    def __init__(self) -> None:
        super().__init__()


class HeartBeatCheckTimer(Timer):
    HEARTBEAT_CHECK_RETRY_MILLIS = 5000
WinJ's avatar
WinJ committed

    def __init__(self, ballot_num: List[BallotNumber]) -> None:
WinJ's avatar
WinJ committed
        super().__init__()
        self.ballot_num: List[BallotNumber] = ballot_num
WinJ's avatar
WinJ committed


class LeaderElectionTimer(Timer):
    LEADER_ELECTION_TIMER = 500000
WinJ's avatar
WinJ committed

    def __init__(self, p1a: P1A) -> None:
        super().__init__()
        self.p1a: P1A = p1a


"""
Setting a timer with callback
"""


def setTimer(timer: Timer, timerLengthMillis: int, callback: Callable):
    # threading.Timer takes in time (in s), a callback function, and arguments
    # (timer, ) is a list of positional arguments to the callback function
    S = threading.Timer(timerLengthMillis / 1000.0, callback, (timer,))
    S.start()