Not Applicable
Not Applicable
A portion of the material in this patent document is subject to copyright protection under the copyright laws of the United States and of other countries. The owner of the copyright rights has no objection to the facsimile reproduction by anyone of the patent document or the patent disclosure, as it appears in the United States Patent and Trademark Office publicly available file or records, but otherwise reserves all copyright rights whatsoever. The copyright owner does not hereby waive any of its rights to have this patent document maintained in secrecy, including without limitation its rights pursuant to 37 C.F.R. § 1.14.
1. Field of the Invention
This invention pertains generally to enterprise computer systems, computer networks, embedded computer systems, and computer systems, and more particularly with methods, systems and procedures (i.e., programming) for providing high availability services and automatic fault detection and recovery for computer applications distributed across multiple computers.
2. Description of Related Art
Enterprise systems operating today are subject to continuous program execution, that is 24 hours a day and 7 days a week. There is no longer the concept of “overnight” or “planned downtime”. All programs and data must be available at any point during the day and night. Any outages or deteriorated service can result in loss of revenue as customers simply take their business elsewhere, and the enterprise stops to function on a global scale. Traditionally, achieving extremely high degrees of availability has been accomplished with customized applications running on custom hardware, all of which is expensive and proprietary. Furthermore, application services being utilized today are no longer run as single processes on a single server, yet are built instead from a collection of individual programs running on different servers. Traditionally, no mechanisms have existed for protecting these fully distributed applications. This problem is compounded by the fact that the individual applications comprising the service are typically provided by different vendors.
Two publications provide a background for understanding aspects of the current invention. A first publication is U.S. patent application Ser. No. 11/213,678 filed on Aug. 26, 2005 (Docket ETE5342.13A1), and published as US 2006-0090097 A1 on Apr. 27, 2006, incorporated herein by reference in its entirety, which describes providing transparent and automatic high availability for applications where all the application processes are executed on one node. A second publication is U.S. patent application Ser. No. 11/213,630 filed on Aug. 26, 2005 (Docket ETE5342.13A2), and published as US 2006-0085679 A1 on Apr. 20, 2006, incorporated herein by reference in its entirety, which describes technology to support stateful recovery of multi-process applications wherein the processes are running on the same node. However, the above-referenced publications do not fully address distributed applications where an application runs across multiple nodes at the same time, and where fault detection and recovery need to involve multiple independent nodes.
Therefore, a need exists for a method and system for achieving high availability and reliability for distributed applications, in a manner that is automatic, transparent to the client, and which does not require custom coding, custom applications, or specialized hardware.
A method, system, apparatus and/or computer program are described for achieving transparent high availability and loss-less migration of distributed application programs The system provides transparent migration and fail-over of distributed applications while ensuring that connected clients remain unaware of the migration. The client's connection and session are transparently transferred from the primary to the backup server without any client involvement
In at least one embodiment, a high-availability services program is configured for automatically performing a number of application services, including: injecting registration code into sub-programs during launch, registering the distributed application, detecting execution failures, and executing from backup nodes in response to sub-program failure, application failure or node failure. The services can be integrated transparently into the system in that they are implemented on the system without the need of modifying or recompiling the application program and without the need of a custom loader.
The term “high-availability services” is utilized herein to designate a set of system-level services which protect distributed applications to assure that execution of these applications is provided with high availability. High availability can be generally considered a characteristic of a distributed application when a level of fault tolerance is provided to reduce or eliminate the possibility of losing access to the application as a consequence of sub-program or node failures. The high availability services run (execute) on each node (computer) of a network, grid, or other distributed communications configuration and protect all the distributed components of the distributed application.
The term “node” is utilized herein to designate one or more processors running a single instance of an operating system. A virtual machine, such as VMWare or XEN, is also considered a “node”.
The term “grid” is utilized herein to designate a collection of nodes able to communicate via a network, custom backplane, or system busses.
The term “distributed application”, “grid application” and “application” are utilized herein interchangeably. Each of these terms is meant to convey an application comprised of one or more sub-programs running on one or more nodes (i.e., computers), and in which all of the sub-programs jointly provide a service, such as for example running a large seismic computation.
The term “program” and “sub-program” is utilized to designate an individual application or a component of a larger distributed application. In practical terms, it is an executable that can run and produce a result on an individual node. Sub-programs can consist of one or more processes, all of which can be single or multi-threaded.
The term “coordinator” is utilized for designating a special control process running as an element of the invention. The coordinator is generally responsible for sending out coordination events and to coordinate activities across all sub-programs in a distributed application. For the sake of simplicity the coordinator is described as running on its own node, however, this is not a requirement as the coordinator can run on any desired node.
The term “transport” is utilized to designate the connection, mechanism and/or protocols used for communicating across the distributed application. Examples of transport include TCP/IP, Message Passing Interface (MPI), Myrinet, FiberChannel, ATM, shared memory, DMA, RDMA, system busses, and custom backplanes. In the following, the term “transport driver” is utilized to designate the implementation of the transport. By way of example, the transport driver for TCP/IP would be the local TCP/IP stack running on the host.
The term “Transport Communication Layer (TCL)” shall be used to designate the interface between the application and the transport as provided by the invention. The TCL is generally viewed as a component within the invention, but can also be directly provided by the transport or the application. By way of example, the TCL for TCP/IP may comprise a layer insulating the application from the local implementation of TCP/IP and providing services to be described below.
The term “channel” or “message channel” is utilized to designate the specific communication mechanism used by the implementation of the transport to communicate and move data, for example between the sub-programs and the transport itself. Generally “channels” are implemented using TCP/IP, sockets, pipes, FIFO, system busses, shared memory, backplanes or other proprietary messaging mechanism.
In the following descriptions, the product name “Duration” is utilized in referring to a system as described in the first and second references cited previously. It should be appreciated, however, that the teachings herein are applicable to other similarly configured systems.
The present invention comprises a set of system-level high-availability services for distributed applications. The high availability services run on each node (computer) on the grid and protect all the distributed components of the distributed application. One embodiment of the invention generally functions as an extension of the operating system executing on all grid nodes. A coordination mechanism is utilized to ensure that the execution of applications on the grid nodes are coordinated at certain points in time.
By way of example, and not of limitation, the present invention implements high availability for stateless applications (e.g., sendmail), stateful applications (e.g., Voice over IP (VOIP)), multi-tier enterprise applications (e.g., Apache, WebLogic and Oracle Database combined), and large distributed applications, for example those found in High Performance Computing (HPC), such as seismic exploration and financial modeling.
According to one aspect of the invention, the distributed application runs across a grid (i.e., of computer nodes), with sub-programs on one or more nodes. Each sub-program is protected individually and has one or more backup nodes ready to take over (execute the sub-program in the place of the original) in the event of a fault. The protection of the distributed program is thus coordinated across the grid and guaranteed to be consistent across the grid to assure high availability.
A distributed application can be configured according to the invention with any number of sub-programs running on any number of nodes. Each sub-program runs on a primary node while a backup node for the application stands ready to take over in the event of a fault and subsequent recovery. The primary and backup can be different nodes or the primary and backup can be the same node, in which case the fault recovery is local.
The invention provides layered high availability services for distributed applications, with high availability offered both across the grid and at the individual sub-program level. High availability, including fault detection and recovery, for the individual sub-programs is provided by Duration's existing stateful High Availability Services. The invention layers a distributed fault detection and recovery mechanism on top of the local fault detection and ensures that fault detection and recovery is consistent across the entire grid.
According to one aspect of the invention, a coordinator provides general coordination and synchronization for the individual sub-programs of the distributed applications. By way of example, and not limitation, the coordinator is shown running on a separate node from the sub-programs to simplify the following teachings. It should be appreciated, however, that this is not a requirement as the coordinator can run on any node in the system.
By way of example, and not of limitation, the invention implements stateless or stateful recovery of a distributed application by recovering each sub-program and ensuring all sub-programs are recovered in a consistent state. The recovery is automatic without any application or sub-program involvement.
According to an aspect of the invention, there is a clean separation of the application logic from the high-availability program code. This allows application programmers to focus on writing their application code, rather than on writing high availability code. An administrator can make applications highly available by simply configuring the desired settings, such as by using a graphical configuration tool implemented according to the invention. The result is that high availability applications are developed easily and deployed quickly without the necessity of custom coding.
According to another aspect of the invention, protection is provided against node faults, network faults and process faults. The present invention provides user-controlled system management, automatic availability management, and publish/subscribe event management, including notification of faults and alarms.
In various embodiments of the invention, features are provided that are useful for distributed applications that must be highly available, including but not limited to the following:
(a) Stateful high availability for distributed applications including high performance computing, financial modeling, enterprise applications, web servers,
(b) Configurable protection levels.
(c) Coordinated Restart and stateful restore for distributed applications.
(d) Coordinated and transparent checkpointing of distributed applications.
(e) Coordinated full and incremental checkpointing for distributed applications.
(f) Checkpoints stored on local disks, shared disks, or memories.
(g) Automatic and transparent fault detection for distributed applications.
(h) Node fault detection.
(i) Process fault detection.
(j) Distributed application deadlock and hang protection through external health checks.
(k) Coordinated automatic and transparent recovery of distributed applications.
(l) Auto-startup of distributed applications.
(m) Script support of starting, stopping, or restarting.
(n) Dynamic policy updates.
(o) User-controllable migration of distributed applications.
The invention can be practiced according to various aspects and embodiments, including, but not limited to, those described in the following aspects and embodiments which are described using phraseology which is generally similar to the claim language.
According to an aspect of the invention a method for achieving transparent integration of a distributed application program with a high-availability protection program comprises: (a) injecting registration code, transparently and automatically, into all sub-programs during launch, without the need of modifying or recompiling the application program and without the need of a custom loader; (b) registering the distributed application automatically with the high-availability protection program; (c) detecting a failure in the execution of the distributed application program; and (d) executing the distributed application program with one or more sub-programs being executed from their respective backup servers automatically in response to the failure. The high-availability protection program is preferably configured as an extension of the operating system wherein recovery of application programs can be performed without modifying programming within said application programs. The high-availability protection can be configured for protecting against node faults, network faults, and process faults.
According to another aspect of the invention, a method, system, improvement or computer program for performing loss-less migration of a distributed application, including loss-less migration of all sub-programs from a their respective primary nodes to their backup nodes and while being transparent to a client connected to the primary node over a TCP/IP, MPI, system bus or other transport. The transport, i.e. TCP/IP, MPI, or system bus will be flushed and halted during checkpointing.
According to another aspect of the invention, a method, system, improvement or computer program performs loss-less migration of a distributed application, comprising: (a) migrating one or more sub-programs within an application, without loss, from their respective primary nodes to at least one backup node; (b) maintaining transparency to a client connected to the primary node over a transport connection; (c) flushing and halting the transport connection during the taking of checkpoints; and (d) restoring the one or more sub-programs from the checkpoints in response to initiating recovery of the application. The execution transparency to the client is maintained by a high-availability protection program configured to automatically coordinate transparent recovery of distributed applications. Transparency is maintained by a high-availability protection program to said one or more sub-programs running on a primary node while at least one backup node stands ready in the event of a fault and subsequent recovery.
According to another aspect of the invention, a method, system, improvement or computer program performs fault protection for applications distributed across multiple computer nodes, comprising: (a) providing high-availability application services for transparently loading applications, registering applications for protection, detecting faults in applications, and initiating recovery of applications; (b) taking checkpoints of one or more sub-programs within applications executing across multiple computer nodes; (c) restoring the one or more sub-programs from the checkpoints in response to initiating recovery of one or more the applications; (c) wherein said high-availability application services are provided to the one or more sub-programs running on a primary node, while at least one backup node stands ready in the event of a fault and subsequent recovery; and (d) coordinating execution of individual sub-programs within a coordinator program which is executed on a node accessible to the multiple computer nodes.
According to another aspect of the invention, a method, system, improvement or computer program performs loss-less migration of a distributed application program, comprising: (a) a high-availability services module configured for execution in conjunction with an operating system upon which at least one application can be executed on one or more computer nodes of a distributed system; and (b) programming within the high-availability services module executable on the computer nodes for loss-less migration of sub-programs within the at least one application for, (b)(i) checkpointing of all state in the transport connection, (b)(ii) coordinating checkpointing of the state of the transport connection across the distributed system, (b)(iii) restoring all states in the transport connection to the state they were in at the last checkpoint, (b)(iv) coordinating recovery within a restore procedure that is coupled to the transport connection.
According to another aspect of the invention, a system of multiple computer nodes over which distributed applications are protected against faults, comprising: (a) a plurality of computer nodes upon which applications can be executed; (b) an operating system configured for execution on each computer node and upon which applications are executed; (c) a high-availability services module configured for protecting applications from faults, and for executing in combination with the operating system; and (d) programming within the high-availability services module configured for execution on each computer node for, (d)(i) providing transparent application functions for loading applications, (d)(ii) registering applications for protection, (d)(iii) detecting faults in applications, and (d)(iv) initiating recovery of applications; (e) checkpointing of one or more sub-programs to create checkpoints for the application executing on at least one computer node; (f) restoring one or more sub-programs from the checkpoints when initiating recovery of the application; (g) executing one or more sub-programs on a primary node while at least one backup node stands ready for executing the sub-programs in the event of a fault and subsequent recovery; and (h) coordinating execution of individual sub-programs within a coordinator program which runs on a node accessible to the plurality of computer nodes.
According to another aspect of the invention, a computer executable program for loss-less migration of a distributed application program, including loss-less migration of all sub-programs, comprising: (a) checkpointing of all state in the transport; (b) a checkpointing procedure that coordinates checkpointing of transport state across the grid; (c) a restore procedure that restores all state in the transport to the state they were in at the last checkpoint; (d) a restore procedure that hooks into the transport to coordinate the recovery.
According to another aspect of the invention, there is described a method, system, improvement and/or computer program for maintaining all transport connection across a fault. Transport connections will be automatically restored using Duration's virtual IP addressing mechanisms.
Another aspect of the invention is a method, system, improvement and/or computer program that provides a mechanism to ensure that the distributed applications sub-programs are launched in the proper order and with the proper timing constraints during recovery. In one embodiment, a mechanism is also provided to ensure that application programs are recovered in the proper order.
Another aspect of the invention is a method, system, computer program, computer executable program, or improvement wherein user controllable launch of sub-programs for the distributed application is provided.
Another aspect of the invention is a method, system, computer program, computer executable program, or improvement wherein user controllable stop of sub-programs and distributed applications is provided.
Further aspects of the invention will be brought out in the following portions of the specification, wherein the detailed description is for the purpose of fully disclosing preferred embodiments of the invention without placing limitations thereon.
The invention will be more fully understood by reference to the following drawings which are for illustrative purposes only:
Referring more specifically to the drawings, for illustrative purposes the present invention will be described in relation to
The context in which this invention is described is a distributed application program consisting of any number of sub-programs. Each sub-program runs on a primary node and can be supported by one or more designated backup nodes. Without affecting the general case of multiple backups, the following describes scenarios where each sub-program has one primary node and one backup node. Multiple backups are handled in a similar manner as a single backup.
The mechanisms for transparently loading applications, transparently registering applications for protection, transparently detecting faults, and transparently initiating recovery are described in the first reference above which was incorporated by reference.
The mechanisms for taking checkpoints of multi-process, multi-threaded processes and restoring from those checkpoints are described in the second reference above which was incorporated by reference.
TCL 70 is responsible for interfacing 72 with local transport driver 54 and generally executes as a service in combination with other services provided by HA services 58-68. In the following disclosures TCL can be considered as a component within HA services 52 without explicitly showing TCL on the diagrams.
Sub-program A 94a communicates with its transport driver 104a via channel 112a, sub-program B 94b communicates with transport driver 104b via channel 112b, while sub-program C 94c communicates with transport driver 104c via channel 112c.
By way of example and not limitation, the checkpointing process is initiated from the coordinator 108 within coordinator node 110. When the checkpointing process is triggered, coordinator 108 sends a message 114a to TCL 102a within HA services 100a of node 096a, message 114b to TCL 102b within HA services 100b of node 196b, and a message 114c to the TCL within HA services 100c for node 296c.
The TCL 102a on node 0 stops processing traffic and sends a message 116a to transport driver 104a on node 096a, to stop processing and flush all buffers. Similarly, TCL 102b on node 196b stops processing traffic and sends a message 116b to transport driver 104b on node 1 to stop processing and flush all buffers, while TCL 102c on node 296c stops processing traffic and sends a message 114c to transport driver 104c on node 296c to stop processing and flush all buffers.
When transport driver 104a has been completely stopped and flushed, the transport drivers sends a message 118a to HA services 100a to checkpoint sub-program A 94a. When transport driver 104b has been completely stopped and flushed, it sends a message 118b to HA services 100b to checkpoint sub-program B 94b. When transport driver 104c has been completely stopped and flushed, it sends a message 118c to HA services 100c to checkpoint sub-program C 94c.
By way of example, and not limitation, the messaging provided by 116a, 116b, 116c, 118a, 118b and 118c can be provided by any desired communication structures including: pipes, FIFOs, library call-backs, shared memory, IPC messages, TCP messages, or the like. The HA services running on each node checkpoint sub-program A 96a, sub-program B 96b, and sub-program C 96c. It should be appreciated that since the transport is stopped and not processing any messages, it is guaranteed that the relative states of sub-programs A, B and C are fixed.
To create the checkpoint for the entire distributed application, first the checkpoint of sub-program A 94a is combined with the checkpoint of the local TCL 102a and transport driver 104a on node 096a. This same procedure applies for sub-program B 94b, local TCL 102b and transport driver 104b on node 196b, and sub-program C 94c, local TCL 102c and transport driver 104c on node 296c. Finally, all combined sub-program checkpoints and local transport checkpoints are assembled into one checkpoint for the entire distributed application. Halting and checkpointing of the transport is described in further detail below.
When checkpointing of sub-program A 94a has completed, TCL 102a sends a message 114a to the coordinator 108, that checkpointing of sub-program A 94a has completed. Similarly, when checkpointing of sub-program B 94b has completed, TCL 102b sends a message 114b to coordinator 108 that checkpointing of sub-program B 94b has completed, and when checkpointing of sub-program C 94c has completed TCL 118c sends a message 114c to coordinator 108 that checkpointing of sub-program C 94c has completed. Coordinator 108 waits for all checkpoints to be completed and sends message 114a to TCL 102a to resume operation of sub-program A 94a, and similarly sends message 114b to TCL 102b to resume operation of sub-program B 94b, and message 114c to TCL 102c to resume operation of sub-program C 94c. The distributed application consisting of sub-program A 94a, sub-program B 94b and sub-program C 94c is now running again.
By way of example, the checkpointing process can also be initiated from the HA services 100x on coordinator node 110. In this case HA services 100x sends a message 120 to coordinator 108, which proceeds as described above.
By way of example and not limitation, the restoration process is initiated from coordinator 108, which sends message 114a to TCL 102a within HA services 100a for node 096a, and similarly message 114b to TCL 102b within HA services 100b for node 196b, as well as message 114c to TCL 102c within HA services 100c for node 296c.
TCL 102a on node 096a stops processing traffic and sends a message 122a to HA services 100a on node 096a to restore sub-program A 94a from the most recent checkpoint. In a similar manner, TCL 102b on node 196b stops processing traffic and sends a message 122b to HA services 100b on node 196b to restore sub-program B 94b from the most recent checkpoint. Following the same pattern TCL 102c on node 296c stops processing traffic and sends a message 122c to HA services 100c on node 296c to restore sub-program C 94c from the most recent checkpoint.
The restore process includes restoring local transport drivers 104a, 104b and 104c as well as TCLs 102a, 102b and 102c. Halting and checkpoint restore of the local transport is described in further detail below.
Restoration from checkpoints, as just described, is commonly performed as part of the fault recovery process. After a fault, one or more of the sub-programs may have crashed, exited, or otherwise ceased functioning.
According to one aspect of the invention, HA services 100a terminates sub-program A 94a, if running, before restoring; while HA services 100b terminates sub-program B 94b, if running, before restoring; and finally HA services 100c terminates sub-program C 94c, if running, before restoring. This sequence of termination before restoration guarantees that all sub-programs are loaded and functional.
According to another aspect of the invention, HA services 100a halts sub-program A 94a, if running, before restoring; while HA services 100b halts sub-program B 94b, if running, before restoring; and finally HA services 100c halts sub-program C 94c, if running, before restoring. This sequence also guarantees that all sub-programs are loaded and functional.
By way of example, the restore process can also be initiated from HA services 100x on coordinator node 110. In this case HA services 100x sends a message 120 to coordinator 108, which then proceeds as described above.
The example illustrates a scenario where node 196b serves as backup location for sub-program A 94a. A node fault means that the entire node has gone down, due to a hardware or software fault. Network faults cause the entire node to become unreachable due to network outage.
HA services 100b for the backup-location of sub-program A 94a performs the fault detection. HA services 100b sends a message 128 to HA services 100x for coordinator 108. HA services 100x sends a restore message 130 to coordinator 108. The “restore from distributed checkpoint” proceeds as described above.
For node 0, the transport driver 158a contains a buffer 164a for messages going to the sub-program, and a buffer 166a for receiving messages from the application. For sub-program B 154b the transport driver 158b contains a buffer 164b for messages going to the sub-program, and a buffer 166b for receiving messages from the sub-program. Node 0156a also contains within transport driver 158a, a buffer 168a for incoming transport messages, and a buffer 170a for outgoing transport messages. Similar buffer configuration is seen for node 1, with buffers 164b, 166b, 168b and 170b within transport driver 158b.
A transport mechanism 172 is shown with the lowest layer of transport containing a message channel 174a directed into the transport driver 158a of node 0156a, and a message channel 176a directed out of the transport driver. Node 1156a is similarly shown with message channels 174b, 176b.
By way of example and not limitation, the message channels between the transport driver and the applications, or between the transport and the driver, can be implemented as containing any desired number and configuration of pipes, FIFOs, sockets, message queues, DMA, shared memory, or custom protocols.
Halting and flushing the transport driver is a multi-step process. In one embodiment, the transport driver first stops sending out new messages. By way of example, this means that the driver blocks message channels 164a and 170a on node 0156a, and message channels 164b and 170b on node 1156b.
The transport driver proceeds to receive all incoming messages delivered on message channel 166a and 168a on node 0156a, and message channel 166b and 168b on node 1156b. Those messages are received and stored in the outgoing message queues for delivery after the checkpointing process.
On node 0156a, channel 176a will not send new messages and channel 174a will receive all messages sent to it. On node 1 channel 176b will not send new messages and channel 174b will receive all messages sent to it. When no more messages are “in transit”, the communication channel 172 has been flushed and the transport traffic halted.
Referring to
Referring to
By way of example, the disclosure above describes a transport driver architecture in which the transport driver is responsible for receiving, halting and flushing messages and issuing the messages to let sub-programs continue after checkpointing.
An alternate implementation layers the TCL between the application and the transport driver, thereby forcing all communication between application and transport driver to go through the TCL.
The alternate architecture illustrated by
The inter-positioning of TCL 192a between the application and the transport driver does not in any substantial way alter operations discussed above.
Referring once again to
Building on the disclosures above, a loss-less migration is achieved by: first checkpointing the distributed application, including all sub-programs and local transports, then restoring all sub-programs and local transports from the checkpoints on the backup nodes. The migration is loss-less, which means that no data or processing is lost, since the transport and all sub-programs have been halted.
In the embodiments described herein, an example programming environment was described for which an embodiment of programming according to the invention was taught. It should be appreciated that the present invention can be implemented by one of ordinary skill in the art using different program organizations and structures, different data structures, and of course any desired naming conventions without departing from the teachings herein. In addition, the invention can be ported, or otherwise configured for, use across a wide-range of operating system environments.
Although the description above contains many details, these should not be construed as limiting the scope of the invention but as merely providing illustrations of some of the presently preferred embodiments of this invention. Therefore, it will be appreciated that the scope of the present invention fully encompasses other embodiments which may become obvious to those skilled in the art, and that the scope of the present invention is accordingly to be limited by nothing other than the appended claims, in which reference to an element in the singular is not intended to mean “one and only one” unless explicitly so stated, but rather “one or more.” All structural and functional equivalents to the elements of the above-described preferred embodiment that are known to those of ordinary skill in the art are expressly incorporated herein by reference and are intended to be encompassed by the present claims. Moreover, it is not necessary for a device or method to address each and every problem sought to be solved by the present invention, for it to be encompassed by the present claims. Furthermore, no element, component, or method step in the present disclosure is intended to be dedicated to the public regardless of whether the element, component, or method step is explicitly recited in the claims. No claim element herein is to be construed under the provisions of 35 U.S.C. 112, sixth paragraph, unless the element is expressly recited using the phrase “means for.”
This application claims priority from U.S. provisional application Ser. No. 60/797,219 filed on May 2, 2006, incorporated herein by reference in its entirety. This application is related to U.S. patent application Ser. No. 11/213,678 filed on Aug. 26, 2005, and published as US 2006-0090097 A1 on Apr. 27, 2006, incorporated herein by reference in its entirety. This application is also related to U.S. patent application Ser. No. 11/213,630 filed on Aug. 26, 2005, and published as US 2006-0085679 A1 on Apr. 20, 2006, incorporated herein by reference in its entirety.
Number | Date | Country | |
---|---|---|---|
60797219 | May 2006 | US |