Hi Ralph, Very interesting the "composite framework" idea. Regarding to the schema represented by the picture, I didn't understand the RecoS' behaviour in a node failure situation.
In this case, will mpirun consider the daemon failure as a normal proc failure? If it is correct, should mpirun update the global procs state for all jobs running under the failed daemon? Best regards, Leonardo On Feb 25, 2010, at 7:05 AM, Ralph Castain wrote: > Hi George et al > > I have begun documenting the RecoS operation on the OMPI wiki: > > https://svn.open-mpi.org/trac/ompi/wiki/RecoS > > I'll continue to work on this over the next few days by adding a section > explaining what was changed outside of the new framework to make it all work. > In addition, I am revising the recos.h API documentation. > > Hope to have all that done over the weekend. > > > On Feb 23, 2010, at 4:00 PM, Ralph Castain wrote: > >> >> On Feb 23, 2010, at 3:32 PM, George Bosilca wrote: >> >>> Ralph, Josh, >>> >>> We have some comments about the API of the new framework, mostly >>> clarifications needed to better understand how this new framework is >>> supposed to be used. And a request for a deadline extension, to delay the >>> code merge from the Recos branch in the trunk by a week. >>> >>> We have our own FT branch, with a totally different approach than what is >>> described in your RFC. Unfortunately, it diverged from the trunk about a >>> year ago, and merging back had proven to be a quite difficult task. Some of >>> the functionality in the Recos framework is clearly beneficial for what we >>> did, and has the potential to facilitate the porting of most of the >>> features from our brach back in trunk. We would like the deadline extension >>> in order to deeply analyze the impact of the Recos framework on our work, >>> and see how we can fit everything together back in the trunk of Open MPI. >> >> No problem with the extension - feel free to suggest modifications to make >> the merge easier. This is by no means cast in stone, but rather a starting >> point. >> >>> >>> Here are some comments about the code: >>> >>> 1. The documentation in recos.h is not very clear. Most of the functions >>> use only IN arguments, and are not supposed to return any values. We don't >>> see how the functions are supposed to be used, and what is supposed to be >>> their impact on the ORTE framework data. >> >> I'll try to clarify the comments tonight (I know Josh is occupied right >> now). The recos APIs are called from two locations: >> >> 1. The errmgr calls recos whenever it receives a report of an aborted >> process (via the errmgr.proc_aborted API). The idea was for recos to >> determine what (if anything) to do about the failed process. >> >> 2. The rmaps modules can call the recos "suggest_map_targets" API to get a >> list of suggested nodes for the process that is to be restarted. At the >> moment, only the resilient mapper module does this. However, Josh and I are >> looking at reorganizing some functionality currently in that mapper module >> and making all of the existing mappers be "resilient". >> >> So basically, the recos modules determine the recovery procedure and execute >> it. For example, in the "orcm" module, we actually update the various >> proc/job objects to prep them for restart and call plm.spawn from within >> that module. If instead you use the ignore module, it falls through to the >> recos base functions which call "abort" to kill the job. Again, the action >> is taken local to recos, so nothing need be returned. >> >> The functions generally don't return values (other than success/error) >> because we couldn't think of anything useful to return to the errmgr. >> Whatever recos does about an aborted proc, the errmgr doesn't do anything >> further - if you look in that code, you'll see that if recos is enabled, all >> the errmgr does is call recos and return. >> >> Again, this can be changed if desired. >> >>> >>> 2. Why do we have all the char***? Why are they only declared as IN >>> arguments? >> >> I take it you mean in the predicted fault API? I believe Josh was including >> that strictly as a placeholder. As you undoubtedly recall, I removed the >> fddp framework from the trunk (devel continues off-line), so Josh wasn't >> sure what I might want to input here. If you look at the modules themselves, >> you will see the implementation is essentially empty at this time. >> >> We had discussed simply removing that API for now until we determined >> if/when fault prediction would return to the OMPI trunk. It was kind of a >> tossup - so we left if for now. Could just as easily be removed until a >> later date - either way is fine with us. >> >>> >>> 3. The orte_recos_base_process_fault_fn_t function use the node_list as an >>> IN/OUT argument. Why? If the list is modified, then we have a scalability >>> problem, as the list will have to be rebuilt before each call. >> >> Looking...looking...hmm. >> >> typedef int (*orte_recos_base_process_fault_fn_t) >> (orte_job_t *jdata, orte_process_name_t *proec_name, orte_proc_state_t >> state, int *stack_state); >> >> There is no node list, or list of any type, going in or out of that >> function. I suspect you meant the one below it: >> >> typedef int (*orte_recos_base_suggest_map_targets_fn_t) >> (orte_proc_t *proc, orte_node_t *oldnode, opal_list_t *node_list); >> >> I concur with your concern about scalability here. However, I believe the >> idea was that we would pass in the proc that failed and is to be restarted, >> a pointer to the node it was last on, and return a list of candidate nodes >> where it could be restarted. Essentially, this is the equivalent of building >> the target node list that we do in the mappers whenever we map a job. >> >> So in the implementation, we use the rmaps base function to assemble the >> target node list for the app, and then go through some logic (e.g., remove >> the old node, look at fault groups and load balancing) to prune the list >> down. We then pass the resulting list back to the caller. >> >> If we are going to have frequent process failures, then rebuilding the >> candidate node list every time would indeed be a problem. I suspect we'll >> have to revisit that implementation at some point. >> >> HTH >> Ralph >> >>> >>> Thanks, >>> george. >>> >>> On Feb 19, 2010, at 12:59 , Ralph Castain wrote: >>> >>>> WHAT: Merge a tmp branch for fault recovery development into the OMPI trunk >>>> >>>> WHY: Bring over work done by Josh and Ralph to extend OMPI's fault >>>> recovery capabilities >>>> >>>> WHERE: Impacts a number of ORTE files and a small number of OMPI files >>>> >>>> TIMEOUT: Barring objections and/or requests for delay, the weekend of Feb >>>> 27-28 >>>> >>>> REFERENCE BRANCH: http://bitbucket.org/rhc/ompi-recos/overview/ >>>> >>>> ====================================================================== >>>> >>>> BACKGROUND: >>>> >>>> Josh and Ralph have been working on a private branch off of the trunk on >>>> extended fault recovery procedures, mostly impacting ORTE. The new code >>>> optionally allows ORTE to recover from failed nodes, moving processes to >>>> other nodes in order to maintain operation. In addition, the code provides >>>> better support for recovering from individual process failures. >>>> >>>> Not all of the work done on the private branch will be brought over in >>>> this commit. Some of the MPI-specific code that allows recovery from >>>> process failure on-the-fly will be committed separately at a later date. >>>> >>>> This commit will include the infrastructure to support those advanced >>>> recovery operations. Among other things, this commit will introduce a new >>>> "RecoS" (Recovery Service/Strategy) framework to allow multiple strategies >>>> for responding to failures. The default module, called "ignore", will >>>> stabilize the runtime environment for other RecoS components. In the >>>> absence of other RecoS components it will trigger the default behavior >>>> (abort the job) to be executed. >>>> >>>> This branch includes some configure modifications that allow a comma >>>> separated list of options to be passed to the '--with-ft' option. This >>>> allows us to enable any combination of 'cr' and 'recos' at build time, >>>> specifically so that the RecoS functionally can be enabled independently >>>> of the C/R functionality. Most of the changes outside of the ORTE layer >>>> are due to symbol cleanup resulting from this modification. >>>> >>>> For example, C/R specific code paths were previously incorrectly marked >>>> with: >>>> #if OPAL_ENABLE_FT == 1 >>>> They are now marked as, where appropriate: >>>> #if OPAL_ENABLE_FT_CR == 1 >>>> >>>> Additionally, C/R specific components have modified configure.m4 files to >>>> change: >>>> AS_IF([test "$ompi_want_ft" = "0"], >>>> to: >>>> AS_IF([test "$ompi_want_ft_cr" = "0"], >>>> >>>> We have created a public repo (reference branch, above) with the code to >>>> be merged into the trunk. Please feel free to check it out and test it. >>>> >>>> NOTE: the new recovery capability is only active if... >>>> (a) you configure --with-ft=recos, and >>>> (b) you set OMPI_MCA_recos_base_enable=1 to turn it on! >>>> >>>> Comments, suggestions, and corrections are welcome! >>>> >>>> _______________________________________________ >>>> devel mailing list >>>> de...@open-mpi.org >>>> http://www.open-mpi.org/mailman/listinfo.cgi/devel >>> >>> >>> _______________________________________________ >>> devel mailing list >>> de...@open-mpi.org >>> http://www.open-mpi.org/mailman/listinfo.cgi/devel >> > > _______________________________________________ > devel mailing list > de...@open-mpi.org > http://www.open-mpi.org/mailman/listinfo.cgi/devel