Mercurial > code > home > repos > rdfdb
annotate rdfdb/syncedgraph.py @ 1:674833ada390
no light9 package; rdfdb is now a toplevel name
Ignore-this: 2b7d8c53df9e62c9d3fbb38b083b122f
author | Drew Perttula <drewp@bigasterisk.com> |
---|---|
date | Sun, 18 Feb 2018 09:17:36 +0000 |
parents | d487d597ad33 |
children | c9d1764d64ad |
rev | line source |
---|---|
0
d487d597ad33
initial split from light9/
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
1 """ |
d487d597ad33
initial split from light9/
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
2 client code uses a SyncedGraph, which has a few things: |
d487d597ad33
initial split from light9/
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
3 |
d487d597ad33
initial split from light9/
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
4 AutoDepGraphApi - knockoutjs-inspired API for querying the graph in a |
d487d597ad33
initial split from light9/
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
5 way that lets me call you again when there were changes to the things |
d487d597ad33
initial split from light9/
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
6 you queried |
d487d597ad33
initial split from light9/
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
7 |
d487d597ad33
initial split from light9/
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
8 CurrentStateGraphApi - a way to query the graph that doesn't gather |
d487d597ad33
initial split from light9/
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
9 your dependencies like AutoDepGraphApi does |
d487d597ad33
initial split from light9/
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
10 |
d487d597ad33
initial split from light9/
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
11 GraphEditApi - methods to write patches to the graph for common |
d487d597ad33
initial split from light9/
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
12 operations, e.g. replacing a value, or editing a mapping |
d487d597ad33
initial split from light9/
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
13 |
d487d597ad33
initial split from light9/
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
14 PatchReceiver - our web server that listens to edits from the master graph |
d487d597ad33
initial split from light9/
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
15 |
d487d597ad33
initial split from light9/
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
16 PatchSender - collects and transmits your graph edits |
d487d597ad33
initial split from light9/
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
17 """ |
d487d597ad33
initial split from light9/
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
18 |
d487d597ad33
initial split from light9/
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
19 from rdflib import ConjunctiveGraph |
d487d597ad33
initial split from light9/
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
20 import logging, cyclone.httpclient, traceback |
d487d597ad33
initial split from light9/
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
21 from twisted.internet import defer |
d487d597ad33
initial split from light9/
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
22 import treq, json |
d487d597ad33
initial split from light9/
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
23 log = logging.getLogger('syncedgraph') |
1
674833ada390
no light9 package; rdfdb is now a toplevel name
Drew Perttula <drewp@bigasterisk.com>
parents:
0
diff
changeset
|
24 from rdfdb.rdflibpatch import patchQuads |
0
d487d597ad33
initial split from light9/
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
25 |
1
674833ada390
no light9 package; rdfdb is now a toplevel name
Drew Perttula <drewp@bigasterisk.com>
parents:
0
diff
changeset
|
26 from rdfdb.patchsender import PatchSender |
674833ada390
no light9 package; rdfdb is now a toplevel name
Drew Perttula <drewp@bigasterisk.com>
parents:
0
diff
changeset
|
27 from rdfdb.patchreceiver import PatchReceiver |
674833ada390
no light9 package; rdfdb is now a toplevel name
Drew Perttula <drewp@bigasterisk.com>
parents:
0
diff
changeset
|
28 from rdfdb.currentstategraphapi import CurrentStateGraphApi |
674833ada390
no light9 package; rdfdb is now a toplevel name
Drew Perttula <drewp@bigasterisk.com>
parents:
0
diff
changeset
|
29 from rdfdb.autodepgraphapi import AutoDepGraphApi |
674833ada390
no light9 package; rdfdb is now a toplevel name
Drew Perttula <drewp@bigasterisk.com>
parents:
0
diff
changeset
|
30 from rdfdb.grapheditapi import GraphEditApi |
0
d487d597ad33
initial split from light9/
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
31 |
d487d597ad33
initial split from light9/
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
32 # everybody who writes literals needs to get this |
d487d597ad33
initial split from light9/
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
33 from rdflibpatch_literal import patch |
d487d597ad33
initial split from light9/
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
34 patch() |
d487d597ad33
initial split from light9/
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
35 |
d487d597ad33
initial split from light9/
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
36 |
d487d597ad33
initial split from light9/
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
37 class SyncedGraph(CurrentStateGraphApi, AutoDepGraphApi, GraphEditApi): |
d487d597ad33
initial split from light9/
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
38 """ |
d487d597ad33
initial split from light9/
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
39 graph for clients to use. Changes are synced with the master graph |
d487d597ad33
initial split from light9/
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
40 in the rdfdb process. |
d487d597ad33
initial split from light9/
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
41 |
d487d597ad33
initial split from light9/
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
42 This api is like rdflib.Graph but it can also call you back when |
d487d597ad33
initial split from light9/
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
43 there are graph changes to the parts you previously read. |
d487d597ad33
initial split from light9/
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
44 |
d487d597ad33
initial split from light9/
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
45 You may want to attach to self.initiallySynced deferred so you |
d487d597ad33
initial split from light9/
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
46 don't attempt patches before we've heard the initial contents of |
d487d597ad33
initial split from light9/
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
47 the graph. It would be ok to accumulate some patches of new |
d487d597ad33
initial split from light9/
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
48 material, but usually you won't correctly remove the existing |
d487d597ad33
initial split from light9/
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
49 statements unless we have the correct graph. |
d487d597ad33
initial split from light9/
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
50 |
d487d597ad33
initial split from light9/
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
51 If we get out of sync, we abandon our local graph (even any |
d487d597ad33
initial split from light9/
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
52 pending local changes) and get the data again from the |
d487d597ad33
initial split from light9/
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
53 server. |
d487d597ad33
initial split from light9/
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
54 """ |
d487d597ad33
initial split from light9/
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
55 def __init__(self, rdfdbRoot, label): |
d487d597ad33
initial split from light9/
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
56 """ |
d487d597ad33
initial split from light9/
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
57 label is a string that the server will display in association |
d487d597ad33
initial split from light9/
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
58 with your connection |
d487d597ad33
initial split from light9/
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
59 """ |
d487d597ad33
initial split from light9/
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
60 self.rdfdbRoot = rdfdbRoot |
d487d597ad33
initial split from light9/
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
61 self.initiallySynced = defer.Deferred() |
d487d597ad33
initial split from light9/
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
62 self._graph = ConjunctiveGraph() |
d487d597ad33
initial split from light9/
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
63 |
d487d597ad33
initial split from light9/
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
64 self._receiver = PatchReceiver(self.rdfdbRoot, label, self._onPatch) |
d487d597ad33
initial split from light9/
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
65 |
d487d597ad33
initial split from light9/
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
66 self._sender = PatchSender(self.rdfdbRoot + 'patches', |
d487d597ad33
initial split from light9/
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
67 self._receiver.updateResource) |
d487d597ad33
initial split from light9/
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
68 AutoDepGraphApi.__init__(self) |
d487d597ad33
initial split from light9/
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
69 # this needs more state to track if we're doing a resync (and |
d487d597ad33
initial split from light9/
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
70 # everything has to error or wait) or if we're live |
d487d597ad33
initial split from light9/
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
71 |
d487d597ad33
initial split from light9/
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
72 def resync(self): |
d487d597ad33
initial split from light9/
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
73 """ |
d487d597ad33
initial split from light9/
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
74 get the whole graph again from the server (e.g. we had a |
d487d597ad33
initial split from light9/
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
75 conflict while applying a patch and want to return to the |
d487d597ad33
initial split from light9/
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
76 truth). |
d487d597ad33
initial split from light9/
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
77 |
d487d597ad33
initial split from light9/
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
78 To avoid too much churn, we remember our old graph and diff it |
d487d597ad33
initial split from light9/
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
79 against the replacement. This way, our callers only see the |
d487d597ad33
initial split from light9/
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
80 corrections. |
d487d597ad33
initial split from light9/
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
81 |
d487d597ad33
initial split from light9/
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
82 Edits you make during a resync will surely be lost, so I |
d487d597ad33
initial split from light9/
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
83 should just fail them. There should be a notification back to |
d487d597ad33
initial split from light9/
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
84 UIs who want to show that we're doing a resync. |
d487d597ad33
initial split from light9/
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
85 """ |
d487d597ad33
initial split from light9/
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
86 log.info('resync') |
d487d597ad33
initial split from light9/
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
87 self._sender.cancelAll() |
d487d597ad33
initial split from light9/
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
88 # this should be locked so only one resync goes on at once |
d487d597ad33
initial split from light9/
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
89 return cyclone.httpclient.fetch( |
d487d597ad33
initial split from light9/
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
90 url=self.rdfdbRoot + "graph", |
d487d597ad33
initial split from light9/
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
91 method="GET", |
d487d597ad33
initial split from light9/
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
92 headers={'Accept':['x-trig']}, |
d487d597ad33
initial split from light9/
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
93 ).addCallback(self._resyncGraph) |
d487d597ad33
initial split from light9/
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
94 |
d487d597ad33
initial split from light9/
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
95 def _resyncGraph(self, response): |
d487d597ad33
initial split from light9/
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
96 log.warn("new graph in") |
d487d597ad33
initial split from light9/
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
97 |
d487d597ad33
initial split from light9/
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
98 #diff against old entire graph |
d487d597ad33
initial split from light9/
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
99 #broadcast that change |
d487d597ad33
initial split from light9/
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
100 |
d487d597ad33
initial split from light9/
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
101 def patch(self, p): |
d487d597ad33
initial split from light9/
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
102 """send this patch to the server and apply it to our local |
d487d597ad33
initial split from light9/
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
103 graph and run handlers""" |
d487d597ad33
initial split from light9/
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
104 |
d487d597ad33
initial split from light9/
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
105 if p.isNoop(): |
d487d597ad33
initial split from light9/
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
106 log.info("skipping no-op patch") |
d487d597ad33
initial split from light9/
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
107 return |
d487d597ad33
initial split from light9/
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
108 |
d487d597ad33
initial split from light9/
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
109 # these could fail if we're out of sync. One approach: |
d487d597ad33
initial split from light9/
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
110 # Rerequest the full state from the server, try the patch |
d487d597ad33
initial split from light9/
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
111 # again after that, then give up. |
d487d597ad33
initial split from light9/
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
112 debugKey = '[id=%s]' % (id(p) % 1000) |
d487d597ad33
initial split from light9/
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
113 log.debug("\napply local patch %s %s", debugKey, p) |
d487d597ad33
initial split from light9/
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
114 try: |
d487d597ad33
initial split from light9/
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
115 patchQuads(self._graph, |
d487d597ad33
initial split from light9/
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
116 deleteQuads=p.delQuads, |
d487d597ad33
initial split from light9/
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
117 addQuads=p.addQuads, |
d487d597ad33
initial split from light9/
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
118 perfect=True) |
d487d597ad33
initial split from light9/
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
119 except ValueError as e: |
d487d597ad33
initial split from light9/
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
120 log.error(e) |
d487d597ad33
initial split from light9/
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
121 self.sendFailed(None) |
d487d597ad33
initial split from light9/
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
122 return |
d487d597ad33
initial split from light9/
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
123 log.debug('runDepsOnNewPatch') |
d487d597ad33
initial split from light9/
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
124 self.runDepsOnNewPatch(p) |
d487d597ad33
initial split from light9/
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
125 log.debug('sendPatch') |
d487d597ad33
initial split from light9/
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
126 self._sender.sendPatch(p).addErrback(self.sendFailed) |
d487d597ad33
initial split from light9/
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
127 log.debug('patch is done %s', debugKey) |
d487d597ad33
initial split from light9/
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
128 |
d487d597ad33
initial split from light9/
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
129 def suggestPrefixes(self, ctx, prefixes): |
d487d597ad33
initial split from light9/
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
130 """ |
d487d597ad33
initial split from light9/
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
131 when writing files for this ctx, try to use these n3 |
d487d597ad33
initial split from light9/
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
132 prefixes. async, not guaranteed to finish before any |
d487d597ad33
initial split from light9/
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
133 particular file flush |
d487d597ad33
initial split from light9/
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
134 """ |
d487d597ad33
initial split from light9/
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
135 treq.post(self.rdfdbRoot + 'prefixes', json.dumps({'ctx': ctx, 'prefixes': prefixes})) |
d487d597ad33
initial split from light9/
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
136 |
d487d597ad33
initial split from light9/
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
137 def sendFailed(self, result): |
d487d597ad33
initial split from light9/
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
138 """ |
d487d597ad33
initial split from light9/
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
139 we asked for a patch to be queued and sent to the master, and |
d487d597ad33
initial split from light9/
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
140 that ultimately failed because of a conflict |
d487d597ad33
initial split from light9/
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
141 """ |
d487d597ad33
initial split from light9/
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
142 log.warn("sendFailed") |
d487d597ad33
initial split from light9/
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
143 self.resync() |
d487d597ad33
initial split from light9/
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
144 |
d487d597ad33
initial split from light9/
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
145 #i think we should receive back all the pending patches, |
d487d597ad33
initial split from light9/
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
146 #do a resync here, |
d487d597ad33
initial split from light9/
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
147 #then requeue all the pending patches (minus the failing one?) after that's done. |
d487d597ad33
initial split from light9/
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
148 |
d487d597ad33
initial split from light9/
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
149 def _onPatch(self, p): |
d487d597ad33
initial split from light9/
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
150 """ |
d487d597ad33
initial split from light9/
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
151 central server has sent us a patch |
d487d597ad33
initial split from light9/
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
152 """ |
d487d597ad33
initial split from light9/
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
153 log.debug('_onPatch server has sent us %s', p) |
d487d597ad33
initial split from light9/
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
154 patchQuads(self._graph, p.delQuads, p.addQuads, perfect=True) |
d487d597ad33
initial split from light9/
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
155 log.debug("graph now has %s statements" % len(self._graph)) |
d487d597ad33
initial split from light9/
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
156 try: |
d487d597ad33
initial split from light9/
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
157 self.runDepsOnNewPatch(p) |
d487d597ad33
initial split from light9/
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
158 except Exception: |
d487d597ad33
initial split from light9/
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
159 # don't reflect this error back to the server; we did |
d487d597ad33
initial split from light9/
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
160 # receive its patch correctly. However, we're in a bad |
d487d597ad33
initial split from light9/
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
161 # state since some dependencies may not have rerun |
d487d597ad33
initial split from light9/
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
162 traceback.print_exc() |
d487d597ad33
initial split from light9/
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
163 log.warn("some graph dependencies may not have completely run") |
d487d597ad33
initial split from light9/
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
164 |
d487d597ad33
initial split from light9/
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
165 if self.initiallySynced: |
d487d597ad33
initial split from light9/
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
166 self.initiallySynced.callback(None) |
d487d597ad33
initial split from light9/
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
167 self.initiallySynced = None |