<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2//EN">
<HTML>
<HEAD>
<META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=us-ascii">
<META NAME="Generator" CONTENT="MS Exchange Server version 5.5.2658.2">
<TITLE>RE: Patch II design review revision 1 !!</TITLE>
</HEAD>
<BODY>

<P><FONT SIZE=2>Thanks for spotting the big hole on the section data.</FONT>
</P>

<P><FONT SIZE=2>Thanks</FONT>
</P>

<P><FONT SIZE=2>Muni</FONT>
</P>

<P><FONT SIZE=2>-----Original Message-----</FONT>
<BR><FONT SIZE=2>From: Steven Dake [<A HREF="mailto:sdake@mvista.com">mailto:sdake@mvista.com</A>] </FONT>
<BR><FONT SIZE=2>Sent: Thursday, February 24, 2005 2:56 AM</FONT>
<BR><FONT SIZE=2>To: Bajpai, Muni [NGC:B670:EXCH]</FONT>
<BR><FONT SIZE=2>Cc: 'openais@lists.osdl.org'; Smith, Kristen [NGC:B675:EXCH]</FONT>
<BR><FONT SIZE=2>Subject: Re: Patch II design review revision 1 !!</FONT>
</P>
<BR>

<P><FONT SIZE=2>Muni,</FONT>
<BR><FONT SIZE=2>My apologies for not responding earlier; I've been swawmped by my day job.. :( On Wed, 2005-02-23 at 13:18, Muni Bajpai wrote:</FONT></P>

<P><FONT SIZE=2>&gt; Hey Steve,</FONT>
<BR><FONT SIZE=2>&gt; </FONT>
<BR><FONT SIZE=2>&gt; So I have made the changes as itemized by you.</FONT>
<BR><FONT SIZE=2>&gt; Some Notes:</FONT>
<BR><FONT SIZE=2>&gt; 1.) Have removed saCkptCheckpointSection from </FONT>
<BR><FONT SIZE=2>&gt; req_exec_ckpt_synchronize_state and added the following</FONT>
<BR><FONT SIZE=2>&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SaCkptSectionDescriptorT sectionDescriptor;</FONT>
<BR><FONT SIZE=2>&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SaUint32T dataOffSet;</FONT>
<BR><FONT SIZE=2>&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SaUint32T dataSize;</FONT>
</P>

<P><FONT SIZE=2>I think this makes sense, but probably as another message.&nbsp; See later comments.</FONT>
</P>

<P><FONT SIZE=2>&gt; 2.) Could not think of any other way to do </FONT>
<BR><FONT SIZE=2>&gt; ckpt_checkpoint_remove_cleanup. Let me know if you have any </FONT>
<BR><FONT SIZE=2>&gt; suggestions</FONT>
<BR><FONT SIZE=2>&gt; </FONT>
<BR><FONT SIZE=2>hmm I think its ok for now we can always refine later.</FONT>
</P>

<P><FONT SIZE=2>&gt; Thanks,</FONT>
<BR><FONT SIZE=2>&gt; </FONT>
<BR><FONT SIZE=2>&gt; Muni</FONT>
<BR><FONT SIZE=2>&gt; P.S I haven't tested any of this and plan to do that as soon the I </FONT>
<BR><FONT SIZE=2>&gt; base changes for recovery are in. When do you estimate that to be </FONT>
<BR><FONT SIZE=2>&gt; merged in ?</FONT>
<BR><FONT SIZE=2>&gt; </FONT>
</P>

<P><FONT SIZE=2>I am hopeful I will have something available Monday.&nbsp; I'd suggest, however, trying to test without the base recovery code by adding the calls to the locations specified in previous emails.&nbsp; This should atleast allow you to start testing your implementation..</FONT></P>

<P><FONT SIZE=2>comments on patch:</FONT>
<BR><FONT SIZE=2>findProcessorIndex style is still somewhat wacky and has a c++ comment</FONT>
</P>

<P><FONT SIZE=2>&quot;//save off the elements&quot; c++ comment should be changed to C comment</FONT>
</P>

<P><FONT SIZE=2>Please do not specify variables in code body.&nbsp; This is a C++ ism and only works on newer GCC compilers but not 2.9.5 or earlier.</FONT></P>

<P><FONT SIZE=2>+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SaUint32T sync_sequence_number = 0;</FONT>
</P>

<P><FONT SIZE=2>The sectionData in req_exec_ckpt_synchronize_state is wrong.&nbsp; It should be void sectionData[0] and at the end of the structure.&nbsp; Then ensure that when creating the syncstate msg, to allocate sizeof syncstate + (dataSize + dataOffset).&nbsp; Then address the section data as a normal array.</FONT></P>

<P><FONT SIZE=2>Still alot of C++ style comments please axe em for c comments.</FONT>
</P>

<P><FONT SIZE=2>when specifying todo, use uppercase TODO instead of todo makes searching easier if all todos are consistent</FONT>
</P>

<P><FONT SIZE=2>Use a memcpy when initializing the checkpoint section descriptor:</FONT>
<BR><FONT SIZE=2>example:</FONT>
<BR><FONT SIZE=2>// Configure checkpoint section</FONT>
</P>

<P><FONT SIZE=2>I dont like the overload of section data updates along with checkpoint and refcount updates.&nbsp; I believe these two things should be two seperate messages.&nbsp; Logically that makes more sense, instead of updating the creationattributes and reference countson every message.&nbsp; The refcount and creation attributes message should only be sent once, while a section update should be sent for each section.&nbsp; It is ok to have multiple messages for synchronization.&nbsp; We have a big address space to use, so might as well use it. :)</FONT></P>

<P><FONT SIZE=2>Also why do you need sync_msg_sequence_number?&nbsp; All messages are in agreed order, so the order you send them will be the order they arrive. </FONT></P>

<P><FONT SIZE=2>There should be no need to do any sequencing beyond that.</FONT>
</P>

<P><FONT SIZE=2>Good work</FONT>
</P>

<P><FONT SIZE=2>Regards</FONT>
<BR><FONT SIZE=2>-steve</FONT>
</P>
<BR>
<BR>

<P><FONT SIZE=2>&gt; -----Original Message-----</FONT>
<BR><FONT SIZE=2>&gt; From: Steven Dake [<A HREF="mailto:sdake@mvista.com">mailto:sdake@mvista.com</A>]</FONT>
<BR><FONT SIZE=2>&gt; Sent: Tuesday, February 22, 2005 3:27 PM</FONT>
<BR><FONT SIZE=2>&gt; To: Bajpai, Muni [NGC:B670:EXCH]</FONT>
<BR><FONT SIZE=2>&gt; Cc: openais@lists.osdl.org; Smith, Kristen [NGC:B675:EXCH]</FONT>
<BR><FONT SIZE=2>&gt; Subject: RE: Patch II design review !!</FONT>
<BR><FONT SIZE=2>&gt; </FONT>
<BR><FONT SIZE=2>&gt; </FONT>
<BR><FONT SIZE=2>&gt; On Tue, 2005-02-22 at 14:08, Muni Bajpai wrote:</FONT>
<BR><FONT SIZE=2>&gt; &gt; Thanks Steven,</FONT>
<BR><FONT SIZE=2>&gt; &gt; </FONT>
<BR><FONT SIZE=2>&gt; &gt; On the last item you mentioned for multiple checkpoints per section. </FONT>
<BR><FONT SIZE=2>&gt; &gt; The Design as it exists today is that a sync_message is sent out for </FONT>
<BR><FONT SIZE=2>&gt; &gt; every section in a checkpoint for all checkpoints. So if a</FONT>
<BR><FONT SIZE=2>&gt; checkpoint</FONT>
<BR><FONT SIZE=2>&gt; &gt; has 2 sections then 2 sync's are sent out for that checkpoint.</FONT>
<BR><FONT SIZE=2>&gt; &gt; </FONT>
<BR><FONT SIZE=2>&gt; </FONT>
<BR><FONT SIZE=2>&gt; ok this works</FONT>
<BR><FONT SIZE=2>&gt; </FONT>
<BR><FONT SIZE=2>&gt; &gt; Will start work on the remaining items.</FONT>
<BR><FONT SIZE=2>&gt; &gt; </FONT>
<BR><FONT SIZE=2>&gt; &gt; Thanks</FONT>
<BR><FONT SIZE=2>&gt; &gt; </FONT>
<BR><FONT SIZE=2>&gt; Thanks Muni</FONT>
<BR><FONT SIZE=2>&gt; </FONT>
<BR><FONT SIZE=2>&gt; regards</FONT>
<BR><FONT SIZE=2>&gt; -steve</FONT>
<BR><FONT SIZE=2>&gt; </FONT>
<BR><FONT SIZE=2>&gt; &gt; Muni</FONT>
<BR><FONT SIZE=2>&gt; &gt; </FONT>
<BR><FONT SIZE=2>&gt; &gt; -----Original Message-----</FONT>
<BR><FONT SIZE=2>&gt; &gt; From: Steven Dake [<A HREF="mailto:sdake@mvista.com">mailto:sdake@mvista.com</A>]</FONT>
<BR><FONT SIZE=2>&gt; &gt; Sent: Tuesday, February 22, 2005 1:58 PM</FONT>
<BR><FONT SIZE=2>&gt; &gt; To: Bajpai, Muni [NGC:B670:EXCH]</FONT>
<BR><FONT SIZE=2>&gt; &gt; Cc: openais@lists.osdl.org; Smith, Kristen [NGC:B675:EXCH]</FONT>
<BR><FONT SIZE=2>&gt; &gt; Subject: Re: Patch II design review !!</FONT>
<BR><FONT SIZE=2>&gt; &gt; </FONT>
<BR><FONT SIZE=2>&gt; &gt; On Mon, 2005-02-21 at 12:10, Muni Bajpai wrote:</FONT>
<BR><FONT SIZE=2>&gt; &gt; &gt; Hi Steven,</FONT>
<BR><FONT SIZE=2>&gt; &gt; &gt; </FONT>
<BR><FONT SIZE=2>&gt; &gt; &gt; Please take a look at the patch II and advise on the design. I</FONT>
<BR><FONT SIZE=2>&gt; &gt; haven't</FONT>
<BR><FONT SIZE=2>&gt; &gt; &gt; run this code yet and is in a &quot;In Progress&quot; state. I wanted to get </FONT>
<BR><FONT SIZE=2>&gt; &gt; &gt; feedback before I continued down that path.</FONT>
<BR><FONT SIZE=2>&gt; &gt; &gt; </FONT>
<BR><FONT SIZE=2>&gt; &gt; &gt;&nbsp; -&nbsp; Does checkpoint close get called on all the remaining</FONT>
<BR><FONT SIZE=2>&gt; processors</FONT>
<BR><FONT SIZE=2>&gt; &gt; &gt; when a processor fails ?</FONT>
<BR><FONT SIZE=2>&gt; &gt; &gt; </FONT>
<BR><FONT SIZE=2>&gt; &gt; </FONT>
<BR><FONT SIZE=2>&gt; &gt; No.</FONT>
<BR><FONT SIZE=2>&gt; &gt; </FONT>
<BR><FONT SIZE=2>&gt; &gt; When a processor fails, the processors will receive a configuration</FONT>
<BR><FONT SIZE=2>&gt; &gt; change.&nbsp; The reason we keep a list of the processor identifiers</FONT>
<BR><FONT SIZE=2>&gt; along</FONT>
<BR><FONT SIZE=2>&gt; &gt; with their checkpoint reference count is so that each processor can</FONT>
<BR><FONT SIZE=2>&gt; &gt; reduce the reference count the appropriate number of times.&nbsp; This is</FONT>
<BR><FONT SIZE=2>&gt; &gt; similiar to closing, except that no actual close message should be </FONT>
<BR><FONT SIZE=2>&gt; &gt; sent.</FONT>
<BR><FONT SIZE=2>&gt; &gt; </FONT>
<BR><FONT SIZE=2>&gt; &gt; &gt; Thanks</FONT>
<BR><FONT SIZE=2>&gt; &gt; &gt; </FONT>
<BR><FONT SIZE=2>&gt; &gt; &gt; Muni</FONT>
<BR><FONT SIZE=2>&gt; &gt; &gt; </FONT>
<BR><FONT SIZE=2>&gt; &gt; &gt; &lt;&lt;patchtemp.txt&gt;&gt;</FONT>
<BR><FONT SIZE=2>&gt; &gt; &gt; </FONT>
<BR><FONT SIZE=2>&gt; &gt; </FONT>
<BR><FONT SIZE=2>&gt; &gt; Patch review:</FONT>
<BR><FONT SIZE=2>&gt; &gt; </FONT>
<BR><FONT SIZE=2>&gt; &gt; Great work Muni!&nbsp; I think the design is solid thus far.&nbsp; I have a</FONT>
<BR><FONT SIZE=2>&gt; few</FONT>
<BR><FONT SIZE=2>&gt; &gt; suggestions.</FONT>
<BR><FONT SIZE=2>&gt; &gt; </FONT>
<BR><FONT SIZE=2>&gt; &gt; When using pointers, please use * instead of [].</FONT>
<BR><FONT SIZE=2>&gt; &gt; </FONT>
<BR><FONT SIZE=2>&gt; &gt; ex:</FONT>
<BR><FONT SIZE=2>&gt; &gt; +static void initialize_ckpt_refcount_array (struct ckpt_refcnt</FONT>
<BR><FONT SIZE=2>&gt; &gt; ckpt_refcount[]) {</FONT>
<BR><FONT SIZE=2>&gt; &gt; </FONT>
<BR><FONT SIZE=2>&gt; &gt; should be:</FONT>
<BR><FONT SIZE=2>&gt; &gt; </FONT>
<BR><FONT SIZE=2>&gt; &gt; +static void initialize_ckpt_refcount_array (struct ckpt_refcnt</FONT>
<BR><FONT SIZE=2>&gt; &gt; *ckpt_refcount) {</FONT>
<BR><FONT SIZE=2>&gt; &gt; </FONT>
<BR><FONT SIZE=2>&gt; &gt; </FONT>
<BR><FONT SIZE=2>&gt; &gt; I know this doesn't seem to make alot of sense when looking at the</FONT>
<BR><FONT SIZE=2>&gt; &gt; code, but in the past we have agreed to use mostly linux kernel</FONT>
<BR><FONT SIZE=2>&gt; coding</FONT>
<BR><FONT SIZE=2>&gt; &gt; style for the executive code, and SA forum coding style for the</FONT>
<BR><FONT SIZE=2>&gt; &gt; libraries. This makes debugging libraries for people using the APIs </FONT>
<BR><FONT SIZE=2>&gt; &gt; easier and makes working on the executive easier for us </FONT>
<BR><FONT SIZE=2>&gt; &gt; non-capitalized developers</FONT>
<BR><FONT SIZE=2>&gt; &gt; to read the code.</FONT>
<BR><FONT SIZE=2>&gt; &gt; </FONT>
<BR><FONT SIZE=2>&gt; &gt; Unfortunately this group decision was made after the checkpoint code </FONT>
<BR><FONT SIZE=2>&gt; &gt; was developed.&nbsp; Could you change the style to match this?&nbsp; A good</FONT>
<BR><FONT SIZE=2>&gt; &gt; example:</FONT>
<BR><FONT SIZE=2>&gt; &gt; </FONT>
<BR><FONT SIZE=2>&gt; &gt; for (checkpointList = checkpointListHead.next;</FONT>
<BR><FONT SIZE=2>&gt; &gt; +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; checkpointList != &amp;checkpointListHead;</FONT>
<BR><FONT SIZE=2>&gt; &gt; +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; checkpointList = checkpointList-&gt;next) {</FONT>
<BR><FONT SIZE=2>&gt; &gt; should be</FONT>
<BR><FONT SIZE=2>&gt; &gt; </FONT>
<BR><FONT SIZE=2>&gt; &gt; for (list = checkpoint_list_head.next;</FONT>
<BR><FONT SIZE=2>&gt; &gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; list != &amp;checkpoint_list_head;</FONT>
<BR><FONT SIZE=2>&gt; &gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; list =list-&gt;next);</FONT>
<BR><FONT SIZE=2>&gt; &gt; </FONT>
<BR><FONT SIZE=2>&gt; &gt; Please do not assign structures.&nbsp; Use memcpy instead.&nbsp; Example:</FONT>
<BR><FONT SIZE=2>&gt; &gt; +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; sync_msg-&gt;request.previous_ring_id =</FONT>
<BR><FONT SIZE=2>&gt; &gt; saved_ring_id;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </FONT>
<BR><FONT SIZE=2>&gt; &gt; </FONT>
<BR><FONT SIZE=2>&gt; &gt; should be</FONT>
<BR><FONT SIZE=2>&gt; &gt; memcpy (&amp;sync_msg-&gt;request.previous_ring_id, &amp;saved_ring_id, sizeof</FONT>
<BR><FONT SIZE=2>&gt; &gt; (struct memb_ring_id));</FONT>
<BR><FONT SIZE=2>&gt; &gt; </FONT>
<BR><FONT SIZE=2>&gt; &gt; totempg_token_callback_create should use</FONT>
<BR><FONT SIZE=2>&gt; TOTEMPG_CALLBACK_TOKEN_SENT.</FONT>
<BR><FONT SIZE=2>&gt; &gt; If you queue data on received, then that data has to be queued</FONT>
<BR><FONT SIZE=2>&gt; before</FONT>
<BR><FONT SIZE=2>&gt; &gt; the token can be processed, which introduces latency into the </FONT>
<BR><FONT SIZE=2>&gt; &gt; protocol.</FONT>
<BR><FONT SIZE=2>&gt; &gt; </FONT>
<BR><FONT SIZE=2>&gt; &gt; Please do not use C++ style comments.&nbsp; evil evil.&nbsp; I use them for</FONT>
<BR><FONT SIZE=2>&gt; &gt; TODO's which is acceptable but that is the only valid case.&nbsp; We</FONT>
<BR><FONT SIZE=2>&gt; intend</FONT>
<BR><FONT SIZE=2>&gt; &gt; to delete all those TODOs someday :)&nbsp; Example:</FONT>
<BR><FONT SIZE=2>&gt; &gt; +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //Check for empty list here</FONT>
<BR><FONT SIZE=2>&gt; &gt; This should be</FONT>
<BR><FONT SIZE=2>&gt; &gt; /*</FONT>
<BR><FONT SIZE=2>&gt; &gt;&nbsp; * Check for empty list here</FONT>
<BR><FONT SIZE=2>&gt; &gt;&nbsp; */</FONT>
<BR><FONT SIZE=2>&gt; &gt; </FONT>
<BR><FONT SIZE=2>&gt; &gt; In ckpt_recovery_finalize there is an extra list_init which is</FONT>
<BR><FONT SIZE=2>&gt; &gt; unnecessary:</FONT>
<BR><FONT SIZE=2>&gt; &gt; +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; list_init(&amp;checkpointListHead);</FONT>
<BR><FONT SIZE=2>&gt; &gt; </FONT>
<BR><FONT SIZE=2>&gt; &gt; I don't really like the structurein</FONT>
<BR><FONT SIZE=2>&gt; ckpt_recovery_process_members_exit</FONT>
<BR><FONT SIZE=2>&gt; &gt; but if that is the only way to do it, then thats the only way to do</FONT>
<BR><FONT SIZE=2>&gt; &gt; it..</FONT>
<BR><FONT SIZE=2>&gt; &gt; </FONT>
<BR><FONT SIZE=2>&gt; &gt; synchronize_state needs some work..&nbsp; Specifically I don't think you</FONT>
<BR><FONT SIZE=2>&gt; &gt; can just do a sectioncreate..&nbsp; You want to actually synchronize the</FONT>
<BR><FONT SIZE=2>&gt; &gt; section</FONT>
<BR><FONT SIZE=2>&gt; &gt; data.&nbsp; Allocating void *data is not optimal since memory allocation</FONT>
<BR><FONT SIZE=2>&gt; &gt; can</FONT>
<BR><FONT SIZE=2>&gt; &gt; fail.&nbsp; Nothing in the recovery path should allocate memory if at all</FONT>
<BR><FONT SIZE=2>&gt; &gt; possible.&nbsp; When comparing ring ids, use memcmp instead of the if</FONT>
<BR><FONT SIZE=2>&gt; &gt; statement you have.&nbsp; ex:</FONT>
<BR><FONT SIZE=2>&gt; &gt; +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if ((req_exec_ckpt_sync_state-&gt;previous_ring_id.seq !=</FONT>
<BR><FONT SIZE=2>&gt; &gt; saved_ring_id.seq)</FONT>
<BR><FONT SIZE=2>&gt; &gt; +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ||</FONT>
<BR><FONT SIZE=2>&gt; &gt; (req_exec_ckpt_sync_state-&gt;previous_ring_id.rep.s_addr !=</FONT>
<BR><FONT SIZE=2>&gt; &gt; saved_ring_id.rep.s_addr)) {</FONT>
<BR><FONT SIZE=2>&gt; &gt; +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return(0);</FONT>
<BR><FONT SIZE=2>&gt; &gt; +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</FONT>
<BR><FONT SIZE=2>&gt; &gt; </FONT>
<BR><FONT SIZE=2>&gt; &gt; should be</FONT>
<BR><FONT SIZE=2>&gt; &gt; </FONT>
<BR><FONT SIZE=2>&gt; &gt; if (memcmp (&amp;req_exec_ckpt_sync_Sate-&gt;previous_ring_id,</FONT>
<BR><FONT SIZE=2>&gt; &gt; &amp;saved_ring_id,</FONT>
<BR><FONT SIZE=2>&gt; &gt; sizeof (struct memb_ring_id) != 0) {</FONT>
<BR><FONT SIZE=2>&gt; &gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return (0);</FONT>
<BR><FONT SIZE=2>&gt; &gt; }</FONT>
<BR><FONT SIZE=2>&gt; &gt; </FONT>
<BR><FONT SIZE=2>&gt; &gt; What should probably happen is that a new function should be created</FONT>
<BR><FONT SIZE=2>&gt; &gt; (ckpt_section_create) that creates the checkpoint section</FONT>
<BR><FONT SIZE=2>&gt; information</FONT>
<BR><FONT SIZE=2>&gt; &gt; based upon a saCkptCheckpointSection data structure.</FONT>
<BR><FONT SIZE=2>&gt; &gt; </FONT>
<BR><FONT SIZE=2>&gt; &gt; This same thing should be done for the saCkptCHeckpoint data</FONT>
<BR><FONT SIZE=2>&gt; structure</FONT>
<BR><FONT SIZE=2>&gt; &gt; as well (in case the processor adding the checkpoint doesn't yet</FONT>
<BR><FONT SIZE=2>&gt; have</FONT>
<BR><FONT SIZE=2>&gt; &gt; it in its database).</FONT>
<BR><FONT SIZE=2>&gt; &gt; </FONT>
<BR><FONT SIZE=2>&gt; &gt; I'd also suggest somehow adding more then one section to the</FONT>
<BR><FONT SIZE=2>&gt; &gt; synchronize message.&nbsp; It is possible a checkpoint could have alot of</FONT>
<BR><FONT SIZE=2>&gt; &gt; sections.</FONT>
<BR><FONT SIZE=2>&gt; &gt; </FONT>
<BR><FONT SIZE=2>&gt; &gt; Your off to a great start Muni...</FONT>
<BR><FONT SIZE=2>&gt; &gt; </FONT>
<BR><FONT SIZE=2>&gt; &gt; Good work</FONT>
<BR><FONT SIZE=2>&gt; &gt; -steve</FONT>
<BR><FONT SIZE=2>&gt; &gt; </FONT>
<BR><FONT SIZE=2>&gt; &gt; </FONT>
<BR><FONT SIZE=2>&gt; </FONT>
<BR><FONT SIZE=2>&gt; </FONT>
<BR><FONT SIZE=2>&gt;&nbsp; </FONT>
</P>
<BR>

</BODY>
</HTML>