Files
Groene AIandClaude Opus 5.5 4cc0fe19ef Lock SQLancer++ feedback counters on the class, not on the per-database table
`GeneralErrorHandler` keeps its cross-database feedback counters
(`allNodeSuccess/Count`, `allCompositeSuccess/Count`,
`allFragmentSuccess/Count`) in static HashMaps shared by every worker
thread. Their only writer, `GeneratorInfoTable.calcAverageScore`, is
`synchronized`, but `GeneratorInfoTable` is a non-static inner class
owned by each per-database handler, so every thread locked a different
object. Two threads finishing a database at the same time ran the
method concurrently: one iterated `allSuccess` while the other inserted
a new key, which threw `ConcurrentModificationException`, killed that
worker and made the FUZZING oracle exit 255 with no finding
(`SQLancerPP (arm_release)`, master 8e3eb7adf1, 2026-10-25).

Patch the method at image build time to synchronize on
`GeneralErrorHandler.class`. The pinned pom compiles with Java 11
source level, which does not allow a static method in an inner class,
so the method keeps its signature and delegates to a private copy of
the original body. The critical section is the in-memory aggregation
only: no file I/O and no per-statement path takes the lock.

Validation: a stress driver calling the handler from 8 threads failed
7/7 runs on the base image with the CI stack (`calcAverageScore` at
GeneralErrorHandler.java:213, reached through `updateHandler`) and
passed 7/7 on the patched image with every thread completing its
workload. A 300 s FUZZING run against a master server exits 0 on both
images at the same throughput.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-25 09:43:37 +00:00
..
2026-10-16 15:42:01 +00:00