From: <dg...@su...> - 2009-01-10 16:54:35
|
Author: dgollub Date: Sat Jan 10 17:53:57 2009 New Revision: 5068 URL: http://www.opensync.org/changeset/5068 Log: Introduce engine command/event PREPARE_WRITE/PREPRED_WRITE. This engine command is intended to seperate the engine WRITE command from demerge and conversion tasks. Modified: trunk/opensync/engine/opensync_engine.c trunk/opensync/engine/opensync_engine.h trunk/opensync/engine/opensync_engine_private.h trunk/opensync/engine/opensync_obj_engine.c trunk/tests/support.c trunk/tests/support.h Modified: trunk/opensync/engine/opensync_engine.c ============================================================================== --- trunk/opensync/engine/opensync_engine.c Sat Jan 10 17:16:11 2009 (r5067) +++ trunk/opensync/engine/opensync_engine.c Sat Jan 10 17:53:57 2009 (r5068) @@ -1012,6 +1012,27 @@ } +static void _osync_engine_generate_prepared_write_event(OSyncEngine *engine) +{ + if (osync_bitcount(engine->obj_errors | engine->obj_prepared_write) == g_list_length(engine->object_engines)) { + if (osync_bitcount(engine->obj_errors)) { + OSyncError *locerror = NULL; + osync_error_set(&locerror, OSYNC_ERROR_GENERIC, "At least one object engine failed while preparing the write event. Aborting"); + osync_trace(TRACE_ERROR, "%s", osync_error_print(&locerror)); + osync_engine_set_error(engine, locerror); + osync_status_update_engine(engine, OSYNC_ENGINE_EVENT_ERROR, locerror); + osync_engine_event(engine, OSYNC_ENGINE_EVENT_ERROR); + //osync_error_unref(&locerror); + } else { + osync_status_update_engine(engine, OSYNC_ENGINE_EVENT_PREPARED_WRITE, NULL); + osync_engine_event(engine, OSYNC_ENGINE_EVENT_PREPARED_WRITE); + + } + } else + osync_trace(TRACE_INTERNAL, "Not yet: %i", osync_bitcount(engine->obj_errors | engine->obj_prepared_write)); + +} + static void _osync_engine_generate_written_event(OSyncEngine *engine) { if (osync_bitcount(engine->proxy_errors | engine->proxy_written) != g_list_length(engine->proxies)) @@ -1249,6 +1270,9 @@ case OSYNC_ENGINE_EVENT_MULTIPLIED: engine->obj_multiplied = engine->obj_multiplied | (0x1 << position); break; + case OSYNC_ENGINE_EVENT_PREPARED_WRITE: + engine->obj_prepared_write = engine->obj_prepared_write | (0x1 << position); + break; case OSYNC_ENGINE_EVENT_WRITTEN: engine->obj_written = engine->obj_written | (0x1 << position); break; @@ -1287,6 +1311,9 @@ case OSYNC_ENGINE_EVENT_MULTIPLIED: _osync_engine_generate_multiplied_event(engine); break; + case OSYNC_ENGINE_EVENT_PREPARED_WRITE: + _osync_engine_generate_prepared_write_event(engine); + break; case OSYNC_ENGINE_EVENT_WRITTEN: _osync_engine_generate_written_event(engine); break; @@ -1574,6 +1601,14 @@ goto error; } break; + case OSYNC_ENGINE_COMMAND_PREPARE_WRITE: + /* Now that we have multiplied the change, we prepare the write event. */ + for (o = engine->object_engines; o; o = o->next) { + OSyncObjEngine *objengine = o->data; + if (!osync_obj_engine_command(objengine, OSYNC_ENGINE_COMMAND_PREPARE_WRITE, &locerror)) + goto error; + } + break; case OSYNC_ENGINE_COMMAND_WRITE: case OSYNC_ENGINE_COMMAND_DISCONNECT: case OSYNC_ENGINE_COMMAND_SYNC_DONE: @@ -1714,6 +1749,15 @@ /* Now that we have multiplied the changes, we write the changes */ for (o = engine->object_engines; o; o = o->next) { OSyncObjEngine *objengine = o->data; + if (!osync_obj_engine_command(objengine, OSYNC_ENGINE_COMMAND_PREPARE_WRITE, &locerror)) + goto error; + } + + break; + case OSYNC_ENGINE_EVENT_PREPARED_WRITE: + /* Now that we have prepared the write event, we finally write the changes */ + for (o = engine->object_engines; o; o = o->next) { + OSyncObjEngine *objengine = o->data; if (!osync_obj_engine_command(objengine, OSYNC_ENGINE_COMMAND_WRITE, &locerror)) goto error; } @@ -1806,6 +1850,7 @@ engine->obj_mapped = 0; engine->obj_solved = 0; engine->obj_multiplied = 0; + engine->obj_prepared_write = 0; engine->obj_written = 0; engine->obj_sync_done = 0; @@ -2213,6 +2258,9 @@ case OSYNC_ENGINE_COMMAND_END_CONFLICTS: cmdstr = "END_CONFLICTS"; break; + case OSYNC_ENGINE_COMMAND_PREPARE_WRITE: + cmdstr = "PREPARE_WRITE"; + break; } return cmdstr; @@ -2259,6 +2307,9 @@ case OSYNC_ENGINE_EVENT_MULTIPLIED: eventstr = "MULTIPLIED"; break; + case OSYNC_ENGINE_EVENT_PREPARED_WRITE: + eventstr = "PREPARE_WRITE"; + break; } return eventstr; Modified: trunk/opensync/engine/opensync_engine.h ============================================================================== --- trunk/opensync/engine/opensync_engine.h Sat Jan 10 17:16:11 2009 (r5067) +++ trunk/opensync/engine/opensync_engine.h Sat Jan 10 17:53:57 2009 (r5068) @@ -71,7 +71,9 @@ /* Multiply all reported changes to all peers */ OSYNC_ENGINE_COMMAND_MULTIPLY, /* Check if all conflicts got solved */ - OSYNC_ENGINE_COMMAND_END_CONFLICTS + OSYNC_ENGINE_COMMAND_END_CONFLICTS, + /* Prepare write to peers */ + OSYNC_ENGINE_COMMAND_PREPARE_WRITE } OSyncEngineCmd; @@ -129,7 +131,9 @@ /** All reported records got mapped */ OSYNC_ENGINE_EVENT_MAPPED, /** Multiplying of all reported changes is completed */ - OSYNC_ENGINE_EVENT_MULTIPLIED + OSYNC_ENGINE_EVENT_MULTIPLIED, + /* Engine completed with preparing a write */ + OSYNC_ENGINE_EVENT_PREPARED_WRITE } OSyncEngineEvent; typedef enum { Modified: trunk/opensync/engine/opensync_engine_private.h ============================================================================== --- trunk/opensync/engine/opensync_engine_private.h Sat Jan 10 17:16:11 2009 (r5067) +++ trunk/opensync/engine/opensync_engine_private.h Sat Jan 10 17:53:57 2009 (r5068) @@ -124,6 +124,7 @@ int obj_mapped; int obj_solved; int obj_multiplied; + int obj_prepared_write; int obj_written; int obj_sync_done; Modified: trunk/opensync/engine/opensync_obj_engine.c ============================================================================== --- trunk/opensync/engine/opensync_obj_engine.c Sat Jan 10 17:16:11 2009 (r5067) +++ trunk/opensync/engine/opensync_obj_engine.c Sat Jan 10 17:53:57 2009 (r5068) @@ -1065,6 +1065,12 @@ osync_obj_engine_event(engine, OSYNC_ENGINE_EVENT_MULTIPLIED, *error); break; + case OSYNC_ENGINE_COMMAND_PREPARE_WRITE: + + /* TODO: PLACEHOLDER for demerge and conversion */ + + osync_obj_engine_event(engine, OSYNC_ENGINE_EVENT_PREPARED_WRITE, *error); + break; case OSYNC_ENGINE_COMMAND_WRITE: if (engine->conflicts) { osync_trace(TRACE_INTERNAL, "We still have conflict. Delaying write"); Modified: trunk/tests/support.c ============================================================================== --- trunk/tests/support.c Sat Jan 10 17:16:11 2009 (r5067) +++ trunk/tests/support.c Sat Jan 10 17:53:57 2009 (r5068) @@ -379,6 +379,10 @@ fail_unless(!osync_error_is_set(&(status->error)), NULL); num_engine_multiplied++; break; + case OSYNC_ENGINE_EVENT_PREPARED_WRITE: + fail_unless(!osync_error_is_set(&(status->error)), NULL); + num_engine_prepared_write++; + break; case OSYNC_ENGINE_EVENT_WRITTEN: fail_unless(!osync_error_is_set(&(status->error)), NULL); num_engine_written++; Modified: trunk/tests/support.h ============================================================================== --- trunk/tests/support.h Sat Jan 10 17:16:11 2009 (r5067) +++ trunk/tests/support.h Sat Jan 10 17:53:57 2009 (r5068) @@ -38,6 +38,7 @@ int num_engine_read; int num_engine_mapped; int num_engine_multiplied; +int num_engine_prepared_write; int num_engine_written; int num_engine_disconnected; int num_engine_errors; |