|
- # SPDX-FileCopyrightText: 2020 - 2024 Slavi Pantaleev
- # SPDX-FileCopyrightText: 2022 MDAD project contributors
- # SPDX-FileCopyrightText: 2022 Marko Weltzer
- # SPDX-FileCopyrightText: 2022 Nikita Chernyi
- # SPDX-FileCopyrightText: 2022 Sebastian Gumprich
- #
- # SPDX-License-Identifier: AGPL-3.0-or-later
-
- ---
- # Pre-checks
-
- - name: Fail if Postgres not enabled
- ansible.builtin.fail:
- msg: "Postgres via ansible-role-postgres role is not enabled (`postgres_enabled`). Cannot use rust-synapse-compress-state."
- when: "not postgres_enabled | bool"
-
-
- # Defaults
-
- - name: Set matrix_synapse_rust_synapse_compress_state_find_rooms_command_wait_time, if not provided
- ansible.builtin.set_fact:
- matrix_synapse_rust_synapse_compress_state_find_rooms_command_wait_time: 1800
- when: "matrix_synapse_rust_synapse_compress_state_find_rooms_command_wait_time | default('') == ''"
-
- - name: Set matrix_synapse_rust_synapse_compress_state_compress_room_time, if not provided
- ansible.builtin.set_fact:
- matrix_synapse_rust_synapse_compress_state_compress_room_time: 3600
- when: "matrix_synapse_rust_synapse_compress_state_compress_room_time | default('') == ''"
-
- - name: Set matrix_synapse_rust_synapse_compress_state_psql_import_time, if not provided
- ansible.builtin.set_fact:
- matrix_synapse_rust_synapse_compress_state_psql_import_time: 3600
- when: "matrix_synapse_rust_synapse_compress_state_psql_import_time | default('') == ''"
-
- - name: Set matrix_synapse_rust_synapse_compress_state_min_state_groups_required, if not provided
- ansible.builtin.set_fact:
- # The minimum number of state groups we're looking for before we consider a room eligible for compression.
- # Rooms with a smaller state groups count will not be compressed.
- matrix_synapse_rust_synapse_compress_state_min_state_groups_required: 100000
- when: "matrix_synapse_rust_synapse_compress_state_min_state_groups_required | default('') == ''"
-
-
- # Actual compression work
-
- - name: Ensure rust-synapse-compress-state paths exist
- ansible.builtin.file:
- path: "{{ matrix_synapse_rust_synapse_compress_state_base_path }}"
- state: directory
- mode: '0750'
- owner: "{{ matrix_synapse_uid }}"
- group: "{{ matrix_synapse_gid }}"
-
- - name: Ensure rust-synapse-compress-state image is pulled
- community.docker.docker_image:
- name: "{{ matrix_synapse_rust_synapse_compress_state_container_image }}"
- source: "{{ 'pull' if ansible_version.major > 2 or ansible_version.minor > 7 else omit }}"
- force_source: "{{ matrix_synapse_rust_synapse_compress_state_container_image_force_pull if ansible_version.major > 2 or ansible_version.minor >= 8 else omit }}"
- force: "{{ omit if ansible_version.major > 2 or ansible_version.minor >= 8 else matrix_synapse_rust_synapse_compress_state_container_image_force_pull }}"
- register: result
- retries: "{{ devture_playbook_help_container_retries_count }}"
- delay: "{{ devture_playbook_help_container_retries_delay }}"
- until: result is not failed
-
-
- - name: Generate rust-synapse-compress-state room find SQL command
- ansible.builtin.set_fact:
- matrix_synapse_rust_synapse_compress_state_find_rooms_command: >-
- {{ postgres_bin_path }}/cli-non-interactive --dbname={{ matrix_synapse_database_database | quote }} -c "SELECT array_to_json(array_agg(row_to_json (r))) FROM (SELECT room_id, count(*) AS count FROM state_groups_state GROUP BY room_id HAVING count(*) > {{ matrix_synapse_rust_synapse_compress_state_min_state_groups_required }} ORDER BY count DESC) r;"
-
- - name: Find rooms eligible for compression with rust-synapse-compress-state
- ansible.builtin.command: "{{ matrix_synapse_rust_synapse_compress_state_find_rooms_command }}"
- async: "{{ matrix_synapse_rust_synapse_compress_state_find_rooms_command_wait_time }}"
- poll: 10
- register: matrix_synapse_rust_synapse_compress_state_find_rooms_command_result
- failed_when: not matrix_synapse_rust_synapse_compress_state_find_rooms_command_result.finished
- changed_when: false
-
- # We expect the output to be like this:
- #
- # "stdout_lines": [
- # " array_to_json ",
- # "----------------------------------------------------------------------------------------------------------------------------",
- # " [{\"room_id\":\"!some-id\",\"count\":2461329},{\"room_id\":\"!another-id\",\"count\":512017}]",
- # "(1 row)"
- # ]
- #
- # Row 3 (out of 4) contains the actual result.
- #
- # Row 3 contains a space when there's no result.
-
- - when: "matrix_synapse_rust_synapse_compress_state_find_rooms_command_result.failed or matrix_synapse_rust_synapse_compress_state_find_rooms_command_result.stdout_lines | length != 4"
- block:
- - ansible.builtin.debug:
- var: "matrix_synapse_rust_synapse_compress_state_find_rooms_command_result"
-
- - name: Fail if room find result is not what we expect
- ansible.builtin.fail:
- msg: >-
- Expecting 4 lines in the "find rooms" result.
-
- - when: "matrix_synapse_rust_synapse_compress_state_find_rooms_command_result.stdout_lines[2] != ' '"
- block:
- # matrix_synapse_rust_synapse_compress_state_eligible_rooms is a list
- # of dictionaries like this: {'room_id': '!some-id', 'count': 2461329}
- - ansible.builtin.set_fact:
- matrix_synapse_rust_synapse_compress_state_eligible_rooms: "{{ matrix_synapse_rust_synapse_compress_state_find_rooms_command_result.stdout_lines[2] | from_json }}"
-
- - name: Display rooms that will be compressed
- ansible.builtin.debug:
- msg: >-
- The following rooms contain more than {{ matrix_synapse_rust_synapse_compress_state_min_state_groups_required }} state group rows
- (configurable via `matrix_synapse_rust_synapse_compress_state_min_state_groups_required`)
- and will be compressed:
- {{ matrix_synapse_rust_synapse_compress_state_eligible_rooms }}
-
- - name: Compress room state
- ansible.builtin.include_tasks: "{{ role_path }}/tasks/rust-synapse-compress-state/compress_room.yml"
- with_items: "{{ matrix_synapse_rust_synapse_compress_state_eligible_rooms }}"
- loop_control:
- loop_var: room_details
-
- - name: Show notice about lack of rooms to compress
- ansible.builtin.debug:
- msg: >-
- No rooms were found to contain more than {{ matrix_synapse_rust_synapse_compress_state_min_state_groups_required }} state group rows
- (configurable via `matrix_synapse_rust_synapse_compress_state_min_state_groups_required`),
- so there's nothing to compress.
- when: "matrix_synapse_rust_synapse_compress_state_find_rooms_command_result.stdout_lines[2] == ' '"
|