Merge lp:~jameinel/u1db/sync_skip_record_999592 into lp:u1db

Proposed by John A Meinel
Status: Merged
Merged at revision: 284
Proposed branch: lp:~jameinel/u1db/sync_skip_record_999592
Merge into: lp:u1db
Diff against target: 107 lines (+29/-4)
5 files modified
src/u1db_sync_target.c (+8/-2)
u1db/backends/inmemory.py (+2/-0)
u1db/backends/sqlite_backend.py (+2/-0)
u1db/sync.py (+2/-1)
u1db/tests/test_sync.py (+15/-1)
To merge this branch: bzr merge lp:~jameinel/u1db/sync_skip_record_999592
Reviewer Review Type Date Requested Status
Lucio Torre (community) Approve
Review via email: mp+105805@code.launchpad.net

Description of the change

This handles the next stage of "don't talk to the server if you don't have to". The three steps today are GET, POST, PUT. Eric's branch handles that if GET says there is nothing to do, we don't POST or PUT. This adds a test that if after POST the remote server knows everything, we don't do a follow up PUT.

Interestingly, the C code already had the check, we just didn't have a test for it.

To post a comment you must log in.
Revision history for this message
Lucio Torre (lucio.torre) :
review: Approve

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1=== modified file 'src/u1db_sync_target.c'
2--- src/u1db_sync_target.c 2012-05-15 09:03:31 +0000
3+++ src/u1db_sync_target.c 2012-05-15 12:15:23 +0000
4@@ -131,12 +131,19 @@
5 st_record_sync_info(u1db_sync_target *st, const char *source_replica_uid,
6 int source_gen)
7 {
8+ int status;
9 u1database *db;
10 if (st == NULL || source_replica_uid == NULL) {
11 return U1DB_INVALID_PARAMETER;
12 }
13+ if (st->trace_cb) {
14+ status = st->trace_cb(st->trace_context, "record_sync_info");
15+ if (status != U1DB_OK) { goto finish; }
16+ }
17 db = (u1database *)st->implementation;
18- return u1db__set_sync_generation(db, source_replica_uid, source_gen);
19+ status = u1db__set_sync_generation(db, source_replica_uid, source_gen);
20+finish:
21+ return status;
22 }
23
24
25@@ -593,7 +600,6 @@
26 ((*local_gen_before_sync + return_doc_state.num_inserted)
27 == local_gen))
28 {
29- // fprintf(stderr, "Informing target of local_gen\n", local_gen);
30 status = target->record_sync_info(target, local_uid, local_gen);
31 if (status != U1DB_OK) { goto finish; }
32 }
33
34=== modified file 'u1db/backends/inmemory.py'
35--- u1db/backends/inmemory.py 2012-04-27 14:22:47 +0000
36+++ u1db/backends/inmemory.py 2012-05-15 12:15:23 +0000
37@@ -338,5 +338,7 @@
38 self._db._replica_uid, len(self._db._transaction_log), source_gen)
39
40 def record_sync_info(self, source_replica_uid, source_replica_generation):
41+ if self._trace_hook:
42+ self._trace_hook('record_sync_info')
43 self._db.set_sync_generation(source_replica_uid,
44 source_replica_generation)
45
46=== modified file 'u1db/backends/sqlite_backend.py'
47--- u1db/backends/sqlite_backend.py 2012-05-10 16:23:47 +0000
48+++ u1db/backends/sqlite_backend.py 2012-05-15 12:15:23 +0000
49@@ -602,6 +602,8 @@
50 return self._db._replica_uid, my_gen, source_gen
51
52 def record_sync_info(self, source_replica_uid, source_replica_generation):
53+ if self._trace_hook:
54+ self._trace_hook('record_sync_info')
55 self._db.set_sync_generation(source_replica_uid,
56 source_replica_generation)
57
58
59=== modified file 'u1db/sync.py'
60--- u1db/sync.py 2012-04-30 11:37:13 +0000
61+++ u1db/sync.py 2012-05-15 12:15:23 +0000
62@@ -82,7 +82,8 @@
63 new generation.
64 """
65 cur_gen = self.source._get_generation()
66- if cur_gen == start_generation + self.num_inserted:
67+ if (cur_gen == start_generation + self.num_inserted
68+ and self.num_inserted > 0):
69 self.sync_target.record_sync_info(self.source._replica_uid,
70 cur_gen)
71
72
73=== modified file 'u1db/tests/test_sync.py'
74--- u1db/tests/test_sync.py 2012-05-09 16:09:04 +0000
75+++ u1db/tests/test_sync.py 2012-05-15 12:15:23 +0000
76@@ -359,9 +359,12 @@
77 called.append(state)
78 self.set_trace_hook(cb)
79 self.st.sync_exchange([], 'replica', 0, self.receive_doc)
80+ self.st.record_sync_info('replica', 0)
81 self.assertEqual(['before whats_changed',
82 'after whats_changed',
83- 'before get_docs'],
84+ 'before get_docs',
85+ 'record_sync_info',
86+ ],
87 called)
88
89
90@@ -468,6 +471,17 @@
91 # returned from c2.
92 self.assertEqual(0, self.db2.get_sync_generation('test1'))
93
94+ def test_sync_doesnt_update_other_if_nothing_pulled(self):
95+ doc = self.db1.create_doc(simple_doc)
96+ def no_record_sync_info(state):
97+ if state != 'record_sync_info':
98+ return
99+ self.fail('SyncTarget.record_sync_info was called')
100+ self.assertEqual(1, self.sync(self.db1, self.db2,
101+ trace_hook=no_record_sync_info))
102+ self.assertEqual(1,
103+ self.db2.get_sync_generation(self.db1._replica_uid))
104+
105 def test_sync_ignores_convergence(self):
106 doc = self.db1.create_doc(simple_doc)
107 self.db3 = self.create_database('test3')

Subscribers

People subscribed via source and target branches