Changeset 1408

Show
Ignore:
Timestamp:
10/06/06 22:48:27 (2 years ago)
Author:
abauer
Message:

Added stacking of errors

Fixed bugs when a error condition happens in the engine

Location:
branches/dev-branch
Files:
10 modified

Legend:

Unmodified
Added
Removed
  • branches/dev-branch/opensync/engine/opensync_engine.c

    r1263 r1408  
    7979        osync_assert(engine); 
    8080        if (engine->error) { 
    81                 osync_trace(TRACE_ERROR, "Not overwriting error"); 
    82                 return; 
     81                osync_error_stack(&error, &engine->error); 
     82                osync_error_unref(&engine->error); 
    8383        } 
    8484         
     
    122122{ 
    123123        char *format = g_hash_table_lookup(engine->internalFormats, objtype); 
     124        if (!format) 
     125                return NULL; 
    124126        return osync_format_env_find_objformat(engine->formatenv, format); 
    125127} 
     
    128130{ 
    129131        osync_trace(TRACE_INTERNAL, "Setting internal format of %s to %p", objtype, format); 
     132        if (!format) 
     133                return; 
    130134        g_hash_table_insert(engine->internalFormats, g_strdup(objtype), g_strdup(osync_objformat_get_name(format))); 
    131135} 
     
    412416                 
    413417        if (g_atomic_int_dec_and_test(&(engine->ref_count))) { 
     418                osync_trace(TRACE_ENTRY, "%s(%p)", __func__, engine); 
     419         
    414420                if (engine->internalFormats) 
    415421                        g_hash_table_destroy(engine->internalFormats); 
     
    457463                        osync_archive_unref(engine->archive); 
    458464                 
     465                if (engine->error) 
     466                        osync_error_unref(&(engine->error)); 
     467                 
    459468                g_free(engine); 
     469                osync_trace(TRACE_EXIT, "%s", __func__); 
    460470        } 
    461471} 
     
    740750         
    741751        if (BitCount(engine->obj_errors | engine->obj_connects) == g_list_length(engine->object_engines)) { 
    742                 osync_status_update_engine(engine, OSYNC_ENGINE_EVENT_CONNECTED, NULL); 
    743                 osync_engine_event(engine, OSYNC_ENGINE_EVENT_CONNECTED); 
     752                if (BitCount(engine->obj_errors) == g_list_length(engine->object_engines)) { 
     753                        OSyncError *locerror = NULL; 
     754                        osync_error_set(&locerror, OSYNC_ERROR_GENERIC, "No objtypes left without error. Aborting"); 
     755                        osync_trace(TRACE_ERROR, "%s", osync_error_print(&locerror)); 
     756                        osync_engine_set_error(engine, locerror); 
     757                        osync_status_update_engine(engine, OSYNC_ENGINE_EVENT_ERROR, locerror); 
     758                        osync_engine_event(engine, OSYNC_ENGINE_EVENT_ERROR); 
     759                        osync_error_unref(&locerror); 
     760                } else { 
     761                        osync_status_update_engine(engine, OSYNC_ENGINE_EVENT_CONNECTED, NULL); 
     762                        osync_engine_event(engine, OSYNC_ENGINE_EVENT_CONNECTED); 
     763                } 
    744764                return TRUE; 
    745765        } 
     
    972992                        break; 
    973993                case OSYNC_ENGINE_EVENT_ERROR: 
     994                        osync_trace(TRACE_ERROR, "Engine received an error: %s", osync_error_print(&error)); 
     995                        osync_engine_set_error(engine, error); 
    974996                        engine->obj_errors = engine->obj_errors | (0x1 << i); 
    975997                        break; 
     
    12101232                        break; 
    12111233                case OSYNC_ENGINE_EVENT_ERROR: 
     1234                        osync_trace(TRACE_ERROR, "Engine aborting due to an error: %s", osync_error_print(&(engine->error))); 
     1235                         
     1236                        g_mutex_lock(engine->syncing_mutex); 
     1237                        g_cond_signal(engine->syncing); 
     1238                        g_mutex_unlock(engine->syncing_mutex); 
    12121239                        break; 
    12131240                case OSYNC_ENGINE_EVENT_SUCCESSFUL: 
     
    12891316         
    12901317        if (engine->error) { 
     1318                char *msg = osync_error_print_stack(&(engine->error)); 
     1319                osync_trace(TRACE_ERROR, "error while synchronizing: %s", msg); 
     1320                g_free(msg); 
    12911321                osync_error_set_from_error(error, &(engine->error)); 
    12921322                osync_error_unref(&(engine->error)); 
  • branches/dev-branch/opensync/engine/opensync_obj_engine.c

    r1263 r1408  
    710710         
    711711        if (error) { 
     712                osync_trace(TRACE_INTERNAL, "Obj Engine received connect error: %s", osync_error_print(&error)); 
    712713                osync_obj_engine_set_error(engine, error); 
    713714                engine->sink_errors = engine->sink_errors | (0x1 << sinkengine->position); 
     
    14111412{ 
    14121413        osync_assert(engine); 
    1413         if (engine->error) 
     1414        if (engine->error) { 
     1415                osync_error_stack(&error, &engine->error); 
    14141416                osync_error_unref(&engine->error); 
     1417        } 
    14151418        engine->error = error; 
    14161419        osync_error_ref(&error); 
  • branches/dev-branch/opensync/engine/opensync_status.c

    r1216 r1408  
    9696{ 
    9797        osync_trace(TRACE_ENTRY, "%s(%p, %p, %i, %s, %p)", __func__, engine, member, type, objtype, error); 
     98         
    9899        if (engine->mebstat_callback) { 
    99100                OSyncMemberUpdate *update = g_malloc0(sizeof(OSyncMemberUpdate)); 
  • branches/dev-branch/opensync/format/opensync_format_env.c

    r1216 r1408  
    119119        for (m = env->modules; m; m = m->next) { 
    120120                module = m->data; 
    121                 if (!osync_module_get_conversion_info(module, env, error)) 
    122                         goto error; 
     121                if (!osync_module_get_conversion_info(module, env, error)) { 
     122                        osync_trace(TRACE_INTERNAL, "Module get conversion error %s", osync_error_print(error)); 
     123                        osync_error_unref(error); 
     124                } 
    123125        } 
    124126         
  • branches/dev-branch/opensync/ipc/opensync_serializer.c

    r1162 r1408  
    284284                osync_error_set(error, (OSyncErrorType)error_type, msg); 
    285285                g_free(msg); 
    286         } else 
    287                 osync_error_unref(error); 
    288 } 
     286        } 
     287} 
  • branches/dev-branch/opensync/opensync-error.h

    r1263 r1408  
    5252OSYNC_EXPORT void osync_error_set(OSyncError **error, OSyncErrorType type, const char *format, ...); 
    5353OSYNC_EXPORT const char *osync_error_get_name(OSyncError **error); 
    54 OSYNC_EXPORT void osync_error_update(OSyncError **error, const char *format, ...); 
    5554OSYNC_EXPORT void osync_error_set_from_error(OSyncError **target, OSyncError **source); 
    5655OSYNC_EXPORT const char *osync_error_print(OSyncError **error); 
     56OSYNC_EXPORT char *osync_error_print_stack(OSyncError **error); 
     57OSYNC_EXPORT void osync_error_stack(OSyncError **parent, OSyncError **child); 
     58OSYNC_EXPORT OSyncError *osync_error_get_child(OSyncError **parent); 
    5759OSYNC_EXPORT OSyncErrorType osync_error_get_type(OSyncError **error); 
    5860OSYNC_EXPORT void osync_error_set_type(OSyncError **error, OSyncErrorType type); 
  • branches/dev-branch/opensync/opensync_error.c

    r1263 r1408  
    125125                if ((*error)->message) 
    126126                        g_free ((*error)->message); 
    127                          
     127                 
     128                if ((*error)->child) 
     129                        osync_error_unref(&((*error)->child)); 
     130                 
    128131                g_free(*error); 
    129132        } 
     
    178181} 
    179182 
    180 /*! @brief Updates the error message 
    181  *  
    182  * You can use this function to update the error message on 
    183  * a error. You can use the old error->message as a parameter 
    184  * for this function. 
    185  *  
    186  * @param error A pointer to a error struct to update 
    187  * @param format The new message 
    188  *  
    189  */ 
    190 void osync_error_update(OSyncError **error, const char *format, ...) 
    191 { 
    192         va_list args; 
    193         char *buffer; 
    194         osync_return_if_fail(error != NULL); 
    195         osync_return_if_fail(*error != NULL); 
    196  
    197         va_start(args, format); 
    198         buffer = g_strdup_vprintf(format, args); 
    199         g_free((*error)->message); 
    200         (*error)->message = buffer; 
    201         va_end (args); 
     183char *osync_error_print_stack(OSyncError **error) 
     184{ 
     185        if (!osync_error_is_set(error)) 
     186                return NULL; 
     187                 
     188        char *submessage = NULL; 
     189        if ((*error)->child) 
     190                submessage = osync_error_print_stack(&((*error)->child)); 
     191         
     192        char *message = NULL; 
     193        if (submessage) { 
     194                message = g_strdup_printf("NEXT ERROR: \"%s\"; %s", (*error)->message, submessage); 
     195                g_free(submessage); 
     196        } else 
     197                message = g_strdup_printf("ROOT CAUSE: \"%s\"", (*error)->message); 
     198         
     199        return message; 
    202200} 
    203201 
     
    240238} 
    241239 
     240void osync_error_stack(OSyncError **parent, OSyncError **child) 
     241{ 
     242        if (!parent || !*parent) 
     243                return; 
     244         
     245        if (!child || !*child) 
     246                return; 
     247         
     248        if ((*parent)->child) 
     249                osync_error_unref(&((*parent)->child)); 
     250         
     251        (*parent)->child = *child; 
     252        osync_error_ref(child); 
     253} 
     254 
     255OSyncError *osync_error_get_child(OSyncError **parent) 
     256{ 
     257        if (!parent || !*parent) 
     258                return NULL; 
     259         
     260        return (*parent)->child; 
     261} 
     262 
    242263/*! @brief Sets the type of an error 
    243264 *  
  • branches/dev-branch/opensync/opensync_error_internals.h

    r1058 r1408  
    3030        char *message; 
    3131        int ref_count; 
     32        OSyncError *child; 
    3233}; 
    3334 
  • branches/dev-branch/tests/check_error.c

    r1263 r1408  
    103103END_TEST 
    104104 
    105 START_TEST (error_update_null) 
    106 { 
    107         osync_error_update(NULL, NULL); 
    108  
    109 } 
    110 END_TEST 
    111  
    112 START_TEST (error_update_null2) 
    113 { 
    114         OSyncError *error = NULL; 
    115         osync_error_update(&error, NULL); 
    116 } 
    117 END_TEST 
    118  
    119 START_TEST (error_update) 
    120 { 
    121         OSyncError *error = NULL; 
    122         osync_error_set(&error, OSYNC_ERROR_GENERIC, "test"); 
    123         osync_error_update(&error, "test2%i", 1); 
    124         fail_unless(!strcmp(osync_error_print(&error), "test21"), NULL); 
    125         osync_error_unref(&error); 
    126 } 
    127 END_TEST 
    128  
    129 START_TEST (error_update2) 
    130 { 
    131         OSyncError *error = NULL; 
    132         osync_error_set(&error, OSYNC_ERROR_GENERIC, "test"); 
    133         osync_error_update(&error, "test2%s", osync_error_print(&error)); 
    134         fail_unless(!strcmp(osync_error_print(&error), "test2test"), NULL); 
    135         osync_error_unref(&error); 
     105START_TEST (error_stack_null) 
     106{ 
     107        osync_error_stack(NULL, NULL); 
     108 
     109} 
     110END_TEST 
     111 
     112START_TEST (error_stack_null2) 
     113{ 
     114        OSyncError *error = NULL; 
     115        osync_error_set(&error, OSYNC_ERROR_GENERIC, "test"); 
     116         
     117        char *msg = osync_error_print_stack(&error); 
     118        fail_unless(msg != NULL, NULL); 
     119        g_free(msg); 
     120         
     121        osync_error_stack(&error, NULL); 
     122        osync_error_unref(&error); 
     123} 
     124END_TEST 
     125 
     126START_TEST (error_stack) 
     127{ 
     128        OSyncError *error = NULL; 
     129        osync_error_set(&error, OSYNC_ERROR_GENERIC, "test"); 
     130        OSyncError *error2 = NULL; 
     131        osync_error_set(&error2, OSYNC_ERROR_GENERIC, "test2"); 
     132        osync_error_stack(&error, &error2); 
     133        fail_unless(!strcmp(osync_error_print(&error), "test"), NULL); 
     134        OSyncError *error3 = osync_error_get_child(&error); 
     135        fail_unless(!strcmp(osync_error_print(&error3), "test2"), NULL); 
     136        error3 = osync_error_get_child(&error2); 
     137        fail_unless(error3 == NULL, NULL); 
     138         
     139        osync_error_unref(&error2); 
     140        osync_error_unref(&error); 
     141} 
     142END_TEST 
     143 
     144START_TEST (error_stack2) 
     145{ 
     146        OSyncError *error1 = NULL; 
     147        osync_error_set(&error1, OSYNC_ERROR_GENERIC, "test1"); 
     148        OSyncError *error2 = NULL; 
     149        osync_error_set(&error2, OSYNC_ERROR_GENERIC, "test2"); 
     150        OSyncError *error3 = NULL; 
     151        osync_error_set(&error3, OSYNC_ERROR_GENERIC, "test3"); 
     152         
     153        osync_error_stack(&error1, &error2); 
     154        osync_error_stack(&error2, &error3); 
     155         
     156        osync_error_unref(&error2); 
     157        osync_error_unref(&error3); 
     158         
     159        fail_unless(!strcmp(osync_error_print(&error1), "test1"), NULL); 
     160        OSyncError *error = osync_error_get_child(&error1); 
     161        fail_unless(!strcmp(osync_error_print(&error), "test2"), NULL); 
     162        error = osync_error_get_child(&error); 
     163        fail_unless(!strcmp(osync_error_print(&error), "test3"), NULL); 
     164         
     165        char *msg = osync_error_print_stack(&error1); 
     166        fail_unless(msg != NULL, NULL); 
     167        g_free(msg); 
     168         
     169        osync_error_unref(&error1); 
    136170} 
    137171END_TEST 
     
    141175        osync_error_set(NULL, OSYNC_NO_ERROR, NULL); 
    142176 
    143 } 
    144 END_TEST 
    145  
    146 START_TEST (error_set_null2) 
    147 { 
    148         OSyncError *error = NULL; 
    149         osync_error_update(&error, OSYNC_NO_ERROR, NULL); 
    150         osync_error_unref(&error); 
    151177} 
    152178END_TEST 
     
    193219        create_case(s, "error_check", error_check); 
    194220        create_case(s, "error_check2", error_check2); 
    195         create_case(s, "error_update_null", error_update_null); 
    196         create_case(s, "error_update_null2", error_update_null2); 
    197         create_case(s, "error_update", error_update); 
    198         create_case(s, "error_update2", error_update2); 
     221        create_case(s, "error_stack_null", error_stack_null); 
     222        create_case(s, "error_stack_null2", error_stack_null2); 
     223        create_case(s, "error_stack", error_stack); 
     224        create_case(s, "error_stack2", error_stack2); 
    199225        create_case(s, "error_set_null", error_set_null); 
    200         create_case(s, "error_set_null2", error_set_null2); 
    201226        create_case(s, "error_duplicate_null", error_duplicate_null); 
    202227        create_case(s, "error_duplicate", error_duplicate); 
  • branches/dev-branch/tests/engine-tests/check_engine_error.c

    r1263 r1408  
    932932        osync_engine_set_plugindir(engine, testbed); 
    933933         
     934        osync_engine_set_conflict_callback(engine, conflict_handler_choose_first, GINT_TO_POINTER(1)); 
     935        osync_engine_set_changestatus_callback(engine, entry_status, GINT_TO_POINTER(1)); 
     936        osync_engine_set_mappingstatus_callback(engine, mapping_status, GINT_TO_POINTER(1)); 
     937        osync_engine_set_enginestatus_callback(engine, engine_status, GINT_TO_POINTER(1)); 
     938        osync_engine_set_memberstatus_callback(engine, member_status, GINT_TO_POINTER(1)); 
     939         
    934940        fail_unless(osync_engine_initialize(engine, &error), NULL); 
    935941        fail_unless(error == NULL, NULL); 
     
    941947        fail_unless(osync_engine_finalize(engine, &error), NULL); 
    942948        fail_unless(error == NULL, NULL); 
    943          
    944         osync_engine_set_conflict_callback(engine, conflict_handler_choose_first, NULL); 
    945         osync_engine_set_changestatus_callback(engine, entry_status, NULL); 
    946         osync_engine_set_mappingstatus_callback(engine, mapping_status, NULL); 
    947         osync_engine_set_enginestatus_callback(engine, engine_status, NULL); 
    948         osync_engine_set_memberstatus_callback(engine, member_status, NULL); 
    949949         
    950950        fail_unless(num_connect == 2, NULL); 
     
    954954        /* Client checks */ 
    955955        fail_unless(num_client_connected == 0, NULL); 
    956         fail_unless(num_client_main_connected == 0, NULL); 
     956        fail_unless(num_client_main_connected == 2, NULL); 
    957957        fail_unless(num_client_read == 0, NULL); 
    958958        fail_unless(num_client_main_read == 0, NULL); 
     
    968968        /* Client checks */ 
    969969        fail_unless(num_engine_connected == 0, NULL); 
    970         fail_unless(num_engine_errors == 0, NULL); 
     970        fail_unless(num_engine_errors == 1, NULL); 
    971971        fail_unless(num_engine_read == 0, NULL); 
    972972        fail_unless(num_engine_written == 0, NULL);