Ejemplo n.º 1
0
    def testInitEngines_usesCorrectIsolationLevels(
        self,
        mock_get_secret: mock.MagicMock,
        mock_in_gcp: mock.MagicMock,
        mock_in_production: mock.MagicMock,
        mock_create_engine: mock.MagicMock,
        mock_get_states: mock.MagicMock,
    ) -> None:
        # Arrange
        mock_in_gcp.return_value = True
        mock_in_production.return_value = True
        # Pretend all secret values are just the key suffixed with '_value'
        mock_get_secret.side_effect = lambda key: f"{key}_value"

        # Act
        SQLAlchemyEngineManager.attempt_init_engines_for_server(
            set(schema_utils.SchemaType))

        # Assert
        self.assertEqual(
            mock_create_engine.call_args_list,
            [
                call(
                    URL.create(
                        drivername="postgresql",
                        username="******",
                        password="******",
                        database="postgres",
                        query={
                            "host":
                            "/cloudsql/sqlalchemy_cloudsql_instance_id_value"
                        },
                    ),
                    isolation_level=None,
                    poolclass=None,
                    echo_pool=True,
                    pool_recycle=600,
                ),
                call(
                    URL.create(
                        drivername="postgresql",
                        username="******",
                        password="******",
                        database="postgres",
                        query={
                            "host":
                            "/cloudsql/state_cloudsql_instance_id_value"
                        },
                    ),
                    isolation_level="SERIALIZABLE",
                    poolclass=sqlalchemy.pool.NullPool,
                    echo_pool=True,
                    pool_recycle=600,
                ),
                call(
                    URL.create(
                        drivername="postgresql",
                        username="******",
                        password="******",
                        database="postgres",
                        query={
                            "host":
                            "/cloudsql/operations_cloudsql_instance_id_value"
                        },
                    ),
                    isolation_level=None,
                    poolclass=None,
                    pool_size=2,
                    max_overflow=5,
                    pool_timeout=15,
                    echo_pool=True,
                    pool_recycle=600,
                ),
                call(
                    URL.create(
                        drivername="postgresql",
                        username="******",
                        password="******",
                        database="postgres",
                        query={
                            "host":
                            "/cloudsql/justice_counts_cloudsql_instance_id_value"
                        },
                    ),
                    isolation_level="SERIALIZABLE",
                    poolclass=None,
                    echo_pool=True,
                    pool_recycle=600,
                ),
                call(
                    URL.create(
                        drivername="postgresql",
                        username="******",
                        password="******",
                        database="postgres",
                        query={
                            "host":
                            "/cloudsql/case_triage_cloudsql_instance_id_value"
                        },
                    ),
                    isolation_level=None,
                    poolclass=None,
                    echo_pool=True,
                    pool_recycle=600,
                ),
                call(
                    URL.create(
                        drivername="postgresql",
                        username="******",
                        password="******",
                        database="us_xx_primary",
                        query={
                            "host":
                            "/cloudsql/state_cloudsql_instance_id_value"
                        },
                    ),
                    isolation_level="SERIALIZABLE",
                    poolclass=sqlalchemy.pool.NullPool,
                    echo_pool=True,
                    pool_recycle=600,
                ),
                call(
                    URL.create(
                        drivername="postgresql",
                        username="******",
                        password="******",
                        database="us_ww_primary",
                        query={
                            "host":
                            "/cloudsql/state_cloudsql_instance_id_value"
                        },
                    ),
                    isolation_level="SERIALIZABLE",
                    poolclass=sqlalchemy.pool.NullPool,
                    echo_pool=True,
                    pool_recycle=600,
                ),
                call(
                    URL.create(
                        drivername="postgresql",
                        username="******",
                        password="******",
                        database="us_xx_secondary",
                        query={
                            "host":
                            "/cloudsql/state_cloudsql_instance_id_value"
                        },
                    ),
                    isolation_level="SERIALIZABLE",
                    poolclass=sqlalchemy.pool.NullPool,
                    echo_pool=True,
                    pool_recycle=600,
                ),
                call(
                    URL.create(
                        drivername="postgresql",
                        username="******",
                        password="******",
                        database="us_ww_secondary",
                        query={
                            "host":
                            "/cloudsql/state_cloudsql_instance_id_value"
                        },
                    ),
                    isolation_level="SERIALIZABLE",
                    poolclass=sqlalchemy.pool.NullPool,
                    echo_pool=True,
                    pool_recycle=600,
                ),
            ],
        )
        mock_get_states.assert_called()
Ejemplo n.º 2
0
    "sqlalchemy",
])

if environment.in_gcp():
    # This attempts to connect to all of our databases. Any connections that fail will
    # be logged and not raise an error, so that a single database outage doesn't take
    # down the entire application. Any attempt to use those databases later will
    # attempt to connect again in case the database was just unhealthy.
    if service_type is environment.ServiceType.SCRAPERS:
        schemas = {SchemaType.JAILS}
    elif service_type is environment.ServiceType.DEFAULT:
        schemas = set(SchemaType) - {SchemaType.JAILS}
    else:
        raise ValueError(f"Unsupported service type: {service_type}")

    SQLAlchemyEngineManager.attempt_init_engines_for_server(schemas)


@zope.event.classhandler.handler(events.MemoryUsageThresholdExceeded)
def memory_condition_handler(
        event: events.MemoryUsageThresholdExceeded) -> None:
    logging.warning(
        "Memory usage %d is more than limit of %d, forcing gc",
        event.mem_usage,
        event.max_allowed,
    )
    gc.collect()


@zope.event.classhandler.handler(events.EventLoopBlocked)
def blocked_condition_handler(event: events.EventLoopBlocked) -> None: