# Patent

## Title
Methods, media and systems for managing a distributed application running in a plurality of digital processing devices

## Abstract

Methods, media and systems for managing a distributed application running in a plurality of digital processing devices are provided. In some embodiments, a method includes running one or more processes associated with the distributed application in virtualized operating system environments on a plurality of digital processing devices, suspending the one or more processes, and saving network state information relating to network connections among the one or more processes. The method further include storing process information relating to the one or more processes, recreating the network connections using the saved network state information, and restarting the one or more processes using the stored process information.

## Background
CROSS-REFERENCE TO RELATED APPLICATIONS
This application claims priority under 35 U.S.C. §119(e) from U.S. Provisional Application No. 60/729,094, filed on Oct. 20, 2005, U.S. Provisional Application No. 60/729,093, filed on Oct. 20, 2005, and U.S. Provisional Application No. 60/729,096, filed on Oct. 20, 2005, which are hereby incorporated by reference in their entireties.


STATEMENT REGARDING FEDERALLY SPONSORED RESEARCH OR DEVELOPMENT
The government may have certain rights in the present invention pursuant to grants by National Science Foundation, grant numbers ANI-0240525 and CNS-0426623, and Department of Energy Early Career Award.


TECHNOLOGY AREA
The disclosed subject matter relates to methods, media and systems for managing a distributed application running in a plurality of digital processing devices.
BACKGROUND
As computers have become faster, cheaper, they have become ubiquitous in academic, corporate, and government organizations. At the same time, the widespread use of computers has given rise to enormous management complexity and security hazards, and the total cost of owning and maintaining them is becoming unmanageable. The fact that computers are increasingly networked complicates the management problem.
One difficult problem relates to managing systems where applications (e.g., resource-intensive scientific applications) are distributed to run on multiple nodes in a computer cluster. In these systems, when a cluster node goes down for maintenance or because of a fault condition, it is desirable that the distributed applications can continue to run in the cluster when at least one cluster node is still operational. This calls for an application checkpoint-restart function, which is the ability to save a running application at a given point in time such that it can be restored at a later time in the same state in which it was saved. Application checkpoint-restart can facilitate fault resilience by migrating applications off faulty cluster nodes and fault recovery by restarting applications from a previously saved state. However, conventional checkpoint-restart mechanisms cannot provide this functionality, while ensuring the global consistency of the network state of the cluster nodes, transparently on clusters running commodity operating systems and hardware.
SUMMARY
Methods, media and systems for managing a distributed application running in a plurality of digital processing devices are provided. In some embodiments, methods for managing a distributed application running in a plurality of digital processing devices are provided, comprising: running one or more processes associated with the distributed application in virtualized operating system environments in a plurality of digital processing devices; suspending the one or more processes; saving network state information relating to network connections among the one or more processes; storing process information relating to the one or more processes; recreating the network connections using the saved network state information; and restarting the one or more processes using the stored process information.
In some embodiments, computer-readable media containing computer-executable instructions that, when executed by a processor, cause the processor to perform a method for managing a distributed application running in a plurality of digital processing devices are provided, the method comprising: running one or more processes associated with the distributed application in virtualized operating system environments in a plurality of digital processing devices; suspending the one or more processes; saving network state information relating to network connections among the one or more processes; storing process information relating to the one or more processes; recreating the network connections using the saved network state information; and restarting the one or more processes using the stored process information.
In some embodiments, systems for managing a distributed application are provided, comprising: a plurality of interconnected digital processing devices configured to run one or more processes associated with the distributed application in virtualized operating system environments, suspend the one or more processes, save network state information relating to network connections among the one or more processes, recreate the network connections using the saved network state information, and restart the one or more processes using the stored process information.



BRIEF DESCRIPTION OF THE DRAWINGS
The Detailed Description, including the description of various embodiments of the invention, will be best understood when read in reference to the accompanying figures wherein:
FIG. 1 is a block diagram illustrating an operating system virtualization scheme according to some embodiments;
FIG. 2 is a diagram illustrating a method for managing a distributed application, according to some embodiments;
FIG. 3 is a diagram illustrating a method for performing a checkpoint of a distributed application, according to some embodiments;
FIG. 4 is a diagram a timeline for performing a checkpoint of a distributed application, according to some embodiments;
FIG. 5 is a diagram illustrating a method for restarting a distributed application, according to some embodiments;
FIG. 6 is a diagram depicting examples of network state information; and
FIG. 7 is a block diagram of a system according to some embodiments.



DETAILED DESCRIPTION
Methods, media and systems for managing a distributed application running in a plurality of digital processing devices (e.g., computers) are provided. In some embodiments, methods, media, and systems are provided for transparent coordinated checkpoint-restart of distributed network applications on commodity clusters. To this end, a virtualized operating system environment can be used to migrate applications in a flexible manner.
FIG. 1 is a block diagram illustrating an operating system virtualization scheme in some embodiments. An operating system 108 that runs on digital processing device 110 can be provided with a virtualization layer 112 that provides a PrOcess Domain (pod) abstraction. Digital processing device 110 can include, for example, computers, set-top boxes, mobile computing devices such as cell phones and Personal Digital Assistants (PDAs), other embedded systems and/or any other suitable device. One or more pods, for example, Pod 102a and Pod 102b, can be supported. A pod (e.g., pod 102a) can include a group of processes (e.g., processes 104a) with a private namespace, which can include a group of virtual identifiers (e.g., identifiers 106a). The private namespace can present the process group with a virtualized view of the operating system 108. This virtualization provided by virtualization layer 112 can associate virtual identifiers (e.g., identifiers 106a) with operating system resources identifiers 114 such as process identifiers and network addresses. Hence, processes (e.g., processes 104a) in a pod (e.g., pod 102a) can be decoupled from dependencies on the operating system 108 and from other processes (e.g., processes 104b) in the system. This virtualization can be integrated with a checkpoint-restart mechanism that enables processes within a pod to be migrated as a unit to another machine. This virtualization scheme can be implemented to virtualize any suitable operating systems, including, but not limited to, Unix, Linux, and Windows operating systems. This virtualization scheme can be, for example, implemented as a loadable kernel module in Linux.
The private, virtual namespace of pods enables secure isolation of applications by providing complete mediation to operating system resources. Pods can restrict what operating system resources are accessible within a pod by simply not providing identifiers to such resources within its namespace. A pod only needs to provide access to resources that are needed for running those processes within the pod. It does not need to provide access to all resources to support a complete operating system environment. An administrator can configure a pod in the same way one configures and installs applications on a regular machine. Pods enforce secure isolation to prevent exploited pods from being used to attack the underlying host or other pods on the system. Similarly, the secure isolation allows one to run multiple pods from different organizations, with different sets of users and administrators on a single host, while retaining the semantic of multiple distinct and individually managed machines.
For example, to provide a web server, a web server pod can be setup to only contain the files the web server needs to run and the content it wants to serve. The web server pod could have its own IP address, decoupling its network presence from the underlying system. The pod can have its network access limited to client-initiated connections using firewall software to restrict connections to the pod's IP address to only the ports served by applications running within this pod. If the web server application is compromised, the pod limits the ability of an attacker to further harm the system because the only resources he has access to are the ones explicitly needed by the service. The attacker cannot use the pod to directly initiate connections to other systems to attack them since the pod is limited to client-initiated connections. Furthermore, there is no need to carefully disable other network services commonly enabled by the operating system to protect against the compromised pod because those services, and the core operating system itself, reside outside of the pod's context.
Pod virtualization can be provided using a system call interposition mechanism and the chroot utility with file system stacking. Each pod can be provided with its own file system namespace that can be separate from the regular host file system. While chroot can give a set of processes a virtualized file system namespace, there may be ways to break out of the environment changed by the chroot utility, especially if the chroot system call is allowed to be used by processes in a pod. Pod file system virtualization can enforce the environment changed by the chroot utility and ensure that the pod's file system is only accessible to processes within the given pod by using a simple form of file system stacking to implement a barrier. File systems can provide a permission function that determines if a process can access a file.
For example, if a process tries to access a file a few directories below the current directory, the permission function is called on each directory as well as the file itself in order. If any of the calls determine that the process does not have permission on a directory, the chain of calls ends. Even if the permission function determines that the process has access to the file itself, it must have permission to traverse the directory hierarchy to the file to access it. Therefore, a barrier can be implemented by stacking a small pod-aware file system on top of the staging directory that overloads the underlying permission function to prevent processes running within the pod from accessing the parent directory of the staging directory, and to prevent processes running only on the host from accessing the staging directory. This effectively confines a process in a pod to the pod's file system by preventing it from ever walking past the pod's file system root.
Any suitable network file system, including Network File System (NFS), can be used with pods to support migration. Pods can take advantage of the user identifier (UID) security model in NFS to support multiple security domains on the same system running on the same operating system kernel. For example, since each pod can have its own private file system, each pod can have its own /etc/passwd file that determines its list of users and their corresponding UIDs. In NFS, the UID of a process determines what permissions it has in accessing a file.
Pod virtualization can keep process UIDs consistent across migration and keep process UIDs the same in the pod and operating system namespaces. However, because the pod file system is separate from the host file system, a process running in the pod is effectively running in a separate security domain from another process with the same UID that is running directly on the host system. Although both processes have the same UID, each process is only allowed to access files in its own file system namespace. Similarly, multiple pods can have processes running on the same system with the same UID, but each pod effectively provides a separate security domain since the pod file systems are separate from one another. The pod UID model supports an easy-to-use migration model when a user may be using a pod on a host in one administrative domain and then moves the pod to another. Even if the user has computer accounts in both administrative domains, it is unlikely that the user will have the same UID in both domains if they are administratively separate. Nevertheless, pods can enable the user to run the same pod with access to the same files in both domains.
Suppose the user has UID 100 on a machine in administrative domain A and starts a pod connecting to a file server residing in domain A. Suppose that all pod processes are then running with UID 100. When the user moves to a machine in administrative domain B where he has UID 200, he can migrate his pod to the new machine and continue running processes in the pod. Those processes can continue to run as UID 100 and continue to access the same set of files on the pod file server, even though the user's real UID has changed. This works, even if there's a regular user on the new machine with a UID of 100. While this example considers the case of having a pod with all processes running with the same UID, it is easy to see that the pod model supports pods that may have running processes with many different UIDs.
Because the root UID 0 may be privileged and treated specially by the operating system kernel, pod virtualization may treat UID 0 processes inside of a pod specially as well. This can prevent processes running with privilege from breaking the pod abstraction, accessing resources outside of the pod, and causing harm to the host system. While a pod can be configured for administrative reasons to allow full privileged access to the underlying system, there are pods for running application services that do not need to be used in this manner. Pods can provide restrictions on UID 0 processes to ensure that they function correctly inside of pods.
When a process is running in user space, its UID does not have any affect on process execution. Its UID only matters when it tries to access the underlying kernel via one of the kernel entry points, namely devices and system calls. Since a pod can already provide a virtual file system that includes a virtual/dev with a limited set of secure devices, the device entry point may already be secure. System calls of concern include those that could allow a root process to break the pod abstraction. They can be classified into three categories and are listed below:
Category 1: Host Only System Calls
mount—If a user within a pod is able to mount a file system, they could mount a file system with device nodes already present and thus would be able to access the underlying system directly. Therefore, pod processes may be prevented from using this system call.
stime, adjtimex—These system calls enable a privileged process to adjust the host's clock. If a user within a pod could call this system call they can cause a change on the host. Therefore pod processes may be prevented from using this system call.
acct—This system call sets what file on the host BSD process accounting information should be written to. As this is host specific functionality, processes may be prevented from using this system call.
swapon, swapoff—These system calls control swap space allocation. Since these system calls are host specific and may have no use within a pod, processes may be prevented from calling these system calls.
reboot—This system call can cause the system to reboot or change Ctrl-Alt-Delete functionality. Therefore, processes may be prevented from calling it.
ioperm, iopl—These system calls may enable a privileged process to gain direct access to underlying hardware resources. Since pod processes do not access hardware directly, processes may be prevented from making these system calls.
create_nodule, init_nodule, delete_nodule, query_module—These system calls relate to inserting and removing kernel modules. As this is a host specific function, processes may be prevented from making these system calls.
sethostname, setdomainname—These system call set the name for the underlying host. These system calls may be wrapped to save them with pod specific names, allowing each pod to call them independently.
nfsservctl—This system call can enable a privileged process inside a pod to change the host's internal NFS server. Processes may be prevented from making this system call.
Category 2: Root Squashed System Calls
nice, setpriority, sched_setscheduler—These system calls lets a process change its priority. If a process is running as root (UID 0), it can increase its priority and freeze out other processes on the system. Therefore, processes may be prevented from increasing their priorities.
ioctl—This system call is a syscall demultiplexer that enables kernel device drivers and subsystems to add their own functions that can be called from user space. However, as functionality can be exposed that enables root to access the underlying host, all system call beyond a limited audited safe set may be squashed to user “nobody,” similar to what NFS does.
setrlimit—this system call enables processes running as UID 0 to raise their resource limits beyond what was preset, thereby enabling them to disrupt other processes on the system by using too much resources. Processes may be prevented from using this system call to increase the resources available to them.
mlock, mlockall—These system calls enable a privileged process to pin an arbitrary amount of memory, thereby enabling a pod process to lock all of available memory and starve all the other processes on the host. Privileged processes may therefore be reduced to user “nobody” when they attempt to call this system call so that they are treated like a regular process.
Category 3: Option Checked System Calls
mknod—This system call enables a privileged user to make special files, such as pipes, sockets and devices as well as regular files. Since a privileged process needs to make use of such functionality, the system call cannot be disabled. However, if the process creates a device it may be creating an access point to the underlying host system. Therefore when a pod process makes use of this system call, the options may be checked to prevent it from creating a device special file, while allowing the other types through unimpeded.
The first class of system calls are those that only affect the host system and serve no purpose within a pod. Examples of these system calls include those that load and unload kernel modules or that reboot the host system. Because these system calls only affect the host, they would break the pod security abstraction by allowing processes within it to make system administrative changes to the host. System calls that are part of this class may therefore be made inaccessible by default to processes running within a pod.
The second class of system calls are those that are forced to run unprivileged. Just like NFS, pod virtualization may force privileged processes to act as the “nobody” user when they want to make use of some system calls. Examples of these system calls include those that set resource limits and ioctl system calls. Since system calls such as setrlimit and nice can allow a privileged process to increase its resource limits beyond predefined limits imposed on pod processes, privileged processes are by default treated as unprivileged when executing these system calls within a pod. Similarly, the ioctl system call is a system call multiplexer that allows any driver on the host to effectively install its own set of system calls. Pod virtualization may conservatively treat access to this system call as unprivileged by default.
The third class of system calls are calls that are required for regular applications to run, but have options that will give the processes access to underlying host resources, breaking the pod abstraction. Since these system calls are required by applications, the pod may check all their options to ensure that they are limited to resources that the pod has access to, making sure they are not used in a manner that breaks the pod abstraction. For example, the mknod system call can be used by privileged processes to make named pipes or files in certain application services. It is therefore desirable to make it available for use within a pod. However, it can also be used to create device nodes that provide access to the underlying host resources. To limit how the system call is used, the pod system call interposition mechanism may check the options of the system call and only allows it to continue if it is not trying to create a device.
In some embodiments, checkpoint-restart as shown in FIG. 2 can allow pods to be migrated across machines running different operating system kernels. Upon completion of the upgrade process (e.g., at 210 of method 200), the system and its applications may be restored on the original machine. Pods can be migrated between machines with a common CPU architecture with kernel differences that may be limited to maintenance and security patches.
Many of the Linux kernel patches contain security vulnerability fixes, which are typically not separated out from other maintenance patches. Migration can be achieved where the application's execution semantics, such as how threads are implemented and how dynamic linking is done, do not change. On the Linux kernels, this is not an issue as all these semantics are enforced by user-space libraries. Whether one uses kernel or user threads, or how libraries are dynamically linked into a process can be determined by the respective libraries on the file system. Since the pod may have access to the same file system on whatever machine it is running on, these semantics can stay the same. To support migration across different kernels, a system can use a checkpoint-restart mechanism that employs an intermediate format to represent the state that needs to be saved on checkpoint, as discussed above.
In some embodiments, the checkpoint-restart mechanism can be structured to perform its operations when processes are in such a state that saving on checkpoint can avoid depending on many low-level kernel details. For example, semaphores typically have two kinds of state associated with each of them: the value of the semaphore and the wait queue of processes waiting to acquire the corresponding semaphore lock. In general, both of these pieces of information have to be saved and restored to accurately reconstruct the semaphore state. Semaphore values can be easily obtained and restored through GETALL and SETALL parameters of the semcti system call. But saving and restoring the wait queues involves manipulating kernel internals directly. The checkpoint-restart mechanism avoids having to save the wait queue information by requiring that all the processes be stopped before taking the checkpoint. When a process waiting on a semaphore receives a stop signal, the kernel immediately releases the process from the wait queue and returns EINTR. This ensures that the semaphore wait queues are always empty at the time of checkpoint so that they do not have to be saved.
While most process state information can be abstracted and manipulated in higher-level terms using higher-level kernel services, there are some parts that are not amenable to a portable intermediate representation. For instance, specific TCP connection states like time-stamp values and sequence numbers, which do not have a high-level semantic value, have to be saved and restored to maintain a TCP connection. As this internal representation can change, its state needs to be tracked across kernel versions and security patches. Fortunately, there is usually an easy way to interpret such changes across different kernels because networking standards such as TCP do not change often. Across all of the Linux 2.4 kernels, there was only one change in TCP state that required even a small modification in the migration mechanism. Specifically, in the Linux 2.4.14 kernel, an extra field was added to TCP connection state to address a flaw in the existing syncookie mechanism. If configured into the kernel, syncookies protect an Internet server against a synflood attack. When migrating from an earlier kernel to a Linux-2.4.14 or later version kernel, the extra field can be initialized in such a way that the integrity of the connection is maintained. In fact, this is the only instance across all of the Linux 2.4 kernel versions where an intermediate representation is not possible and the internal state had changed and had to be accounted for.
By providing a thin virtualization layer on top of an operating system, a distributed application can be decoupled from operating system instances running on a set of cluster nodes. This frees the application from dependencies on the cluster nodes on which it is executing. This virtualization may expose the underlying host operating system functionality directly to applications, enabling parallel applications to efficiently utilize existing multiprocessor operating system functionality. The cluster nodes in a cluster can run independent commodity operating system instances, and the nodes can have access to a shared storage infrastructure. For example, a common configuration may be a set of blade servers or rackmounted 1U servers running standard Linux and connected to a common Storage Area Network (SAN) or a Network Attached Storage (NAS) storage infrastructure.
FIG. 2 is a diagram illustrating a method 200 for managing a distributed application, according to some embodiments. At 202, a number of pods associated with a distributed application run in a computer cluster. At 204, the pods are suspended. At 206, a checkpoint is performed with respect to a network state by saving information regarding the network connections between the computers in the cluster. At 208, a checkpoint is performed with respect to the pods on the computers. At 210, the pods and the network connections are recreated in the cluster, where the location of pods may have changed.
In method 200, according to some embodiments, an entire distributed application can be saved on checkpoint across all nodes in a coordinated manner so that it can be restarted at the checkpoint on a different set of cluster nodes at a later time. In saving and restarting a distributed application, the processing of a network state can be separated from per node application states. Operation in saving the network state can be synchronized. Checkpoint-restart operations on per node application states can be designed to proceed in parallel with minimal synchronization requirements among nodes, resulting in faster checkpoint-restart times. In some embodiments, checkpoint data can be directly streamed from one set of nodes to another, enabling direct migration of a distributed application to a new set of nodes without saving and restoring state from secondary storage.
In some embodiments, complete checkpoint-restart of network state can be supported in a transport protocol independent manner without application or library support. Socket abstraction can be used to save and restore all socket state, including socket parameters, socket data queues, and minimal protocol specific state. This can be accomplished in a portable manner using the standard socket interface without detailed knowledge of the underlying network protocol data structures. In some embodiments, network state can be saved and restored in a protocol independent manner for reliable and unreliable network protocols, including TCP, UDP and raw DP.
A system or a computer software product for checkpoint-restart of distributed applications can include three logical components: a standalone pod checkpoint-restart mechanism that saves and restores non-network per-node application state, a manager that coordinates a set of agents each using the standalone checkpoint-restart mechanism to save and restore a distributed application across a set of cluster nodes in a consistent manner, and a network checkpoint-restart mechanism that saves and restores all the necessary network state to enable the application processes running on different nodes to communicate.
The pod checkpoint-restart mechanism can use the pod virtual machine abstraction. Pod virtual resources are transparently mapped-to real operating system resources as a pod migrates from one node to another. This allows distributed applications to migrate to any cluster regardless of its IP subnet or addresses. Pod namespaces can be supported using a thin virtualization layer based on system call interposition mechanism and the chroot utility with file system stacking. The pod virtualization layer can be implemented entirely in a dynamically loadable kernel module.
In some embodiments, the pod checkpoint-restart mechanism can employ higher-level semantic information specified in an intermediate format rather than kernel specific data in native format to keep the format portable across different kernels. In some embodiments, the pod checkpoint-restart mechanism assumes a shared storage infrastructure across cluster nodes and does not save and restore file system state as part of the pod checkpoint image to reduce checkpoint image size. In these embodiments, the mechanism can be used with already available file system snapshot functionality to provide a saved file system image.
Using some embodiments, a distributed application can be executed in a manner that is analogous to a regular cluster. Each application endpoint (process) can be placed in a separate pod. On multiprocessor nodes that run multiple application endpoints, each endpoint can be encapsulated in a separate pod. To leverage mobility, the application can be divided into many independent pods. This allows for maximum flexibility when migrating the application. A distributed application running on N cluster nodes can be moved to run on M cluster nodes, where N may or may not be equal to M. For instance, a dual-CPU node may host two application endpoints encapsulated in two separate pods. Each pod can thereafter be relocated to a distinct node; they do not need to be migrated together to the same node.
A coordinated checkpoint-restart scheme can include a Manager client that orchestrates the operation of a set of Agents, one on each node. The Manager is the front-end client invoked by the user and can be run from anywhere, inside or outside the cluster. It accepts a user's checkpoint or restart request and translates it into a set of commands to the Agents. The Agents receive these commands and carry them out on their local nodes.
The Manager can maintain reliable network connections with the Agents throughout the entire operation. Therefore an Agent failure can be readily detected by the Manager as soon as the connection becomes broken. Similarly, the Agents can detect a failure of the Manager. In both cases, the operation can be gracefully aborted, and the application can resume its execution.
A checkpoint can be initiated by invoking the Manager with a list of tuples of the form <node, pod, URI>. This list specifies the nodes and the pods that compose the distributed application, as well as the destination for the saved data (URI). The destination can be either a file name or a network address of a receiving Agent. This facilitates direct migration of an application from one set of nodes to another without requiring that the checkpoint data first be written to some intermediary storage.
FIG. 3 is a diagram illustrating a method 300 of some embodiments for performing a checkpoint of a distributed application, to be performed by the Manager and the Agents. Given a checkpoint request, the Manager can begin with broadcasting a checkpoint command to all participating nodes at 302. Upon receiving the command, each Agent can initiate the local checkpoint procedure as follows. The Agent can suspend the designated pod at 310, invoke the network-state checkpoint at 312, and report meta-data to the Manager at 314. The Agent can then proceed with the standalone pod checkpoint at 316, and wait for a ‘continue’ message from the Manager at 318. The Manager, after receiving meta-data at 304 from all Agents, can send a ‘continue’ message to the Agents at 306. The Agent can then unblock the network at 320 and report ‘done’ to the Manager at 322. This ensures that the Agents finish only after having received the ‘continue’ message from the Manager and reported ‘done.’
Each Agent can first suspend its respective pod at 310 by sending a SIGSTOP signal to all the processes in the pod to prevent those processes from being altered during checkpoint. To prevent the network state from changing, the Agent can disable all network activity to and from the pod. This can be achieved by using a standard network filtering service (e.g., Netfilter in Linux) to block the network links. The Agent can then obtain the network meta-data of the node, a table of <state, source, target> tuples showing all network connections of the pod. This can be the first information saved by the Agent as part of the checkpoint and can be used by the restart procedure to correctly reconstruct the network state. The source and target fields describe the connection endpoint IP addresses and port numbers. The state field reflects the state of the connection, which may be full-duplex, half-duplex, closed (in which case there may still be unread data), or connecting. The first three states are for established connections while the last state is a transient state for a not yet fully established connection.
Once the pod's network is frozen, the Agent can save the network state at 312. When finished, the Agent can notify the Manager that it has concluded its network state checkpoint, and reports its meta-data at 314. It can then proceed to perform the standalone pod checkpoint at 316. When the Manager has received the meta-data from all participating Agents at 304, the Manager can tell the Agents to continue at 306, and the Agents can unblock the network at 320. The network state can be saved on checkpoint before the pod state to enable more concurrent checkpoint operation by overlapping the standalone pod checkpoint time with the time it takes for the Manager to receive the meta-data from all participating Agents and indicate that they can continue.
The last action taken by the Agent can depend on the context of the checkpoint. If the application should continue to run on the same node after the checkpoint, the pod can be allowed to resume execution by sending a SIGCONT to all the processes. However, should the application processes migrate to another location, the Agent can destroy the pod locally and create a new one at the destination site. In both cases, a file-system snapshot (if desired) may be taken immediately prior to reactivating the pod.
FIG. 4 illustrates a checkpoint timeline that can be used in some embodiments. The timeline is labeled with numbers that correspond to the acts performed by the Manager as described in FIG. 3. The timeline shows that the entire checkpoint procedure can be executed concurrently in an asynchronous manner on all participating nodes for nearly its entire duration. FIG. 4 shows that the only synchronization point can be when the Manager receives meta-data from Agents and sends the continue message to the Agents. This single synchronization may be sufficient for the checkpoint procedure to be coherent and correct. The Agents can synchronize at the Manager before completing their standalone pod checkpoints and unblocking their networks. If not, it may be possible for one node to resume operation, re-engage in network activity, and deliver data to another node that had not begun its checkpoint. This may result in an inconsistent global state, as the state of the latter node will contain data that is not marked as sent in the already-saved state of the former.
The single synchronization may be sufficient because every pod ensures consistency by blocking its connections independently of other pods. Once a pod has blocked its connections, there may be no interaction with any other pod even if the network of other pods is not yet blocked. The pod may already be isolated and may not need to wait for all other pods to block their connections. By not having to wait for other pods initially, the network activity may only be blocked for the minimal required time.
A restart can be initiated by invoking the Manager with a list of tuples of the form <node, pod, URI>. This list describes the mapping of the application to nodes and pods, where URI indicates the location of the checkpoint data. A key requirement of the restart is to restore the network connections of the distributed application. Because the entire distributed application is to be restarted, the network checkpoint-restart mechanism can control both ends of each network connection, and can reconstruct the communicating sockets on both sides of each connection using a pair of connect and accept system calls. This can leverage the standard socket interface for creating network connections and results in a robust, easy to implement and highly portable approach.
FIG. 5 is a diagram illustrating a method 500 for restarting a distributed application, according to some embodiments. Given a restart request, the Manager can send a ‘restart’ command to all the Agents accompanied by a modified version of the meta-data at 502. The meta-data can be used to derive a new network connectivity map by substituting the destination network addresses in place of the original addresses. This outlines the desired mapping of the application to nodes/pods pairs. In the case of a restart on the same set of nodes (e.g., covering from a crash), the mapping may remain unmodified. In the case of migration, the mapping can reflect the settings of the alternate execution environment, particularly the network addresses at the target cluster.
As part of the modified meta-data, the Manager can provide a schedule that indicates for each connection which peer will initiate and which peer will accept. This can be performed by tagging each entry as either a connect or accept type. This can be determined arbitrarily, except when multiple connections share the same source port number. Source port numbers can be set by the application if not already taken or assigned automatically by the kernel; specifically when a TCP connection is accepted, it can inherit the source port number from the “listening” socket. To correctly preserve the source port number when shared by multiple connections, these connections must be created in a manner that resembles their original creation, as determined by the above schedule.
The Agents can respond to the Manager's commands by creating an empty pod into which the application will be restored at 506. The Agents then engage the local restart procedure, which can include recovering the network connectivity at 508, restoring the network state at 510, and executing the application standalone restart at 512. Once completed, the pod can be allowed to resume execution without further delay, and the Agents can report the ‘done’ status the Manager at 514.
The recovery of the network connectivity at 508 can be performed in user space. The meta-data that the Agent received from the Manager may completely describe the connectivity of the pod, and can be effectively used as a set of instructions to re-establish the desired connections. The Agent can loop over all the entries (each of type connect or accept), and perform the suitable action. If the state field is other than full-duplex, the status of the connection can be adjusted accordingly. For example, a closed connection can have a shutdown system call executed after the rest of its state has been recovered.
Generally, these connections cannot be executed in any arbitrary order, or a deadlock may occur. Consider for instance an application connected in a ring topology (each node has two connections—one at each side): a deadlock can occur if every node first attempts to accept a connection from the next node. To prevent such deadlocks, two threads of execution can be used. One thread can handle requests for incoming connections, and the other can establish connections to remote pods. Hence, there is no specific order at which connections requests should arrive at the Agent. This connectivity recovery scheme can be implemented in a portable way.
Once the network connectivity has been re-established at 508, the Agent can initiate the restart of the network-state at 510. This ensures that the exact previous state of all network connections are reinstated, namely connection status, receive queue, send queue and protocol specific state. Similarly, to the distributed checkpoint, this order of actions can avoid forced synchronization points between the nodes at later stages. In turn, this prevents unnecessary idle time, and increases concurrency by hiding associated latencies. With this framework, the only synchronization that is required is indirect and is induced by the creation of network connections. This restart scheme does not require that the network be disabled for any intermediate period. This scheme can also provide that no data, except data that is explicitly chosen to be sent, will be transmitted through the connection, until the application resumes execution (which will only occur at the end of the restart). The standalone restart can be invoked locally by each Agent after the network state has been successfully restored. To conclude the entire operation, each Agent can send a summary message to the Manager, specifying the completion status (failure or success) and the name of the new pod that has been created. The Manager can collect this data from all the Agents and report it back to the user.
The network-state of an application can be defined by the collection of the network-states of its communication end-points. From the application's standing point, the primary abstraction of a communication endpoint is a socket. A socket is associated with a network protocol upon creation. The application can bind a socket to an address, connect to an address, accept a connection, as well as exchange data. The operating system can in turn keep a certain amount of state for each socket. The network-state checkpoint-restart is responsible for capturing and restoring this state.
The state of a socket can have three components: socket parameters, socket data queues and protocol specific state. The socket parameters describe socket properties related to its state, e.g., connected or not, and to its behavior, e.g., blocking or non-blocking I/O. The data queues—specifically send and receive queues, hold incoming and outgoing data respectively, which is handled by the network layer. Protocol specific data describes internal state held by the protocol itself. For instance, TCP connection state and TCP timers are part of its state.
Saving the state of the socket parameters is straightforward because the processes in the pod are suspended and cannot alter the socket state during a network state checkpoint. Also, the network may be blocked and only restarted later on after all the applications involved in the checkpoint have terminated their local network state checkpoint. Hence the socket parameters can be safely extracted at this point. Furthermore, these properties can be user-accessible via a standard interface provided by the operating system, namely getsockopt and setsockopt system calls. The entire set of the parameters can be included in the saved state. The socket's receive and send queues can be stored in the kernel. They hold intermediate data that has been received by the network layer but not yet delivered to (read by) the application, as well as data issued by the application that has not yet been transmitted over the network.
With unreliable protocols, it is normally not required to save the state of the queue. Packet loss is an expected behavior and should be accounted for by the application. If the restart does not restore a specific segment of data it can be interpreted as a legitimate packet loss. One exception, however, is if the application has already “peeked” at (that is, examined but not consumed) the receive queue. This is a standard feature in most operating system and is regularly used. To preserve the expected semantics, the data in the queue can be restored upon restart, since its existence is already part of the application's state. With reliable protocols, on the other hand, the queues are clearly an integral part of the socket state and cannot be dispensed of. Therefore, one may choose to always save the data in the queues, regardless of the protocol in question. The advantage is that it prevents causing artificial packet loss that would otherwise slowdown the application shortly after its restart, the amount of time it lingers until it detects the loss and fixes it by retransmission.
In both cases of reliable and unreliable protocols, data in transit can be safely ignored. Such data will either be dropped (for incoming packets) or blocked (for outgoing packets) by the network layer, since the pod's network is blocked for the duration of the checkpoint. With unreliable protocol, this is obviously an expected behavior. Reliable protocols will eventually detect the loss of the data and consequently retransmit it.
Saving the state of the receive queue and the send queue necessitates a method to obtain their contents. The method may be transparent and not entail any side-effects that may alter the contents of the queue. One approach is to read the data off the socket using the standard read system call, while at the same time injecting it back into the socket. The data may become attached to the socket as if it has just been restored. Using this approach, even though the receive queue is modified, the application can still be guaranteed to read this data prior to any new data arriving on the network, similar to other restored data.
The kernel typically does not provide an interface to insert data into the receive queue, and thus doing so may require knowledge of the underlying network protocol. This difficulty is overcome by observing that it is sufficient that the application consumes the restart data before any new data arrives to the socket. Therefore, an alternate receive queue can be allocated in which this data is deposited. The socket interface calls can then be interposed to ensure that future application requests will be satisfied with this data first, before access is made to the main receive queue. Clearly, the Checkpoint procedure may save the state of the alternate queue, if applicable (e.g., if a second checkpoint is taken before the application reads its pending data).
Technically, interposition can be realized by altering the socket's dispatch vector. The dispatch vector can determine which kernel function is called for each application interface invocation (e.g. open, write, read and so on). Specifically, three methods that may involve the data in the receive queue, recvmsg, poll and release, can be interposed. Interposition may only persist as long as the alternate queue contains data; when the data becomes depleted, the original methods can be reinstalled to avoid incurring overhead for regular socket operation.
Interposing on recvmsg can be used for using the alternate queue as the source for the data. The poll method can be included since it provides asynchronous notification and probing functionality by examination of the receive queue. Finally, the release method can be used to properly handle cleanup (in case the data has not been entirely consumed before the process terminates).
Extracting the contents of the send queue can be performed by inspecting the socket's send queue using standard in-kernel interface to the socket layer (normally used by protocol code and device drivers). This can be accomplished without altering the state of the send queue itself. While the receive queue is tightly coupled to the protocol specifics and roughly reflects the random manner in which the packets arrived, the send queue is more well organized according to the sequence of data send operations issued by the application.
Restoring the state of the send queue can be performed as follows. Given the re-established connection, the data can be resent by means of the standard write system call. The underlying network layer will take care of delivering the data safely to the peer socket. In the case of migration, a clever optimization is to redirect the contents of the send queue to the receiving pod and merge it with (or append to) the peer's stream of checkpoint data. Later during restart, the data will be concatenated to the alternate receive queue (of course, only after the latter has been restored). This will eliminate the need to transmit the data twice over the network: once when migrating the original pod, and then again when the send queue is processed after the pod resumes execution. Instead it can merge both into a single transfer, from the source pod to the destination pod.
The following describes how to save and restore protocol specific state information. The portion of this state that records the protocol properties is exported to the socket layer and can be accessed by the applications. TCP options that activate and deactivate keep-alive timers (TCP_KEEPALIVE), and semantics of urgent data interpretation (TCP_STDURG) are two such examples. The saved state information includes the entire set of these options, and they can be handled in a similar way to the socket options, as discussed above. The remaining portion of the state information is internal, and holds dynamic operational data. Unlike accessing the socket layer which is a common practice in kernel modules, access to the protocol's state requires intimate knowledge of its internals. Restoring such a state entails carefully handcrafted imitation of the protocol's behavior. If a portable solution is sought, the minimal state that must be extracted can be identified. As discussed before, the minimal state for unreliable protocols is nil, inherently to their nature. With reliable protocols, the internal state typically keeps track of the dynamics of the connection to guarantee delivery of messages. Data elements are tagged with a sequence numbers, and the protocol records the sequence number of data that has been transmitted but not yet acknowledged. Timers are deployed to trigger resubmission of unacknowledged data (on the presumption that it had been lost), and to detect broken connections. Each peer in a connection tracks three sequence numbers: last data sent (sent), last data received (recv) and last data acknowledged by the other peer (acked).
An important property of reliable protocols is the following invariant: recv1>acked2 (where the subindices 1 and 2 designate the peers of connection). The reason is that upon receiving data, a peer updates its recv value, and sends an acknowledgment. If the acknowledgment is not lost, it will arrive with some small delay, and then the other peer will update its acked value. It follows that a send queue always holds data between acked and sent—that is the unacknowledged data. The receive queue holds data from some point back in time until recv. If recv1>acked2, there is some overlap between the two queues. This setting is depicted in FIG. 6. The overlap can be fixed during the restart operation, before the application consumes duplicate data. This can be done by discarding extraneous data from either queue. It is more advantageous to discard that of the send queue to avoid transferring it over the network.
To ensure correct restart of a connection, recv and acked values can be captured on both peers. This data, along with additional protocol specific information, is located in a protocol-control-block (PCB) data structure that is associated with every TCP socket. The concept of a PCB is ubiquitous to the TCP stack, although the details of its layout differ between distinct implementations. It follows that the need to access these fields does not impair the portability of the disclosed subject matter, but merely requires a trivial adjustment per implementation.
Some applications employ timeout mechanisms on top of the native protocol, as a common technique to detect soft faults and dead locks, or to expire idle connections. They are also used to implement reliable protocols on top of unreliable ones (e.g. over UDP). The mechanisms typically maintain a time-stamp for each connection, updating its value whenever there is activity involving the connection. Time-stamps are inspected periodically, and the appropriate action is triggered if the value is older than a predefined threshold.
It follows that if there is sufficient delay between the checkpoint and the restart, certain applications may experience undesired effects if the timer value exceeds the threshold and expires. This can be resolved by virtualizing those system calls that report time. During restart the difference between the current time and the current time as recorded during checkpoint can be computed. Responses to subsequent inquiries of the time are then biased by that delay. Standard operating system timers owned by the application can also be virtualized. At restart, their expiry time is set in a similar manner by calculating the delta between the original clock and the current one. This type of virtualization is optional, and can be turned on or off per application as necessary (so that application that strictly require knowledge of the absolute time can operate normally).
Although some examples presented above relate to the Linux operating system, it will be apparent to a person skilled in the field that various embodiments can be implemented and/or used with any other operating systems, including, but not limited to, Unix and Windows operating systems. In addition, various embodiments are not limited to be used with computer clusters, but can be used with any suitable cluster of digital processing devices. Digital processing devices can include, for example, computers, set-top boxes, mobile computing devices such as cell phones and Personal Digital Assistants (PDAs), and other embedded systems.
FIG. 7 is a diagram illustrating system 700 of some embodiments. As shown, system 700 can include digital processing devices 702, 706, and 708. Distributed application 704 can run, for example, on digital processing devices 702 and 706, within virtualized operating system environments, with network connection 710 between processes relating to distributed application 704 on devices 702 and 706. System 700 can migrate distributed application 704, for example, to devices 702 and 708, preserving connection 710. The migration may include suspending distributed application 704 related processes, saving network state information relating to network connection 710, recreating network connection 710 using the saved network state information, and restarting distributed application 704 using the stored process information on devices 702 and 708.
Other embodiments, extensions, and modifications of the ideas presented above are comprehended and within the reach of one skilled in the field upon reviewing the present disclosure. Accordingly, the scope of the present invention in its various aspects is not to be limited by the examples and embodiments presented above. The individual aspects of the present invention, and the entirety of the invention are to be regarded so as to allow for modifications and future developments within the scope of the present disclosure. The present invention is limited only by the claims that follow.

## Claims

1. A method for managing a distributed application running in a plurality of digital processing devices, comprising:
running a first application endpoint of the distributed application in a first virtualized operating system environment in a first of the plurality of digital processing devices;
running a second application endpoint of the distributed application in a second virtualized operating system environment in a second of the plurality of digital processing devices, wherein the second application endpoint communicates with the first application endpoint via a network connection in a communication network;
sending first messages from the first application to the plurality of digital processing devices to initiate suspending;
suspending the first application endpoint and the second application endpoint;
saving network state information relating to the network connection, wherein saving network state information comprises sending network state information from the plurality of digital processing devices to the first application;
recreating the network connection using the saved network state information;
sending second messages from the first application to the plurality of digital processing devices to enable network activity of the first application endpoint and the second application endpoint;
generating one or more signals to coordinate a restarting of (i) the first application endpoint in one of the first of the plurality of digital processing devices and a third of the plurality of digital processing devices and (ii) the second application endpoint in one of the second of the plurality of digital processing devices and a fourth of the plurality of digital processing devices; and
restarting the first application endpoint and the second application endpoint using stored process information.

2. The method of claim 1, wherein information relating to network connections comprises at least one of network state, a state of socket parameters, and a protocol control block.

3. The method of claim 1, wherein the suspending comprises disabling network activity of the first application endpoint and the second application endpoint.

4. The method of claim 3, wherein the suspending comprises disabling network activity of the first application endpoint and the second application endpoint using, a network filtering service.

5. The method of claim 1, further comprising, for each of the plurality of digital processing devices, storing process information after saving network state information.

6. The method of claim 1, wherein, for each of the plurality of digital processing devices, restarting the first application endpoint and the second application endpoint occurs after recreating the network connections.

7. A non-transitory computer-readable medium containing computer-executable instructions that, when executed by a processor, cause the processor to perform a method for managing a distributed application running in a plurality of digital processing devices, comprising:
running a first application endpoint of the distributed application in a first virtualized operating system environment in a first of the plurality of digital processing devices;
running a second application endpoint of the distributed application in a second virtualized operating system environment in a second of the plurality of digital processing devices, wherein the second application endpoint communicates with the first application endpoint via a network connection in a communication network;
sending first messages from the first application to the plurality of digital processing devices to initiate suspending;
suspending the first application endpoint and the second application endpoint;
saving network state information relating to the network connection, wherein saving network state information comprises sending network state information from the plurality of digital processing devices to the first application;
recreating the network connection using the saved network state information;
sending second messages from the first application to the plurality of digital processing devices to enable network activity of the first application endpoint and the second application endpoint;
generating one or more signals to coordinate a restarting of (i) the first application endpoint in one of the first of the plurality of digital processing devices and a third of the plurality of digital processing devices and (ii) the second application endpoint in one of the second of the plurality of digital processing devices and a fourth of the plurality of digital processing devices; and
restarting the first application endpoint and the second application endpoint using stored process information.

8. The non-transitory computer-readable medium of claim 7, wherein information relating to network connections comprises at least one of network state, a state of socket parameters, and a protocol control block.

9. The non-transitory computer-readable medium of claim 7, wherein the suspending comprises disabling network activity of the first application endpoint and the second application endpoint.

10. The non-transitory computer-readable medium of claim 9, wherein the suspending comprises disabling network activity of the first application endpoint and the second application endpoint using a network filtering service.

11. The non-transitory computer-readable medium of claim 7, wherein the method further comprises, for each of the plurality of digital processing devices, storing process information after saving network state information.

12. The non-transitory computer-readable medium of claim 7, wherein, for each of the plurality of digital processing devices, restarting the first application endpoint and the second application endpoint occurs after recreating the network connections.

13. A system for managing a distributed application, comprising a plurality of interconnected digital processing devices configured to run a first application endpoint of the distributed application in a first virtualized operating system environment, run a second application endpoint of the distributed application in a second virtualized operating system environment in a second of the plurality of digital processing devices, wherein the second application endpoint communicates with the first application endpoint via a network connection in a communication network, send first messages from the first application to the plurality of digital processing devices to initiate suspend, suspend the first application endpoint and the second application endpoint, save network state information relating to the network connection, wherein save network state information comprises sending network state information from the plurality of digital processing devices to the first application, recreate the network connection using the saved network state information, send second messages from the first application to the plurality of digital processing devices to enable network activity of the first application endpoint and the second application endpoint, generate one or more signals to coordinate a restarting of (i) the first application endpoint in one of the first of the plurality of digital processing devices and a third of the plurality of digital processing devices and (ii) the second application endpoint in one of the second of the plurality of digital processing devices and a fourth of the plurality of digital processing devices, and restart the first application endpoint and the second application endpoint using stored process information.