Sometimes we are delivered software that doesn't do exactly what we want and we have to find ways to modify its behavior. Many times we wind up "wrapping" the software. But modern language run times provide mechanisms for overriding the behavior of software after it has been built and delivered/deployed (e.g. inversion of control and dynamic wiring in Java, monkey patching in python). Shared library-based software on UNIX systems have long enjoyed similar capabilities via interposers—functionality that is relatively under-utilized by testers, SAs, and SREs.

In this talk, we present how we used a C library interposer to convert the attachment store of JIRA from being filesystem-based into a two-level store—with the filesystem being merely a cache for a cloud-based store. In a sense, we changed the behavior of the system underneath JIRA to change JIRA's behavior. This implementation gives us local filesystem performance (mostly) for attachment stores with near-infinite capacity for attachments as well as added resiliency (from the use of the cloud-based store).

We also present some other examples of how we have used interposers to support testing and monitoring.