From: <svn...@op...> - 2009-03-29 14:40:28
|
Author: dgollub Date: Sun Mar 29 16:40:22 2009 New Revision: 5422 URL: http://www.opensync.org/changeset/5422 Log: Added "osync_bool slowsync" to the connect_done plugin sink function paramter list. To determine the current sync mode (slow-/fast-sync). Also fixed a bug where connect_done() got called with the wrong sync mode. Due to the sepeartion of Client and ClientProxy and the missing update of the Sync Mode the connect_done() got called with fast-sync even if the engine was supposed to do a slow-sync and would call slow-ysnc with get_changes(). Added regression testcase inside mock-sync. Modified: trunk/opensync/client/opensync_client.c trunk/opensync/client/opensync_client_proxy.c trunk/opensync/client/opensync_client_proxy_internals.h trunk/opensync/engine/opensync_engine.c trunk/opensync/engine/opensync_obj_engine.c trunk/opensync/plugin/opensync_objtype_sink.c trunk/opensync/plugin/opensync_objtype_sink.h trunk/tests/mock-plugin/mock_sync.c trunk/tests/mock-plugin/mock_sync.h Modified: trunk/opensync/client/opensync_client.c ============================================================================== --- trunk/opensync/client/opensync_client.c Sun Mar 29 16:14:48 2009 (r5421) +++ trunk/opensync/client/opensync_client.c Sun Mar 29 16:40:22 2009 (r5422) @@ -969,19 +969,19 @@ osync_message_unref(reply); } else { - /* set slowsync. - otherwise disable slowsync - to avoid slowsyncs every time with the same initiliazed engine - without finalizing the engine the next sync with the same engine would be again a slow-sync. - (unittest: sync - testcases: sync_easy_new_del, sync_easy_new_mapping) */ - if (slowsync) - osync_objtype_sink_set_slowsync(sink, TRUE); - else - osync_objtype_sink_set_slowsync(sink, FALSE); + /* set slowsync. + otherwise disable slowsync - to avoid slowsyncs every time with the same initiliazed engine + without finalizing the engine the next sync with the same engine would be again a slow-sync. + (unittest: sync - testcases: sync_easy_new_del, sync_easy_new_mapping) */ + if (slowsync) + osync_objtype_sink_set_slowsync(sink, TRUE); + else + osync_objtype_sink_set_slowsync(sink, FALSE); context = _create_context(client, message, _osync_client_connect_callback, NULL, error); if (!context) goto error; - + osync_plugin_info_set_sink(client->plugin_info, sink); osync_objtype_sink_connect(sink, client->plugin_info, context); @@ -1001,6 +1001,7 @@ static osync_bool _osync_client_handle_connect_done(OSyncClient *client, OSyncMessage *message, OSyncError **error) { char *objtype = NULL; + int slowsync; OSyncMessage *reply = NULL; OSyncObjTypeSink *sink = NULL; OSyncContext *context = NULL; @@ -1008,7 +1009,8 @@ osync_trace(TRACE_ENTRY, "%s(%p, %p, %p)", __func__, client, message, error); osync_message_read_string(message, &objtype); - osync_trace(TRACE_INTERNAL, "Searching sink for %s", objtype); + osync_message_read_int(message, &slowsync); + osync_trace(TRACE_INTERNAL, "Searching sink for %s (slowsync: %d)", objtype, slowsync); if (objtype) { sink = osync_plugin_info_find_objtype(client->plugin_info, objtype); @@ -1036,6 +1038,13 @@ context = _create_context(client, message, _osync_client_connect_done_callback, NULL, error); if (!context) goto error; + + /* set slowsync (again) if the slow-sync got requested during the connect() call + of a member - and not during frontend/engine itself (e.g. anchor mismatch). */ + if (slowsync) + osync_objtype_sink_set_slowsync(sink, TRUE); + else + osync_objtype_sink_set_slowsync(sink, FALSE); osync_plugin_info_set_sink(client->plugin_info, sink); osync_objtype_sink_connect_done(sink, client->plugin_info, context); Modified: trunk/opensync/client/opensync_client_proxy.c ============================================================================== --- trunk/opensync/client/opensync_client_proxy.c Sun Mar 29 16:14:48 2009 (r5421) +++ trunk/opensync/client/opensync_client_proxy.c Sun Mar 29 16:40:22 2009 (r5422) @@ -1406,7 +1406,6 @@ osync_message_write_string(message, objtype); osync_message_write_int(message, slowsync); - if (!osync_queue_send_message_with_timeout(proxy->outgoing, proxy->incoming, message, timeout, error)) goto error_free_message; @@ -1425,7 +1424,7 @@ return FALSE; } -osync_bool osync_client_proxy_connect_done(OSyncClientProxy *proxy, sync_done_cb callback, void *userdata, const char *objtype, OSyncError **error) +osync_bool osync_client_proxy_connect_done(OSyncClientProxy *proxy, sync_done_cb callback, void *userdata, const char *objtype, osync_bool slowsync, OSyncError **error) { int timeout = 0; callContext *ctx = NULL; @@ -1456,6 +1455,7 @@ osync_message_set_handler(message, _osync_client_proxy_connect_done_handler, ctx); osync_message_write_string(message, objtype); + osync_message_write_int(message, slowsync); if (!osync_queue_send_message_with_timeout(proxy->outgoing, proxy->incoming, message, timeout, error)) goto error_free_message; Modified: trunk/opensync/client/opensync_client_proxy_internals.h ============================================================================== --- trunk/opensync/client/opensync_client_proxy_internals.h Sun Mar 29 16:14:48 2009 (r5421) +++ trunk/opensync/client/opensync_client_proxy_internals.h Sun Mar 29 16:40:22 2009 (r5422) @@ -64,7 +64,7 @@ OSyncObjTypeSink *osync_client_proxy_find_objtype_sink(OSyncClientProxy *proxy, const char *objtype); OSYNC_TEST_EXPORT osync_bool osync_client_proxy_connect(OSyncClientProxy *proxy, connect_cb callback, void *userdata, const char *objtype, osync_bool slowsync, OSyncError **error); -OSYNC_TEST_EXPORT osync_bool osync_client_proxy_connect_done(OSyncClientProxy *proxy, connect_done_cb callback, void *userdata, const char *objtype, OSyncError **error); +OSYNC_TEST_EXPORT osync_bool osync_client_proxy_connect_done(OSyncClientProxy *proxy, connect_done_cb callback, void *userdata, const char *objtype, osync_bool slowsync, OSyncError **error); OSYNC_TEST_EXPORT osync_bool osync_client_proxy_disconnect(OSyncClientProxy *proxy, disconnect_cb callback, void *userdata, const char *objtype, OSyncError **error); osync_bool osync_client_proxy_read(OSyncClientProxy *proxy, read_cb callback, void *userdata, OSyncChange *change, OSyncError **error); Modified: trunk/opensync/engine/opensync_engine.c ============================================================================== --- trunk/opensync/engine/opensync_engine.c Sun Mar 29 16:14:48 2009 (r5421) +++ trunk/opensync/engine/opensync_engine.c Sun Mar 29 16:40:22 2009 (r5422) @@ -1922,7 +1922,7 @@ /* Now we send connect_done to the main sink */ for (o = engine->proxies; o; o = o->next) { OSyncClientProxy *proxy = o->data; - if (!osync_client_proxy_connect_done(proxy, _osync_engine_connect_done_callback, engine, NULL, &locerror)) + if (!osync_client_proxy_connect_done(proxy, _osync_engine_connect_done_callback, engine, NULL, FALSE, &locerror)) goto error; } Modified: trunk/opensync/engine/opensync_obj_engine.c ============================================================================== --- trunk/opensync/engine/opensync_obj_engine.c Sun Mar 29 16:14:48 2009 (r5421) +++ trunk/opensync/engine/opensync_obj_engine.c Sun Mar 29 16:40:22 2009 (r5422) @@ -958,7 +958,7 @@ for (p = engine->active_sink_engines; p; p = p->next) { sinkengine = p->data; - if (!osync_client_proxy_connect_done(sinkengine->proxy, _osync_obj_engine_connect_done_callback, sinkengine, engine->objtype, error)) + if (!osync_client_proxy_connect_done(sinkengine->proxy, _osync_obj_engine_connect_done_callback, sinkengine, engine->objtype, engine->slowsync, error)) goto error; osync_sink_engine_ref(sinkengine); // Note that connect_done callback has a reference } Modified: trunk/opensync/plugin/opensync_objtype_sink.c ============================================================================== --- trunk/opensync/plugin/opensync_objtype_sink.c Sun Mar 29 16:14:48 2009 (r5421) +++ trunk/opensync/plugin/opensync_objtype_sink.c Sun Mar 29 16:40:22 2009 (r5422) @@ -396,7 +396,7 @@ if (!functions.connect_done) osync_context_report_success(ctx); else - functions.connect_done(sink, info, ctx, osync_objtype_sink_get_userdata(sink)); + functions.connect_done(sink, info, ctx, osync_objtype_sink_get_slowsync(sink), osync_objtype_sink_get_userdata(sink)); osync_trace(TRACE_EXIT, "%s", __func__); } Modified: trunk/opensync/plugin/opensync_objtype_sink.h ============================================================================== --- trunk/opensync/plugin/opensync_objtype_sink.h Sun Mar 29 16:14:48 2009 (r5421) +++ trunk/opensync/plugin/opensync_objtype_sink.h Sun Mar 29 16:40:22 2009 (r5422) @@ -38,7 +38,7 @@ typedef osync_bool (* OSyncSinkReadFn) (OSyncObjTypeSink *sink, OSyncPluginInfo *info, OSyncContext *ctx, OSyncChange *change, void *data); typedef void (* OSyncSinkBatchCommitFn) (OSyncObjTypeSink *sink, OSyncPluginInfo *info, OSyncContext *ctx, OSyncContext **, OSyncChange **changes, void *data); typedef void (* OSyncSinkSyncDoneFn) (OSyncObjTypeSink *sink, OSyncPluginInfo *info, OSyncContext *ctx, void *data); -typedef void (* OSyncSinkConnectDoneFn) (OSyncObjTypeSink *sink, OSyncPluginInfo *info, OSyncContext *ctx, void *data); +typedef void (* OSyncSinkConnectDoneFn) (OSyncObjTypeSink *sink, OSyncPluginInfo *info, OSyncContext *ctx, osync_bool slow_sync, void *data); typedef struct OSyncObjTypeSinkFunctions { OSyncSinkConnectFn connect; Modified: trunk/tests/mock-plugin/mock_sync.c ============================================================================== --- trunk/tests/mock-plugin/mock_sync.c Sun Mar 29 16:14:48 2009 (r5421) +++ trunk/tests/mock-plugin/mock_sync.c Sun Mar 29 16:40:22 2009 (r5422) @@ -101,11 +101,13 @@ return; } -static void mock_connect_done(OSyncObjTypeSink *sink, OSyncPluginInfo *info, OSyncContext *ctx, void *data) +static void mock_connect_done(OSyncObjTypeSink *sink, OSyncPluginInfo *info, OSyncContext *ctx, osync_bool slow_sync, void *data) { - osync_trace(TRACE_ENTRY, "%s(%p, %p, %p, %p)", __func__, sink, info, ctx, data); + osync_trace(TRACE_ENTRY, "%s(%p, %p, %p, %i, %p)", __func__, sink, info, ctx, slow_sync, data); MockDir *dir = data; + dir->connect_done_slowsync = slow_sync; + if (mock_get_error(info->memberid, "CONNECT_DONE_ERROR")) { osync_context_report_error(ctx, OSYNC_ERROR_EXPECTED, "Triggering CONNECT_DONE_ERROR error"); return; @@ -388,6 +390,12 @@ osync_assert(dir->connect_done == TRUE); dir->connect_done = FALSE; + /* Validate that connect_doene and get_changes slow_sync + * is the same. To avoid mix-up of a "late slow-sync". + */ + if (!mock_get_error(info->memberid, "MAINSINK_CONNECT")) + osync_assert(dir->connect_done_slowsync == slow_sync); + if (mock_get_error(info->memberid, "GET_CHANGES_ERROR")) { osync_context_report_error(ctx, OSYNC_ERROR_EXPECTED, "Triggering GET_CHANGES_ERROR error"); osync_trace(TRACE_EXIT_ERROR, "%s - Triggering GET_CHANGES error", __func__); Modified: trunk/tests/mock-plugin/mock_sync.h ============================================================================== --- trunk/tests/mock-plugin/mock_sync.h Sun Mar 29 16:14:48 2009 (r5421) +++ trunk/tests/mock-plugin/mock_sync.h Sun Mar 29 16:40:22 2009 (r5422) @@ -67,6 +67,7 @@ mock_env *env; osync_bool committed_all; osync_bool connect_done; + osync_bool connect_done_slowsync; } MockDir; #endif //_MOCK_PLUGIN_H |