Date of this Version
Many software systems today are highly-configurable, meaning the user can customize their instance of the application, adding and removing features as needed. However, this configurability makes it harder to ensure that faults will not escape testing and manifest as failures in the field. This is because many failures are configuration-dependent; they will appear under certain combinations of features configurations, but not others. Once faults are found and reported in the field, there can be a long lag time (days, weeks or even months) until patches are created and released to fix them. In the meantime, users will continue to use these software systems and need to be able to workaround potential failures. This thesis presents a self-adaptive framework for avoiding configuration-dependent failures at runtime. The framework is built on top of an existing self-adaptive system, Rainbow, and is implemented as a distributed client-base, with a central controller for applying the failure avoidance reconfigurations to clients as needed. Over time as the system gains global information of failures that have occurred, it will not only adapt to new configurations, but it guards other clients from these potentially bad configurations as well.
We have performed two evaluations to determine the feasibility of this framework in practice. We first evaluate a set of heuristic failure avoidance algorithms which forms the core of our adaptation, and compare these against an existing bounded brute force algorithm. We find that our heuristic algorithms are effective in avoiding most failures, but for a lower computational cost. Although we miss some workarounds found by the brute force algorithm, we also find new workarounds that are outside of the bounded search space suggesting that a heuristic approach may be better. We then implemented our framework on top of Rainbow and evaluate this on the Firefox web browser. In a study using four distributed instances of Firefox and a set of seeded faults based on real Firefox configuration bugs, we determine that we can workaround them all, and that once observed, we will no longer see the same failure again. We also see new native failures that we did not seed, and find workarounds for these as well. We conclude that our self-adaptive framework is feasible approach for avoiding configuration dependent failures at runtime.
Adviser: Myra B. Cohen