Inform clients to reload via a 'restart' event sent on Tornado start up

(imported from commit 10bb45547ea0bf34e56fc620ecd7415bb8a825c5)
This commit is contained in:
Zev Benjamin
2013-03-20 18:53:46 -04:00
parent e4fba59538
commit 4bc9152f71
2 changed files with 14 additions and 18 deletions

View File

@@ -135,10 +135,9 @@ def dump_event_queues():
logging.info('Tornado dumped %d event queues in %.3fs' logging.info('Tornado dumped %d event queues in %.3fs'
% (len(clients), time.time() - start)) % (len(clients), time.time() - start))
def setup_event_queue(io_loop): def load_event_queues():
global clients global clients
start = time.time() start = time.time()
# Read in existing event queues
try: try:
with file(PERSISTENT_QUEUE_FILENAME, "r") as stored_queues: with file(PERSISTENT_QUEUE_FILENAME, "r") as stored_queues:
clients = pickle.load(stored_queues) clients = pickle.load(stored_queues)
@@ -151,6 +150,13 @@ def setup_event_queue(io_loop):
logging.info('Tornado loaded %d event queues in %.3fs' logging.info('Tornado loaded %d event queues in %.3fs'
% (len(clients), time.time() - start)) % (len(clients), time.time() - start))
def send_restart_events():
for client in clients.itervalues():
event = dict(type='restart', server_generation=settings.SERVER_GENERATION)
client.add_event(event)
def setup_event_queue(io_loop):
load_event_queues()
atexit.register(dump_event_queues) atexit.register(dump_event_queues)
# Make sure we dump event queues even if we exit via signal # Make sure we dump event queues even if we exit via signal
signal.signal(signal.SIGTERM, lambda signum, stack: sys.exit(1)) signal.signal(signal.SIGTERM, lambda signum, stack: sys.exit(1))
@@ -164,6 +170,8 @@ def setup_event_queue(io_loop):
pc = PeriodicCallback(gc_event_queues, EVENT_QUEUE_GC_FREQ_MSECS, io_loop) pc = PeriodicCallback(gc_event_queues, EVENT_QUEUE_GC_FREQ_MSECS, io_loop)
pc.start() pc.start()
send_restart_events()
# Called from Django # Called from Django
def request_event_queue(user_profile, apply_markdown): def request_event_queue(user_profile, apply_markdown):
if settings.TORNADO_SERVER: if settings.TORNADO_SERVER:

View File

@@ -12,7 +12,6 @@ var viewport = $(window);
var get_updates_params = { var get_updates_params = {
pointer: -1, pointer: -1,
server_generation: -1, /* to be filled in on document.ready */
last_event_id: 0 last_event_id: 0
}; };
var get_updates_failures = 0; var get_updates_failures = 0;
@@ -606,14 +605,6 @@ function get_updates(options) {
get_updates_params.pointer = furthest_read; get_updates_params.pointer = furthest_read;
get_updates_params.dont_block = options.dont_block || get_updates_failures > 0; get_updates_params.dont_block = options.dont_block || get_updates_failures > 0;
get_updates_params.queue_id = page_params.event_queue_id; get_updates_params.queue_id = page_params.event_queue_id;
if (reload.is_pending()) {
// We only send a server_generation to the server if we're
// interested in an immediate reply to tell us if we need to
// reload. Once we're already reloading, we need to not
// submit the parameter, so that the server will process our
// future requests in longpolling mode.
delete get_updates_params.server_generation;
}
get_updates_xhr = $.ajax({ get_updates_xhr = $.ajax({
type: 'POST', type: 'POST',
@@ -633,12 +624,6 @@ function get_updates(options) {
get_updates_failures = 0; get_updates_failures = 0;
$('#connection-error').hide(); $('#connection-error').hide();
if (get_updates_params.server_generation === -1) {
get_updates_params.server_generation = data.server_generation;
} else if (data.server_generation !== get_updates_params.server_generation) {
reload.initiate();
}
var messages = []; var messages = [];
var new_pointer; var new_pointer;
@@ -655,7 +640,10 @@ function get_updates(options) {
messages.push(event.message); messages.push(event.message);
break; break;
case 'pointer': case 'pointer':
new_pointer = event.new_pointer; new_pointer = event.pointer;
break;
case 'restart':
reload.initiate();
break; break;
} }
}); });