Hello community, here is the log from the commit of package dee for openSUSE:Factory checked in at 2014-01-10 21:17:24 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/dee (Old) and /work/SRC/openSUSE:Factory/.dee.new (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "dee" Changes: -------- --- /work/SRC/openSUSE:Factory/dee/dee.changes 2012-09-23 19:31:47.000000000 +0200 +++ /work/SRC/openSUSE:Factory/.dee.new/dee.changes 2014-01-10 21:17:25.000000000 +0100 @@ -1,0 +2,6 @@ +Fri Dec 27 14:34:28 UTC 2013 - [email protected] + +- Add dee-fix-lp1076027.patch, Dee.SharedModel doesn't get + invalidated when the leader changes (lp#1076027). + +------------------------------------------------------------------- New: ---- dee-fix-lp1076027.patch ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ dee.spec ++++++ --- /var/tmp/diff_new_pack.ICP8Fp/_old 2014-01-10 21:17:25.000000000 +0100 +++ /var/tmp/diff_new_pack.ICP8Fp/_new 2014-01-10 21:17:25.000000000 +0100 @@ -1,7 +1,7 @@ # # spec file for package dee # -# Copyright (c) 2012 SUSE LINUX Products GmbH, Nuernberg, Germany. +# Copyright (c) 2014 SUSE LINUX Products GmbH, Nuernberg, Germany. # # All modifications and additions to the file contributed by third parties # remain the property of their copyright owners, unless otherwise agreed @@ -26,6 +26,8 @@ Group: System/Libraries Url: http://launchpad.net/dee Source0: http://launchpad.net/dee/1.0/%{version}/+download/%{name}-%{version}.tar.gz +# PATCH-FIX-UPSTREAM dee-fix-lp1076027.patch lp#1076027 [email protected] -- Dee.SharedModel doesn't get invalidated when the leader changes. A SharedModel should get invalidated if a transaction from leader would be ignored. Patch taken from upsteam svn. +Patch0: dee-fix-lp1076027.patch BuildRequires: fdupes BuildRequires: libicu-devel >= 4.6 BuildRequires: libtool @@ -91,6 +93,7 @@ %prep %setup -q +%patch0 -p0 %build %configure \ ++++++ dee-fix-lp1076027.patch ++++++ === modified file 'src/dee-shared-model.c' --- src/dee-shared-model.c 2012-04-12 08:36:44 +0000 +++ src/dee-shared-model.c 2012-11-09 12:25:03 +0000 @@ -1310,6 +1310,17 @@ g_warning ("Invalidating %s", sender_name); invalidate_peer (self, sender_name, NULL); } + else + { + if (sender_name == NULL || + !g_strcmp0 (sender_name, dee_peer_get_swarm_leader (priv->swarm))) + { + // leader sent an invalid transaction? + // let's just invalidate ourselves + g_warning ("Errornous transaction came from swarm leader, re-syncing model."); + on_invalidate (self); + } + } g_variant_unref (transaction); g_variant_unref (aav); === modified file 'tests/Makefile.am' --- tests/Makefile.am 2012-03-12 10:24:04 +0000 +++ tests/Makefile.am 2012-11-09 12:25:03 +0000 @@ -68,6 +68,7 @@ model-helper-introspect.c \ model-helper-remove3rows.c \ model-helper-replace.c \ + model-helper-resync3rows.c \ model-helper-schemaless.c \ $(NULL) @@ -120,6 +121,9 @@ model_helper_replace_SOURCES = model-helper-replace.c model_helper_replace_LDADD = $(test_dee_LDADD) +model_helper_resync3rows_SOURCES = model-helper-resync3rows.c +model_helper_resync3rows_LDADD = $(test_dee_LDADD) + peer_helper_1peer_SOURCES = peer-helper-1peer.c peer_helper_1peer_LDADD = $(test_dee_LDADD) === added file 'tests/model-helper-resync3rows.c' --- tests/model-helper-resync3rows.c 1970-01-01 00:00:00 +0000 +++ tests/model-helper-resync3rows.c 2012-11-09 12:25:03 +0000 @@ -0,0 +1,108 @@ +/* + * Copyright (C) 2012 Canonical Ltd + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 3 as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + * + * Authored by: + * Michal Hruby <[email protected]> + * + */ + +#include "config.h" +#include <glib.h> +#include <glib-object.h> + +#include <gtx.h> +#include <dee.h> + +static void +row_added (DeeModel *model, DeeModelIter *iter, gpointer data) +{ + gint *num_added = (gint*) data; + (*num_added)++; +} + +/* Expects a clone with 3 rows in it */ +gint +main (gint argc, gchar *argv[]) +{ + DeeModel *model; + DeeModelIter *iter; + gint num_added; + + g_type_init (); + + g_set_prgname ("model-helper"); + + if (argc == 2) + model = dee_shared_model_new (argv[1]); + else + model = dee_shared_model_new_for_peer ((DeePeer*) dee_client_new (argv[1])); + + num_added = 0; + g_signal_connect (model, "row-added", G_CALLBACK (row_added), &num_added); + + if (gtx_wait_for_signal (G_OBJECT (model), 10000, "notify::synchronized", NULL)) + g_error ("Helper model timed out waiting for 'ready' signal"); + + g_assert_cmpint (dee_model_get_n_rows (model), ==, 3); + + iter = dee_model_get_iter_at_row (model, 0); + g_assert_cmpint (dee_model_get_int32 (model, iter, 0), == , 0); + g_assert_cmpstr (dee_model_get_string (model, iter, 1), == , "zero"); + + iter = dee_model_get_iter_at_row (model, 1); + g_assert_cmpint (dee_model_get_int32 (model, iter, 0), == , 1); + g_assert_cmpstr (dee_model_get_string (model, iter, 1), == , "one"); + + iter = dee_model_get_iter_at_row (model, 2); + g_assert_cmpint (dee_model_get_int32 (model, iter, 0), == , 2); + g_assert_cmpstr (dee_model_get_string (model, iter, 1), == , "two"); + + /* The swarm leader goes away and later reappears, + * swarm-leader prop should toggle */ + if (gtx_wait_for_signal (G_OBJECT (dee_shared_model_get_peer (DEE_SHARED_MODEL (model))), 10000, "notify::swarm-leader", NULL)) + g_error ("Helper model timed out waiting for 'swarm-leader' notification"); + + if (!dee_shared_model_is_leader (DEE_SHARED_MODEL (model))) + g_error ("Helper didn't become leader"); + + if (gtx_wait_for_signal (G_OBJECT (dee_shared_model_get_peer (DEE_SHARED_MODEL (model))), 10000, "notify::swarm-leader", NULL)) + g_error ("Helper model timed out waiting for 'swarm-leader' notification"); + + if (dee_shared_model_is_leader (DEE_SHARED_MODEL (model))) + g_error ("Helper didn't loose swarm leadership"); + + /* And let's wait for synchronization again */ + if (gtx_wait_for_signal (G_OBJECT (model), 10000, "notify::synchronized", NULL)) + g_error ("Helper model timed out waiting for 'ready' signal"); + + g_assert_cmpint (dee_model_get_n_rows (model), ==, 3); + + iter = dee_model_get_iter_at_row (model, 0); + g_assert_cmpint (dee_model_get_int32 (model, iter, 0), == , 0); + g_assert_cmpstr (dee_model_get_string (model, iter, 1), == , "zero"); + + iter = dee_model_get_iter_at_row (model, 1); + g_assert_cmpint (dee_model_get_int32 (model, iter, 0), == , 1); + g_assert_cmpstr (dee_model_get_string (model, iter, 1), == , "one"); + + iter = dee_model_get_iter_at_row (model, 2); + g_assert_cmpint (dee_model_get_int32 (model, iter, 0), == , 2); + g_assert_cmpstr (dee_model_get_string (model, iter, 1), == , "two"); + + gtx_assert_last_unref (model); + g_assert_cmpint (num_added, >, 3); + + return 0; +} === modified file 'tests/peer-helper-1peer.c' --- tests/peer-helper-1peer.c 2012-08-10 10:56:44 +0000 +++ tests/peer-helper-1peer.c 2012-11-09 12:25:03 +0000 @@ -43,7 +43,8 @@ gint main (gint argc, gchar *argv[]) { - DeePeer *peer; + DeePeer *peer; + unsigned num_peers; g_type_init (); @@ -66,7 +67,10 @@ g_assert_cmpint (1, ==, n_peers); /* Listing of peers includes also self */ - g_assert_cmpint (2, ==, g_strv_length (dee_peer_list_peers (peer))); + /* Listing of peers is in flaky state atm (should == 2), see lp:1076971 */ + num_peers = g_strv_length (dee_peer_list_peers (peer)); + g_assert_cmpint (2, >=, num_peers); + g_assert_cmpint (1, <=, num_peers); return 0; } === modified file 'tests/test-model-interactions.c' --- tests/test-model-interactions.c 2012-04-05 11:44:38 +0000 +++ tests/test-model-interactions.c 2012-11-09 12:25:03 +0000 @@ -54,11 +54,12 @@ static void test_add_clear (Fixture *fix, gconstpointer data); static void test_row_inserted (Fixture *fix, gconstpointer data); static void test_schemaless_leader (Fixture *fix, gconstpointer data); -static void test_introspect (Fixture *fix, gconstpointer data); +static void test_introspect (Fixture *fix, gconstpointer data); static void test_ownership_stealing (Fixture *fix, gconstpointer data); static void test_remote_append (Fixture *fix, gconstpointer data); static void test_disabled_writes (Fixture *fix, gconstpointer data); static void test_commit_before_clone (Fixture *fix, gconstpointer data); +static void test_force_resync (Fixture *fix, gconstpointer data); void test_model_interactions_create_suite (void) @@ -74,7 +75,7 @@ g_test_add (DOMAIN"/RowChanged", Fixture, 0, model_setup, test_row_changed, model_teardown); g_test_add (DOMAIN"/RowRemoved", Fixture, 0, - model_setup, test_row_removed, model_teardown); + model_setup, test_row_removed, model_teardown); g_test_add (DOMAIN"/Clear", Fixture, 0, model_setup, test_model_clear, model_teardown); g_test_add (DOMAIN"/ClearAndAdd", Fixture, 0, @@ -99,6 +100,8 @@ model_setup_null, test_disabled_writes, model_teardown_null); g_test_add (DOMAIN"/CommitBeforeClone", Fixture, 0, model_setup, test_commit_before_clone, model_teardown); + g_test_add (DOMAIN"/ForceResync", Fixture, 0, + model_setup, test_force_resync, model_teardown); } static void @@ -153,7 +156,7 @@ /* Check that convenience getter now reports TRUE */ g_assert_cmpint (0, !=, dee_shared_model_is_synchronized (DEE_SHARED_MODEL (fix->model))); - if (!gtx_wait_for_signal (G_OBJECT (fix->model), TIMEOUT, "notify::synchronized", &pspec)) + if (!gtx_wait_for_signal (G_OBJECT (fix->model), TIMEOUT, "notify::synchronized", NULL)) { g_critical ("Model changed synchronization state twice"); g_param_spec_unref (pspec); @@ -772,3 +775,74 @@ g_assert_cmpint (dee_model_get_n_rows (fix->model), ==, 3); } +static void +test_force_resync (Fixture *fix, gconstpointer data) +{ + GPid pid; + GMainLoop *ml; + gpointer *wait_data; + DeePeer *leader_peer; + + if (gtx_wait_for_signal (G_OBJECT (fix->model), TIMEOUT, "notify::synchronized", NULL)) + g_critical ("Model never emitted 'ready' signal"); + + _add3rows (fix->model); + + /* need special handling of synchronization */ + + g_spawn_async (TESTDIR, + MODEL_HELPER (resync3rows, MODEL_NAME), + NULL, + G_SPAWN_DO_NOT_REAP_CHILD | G_SPAWN_SEARCH_PATH, + NULL, + NULL, + &pid, + NULL); + + ml = g_main_loop_new (NULL, FALSE); + wait_data = g_new0 (gpointer, 2); + wait_data[0] = ml; + wait_data[1] = GINT_TO_POINTER (837); + + g_child_watch_add (pid, child_quit, wait_data); + + /* We don't really have a better way atm. Peer discovery doesn't work + * with latest changes done to DBus (no watching of method calls from other + * processes) */ + gtx_yield_main_loop (500); /* 500ms yield */ + + /* Peer should be synced now, let's throw away our model */ + gtx_assert_last_unref (fix->model); + + gtx_yield_main_loop (50); /* 50ms yield */ + + /* And re-own it */ + leader_peer = DEE_PEER (g_object_new (DEE_TYPE_PEER, + "swarm-name", MODEL_NAME, + "swarm-owner", TRUE, NULL)); + fix->model = dee_shared_model_new_for_peer (leader_peer); + dee_model_set_schema (fix->model, "i", "s", NULL); + g_assert (DEE_IS_MODEL (fix->model)); + + if (gtx_wait_for_signal (G_OBJECT (fix->model), TIMEOUT, "notify::synchronized", NULL)) + g_critical ("Model never emitted 'ready' signal"); + + _add3rows (fix->model); + + /* don't wait indefinitely for the child */ + g_timeout_add (5000, (GSourceFunc) quit_loop, ml); + + g_main_loop_run (ml); + + if (GPOINTER_TO_INT (wait_data[1]) == 837) + { + g_critical ("Model helper timed out"); + } + else if (GPOINTER_TO_INT (wait_data[1]) != 0) + { + g_critical ("Model helper returned error"); + } + + g_assert_cmpint (dee_model_get_n_rows (fix->model), ==, 3); +} + -- To unsubscribe, e-mail: [email protected] For additional commands, e-mail: [email protected]
