Changed TickerHandler to use the new ExtendedLoopingCall. This means the individual ticker-timers will continue from the last running time after a reload rather than starting over.
This commit is contained in:
parent
dd150ef3bb
commit
4b1b842bd2
2 changed files with 21 additions and 9 deletions
|
|
@ -49,7 +49,7 @@ call the handler's save() and restore() methods when the server reboots.
|
||||||
|
|
||||||
"""
|
"""
|
||||||
from twisted.internet.defer import inlineCallbacks
|
from twisted.internet.defer import inlineCallbacks
|
||||||
from twisted.internet.task import LoopingCall
|
from src.scripts.scripts import ExtendedLoopingCall
|
||||||
from src.server.models import ServerConfig
|
from src.server.models import ServerConfig
|
||||||
from src.utils.logger import log_trace
|
from src.utils.logger import log_trace
|
||||||
from src.utils.dbserialize import dbserialize, dbunserialize, pack_dbobj, unpack_dbobj
|
from src.utils.dbserialize import dbserialize, dbunserialize, pack_dbobj, unpack_dbobj
|
||||||
|
|
@ -92,9 +92,9 @@ class Ticker(object):
|
||||||
self.interval = interval
|
self.interval = interval
|
||||||
self.subscriptions = {}
|
self.subscriptions = {}
|
||||||
# set up a twisted asynchronous repeat call
|
# set up a twisted asynchronous repeat call
|
||||||
self.task = LoopingCall(self._callback)
|
self.task = ExtendedLoopingCall(self._callback)
|
||||||
|
|
||||||
def validate(self):
|
def validate(self, start_delay=None):
|
||||||
"""
|
"""
|
||||||
Start/stop the task depending on how many
|
Start/stop the task depending on how many
|
||||||
subscribers we have using it.
|
subscribers we have using it.
|
||||||
|
|
@ -108,14 +108,18 @@ class Ticker(object):
|
||||||
if not subs:
|
if not subs:
|
||||||
self.task.stop()
|
self.task.stop()
|
||||||
elif subs:
|
elif subs:
|
||||||
self.task.start(self.interval, now=False)
|
print "starting with start_delay=", start_delay
|
||||||
|
self.task.start(self.interval, now=False, start_delay=start_delay)
|
||||||
|
|
||||||
def add(self, store_key, obj, *args, **kwargs):
|
def add(self, store_key, obj, *args, **kwargs):
|
||||||
"""
|
"""
|
||||||
Sign up a subscriber to this ticker
|
Sign up a subscriber to this ticker. If kwargs contains
|
||||||
|
a keyword _start_delay, this will be used to delay the start
|
||||||
|
of the trigger instead of interval.
|
||||||
"""
|
"""
|
||||||
|
start_delay = kwargs.pop("_start_delay", None)
|
||||||
self.subscriptions[store_key] = (obj, args, kwargs)
|
self.subscriptions[store_key] = (obj, args, kwargs)
|
||||||
self.validate()
|
self.validate(start_delay=start_delay)
|
||||||
|
|
||||||
def remove(self, store_key):
|
def remove(self, store_key):
|
||||||
"""
|
"""
|
||||||
|
|
@ -170,7 +174,6 @@ class TickerPool(object):
|
||||||
for ticker in self.tickers.values():
|
for ticker in self.tickers.values():
|
||||||
ticker.stop()
|
ticker.stop()
|
||||||
|
|
||||||
|
|
||||||
class TickerHandler(object):
|
class TickerHandler(object):
|
||||||
"""
|
"""
|
||||||
The Tickerhandler maintains a pool of tasks for subscribing
|
The Tickerhandler maintains a pool of tasks for subscribing
|
||||||
|
|
@ -221,10 +224,17 @@ class TickerHandler(object):
|
||||||
def save(self):
|
def save(self):
|
||||||
"""
|
"""
|
||||||
Save ticker_storage as a serialized string into a temporary
|
Save ticker_storage as a serialized string into a temporary
|
||||||
ServerConf field. This is called by server when it shuts down
|
ServerConf field. Whereas saving is done on the fly, if called by
|
||||||
|
server when it shuts down, the current timer of each ticker will be
|
||||||
|
saved so it can start over from that point.
|
||||||
"""
|
"""
|
||||||
#print "save:", self.ticker_storage
|
|
||||||
if self.ticker_storage:
|
if self.ticker_storage:
|
||||||
|
start_delays = dict((interval, ticker.task.next_call_time())
|
||||||
|
for interval, ticker in self.ticker_pool.tickers.items())
|
||||||
|
# update the timers for the tickers
|
||||||
|
for (obj, interval), (args, kwargs) in self.ticker_storage.items():
|
||||||
|
kwargs["_start_delay"] = start_delays.get(interval, None)
|
||||||
|
|
||||||
ServerConfig.objects.conf(key=self.save_name,
|
ServerConfig.objects.conf(key=self.save_name,
|
||||||
value=dbserialize(self.ticker_storage))
|
value=dbserialize(self.ticker_storage))
|
||||||
else:
|
else:
|
||||||
|
|
|
||||||
|
|
@ -313,6 +313,8 @@ class Evennia(object):
|
||||||
|
|
||||||
from src.server.oobhandler import OOB_HANDLER
|
from src.server.oobhandler import OOB_HANDLER
|
||||||
OOB_HANDLER.save()
|
OOB_HANDLER.save()
|
||||||
|
from src.scripts.tickerhandler import TICKER_HANDLER
|
||||||
|
TICKER_HANDLER.save()
|
||||||
|
|
||||||
if SERVER_STARTSTOP_MODULE:
|
if SERVER_STARTSTOP_MODULE:
|
||||||
SERVER_STARTSTOP_MODULE.at_server_reload_stop()
|
SERVER_STARTSTOP_MODULE.at_server_reload_stop()
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue