From: Changju G. <CG...@no...> - 2004-08-27 23:38:32
|
I am working on an ECE plugin. when the plugin is asked by EVMS engine to send out a message, the field "corrolator" is always set to 0. According to the document at http://evms.sourceforge.net/clustering/ece_api_guide.txt, the engine should be able to accept a new correlator set by the plugin if correlaor comes in as 0. Tests revealed that the engine is still waiting for messages with "corrolator == 0" even if the plugin sets the "corrolator" field to something else. According to the following code, EVMS puts a talk into the "talk_list" before asking a plugin to send the message out. A plugin can change the "corrolator" of "talk->say", but not the entry already in the "talk_list", which will later be used to screen incoming responses (in handle_response()). So if the "corrolator" field is set by a plugin, EVMS will never get the response back. And worse, EVMS can easily mistake a incoming message as a response. Here is how that can happen. Node 1 sends message1 to Node 2. Node 2 sands a status message to node 2. Node 1 finds the status message "match" message1 in its talk_list because the status message's address is "node 2" and "corrolator==0". In handle_response(), EVMS set the rc to 0, even after it realizes that the status message is a request, causing the node1 to think message1 is replied and node 2 to wait for the response of the status message that will never come. /* Send out the "say" message in the talk_t. */ static int say(talk_t * talk) { int rc; list_element_t el; LOG_PROC_ENTRY(); talk->got_response = FALSE; pthread_mutex_lock(&talk_list_mutex); el = insert_thing(&talk_list, talk, INSERT_AFTER, NULL); pthread_mutex_unlock(&talk_list_mutex); SEND_MSG(&talk->say, rc); if (rc != 0) { pthread_mutex_lock(&talk_list_mutex); delete_element(el); pthread_mutex_unlock(&talk_list_mutex); } LOG_PROC_EXIT_INT(rc); return rc; } 4.2.1.1 Correlator semantics ECE facilitates the application with a mechanism to relate 'sent messages' with 'messages responded' to the sent messages. When a application provides a non-zero correlator, ECE simply delivers the correlator to the recipient. However when a application provides a zero correlator, ECE generates a correlator and delivers the correlator to the recipient, as well as returns the correlator to the sender. |