Many systems must be periodically updated to add features, fix bugs, patch security vulnerabilities, and eliminate performance bottlenecks. In some systems, updates can be applied by simply halting the program, updating the code and data, and restarting the new version, but in critical systems even brief interruptions for maintenance are unacceptable. Although the research community has developed techniques for updating programs on the fly, existing frameworks only handle a single machine. To update the software running on a distributed system, programmers typically use ad hoc techniques that are difficult to reason about and prone to error.
The goal of this project is to develop foundational principles and practical techniques for managing distributed updates. A central theme is the use of bidirectional transformations to bridge the gap between different versions of a program, thereby allowing multiple versions to interoperate seamlessly. Specific contributions include developing (i) formal foundations for distributed updates, (ii) programming abstractions for constructing and deploying updates, (iii) verification tools for checking update correctness properties automatically, and (iv) an evaluation of these abstractions and tools on practical examples. The project will have broad impact by (i) discovering techniques for increasing the reliability of distributed systems during updates, (ii) building reusable software infrastructure for managing updates, and (iii) improving K-12 education and increasing the participation of underrepresented minorities in science through a high school outreach program.