int main (int argc, char *argv[]) { int i; char *pluginname = NULL; char *plugindir = NULL; char *configfile = NULL; char *objtype = NULL; OSyncError *error = NULL; if (argc < 2) usage (argv[0], 1); pluginname = argv[1]; for (i = 2; i < argc; i++) { char *arg = argv[i]; if (!strcmp (arg, "--config")) { configfile = argv[i + 1]; i++; if (!configfile) usage (argv[0], 1); } else if (!strcmp (arg, "--type")) { objtype = argv[i + 1]; i++; if (!objtype) usage (argv[0], 1); } else if (!strcmp (arg, "--plugindir")) { printf("plugindir %s\n", argv[i + 1]); plugindir = argv[i + 1]; i++; if (!plugindir) usage (argv[0], 1); } else if (!strcmp (arg, "--random")) { only_random = TRUE; } else if (!strcmp (arg, "--help")) { usage (argv[0], 0); } else { usage (argv[0], 1); } } OSyncEnv *env = osync_env_new(NULL); osync_env_set_option(env, "LOAD_GROUPS", "FALSE"); if (plugindir) osync_env_set_option(env, "PLUGINS_DIRECTORY", plugindir); if (!osync_env_initialize(env, &error)) { printf("Unable to initialize environment: %s\n", osync_error_print(&error)); osync_error_unref(&error); return 1; } char *testdir = g_strdup_printf("%s/plgtest.XXXXXX", g_get_tmp_dir()); char *result = mkdtemp(testdir); if (result == NULL) { osync_trace(TRACE_EXIT_ERROR, "unable to create temporary dir: %s", g_strerror(errno)); return 1; } OSyncGroup *group = osync_group_new(env); osync_group_set_name(group, osync_rand_str(8)); osync_group_set_configdir(group, testdir); OSyncMember *member = osync_member_new(group); char *config = NULL; int size = 0; if (configfile) { if (!osync_file_read(configfile, &config, &size, &error)) { fprintf(stderr, "Unable to read config: %s\n", osync_error_print(&error)); osync_error_unref(&error); return 1; } osync_member_set_config(member, config, size); } osync_member_set_pluginname(member, pluginname); OSyncMember *file = osync_member_new(group); localdir = g_strdup_printf("%s/plgtest.XXXXXX", g_get_tmp_dir()); result = mkdtemp(localdir); if (result == NULL) { osync_trace(TRACE_EXIT_ERROR, "unable to create temporary dir: %s", g_strerror(errno)); return 1; } config = g_strdup_printf("<config><path>%s</path><recursive>0</recursive></config>", localdir); osync_member_set_config(file, config, strlen(config) + 1); osync_member_set_pluginname(file, "file-sync"); if (!osync_group_save(group, &error)) { printf("Error while creating syncengine: %s\n", osync_error_print(&error)); osync_error_unref(&error); goto error_free_env; } if (!g_thread_supported ()) g_thread_init (NULL); OSyncEngine *engine = osengine_new(group, &error); if (!engine) { printf("Error while creating syncengine: %s\n", osync_error_print(&error)); osync_error_unref(&error); goto error_free_env; } if (!osengine_init(engine, &error)) { printf("Error while initializing syncengine: %s\n", osync_error_print(&error)); osync_error_unref(&error); goto error_free_engine; } int count = 0; if (only_random) { 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); } change_content(); check_sync(engine, "Random", 1); } while (g_random_int_range(0, 3) != 0); printf("Finalizing engine\n"); osengine_finalize(engine); osengine_free(engine); engine = osengine_new(group, &error); if (!engine) { printf("Error while creating syncengine: %s\n", osync_error_print(&error)); osync_error_unref(&error); goto error_free_env; } if (!osengine_init(engine, &error)) { printf("Error while initializing syncengine: %s\n", osync_error_print(&error)); osync_error_unref(&error); goto error_free_engine; } } else { register_tests(); run_all_tests(engine, file, member, objtype); } printf("\nCompleted successfully\n"); return 0; error_free_engine: osengine_free(engine); error_free_env: osync_group_free(group); osync_env_free(env); return 1; }
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); } }
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(NULL); 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_unref(&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_unref(&error); goto error_free_env; } if (!osengine_init(engine, &error)) { printf("Error while initializing syncengine: %s\n", osync_error_print(&error)); osync_error_unref(&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_unref(&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; }
$NetBSD$ Don't continue the if block. --- tools/osyncstress.c.orig 2009-09-20 20:14:18.000000000 +0000 +++ tools/osyncstress.c @@ -184,7 +184,7 @@ void change_content(OSyncEngine *engine) 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)))); + if (!osync_group_get_slow_sync(engine->group, osync_objtype_get_name(osync_change_get_objtype(chinfo->change)))) chinfo->type = CHANGE_DELETED; } break;