Relational database applications are notoriously
difficult to test and debug. Concurrent
execution of database transactions may violate
complex structural invariants that constraint
how changes to the contents of one (shared)
table affect the contents of
another. Simplifying the underlying concurrency
model is one way to ameliorate the difficulty of
understanding how concurrent accesses and
updates can affect database state with respect
to these sophisticated properties. Enforcing
serializable execution of all transactions
achieves this simplification, but it comes at a
significant price in performance, especially at
scale, where database state is often replicated
to improve latency and availability.
To address these challenges, this paper presents
a novel testing framework for detecting
serializability violations in (SQL)
database-backed Java applications executing on
weakly-consistent storage systems. We manifest
our approach in a tool named clotho, that
combines a static analyzer and a model checker
to generate abstract executions, discover
serializability violations in these executions,
and translate them back into concrete test
inputs suitable for deployment in a test
environment. To the best of our knowledge,
clotho is the first automated test generation
facility for identifying serializability
anomalies of Java applications intended to
operate in geo-replicated distributed
environments. An experimental evaluation on a
set of industry-standard benchmarks demonstrates
the utility of our approach.