The exception catch in the GeneratedMetadataHandler_XXX removes the ACTIVE guard node in the mq.map cache only if the exception is of type NoHandler. For any other exception (notably for CyclicMetadataException) the ACTIVE node is leaked (left in the map). CyclicMetadataException exceptions are frequent because of cycles in RelSubset.
This issue is not visible normally because the aggressive refresh of mq via RelMetadaatQuery.instance() calls (
CALCITE-1812). With my changes to increase the lifetime of the used mq instances the leaked nodes become a problem as they trigger bogus CyclicMetadataException from leftover nodes.