Ticket #884: ticket884_handle_new_changes_with_type_modified_v2.diff
| File ticket884_handle_new_changes_with_type_modified_v2.diff, 11.4 KB (added by dgollub, 4 years ago) |
|---|
-
opensync/engine/opensync_mapping_engine.c
46 46 #include "opensync_mapping_engine_internals.h" 47 47 48 48 49 OSyncMappingEngine *osync_mapping_engine_new(OSyncObjEngine *parent, OSyncMapping *mapping, OSync Error **error)49 OSyncMappingEngine *osync_mapping_engine_new(OSyncObjEngine *parent, OSyncMapping *mapping, OSyncChangeType initial_changetype, OSyncError **error) 50 50 { 51 osync_trace(TRACE_ENTRY, "%s(%p, %p, % p)", __func__, parent, mapping, error);51 osync_trace(TRACE_ENTRY, "%s(%p, %p, %d, %p)", __func__, parent, mapping, initial_changetype, error); 52 52 53 53 osync_assert(parent); 54 54 osync_assert(mapping); … … 76 76 if (!entry_engine) 77 77 goto error_free_engine; 78 78 79 OSyncChange *change = osync_entry_engine_get_change(entry_engine); 80 osync_change_set_changetype(change, initial_changetype); 81 79 82 engine->entries = g_list_append(engine->entries, entry_engine); 80 83 } 81 84 … … 357 360 if (newChangeType == OSYNC_CHANGE_TYPE_ADDED && (existChangeType != OSYNC_CHANGE_TYPE_DELETED && existChangeType != OSYNC_CHANGE_TYPE_UNKNOWN)) { 358 361 osync_trace(TRACE_INTERNAL, "Updating change type to MODIFIED"); 359 362 osync_change_set_changetype(existChange, OSYNC_CHANGE_TYPE_MODIFIED); 360 /* Only adapt the change to ADDED if the existing Change got deleted. Don't update it to ADDED if existChangeType is UNKOWN.363 /* Only adapt the change to ADDED if the existing Change got deleted. 361 364 The exitChangeType is at least also UNKOWN if the file-sync has only one modified entry. */ 362 } else if (newChangeType == OSYNC_CHANGE_TYPE_MODIFIED && (existChangeType == OSYNC_CHANGE_TYPE_DELETED)) { 365 } else if (newChangeType == OSYNC_CHANGE_TYPE_MODIFIED && 366 (existChangeType == OSYNC_CHANGE_TYPE_DELETED || existChangeType == OSYNC_CHANGE_TYPE_UNKNOWN)) { 363 367 osync_trace(TRACE_INTERNAL, "Updating change type to ADDED"); 364 368 osync_change_set_changetype(existChange, OSYNC_CHANGE_TYPE_ADDED); 365 369 } … … 425 429 if (leftchange == NULL) 426 430 continue; 427 431 428 if (osync_change_get_changetype(leftchange) == OSYNC_CHANGE_TYPE_UNKNOWN) 432 if (osync_change_get_changetype(leftchange) == OSYNC_CHANGE_TYPE_UNMODIFIED 433 || osync_change_get_changetype(leftchange) == OSYNC_CHANGE_TYPE_UNKNOWN) 429 434 continue; 430 435 431 436 osync_mapping_engine_set_master(engine, leftentry); … … 437 442 if (rightchange == NULL) 438 443 continue; 439 444 440 if (osync_change_get_changetype(rightchange) == OSYNC_CHANGE_TYPE_UNKNOWN) 445 if (osync_change_get_changetype(rightchange) == OSYNC_CHANGE_TYPE_UNMODIFIED 446 || osync_change_get_changetype(rightchange) == OSYNC_CHANGE_TYPE_UNKNOWN) 441 447 continue; 442 448 443 449 if (osync_change_compare(leftchange, rightchange) != OSYNC_CONV_DATA_SAME) { -
opensync/engine/opensync_obj_engine.c
69 69 osync_mapping_entry_unref(mapping_entry); 70 70 } 71 71 72 OSyncMappingEngine *mapping_engine = osync_mapping_engine_new(engine, mapping, error);72 OSyncMappingEngine *mapping_engine = osync_mapping_engine_new(engine, mapping, OSYNC_CHANGE_TYPE_UNKNOWN, error); 73 73 if (!mapping_engine) 74 74 goto error_free_mapping; 75 75 osync_mapping_unref(mapping); … … 549 549 for (i = 0; i < osync_mapping_table_num_mappings(engine->mapping_table); i++) { 550 550 OSyncMapping *mapping = osync_mapping_table_nth_mapping(engine->mapping_table, i); 551 551 552 OSyncMappingEngine *mapping_engine = osync_mapping_engine_new(engine, mapping, error);552 OSyncMappingEngine *mapping_engine = osync_mapping_engine_new(engine, mapping, OSYNC_CHANGE_TYPE_UNMODIFIED, error); 553 553 if (!mapping_engine) 554 554 goto error; 555 555 … … 865 865 OSyncMappingEntryEngine *entry = m->data; 866 866 OSyncChange *change = entry->change; 867 867 868 if (!change) 868 osync_assert(change); 869 870 if (osync_change_get_changetype(change) == OSYNC_CHANGE_TYPE_UNMODIFIED) 869 871 continue; 870 872 871 873 if (!osync_client_proxy_read(sinkengine->proxy, _osync_obj_engine_read_ignored_callback, sinkengine, change, error)) … … 940 942 OSyncMappingEntryEngine *entry_engine = e->data; 941 943 osync_assert(entry_engine); 942 944 945 if (osync_change_get_changetype(entry_engine->change) == OSYNC_CHANGE_TYPE_UNMODIFIED) 946 continue; 947 943 948 /* Merger - Save the entire xml and demerge */ 944 949 /* TODO: is here the right place to save the xml???? */ 945 950 if (osync_group_get_merger_enabled(osync_engine_get_group(engine->parent)) && -
opensync/engine/opensync_mapping_entry_engine.c
50 50 engine->sink_engine = sink_engine; 51 51 52 52 engine->objengine = objengine; 53 53 54 engine->change = osync_change_new(error); 55 if (!engine->change) 56 goto error_free; 57 54 58 engine->mapping_engine = osync_mapping_engine_ref(mapping_engine); 55 59 engine->entry = osync_mapping_entry_ref(entry); 56 60 … … 60 64 osync_trace(TRACE_EXIT, "%s: %p", __func__, engine); 61 65 return engine; 62 66 67 error_free: 68 osync_entry_engine_unref(engine); 63 69 error: 64 70 osync_trace(TRACE_EXIT_ERROR, "%s: %s", __func__, osync_error_print(error)); 65 71 return NULL; -
opensync/engine/opensync_mapping_engine_internals.h
34 34 osync_bool synced; 35 35 }; 36 36 37 OSyncMappingEngine *osync_mapping_engine_new(OSyncObjEngine *parent, OSyncMapping *mapping, OSync Error **error);37 OSyncMappingEngine *osync_mapping_engine_new(OSyncObjEngine *parent, OSyncMapping *mapping, OSyncChangeType initial_changetype, OSyncError **error); 38 38 OSyncMappingEngine *osync_mapping_engine_ref(OSyncMappingEngine *engine); 39 39 void osync_mapping_engine_unref(OSyncMappingEngine *engine); 40 40 -
tests/mock-plugin/mock_sync.c
284 284 285 285 OSyncChangeType type = osync_hashtable_get_changetype(directory->hashtable, change); 286 286 287 osync_change_set_changetype(change, type); 287 /* simulate plugins which can't determine if a change is ADDED and need 288 to call always MODIFIED instead. This should be correctly handled by 289 the mapping engine. See #884 290 */ 291 if (mock_get_error(info->memberid, "MOCK_SYNC_ALWAYS_CHANGETYPE_MODIFIED")) 292 osync_change_set_changetype(change, OSYNC_CHANGE_TYPE_MODIFIED); 293 else 294 osync_change_set_changetype(change, type); 295 288 296 osync_hashtable_update_change(directory->hashtable, change); 289 297 290 298 if (type == OSYNC_CHANGE_TYPE_UNMODIFIED) { … … 413 421 osync_trace(TRACE_EXIT_ERROR, "COMMIT_TIMEOUT (mock-sync)!"); 414 422 return; 415 423 } 424 425 if (mock_get_error(info->memberid, "MOCK_SYNC_EXPECT_COMMIT_ALWAYS_ADDED")) { 426 /* for testcase: engine_getchanges_fixed_chtype_modified */ 427 osync_assert(osync_change_get_changetype(change) == OSYNC_CHANGE_TYPE_ADDED); 428 } 416 429 417 430 if (!mock_write(data, info, ctx, change)) { 418 431 osync_trace(TRACE_EXIT_ERROR, "%s", __func__); -
tests/support.c
25 25 unsetenv("MAINSINK_CONNECT"); 26 26 27 27 unsetenv("OSYNC_NOMEMORY"); 28 unsetenv("MOCK_SYNC_EXPECT_COMMIT_ALWAYS_ADDED"); 29 unsetenv("MOCK_SYNC_ALWAYS_CHANGETYPE_MODIFIED"); 28 30 } 29 31 30 32 -
tests/engine-tests/check_engine.c
11 11 #include "opensync/engine/opensync_engine_internals.h" 12 12 #include "opensync/engine/opensync_engine_private.h" 13 13 14 #include "opensync/group/opensync_group_internals.h" 14 15 #include "opensync/group/opensync_member_internals.h" 15 16 #include "opensync/client/opensync_client_internals.h" 16 17 … … 1985 1986 } 1986 1987 END_TEST 1987 1988 1989 /* 1990 * Testing following secnarios: 1991 * 1992 * Member A: will _never_ report changes as ADDED, instead those get reported 1993 * as MODIFIED. DELETED is supported as usual. 1994 * 1995 * Member B: supports reporting of ADDED, MODIFIED and DELETED changetypes. 1996 * 1997 * 0. Very first sync, no previous mappings are available. 1998 * 1. Member A reports _new_ change "testdata" as MODIFIED (not ADDED!) 1999 * Expected result: Member B commit function sees "testdata" change as 2000 * ADDED changetype. NOT modified. 2001 * 2. Member A rerpots _modified_ change "testdata" as MODIFIED (as regular) 2002 * Expected result: Member B commit function sees "testdata" change as 2003 * MODIFIED changetype (as regular). 2004 * 2005 * Regression testing: #884 2006 */ 2007 START_TEST (engine_getchanges_fixed_chtype_modified) 2008 { 2009 char *testbed = setup_testbed("sync"); 2010 char *formatdir = g_strdup_printf("%s/formats", testbed); 2011 char *plugindir = g_strdup_printf("%s/plugins", testbed); 2012 2013 OSyncError *error = NULL; 2014 OSyncGroup *group = osync_group_new(&error); 2015 osync_group_set_schemadir(group, testbed); 2016 osync_group_load(group, "configs/group", &error); 2017 fail_unless(error == NULL, NULL); 2018 2019 /* Engine Init */ 2020 OSyncEngine *engine = osync_engine_new(group, &error); 2021 fail_unless(engine != NULL, NULL); 2022 fail_unless(error == NULL, NULL); 2023 2024 osync_engine_set_schemadir(engine, testbed); 2025 osync_engine_set_plugindir(engine, plugindir); 2026 osync_engine_set_formatdir(engine, formatdir); 2027 2028 fail_unless(osync_engine_initialize(engine, &error), NULL); 2029 fail_unless(error == NULL, NULL); 2030 /* End of Engine Init */ 2031 2032 /* Playground */ 2033 2034 2035 /* Step 1: Create new entry which gets reported as MODIFIED, 2036 and retrieved as ADDED */ 2037 2038 /* Tune Member A (1st) to MODIFIED-only reporting plugin */ 2039 setenv("MOCK_SYNC_ALWAYS_CHANGETYPE_MODIFIED", "1", TRUE); 2040 2041 /* Tune Member B (2nd) to exepcted ADDED reproted change */ 2042 setenv("MOCK_SYNC_EXPECT_COMMIT_ALWAYS_ADDED", "2", TRUE); 2043 osync_testing_system_abort("cp testdata data1/testdata"); 2044 2045 fail_unless(synchronize_once(engine, &error), NULL); 2046 fail_unless(error == NULL, NULL); 2047 fail_unless(osync_testing_diff("data1", "data2"), NULL); 2048 /* (mock-sync plugin would fail if unexpected changetype got send */ 2049 2050 /* Step 2: Modifed change which gets reported as MODIFIED and 2051 retrieved as MODIFIED. Don't expected ADDED for Member B (2nd) */ 2052 unsetenv("MOCK_SYNC_EXPECT_COMMIT_ALWAYS_ADDED"); 2053 2054 osync_testing_system_abort("cp new_data1 data1/testdata"); 2055 2056 fail_unless(synchronize_once(engine, &error), NULL); 2057 fail_unless(error == NULL, NULL); 2058 fail_unless(osync_testing_diff("data1", "data2"), NULL); 2059 2060 /* End of playground */ 2061 2062 /* Finalize */ 2063 osync_engine_unref(engine); 2064 osync_group_unref(group); 2065 2066 g_free(formatdir); 2067 g_free(plugindir); 2068 2069 destroy_testbed(testbed); 2070 } 2071 END_TEST 2072 2073 1988 2074 Suite *engine_suite(void) 1989 2075 { 1990 2076 Suite *s = suite_create("Engine"); … … 2004 2090 2005 2091 //batch commit 2006 2092 //connect problem 2093 2007 2094 //get_changes problem 2095 create_case(s, "engine_getchanges_fixed_chtype_modified", engine_getchanges_fixed_chtype_modified); 2008 2096 2009 2097 return s; 2010 2098 }
