From: <su...@us...> - 2008-09-12 05:29:02
|
Revision: 6875 http://openhpi.svn.sourceforge.net/openhpi/?rev=6875&view=rev Author: sutula Date: 2008-09-12 05:29:11 +0000 (Fri, 12 Sep 2008) Log Message: ----------- [ 2099686 ] Support chage in the OA switchover behaviour The patch is somewhat different from that posted in the defect report, mainly to make the code more clear in this area. Modified Paths: -------------- openhpi/trunk/plugins/oa_soap/oa_soap.h openhpi/trunk/plugins/oa_soap/oa_soap_event.c Modified: openhpi/trunk/plugins/oa_soap/oa_soap.h =================================================================== --- openhpi/trunk/plugins/oa_soap/oa_soap.h 2008-09-05 21:51:44 UTC (rev 6874) +++ openhpi/trunk/plugins/oa_soap/oa_soap.h 2008-09-12 05:29:11 UTC (rev 6875) @@ -81,9 +81,15 @@ #define ERR_INVALID_PRIVILEGE_LEVEL 8 #define ERR_STANDBY_MODE 139 -/* OA firmware version 2.20 */ +/* OA firmware versions */ #define OA_2_20 2.20 +#define OA_2_21 2.21 +/* OA switchover re-try wait period */ +#define WAIT_ON_SWITCHOVER 1 +/* OA switchover max re-try */ +#define MAX_RETRY_ON_SWITCHOVER 1 + /* Enum for storing the status of the plugin */ enum oa_soap_plugin_status { PRE_DISCOVERY = 0, Modified: openhpi/trunk/plugins/oa_soap/oa_soap_event.c =================================================================== --- openhpi/trunk/plugins/oa_soap/oa_soap_event.c 2008-09-05 21:51:44 UTC (rev 6874) +++ openhpi/trunk/plugins/oa_soap/oa_soap_event.c 2008-09-12 05:29:11 UTC (rev 6875) @@ -104,6 +104,7 @@ struct oh_handler_state *handler = NULL; struct oa_info *oa = NULL; int ret_code = SA_ERR_HPI_INVALID_PARAMS; + int retry_on_switchover = 0; struct oa_soap_handler *oa_handler = NULL; struct event_handler *evt_handler = NULL; SaHpiBoolT is_plugin_initialized = SAHPI_FALSE; @@ -214,41 +215,60 @@ */ while (listen_for_events == SAHPI_TRUE) { rv = soap_getAllEvents(oa->event_con, &request, &response); - if (rv != SOAP_OK) { - err("OA %s may not be accessible", oa->server); - /* Try to recover from the error */ - oa_soap_error_handling(handler, oa); - request.pid = oa->event_pid; + if (rv == SOAP_OK) { + retry_on_switchover = 0; + /* OA returns empty event response payload for LCD + * status change events. Ignore empty event response. + */ + if (response.eventInfoArray == NULL) { + dbg("Ignoring empty event response"); + } else + process_oa_events(handler, oa, con, &response); + } else { + /* On switchover, the standby-turned-active OA stops + * responding to SOAP calls to avoid the network loop. + * This change is applicable from OA firmware version + * 2.21. Re-try the getAllEvents SOAP XML call skipping + * the error handling. + */ + if (oa->oa_status == STANDBY && + get_oa_fw_version(handler) >= OA_2_21 && + retry_on_switchover < MAX_RETRY_ON_SWITCHOVER) { + sleep(WAIT_ON_SWITCHOVER); + dbg("getAllEvents call failed, may be due to " + "OA switchover"); + dbg("Re-try the getAllEvents SOAP call"); + retry_on_switchover++; + } else { + /* Try to recover from the error */ + err("OA %s may not be accessible", oa->server); + oa_soap_error_handling(handler, oa); + request.pid = oa->event_pid; - /* Re-initialize the con */ - if (con != NULL) { - soap_close(con); - con = NULL; - } - memset(url, 0, MAX_URL_LEN); - snprintf(url, strlen(oa->server) + strlen(PORT) + 1, - "%s" PORT, oa->server); + /* Re-initialize the con */ + if (con != NULL) { + soap_close(con); + con = NULL; + } + memset(url, 0, MAX_URL_LEN); + snprintf(url, strlen(oa->server) + + strlen(PORT) + 1, + "%s" PORT, oa->server); - /* Ideally, the soap_open should pass in 1st try. - * If not, try until soap_open succeeds - */ - while (con == NULL) { - con = soap_open(url, user_name, password, - HPI_CALL_TIMEOUT); - if (con == NULL) - sleep(2); - } - continue; - } + /* Ideally, the soap_open should pass in + * 1st try. If not, try until soap_open succeeds + */ + while (con == NULL) { + con = soap_open(url, user_name, + password, + HPI_CALL_TIMEOUT); + if (con == NULL) + sleep(2); + } + } /* end of else (non-switchover error handling) */ + } /* end of else (SOAP call failure handling) */ + } /* end of 'while(listen_for_events == SAHPI_TRUE)' loop */ - /* OA returns empty event response payload for LCD status - * change events. Ignore empty event response. - */ - if (response.eventInfoArray == NULL) { - dbg("Ignoring empty event response"); - } else - process_oa_events(handler, oa, con, &response); - } return (gpointer *) SA_OK; } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |