You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@whimsical.apache.org by Sam Ruby <ru...@apache.org> on 2016/03/14 21:16:00 UTC
[whimsy.git] [1/1] Commit 09cf973: minimize requests for data already seen
Commit 09cf973c671b4a87984e5f9a553319251eb46a50:
minimize requests for data already seen
compute, provide, and compare digests for agendas
Branch: refs/heads/master
Author: Sam Ruby <ru...@intertwingly.net>
Committer: Sam Ruby <ru...@intertwingly.net>
Pusher: rubys <ru...@apache.org>
------------------------------------------------------------
www/board/agenda/models/agenda.rb | +++++++ -----
www/board/agenda/routes.rb | +
www/board/agenda/views/buttons/attend.js.rb | + -
www/board/agenda/views/buttons/commit.js.rb | + -
www/board/agenda/views/buttons/post-actions.js.rb | + -
www/board/agenda/views/buttons/post.js.rb | + -
www/board/agenda/views/buttons/refresh.js.rb | + -
www/board/agenda/views/keyboard.js.rb | + -
www/board/agenda/views/layout/main.js.rb | ++ --
www/board/agenda/views/models/agenda.js.rb | +++++++ --
------------------------------------------------------------
58 changes: 36 additions, 22 deletions.
------------------------------------------------------------
diff --git a/www/board/agenda/models/agenda.rb b/www/board/agenda/models/agenda.rb
index f38591c..503d42a 100755
--- a/www/board/agenda/models/agenda.rb
+++ b/www/board/agenda/models/agenda.rb
@@ -6,6 +6,9 @@
# This code also maintains a "working copy" of agendas when updates are
# made that may not yet be reflected in the local svn checkout.
#
+
+require 'digest'
+
class Agenda
def self.[](file)
IPC[file]
@@ -16,16 +19,16 @@ def self.[]=(file, data)
end
def self.update_cache(file, path, contents, quick)
- parsed = ASF::Board::Agenda.parse(contents, quick)
- update = {mtime: (quick ? -1 : File.mtime(path)), parsed: parsed}
- unless IPC[file] and IPC[file] == update
- before = Agenda[file] and Agenda[file][:parsed]
-
- Agenda[file] = update
-
- unless quick or before == update[:parsed]
- IPC.post type: :agenda, file: file, mtime: update[:mtime].to_f
- end
+ update = {
+ mtime: (quick ? -1 : File.mtime(path)),
+ parsed: ASF::Board::Agenda.parse(contents, quick),
+ digest: Digest::SHA256.base64digest(contents)
+ }
+
+ current = IPC[file]
+ unless current and current[:digest] == update[:digest]
+ IPC[file] = update
+ IPC.post type: :agenda, file: file, digest: update[:digest] unless quick
end
end
@@ -138,6 +141,7 @@ def self.update(file, message, retries=20, &block)
# return the result in the response
_.method_missing(:_agenda, Agenda[file][:parsed])
+ _.method_missing(:_digest, Agenda[file][:digest])
end
ensure
diff --git a/www/board/agenda/routes.rb b/www/board/agenda/routes.rb
index 5ecca68..e32ad99 100755
--- a/www/board/agenda/routes.rb
+++ b/www/board/agenda/routes.rb
@@ -97,6 +97,7 @@
query: params['q'],
agenda: agenda,
parsed: Agenda[agenda][:parsed],
+ digest: Agenda[agenda][:digest],
etag: Agenda.uptodate(agenda) ? Agenda[agenda][:etag] : nil
}
diff --git a/www/board/agenda/views/buttons/attend.js.rb b/www/board/agenda/views/buttons/attend.js.rb
index 07b4893..40e5621 100644
--- a/www/board/agenda/views/buttons/attend.js.rb
+++ b/www/board/agenda/views/buttons/attend.js.rb
@@ -40,7 +40,7 @@ def click(event)
@disabled = true
post 'attend', data do |response|
@disabled = false
- Agenda.load response.agenda
+ Agenda.load response.agenda, response.digest
end
end
end
diff --git a/www/board/agenda/views/buttons/commit.js.rb b/www/board/agenda/views/buttons/commit.js.rb
index 9d8cc48..fd7264b 100644
--- a/www/board/agenda/views/buttons/commit.js.rb
+++ b/www/board/agenda/views/buttons/commit.js.rb
@@ -112,7 +112,7 @@ def change(event)
def click(event)
@disabled = true
post 'commit', message: @message, initials: Pending.initials do |response|
- Agenda.load response.agenda
+ Agenda.load response.agenda, response.digest
Pending.load response.pending
@disabled = false
diff --git a/www/board/agenda/views/buttons/post-actions.js.rb b/www/board/agenda/views/buttons/post-actions.js.rb
index 8a23f61..f96f3ef 100644
--- a/www/board/agenda/views/buttons/post-actions.js.rb
+++ b/www/board/agenda/views/buttons/post-actions.js.rb
@@ -21,7 +21,7 @@ def click(event)
@disabled = true
post 'post-actions', data do |response|
@disabled = false
- Agenda.load response.agenda
+ Agenda.load response.agenda, response.digest
end
end
end
diff --git a/www/board/agenda/views/buttons/post.js.rb b/www/board/agenda/views/buttons/post.js.rb
index ab9f904..bef4d79 100644
--- a/www/board/agenda/views/buttons/post.js.rb
+++ b/www/board/agenda/views/buttons/post.js.rb
@@ -198,7 +198,7 @@ def submit(event)
jQuery('#post-report-form').modal(:hide)
document.body.classList.remove('modal-open')
@disabled = false
- Agenda.load response.agenda
+ Agenda.load response.agenda, response.digest
end
end
end
diff --git a/www/board/agenda/views/buttons/refresh.js.rb b/www/board/agenda/views/buttons/refresh.js.rb
index 0df14de..9962f5d 100644
--- a/www/board/agenda/views/buttons/refresh.js.rb
+++ b/www/board/agenda/views/buttons/refresh.js.rb
@@ -14,7 +14,7 @@ def click(event)
@disabled = true
post 'refresh', agenda: Agenda.file do |response|
@disabled = false
- Agenda.load response.agenda
+ Agenda.load response.agenda, response.digest
end
end
end
diff --git a/www/board/agenda/views/keyboard.js.rb b/www/board/agenda/views/keyboard.js.rb
index beca235..de6b530 100644
--- a/www/board/agenda/views/keyboard.js.rb
+++ b/www/board/agenda/views/keyboard.js.rb
@@ -81,7 +81,7 @@ def (document.body).onkeydown(event)
Main.refresh()
post 'refresh', agenda: Agenda.file do |response|
clock_counter -= 1
- Agenda.load response.agenda
+ Agenda.load response.agenda, response.digest
Main.refresh()
end
return false
diff --git a/www/board/agenda/views/layout/main.js.rb b/www/board/agenda/views/layout/main.js.rb
index 549957a..7188a2d 100644
--- a/www/board/agenda/views/layout/main.js.rb
+++ b/www/board/agenda/views/layout/main.js.rb
@@ -44,7 +44,7 @@ def componentWillMount()
Server[prop] = @@server[prop]
end
- Agenda.load(@@page.parsed)
+ Agenda.load(@@page.parsed, @@page.digest)
Minutes.load(@@page.minutes)
self.route(@@page.path, @@page.query)
@@ -129,7 +129,7 @@ def window.onresize()
window.onresize()
# if agenda is stale, fetch immediately; otherwise save etag
- Agenda.fetch(@@page.etag)
+ Agenda.fetch(@@page.etag, @@page.digest)
# start backchannel
Events.monitor()
diff --git a/www/board/agenda/views/models/agenda.js.rb b/www/board/agenda/views/models/agenda.js.rb
index 0ca231d..a00b702 100644
--- a/www/board/agenda/views/models/agenda.js.rb
+++ b/www/board/agenda/views/models/agenda.js.rb
@@ -7,11 +7,13 @@
class Agenda
@@index = []
@@etag = nil
+ @@digest = nil
# (re)-load an agenda, creating instances for each item, and linking
# each instance to their next and previous items.
- def self.load(list)
+ def self.load(list, digest)
return unless list
+ @@digest = digest
@@index.clear()
prev = nil
@@ -52,10 +54,10 @@ def self.load(list)
end
# fetch agenda if etag is not supplied
- def self.fetch(etag)
+ def self.fetch(etag, digest)
if etag
@@etag = etag
- else
+ elsif digest != @@digest or not @@etag
xhr = XMLHttpRequest.new()
xhr.open('GET', "../#{@@date}.json", true)
xhr.setRequestHeader('If-None-Match', @@etag) if @@etag
@@ -69,6 +71,8 @@ def xhr.onreadystatechange()
end
xhr.send()
end
+
+ @@digest = digest
end
# return the entire agenda
@@ -226,6 +230,11 @@ def self.file
"board_agenda_#{@@date.gsub('-', '_')}.txt"
end
+ # get the digest of the file associated with this agenda
+ def self.digest
+ @@digest
+ end
+
# previous link for the agenda index page
def self.prev
result = {title: 'Help', href: 'help'}
@@ -437,7 +446,7 @@ def color
end
Events.subscribe :agenda do |message|
- Agenda.fetch(nil) if message.file == Agenda.file
+ Agenda.fetch(nil, message.digest) if message.file == Agenda.file
end
Events.subscribe :server do |message|