예제 #1
0
    def test_is_in_recovery(self, connect):
        connect().cursor().fetchone.return_value = [sentinel.flag]
        connect().cursor.reset_mock()
        connect.reset_mock()

        self.assertEqual(postgresql.is_in_recovery(), sentinel.flag)

        connect.assert_called_once_with()
        connect().cursor.assert_called_once_with()
        connect().cursor().execute.assert_called_once_with("SELECT pg_is_in_recovery()")
예제 #2
0
    def test_is_in_recovery(self, connect):
        connect().cursor().fetchone.return_value = [sentinel.flag]
        connect().cursor.reset_mock()
        connect.reset_mock()

        self.assertEqual(postgresql.is_in_recovery(), sentinel.flag)

        connect.assert_called_once_with()
        connect().cursor.assert_called_once_with()
        connect().cursor().execute.assert_called_once_with(
            'SELECT pg_is_in_recovery()')
예제 #3
0
def promote_to_master():
    status_set("maintenance", "Promoting to master")
    postgresql.promote()

    set_following(None)
    publish_following()

    while postgresql.is_in_recovery():
        status_set("maintenance", "Waiting for startup")
        time.sleep(1)

    if postgresql.has_version("12"):
        assert not os.path.exists(postgresql.hot_standby_signal_path(
        )), "standby.signal still exists after promotion"
    else:
        assert not os.path.exists(postgresql.recovery_conf_path(
        )), "recovery.conf still exists after promotion"

    update_replication_states()
    helpers.ping_peers()
예제 #4
0
def start():
    status_set('maintenance', 'Starting PostgreSQL')
    postgresql.start()

    while postgresql.is_primary() and postgresql.is_in_recovery():
        status_set('maintenance', 'Startup recovery')
        time.sleep(1)

    store = unitdata.kv()

    open_ports(store.get('postgresql.cluster.pgconf.live.port') or 5432,
               store.get('postgresql.cluster.pgconf.current.port') or 5432)

    # Update the 'live' config now we know it is in effect. This
    # is used to detect future config changes that require a restart.
    settings = store.getrange('postgresql.cluster.pgconf.current.', strip=True)
    store.unsetrange(prefix='postgresql.cluster.pgconf.live.')
    store.update(settings, prefix='postgresql.cluster.pgconf.live.')

    reactive.set_state('postgresql.cluster.is_running')
    reactive.remove_state('postgresql.cluster.needs_restart')
    reactive.remove_state('postgresql.cluster.needs_reload')
예제 #5
0
def start():
    status_set("maintenance", "Starting PostgreSQL")
    postgresql.start()

    while postgresql.is_primary() and postgresql.is_in_recovery():
        status_set("maintenance", "Startup recovery")
        time.sleep(1)

    store = unitdata.kv()

    open_ports(
        store.get("postgresql.cluster.pgconf.live.port") or 5432,
        store.get("postgresql.cluster.pgconf.current.port") or 5432,
    )

    # Update the 'live' config now we know it is in effect. This
    # is used to detect future config changes that require a restart.
    settings = store.getrange("postgresql.cluster.pgconf.current.", strip=True)
    store.unsetrange(prefix="postgresql.cluster.pgconf.live.")
    store.update(settings, prefix="postgresql.cluster.pgconf.live.")

    reactive.set_state("postgresql.cluster.is_running")
    reactive.remove_state("postgresql.cluster.needs_restart")
    reactive.remove_state("postgresql.cluster.needs_reload")