Происходит утечка Sessionmanager в завершенном процессе - ошибка SSL: сбой расшифровки или плохая запись mac - PullRequest
0 голосов
/ 07 апреля 2020

Я написал запрос с блокировкой базы данных (with_for_update) и хочу его протестировать. Для этого я получаю блокировку записи продукта, а затем пытаюсь обновить ее в процессе.

Кажется, это работает, поскольку процесс завершается (т. Е. Обновление никогда не происходит из-за блокировки базы данных.

Однако, когда я снова пытаюсь получить продукт, чтобы подтвердить, что он не обновился, я получаю сообщение об ошибке:

sqlalchemy.exc.OperationalError: (psycopg2.OperationalError) SSL error: decryption failed or bad record mac

При поиске в Google выглядит так, будто я убиваю свой процесс не изящно, SessionManager мог просочиться к последующим вызовам.

Я пытался сделать expunge_all перед повторной загрузкой продукта, чтобы очистить любой экземпляр SessionManager, но у меня не было особой удачи .. какие-нибудь советы?

def doomed_commit(product):
    from flaskbase.orm import SessionManager

        # Get a _new_ session.
    with SessionManager.session(ContextObject()) as session:
        product.name = 'BAD NAME'
        session.add(product)
        session.commit() # This is executing when the entire process is killed

        # Nothing below this gets executed
        raise Exception('Committed successfully?!')


def test
    create_product_in_db()

    with Product.get_all_with_lock() as product:
        proc = multiprocessing.Process(target=doomed_commit, args=(product,))
        proc.join(1)
        proc.kill()
        while proc.is_alive():
            time.sleep(0.1)

    # Getting exception on the next line
    assert Product.get_all()[0].name != 'BAD NAME' 
...