diff options
Diffstat (limited to 'debian/opensync/opensync-0.22/tools/osyncstress.c')
-rw-r--r-- | debian/opensync/opensync-0.22/tools/osyncstress.c | 451 |
1 files changed, 0 insertions, 451 deletions
diff --git a/debian/opensync/opensync-0.22/tools/osyncstress.c b/debian/opensync/opensync-0.22/tools/osyncstress.c deleted file mode 100644 index 04b2bf53..00000000 --- a/debian/opensync/opensync-0.22/tools/osyncstress.c +++ /dev/null @@ -1,451 +0,0 @@ -#include <opensync/opensync.h> -#include "engine.h" -#include "engine_internals.h" - -#include <stdio.h> -#include <stdlib.h> -#include <string.h> -#include <sys/types.h> -#include <sys/wait.h> -#include <glib.h> - -static void usage (char *name, int ecode) -{ - fprintf (stderr, "Usage: %s <groupname>\n", name); - fprintf (stderr, "[--configdir] \tSet a different configdir then ~./opensync\n"); - fprintf (stderr, "[--num] \tHow often do you want to synchronize?\n"); - fprintf (stderr, "[--tryrecover] \tIf something goes wrong try to recover via slow-sync\n"); - fprintf (stderr, "[--crash] \tRandomly crash the engine/plugins\n"); - exit (ecode); -} - -GList *members = NULL; - -typedef struct member_info { - OSyncMember *member; - GList *changes; - osync_bool connected; - osync_bool disconnected; - osync_bool sent_changes; -} member_info; - -typedef struct change_info { - OSyncChange *change; - char *uid; - OSyncChangeType type; - osync_bool sent; - osync_bool received; -} change_info; - -void update_change_list(OSyncEngine *engine) -{ - g_assert(engine); - members = NULL; - GList *v; - GList *e; - for (v = engine->maptable->views; v; v = v->next) { - member_info *meminfo = g_malloc0(sizeof(member_info)); - members = g_list_append(members, meminfo); - OSyncMappingView *view = v->data; - meminfo->member = view->client->member; - for (e = view->changes; e; e = e->next) { - OSyncMappingEntry *entry = e->data; - change_info *chinfo = g_malloc0(sizeof(change_info)); - meminfo->changes = g_list_append(meminfo->changes, chinfo); - chinfo->change = entry->change; - chinfo->type = CHANGE_UNMODIFIED; - chinfo->uid = g_strdup(osync_change_get_uid(chinfo->change)); - } - } -} - -member_info *find_member_info(OSyncMember *member) -{ - GList *m; - for (m = members; m; m = m->next) { - member_info *meminfo = m->data; - if (meminfo->member == member) - return meminfo; - } - return NULL; -} - -change_info *find_change_info(member_info *meminfo, OSyncChange *change) -{ - GList *c; - for (c = meminfo->changes; c; c = c->next) { - change_info *chinfo = c->data; - if (chinfo->uid && !strcmp(chinfo->uid, osync_change_get_uid(change))) - return chinfo; - } - return NULL; -} - -void conflict_handler(OSyncEngine *engine, OSyncMapping *mapping) -{ - if (g_random_int_range(0, 3) == 0) { - osengine_mapping_duplicate(engine, mapping); - printf("Conflict for Mapping %p: Duplicating\n", mapping); - } else { - int num = osengine_mapping_num_changes(mapping); - int choosen = g_random_int_range(0, num); - OSyncChange *change = osengine_mapping_nth_change(mapping, choosen); - osengine_mapping_solve(engine, mapping, change); - printf("Conflict for Mapping %p: Choosing entry %i\n", mapping, choosen); - } -} - - -void member_status(OSyncMemberUpdate *status) -{ - member_info *meminfo = find_member_info(status->member); - if (!meminfo) - return; - switch (status->type) { - case MEMBER_CONNECTED: - meminfo->connected = TRUE; - break; - case MEMBER_DISCONNECTED: - meminfo->disconnected = TRUE; - break; - default: - printf("Unknown status\n"); - } -} - -void mapping_status(OSyncMappingUpdate *status) -{ - switch (status->type) { - case MAPPING_SOLVED: - printf("Mapping solved\n"); - break; - case MAPPING_SYNCED: - printf("Mapping Synced\n"); - break; - default: - printf("errro\n"); - } -} - -void entry_status(OSyncChangeUpdate *status) -{ - member_info *meminfo = find_member_info(osync_change_get_member(status->change)); - if (!meminfo) - return; - change_info *chinfo = find_change_info(meminfo, status->change); - switch (status->type) { - case CHANGE_RECEIVED: - if (chinfo && (chinfo->type == osync_change_get_changetype(status->change))) - chinfo->received = TRUE; - break; - case CHANGE_SENT: - if (chinfo) - chinfo->sent = TRUE; - break; - default: - printf("Unknown status\n"); - } -} - -GMutex *working; - -GMainLoop *loop = NULL; -gboolean busy = FALSE; - -void stress_message_callback(OSyncMember *member, void *user_data, OSyncError *error) -{ - g_main_loop_quit(loop); - busy = FALSE; -} - -void change_content(OSyncEngine *engine) -{ - GList *m; - for (m = members; m; m = m->next) { - member_info *meminfo = m->data; - - busy = TRUE; - osync_member_connect(meminfo->member, (OSyncEngCallback)stress_message_callback, NULL); - if (busy) - g_main_loop_run(loop); - - GList *c = NULL; - for (c = meminfo->changes; c; c = c->next) { - change_info *chinfo = c->data; - if (g_random_int_range(0, 3) == 0) { - switch (g_random_int_range(1, 6)) { - case 1: - case 5: - if (osync_member_modify_random_data(meminfo->member, chinfo->change)) { - printf("Modifying data %s for member %lli. Objtype: %s Format: %s\n", osync_change_get_uid(chinfo->change), osync_member_get_id(meminfo->member), osync_objtype_get_name(osync_change_get_objtype(chinfo->change)), osync_objformat_get_name(osync_change_get_objformat(chinfo->change))); - chinfo->type = CHANGE_MODIFIED; - } - break; - case 2: - if (osync_member_delete_data(meminfo->member, chinfo->change)) { - printf("Deleting data %s for member %lli. Objtype: %s Format: %s\n", osync_change_get_uid(chinfo->change), osync_member_get_id(meminfo->member), osync_objtype_get_name(osync_change_get_objtype(chinfo->change)), osync_objformat_get_name(osync_change_get_objformat(chinfo->change))); - if (!osync_group_get_slow_sync(engine->group, osync_objtype_get_name(osync_change_get_objtype(chinfo->change)))); - chinfo->type = CHANGE_DELETED; - } - break; - case 3: - //printf("Modifying all for %s\n", osync_change_get_uid(change)); - break; - case 4: - //printf("Deleting all for %s\n", osync_change_get_uid(change)); - break; - default: - printf("error\n"); - } - } - } - - int num_new = g_random_int_range(0, 8); - int n = 0;; - for (n = 0; n < num_new; n++) { - change_info *chinfo = g_malloc0(sizeof(change_info)); - if ((chinfo->change = osync_member_add_random_data(meminfo->member, NULL))) { - if (find_change_info(meminfo, chinfo->change)) - continue; - meminfo->changes = g_list_append(meminfo->changes, chinfo); - chinfo->type = CHANGE_ADDED; - chinfo->uid = g_strdup(osync_change_get_uid(chinfo->change)); - printf("Adding new data %s for member %lli. Objtype: %s Format: %s\n", osync_change_get_uid(chinfo->change), osync_member_get_id(meminfo->member), osync_objtype_get_name(osync_change_get_objtype(chinfo->change)), osync_objformat_get_name(osync_change_get_objformat(chinfo->change))); - } - } - - busy = TRUE; - osync_member_disconnect(meminfo->member, (OSyncEngCallback)stress_message_callback, NULL); - if (busy) - g_main_loop_run(loop); - } -} - -static osync_bool check_mappings(OSyncEngine *engine) -{ - member_info *meminfo = NULL; - GList *m; - for (m = members; m; m = m->next) { - meminfo = m->data; - - if (g_list_length(engine->maptable->mappings) != g_list_length(meminfo->changes)) { - printf("Number of mappings do not match for member %lli, %i compared to %i\n", osync_member_get_id(meminfo->member), g_list_length(engine->maptable->mappings), g_list_length(meminfo->changes)); - return FALSE; - } - } - - return TRUE; -} - -static osync_bool check_hashtables(OSyncEngine *engine) -{ - GList *m; - for (m = members; m; m = m->next) { - member_info *meminfo = m->data; - OSyncHashTable *table = osync_hashtable_new(); - osync_hashtable_load(table, meminfo->member, NULL); - /*if (osync_hashtable_num_entries(table) != g_list_length(meminfo->changes)) { - printf("Hashtable for member %i has wrong number %i compared to %i\n", osync_member_get_id(meminfo->member), osync_hashtable_num_entries(table), g_list_length(meminfo->changes)); - abort(); - }*/ - printf("hashtable %p\n", table); - if (osync_hashtable_num_entries(table) && g_list_length(engine->maptable->mappings) != osync_hashtable_num_entries(table)) { - printf("Number of mappings do not match hastable for member %lli, %i compared to %i\n", osync_member_get_id(meminfo->member), g_list_length(engine->maptable->mappings), osync_hashtable_num_entries(table)); - return FALSE; - } - - osync_hashtable_close(table); - } - return TRUE; -} - -/*static osync_bool compare_updates(OSyncEngine *engine) -{ - GList *m; - for (m = members; m; m = m->next) { - member_info *meminfo = m->data; - - if (!meminfo->connected) { - printf("Member %lli never connected\n", osync_member_get_id(meminfo->member)); - return FALSE; - } - if (!meminfo->disconnected) { - printf("Member %lli never connected\n", osync_member_get_id(meminfo->member)); - return FALSE; - } - - GList *c = NULL; - for (c = meminfo->changes; c; c = c->next) { - change_info *chinfo = c->data; - if (chinfo->type != CHANGE_UNMODIFIED) { - if (chinfo->received != TRUE) { - printf("Never received change %s from member %lli\n", chinfo->uid, osync_member_get_id(meminfo->member)); - return FALSE; - } - } - } - } - return TRUE; -}*/ - -static osync_bool compare_content(OSyncEngine *engine) -{ - /*if (system("test \"x$(diff -x \".*\" r1 r2)\" = \"x\"")) { //FIXME - printf("Content did not match!\n"); - return FALSE; - }*/ - return TRUE; -} - -int main (int argc, char *argv[]) -{ - int i; - char *groupname = NULL; - char *configdir = NULL; - int num = -1; - osync_bool failed = FALSE; - osync_bool tryrecover = FALSE; - OSyncError *error = NULL; - OSyncEngine *engine = NULL; - - if (argc <= 1) - usage (argv[0], 1); - - groupname = argv[1]; - for (i = 2; i < argc; i++) { - char *arg = argv[i]; - if (!strcmp (arg, "--configdir")) { - configdir = argv[i + 1]; - i++; - if (!configdir) - usage (argv[0], 1); - } else if (!strcmp (arg, "--num")) { - num = atoi(argv[i + 1]); - i++; - if (num <= 0) - usage (argv[0], 1); - } else if (!strcmp (arg, "--help")) { - usage (argv[0], 0); - } else if (!strcmp (arg, "--tryrecover")) { - tryrecover = TRUE; - } else if (!strcmp (arg, "--")) { - break; - } else if (arg[0] == '-') { - usage (argv[0], 1); - } else { - usage (argv[0], 1); - } - } - - loop = g_main_loop_new(NULL, TRUE); - if (!g_thread_supported ()) g_thread_init (NULL); - - osync_trace(TRACE_ENTRY, "++++ Started the sync stress test +++"); - OSyncEnv *osync = osync_env_new(); - osync_env_set_option(osync, "GROUPS_DIRECTORY", configdir); - - if (!osync_env_initialize(osync, &error)) { - printf("Unable to initialize environment: %s\n", osync_error_print(&error)); - osync_error_free(&error); - goto error_free_env; - } - - OSyncGroup *group = osync_env_find_group(osync, groupname); - - if (!group) { - printf("Unable to find group with name \"%s\"\n", groupname); - goto error_free_env; - } - - if (!g_thread_supported ()) g_thread_init (NULL); - working = g_mutex_new(); - int count = 0; - while (1) { - engine = osengine_new(group, &error); - if (!engine) { - printf("Error while creating syncengine: %s\n", osync_error_print(&error)); - osync_error_free(&error); - goto error_free_env; - } - - if (!osengine_init(engine, &error)) { - printf("Error while initializing syncengine: %s\n", osync_error_print(&error)); - osync_error_free(&error); - goto error_free_engine; - } - - do { - count++; - printf("++++++++++++++++++++++++++++++\n"); - printf("Initializing new round #%i!\n", count); - - if (g_random_int_range(0, 5) == 0) { - int i; - OSyncFormatEnv *env = osync_group_get_format_env(group); - for (i = 0; i < osync_conv_num_objtypes(env); i++) { - if (g_random_int_range(0, 5) == 0) { - OSyncObjType *type = osync_conv_nth_objtype(env, i); - osync_group_set_slow_sync(group, osync_objtype_get_name(type), TRUE); - printf("Requesting slow-sync for: %s\n", osync_objtype_get_name(type)); - } - } - osync_conv_env_free(env); - } - - update_change_list(engine); - - if (!check_mappings(engine) || !check_hashtables(engine) || !compare_content(engine)) { - if (failed) { - printf("already failed last round...\n"); - goto error_free_engine; - } - failed = TRUE; - if (!tryrecover) { - printf("Failed. Not trying to recover\n"); - goto error_free_engine; - } else { - printf("Failed. Trying to recover!\n"); - osync_group_set_slow_sync(group, "data", TRUE); - } - } else { - failed = FALSE; - } - - change_content(engine); - - printf("Starting to synchronize\n"); - if (!osengine_sync_and_block(engine, &error)) { - printf("Error while starting synchronization: %s\n", osync_error_print(&error)); - osync_error_free(&error); - goto error_free_engine; - } - - if (!compare_content(engine)) - goto error_free_engine; - - sleep(2); - printf("End of synchronization\n"); - - if (count == num) - goto out; - } while (g_random_int_range(0, 3) != 0); - - printf("Finalizing engine\n"); - osengine_finalize(engine); - osengine_free(engine); - } - -out: - osync_trace(TRACE_EXIT, "Stress test successful"); - printf("Stress test successful\n"); - return 0; - -error_free_engine: - osengine_free(engine); -error_free_env: - osync_env_free(osync); - g_main_loop_unref(loop); - osync_trace(TRACE_EXIT_ERROR, "Stress test failed"); - printf("ERROR: Stress test failed\n"); - return 1; -} |