Admin UI actions over themes blocks application since 1.61.2
-
When accessing theme management from the admin UI, the application stops working.
The call to /admin/theme/ does not respond for up to 2.6 minutes, displaying the following error:

During this time, calls to /api/health on the instance stop responding.
All calls to the application or API do not respond until the instance recovers.No errors appear in the application log.
The same behaviour occurs when:
- edit an existing tenant: /admin/tenant/edit/<tenant_id>
- add a new tenant: /admin/tenant/add
- edit an existing application: /admin/application/edit?applicationId=<application_id>
- add a new application: /admin/application/add
I assume that it affects these functionalities when all themes are obtained to be displayed in the Theme Field selector of these forms.
Other admin UI actions work correctly (Users, Connectors, Lambdas, Identity Providers...)
This has been happening since an upgrade to FusionAuth version 1.61.2, and also with the latest version 1.62.1.
Reverting the application to a previous version (1.60.2), it works correctly and the error does not occur.I would like to mention that the number of existing themes is low (39), as is the number of tenants (96) and applications (218).
The FusionAuth instance runs in a self-hosted infrastructure, with Docker image
Version: 1.62.1
Platform: Linux 5.14.0-427.57.1.el9_4.x86_64 amd64
Database: PostgreSQL 17.4
Search: DatabaseEnabling the debug level of logger io.fusionauth.api, the log messages during the /admin/theme call are:
2026-01-21 11:51:25.901 AM DEBUG io.fusionauth.api.domain.TenantMapper.retrieveTenantByApplicationId - ==> Preparing: SELECT t.id AS t_id, t.access_token_signing_keys_id AS t_access_token_signing_keys_id, t.data AS t_data, t.client_credentials_access_token_populate_lambdas_id AS t_client_credentials_access_token_populate_lambdas_id, t.confirm_child_email_templates_id AS t_confirm_child_email_templates_id, t.email_update_email_templates_id AS t_email_update_email_templates_id, t.email_verified_email_templates_id AS t_email_verified_email_templates_id, t.failed_authentication_user_actions_id AS t_failed_authentication_user_actions_id, t.family_request_email_templates_id AS t_family_request_email_templates_id, t.forgot_password_email_templates_id AS t_forgot_password_email_templates_id, t.id_token_signing_keys_id AS t_id_token_signing_keys_id, t.insert_instant AS t_insert_instant, t.login_id_in_use_on_create_email_templates_id AS t_login_id_in_use_on_create_email_templates_id, t.login_id_in_use_on_update_email_templates_id AS t_login_id_in_use_on_update_email_templates_id, t.login_validation_lambdas_id AS t_login_validation_lambdas_id, t.last_update_instant AS t_last_update_instant, t.login_new_device_email_templates_id AS t_login_new_device_email_templates_id, t.login_suspicious_email_templates_id AS t_login_suspicious_email_templates_id, t.multi_factor_email_message_templates_id AS t_multi_factor_email_message_templates_id, t.multi_factor_requirement_lambdas_id AS t_multi_factor_requirement_lambdas_id, t.multi_factor_sms_message_templates_id AS t_multi_factor_sms_message_templates_id, t.multi_factor_sms_messengers_id AS t_multi_factor_sms_messengers_id, t.name AS t_name, t.parent_registration_email_templates_id AS t_parent_registration_email_templates_id, t.passwordless_email_templates_id AS t_passwordless_email_templates_id, t.password_reset_success_email_templates_id AS t_password_reset_success_email_templates_id, t.password_update_email_templates_id AS t_password_update_email_templates_id, t.phone_configuration_forgot_password_templates_id AS t_phone_configuration_forgot_password_templates_id, t.phone_configuration_identity_update_templates_id AS t_phone_configuration_identity_update_templates_id, t.phone_configuration_login_id_in_use_on_create_templates_id AS t_phone_configuration_login_id_in_use_on_create_templates_id, t.phone_configuration_login_id_in_use_on_update_templates_id AS t_phone_configuration_login_id_in_use_on_update_templates_id, t.phone_configuration_login_new_device_templates_id AS t_phone_configuration_login_new_device_templates_id, t.phone_configuration_login_suspicious_templates_id AS t_phone_configuration_login_suspicious_templates_id, t.phone_configuration_messengers_id AS t_phone_configuration_messengers_id, t.phone_configuration_password_reset_success_templates_id AS t_phone_configuration_password_reset_success_templates_id, t.phone_configuration_password_update_templates_id AS t_phone_configuration_password_update_templates_id, t.phone_configuration_passwordless_templates_id AS t_phone_configuration_passwordless_templates_id, t.phone_configuration_set_password_templates_id AS t_phone_configuration_set_password_templates_id, t.phone_configuration_two_factor_method_add_templates_id AS t_phone_configuration_two_factor_method_add_templates_id, t.phone_configuration_two_factor_method_remove_templates_id AS t_phone_configuration_two_factor_method_remove_templates_id, t.phone_configuration_verification_complete_templates_id AS t_phone_configuration_verification_complete_templates_id, t.phone_configuration_verification_templates_id AS t_phone_configuration_verification_templates_id, t.scim_enterprise_user_request_converter_lambdas_id AS t_scim_enterprise_user_request_converter_lambdas_id, t.scim_enterprise_user_response_converter_lambdas_id AS t_scim_enterprise_user_response_converter_lambdas_id, t.scim_group_request_converter_lambdas_id AS t_scim_group_request_converter_lambdas_id, t.scim_group_response_converter_lambdas_id AS t_scim_group_response_converter_lambdas_id, t.scim_user_request_converter_lambdas_id AS t_scim_user_request_converter_lambdas_id, t.scim_user_response_converter_lambdas_id AS t_scim_user_response_converter_lambdas_id, t.set_password_email_templates_id AS t_set_password_email_templates_id, t.scim_client_entity_types_id AS t_scim_client_entity_types_id, t.scim_server_entity_types_id AS t_scim_server_entity_types_id, t.themes_id AS t_themes_id, t.two_factor_method_add_email_templates_id AS t_two_factor_method_add_email_templates_id, t.two_factor_method_remove_email_templates_id AS t_two_factor_method_remove_email_templates_id, t.ui_ip_access_control_lists_id AS t_ui_ip_access_control_lists_id, t.verification_email_templates_id AS t_verification_email_templates_id, ct.connectors_id AS ct_connectors_id, ct.data AS ct_data, ct.sequence AS ct_sequence, t.admin_user_forms_id AS t_admin_user_forms_id FROM tenants AS t LEFT OUTER JOIN connectors_tenants AS ct ON t.id = ct.tenants_id WHERE id = (SELECT tenants_id FROM applications WHERE id = ?) ORDER BY ct.sequence ASC 2026-01-21 11:51:25.901 AM DEBUG io.fusionauth.api.domain.TenantMapper.retrieveTenantByApplicationId - ==> Parameters: 3c219e58-ed0e-4b18-ad48-f4f92793ae32(UUID) 2026-01-21 11:51:25.904 AM DEBUG io.fusionauth.api.domain.TenantMapper.retrieveTenantByApplicationId - <== Total: 1 2026-01-21 11:51:25.907 AM DEBUG io.fusionauth.api.domain.TenantMapper.retrieveCount - ==> Preparing: SELECT count(id) FROM tenants 2026-01-21 11:51:25.907 AM DEBUG io.fusionauth.api.domain.TenantMapper.retrieveCount - ==> Parameters: 2026-01-21 11:51:25.908 AM DEBUG io.fusionauth.api.domain.TenantMapper.retrieveCount - <== Total: 1 2026-01-21 11:51:25.910 AM DEBUG io.fusionauth.api.domain.UserMapper.retrieveById - ==> Preparing: SELECT u.id AS u_id, u.active AS u_active, COALESCE(u.breached_password_last_checked_instant, i.breached_password_last_checked_instant) AS u_breached_password_last_checked_instant, COALESCE(u.breached_password_status, i.breached_password_status) AS u_breached_password_status, u.birth_date AS u_birth_date, u.clean_speak_id AS u_clean_speak_id, i.id AS i_id, COALESCE(u.connectors_id, i.connectors_id) AS u_connectors_id, u.data AS u_data, i.email AS i_email, COALESCE(u.password_encryption_scheme, i.encryption_scheme) AS u_password_encryption_scheme, u.expiry AS u_expiry, COALESCE(u.password_factor, i.factor) AS u_password_factor, u.first_name AS u_first_name, u.full_name AS u_full_name, u.image_url AS u_image_url, i.insert_instant AS i_insert_instant, u.insert_instant AS u_insert_instant, i.last_login_instant AS i_last_login_instant, i.last_update_instant AS i_last_update_instant, u.last_login_instant AS u_last_login_instant, u.last_update_instant AS u_last_update_instant, u.last_name AS u_last_name, u.middle_name AS u_middle_name, u.mobile_phone AS u_mobile_phone, u.parent_email AS u_parent_email, COALESCE(u.password, i.password) AS u_password, COALESCE(u.password_change_reason, i.password_change_reason) AS u_password_change_reason, CASE WHEN u.password IS NULL THEN i.password_change_required ELSE u.password_change_required END AS u_password_change_required, COALESCE(u.password_last_update_instant, i.password_last_update_instant) AS u_password_last_update_instant, COALESCE(u.password_salt, i.salt) AS u_password_salt, i.is_primary AS i_is_primary, i.tenants_id AS i_tenants_id, i.status AS i_status, u.tenants_id AS u_tenants_id, u.timezone AS u_timezone, i.type AS i_type, REPLACE(i.username_index, UPPER(i.username), i.username) AS i_unique_username, i.username AS i_username, i.username_status AS i_username_status, i.users_id AS i_users_id, CASE WHEN i.type = 1 THEN i.display_value END AS i_display_value, CASE WHEN i.type = 1 THEN REPLACE(i.value, UPPER(i.display_value), i.display_value) ELSE i.value END AS i_value, i.verified AS i_verified, i.verified_instant AS i_verified_instant, u.verified_instant AS u_verified_instant, i.verified_reason AS i_verified_reason FROM users AS u LEFT OUTER JOIN identities AS i ON u.id = i.users_id WHERE u.id = ? 2026-01-21 11:51:25.910 AM DEBUG io.fusionauth.api.domain.UserMapper.retrieveById - ==> Parameters: xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx(UUID) 2026-01-21 11:51:25.912 AM DEBUG io.fusionauth.api.domain.UserMapper.retrieveById - <== Total: 1 2026-01-21 11:51:25.913 AM DEBUG io.fusionauth.api.domain.GroupMapper.retrieveMembersByUserIds - ==> Preparing: SELECT gm.id AS gm_id, gm.groups_id AS gm_groups_id, gm.data AS gm_data, gm.users_id AS gm_users_id, gm.insert_instant AS gm_insert_instant, g.tenants_id AS g_tenants_id FROM group_members AS gm JOIN groups AS g ON gm.groups_id = g.id WHERE gm.users_id IN ( ? ) 2026-01-21 11:51:25.913 AM DEBUG io.fusionauth.api.domain.GroupMapper.retrieveMembersByUserIds - ==> Parameters: xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx(UUID) 2026-01-21 11:51:25.934 AM DEBUG io.fusionauth.api.domain.GroupMapper.retrieveMembersByUserIds - <== Total: 1 2026-01-21 11:51:25.935 AM DEBUG io.fusionauth.api.domain.UserMapper.retrieveRegistrationsByUserIds - ==> Preparing: SELECT ur.id AS ur_id, ur.applications_id AS ur_applications_id, ur.authentication_token AS ur_authentication_token, ur.clean_speak_id AS ur_clean_speak_id, ur.data AS ur_data, ur.insert_instant AS ur_insert_instant, ur.last_login_instant AS ur_last_login_instant, ur.last_update_instant AS ur_last_update_instant, ur.timezone AS ur_timezone, ur.username AS ur_username, ur.username_status AS ur_username_status, ur.users_id AS ur_users_id, ur.verified AS ur_verified, ur.verified_instant AS ur_verified_instant, ar1.name AS group_ar_name, ar2.name AS registration_ar_name, a.tenants_id AS a_tenants_id FROM user_registrations AS ur INNER JOIN applications AS a ON a.id = ur.applications_id LEFT OUTER JOIN user_registrations_application_roles AS urar ON urar.user_registrations_id = ur.id LEFT OUTER JOIN group_members AS gm ON ur.users_id = gm.users_id LEFT OUTER JOIN group_application_roles AS gar ON gar.groups_id = gm.groups_id LEFT OUTER JOIN application_roles AS ar1 ON ar1.id = urar.application_roles_id AND ar1.applications_id = ur.applications_id LEFT OUTER JOIN application_roles AS ar2 ON ar2.id = gar.application_roles_id AND ar2.applications_id = ur.applications_id WHERE ur.users_id IN ( ? ) 2026-01-21 11:51:25.936 AM DEBUG io.fusionauth.api.domain.UserMapper.retrieveRegistrationsByUserIds - ==> Parameters: xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx(UUID) 2026-01-21 11:51:25.937 AM DEBUG io.fusionauth.api.domain.UserMapper.retrieveRegistrationsByUserIds - <== Total: 1 2026-01-21 11:51:25.938 AM DEBUG io.fusionauth.api.domain.ExternalIdentifierMapper.retrieveByUserIdAndTypes - ==> Preparing: SELECT id, applications_id, data, expiration_instant, insert_instant, tenants_id, type, users_id FROM external_identifiers WHERE users_id = ? AND type IN ( ? , ? ) 2026-01-21 11:51:25.939 AM DEBUG io.fusionauth.api.domain.ExternalIdentifierMapper.retrieveByUserIdAndTypes - ==> Parameters: xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx(UUID), 1(Integer), 25(Integer) 2026-01-21 11:51:25.939 AM DEBUG io.fusionauth.api.domain.ExternalIdentifierMapper.retrieveByUserIdAndTypes - <== Total: 0 2026-01-21 11:51:25.954 AM DEBUG io.fusionauth.api.domain.ThemeMapper.retrieveCountByCriteria - ==> Preparing: SELECT COUNT(*) FROM themes 2026-01-21 11:51:25.954 AM DEBUG io.fusionauth.api.domain.ThemeMapper.retrieveCountByCriteria - ==> Parameters: 2026-01-21 11:51:25.956 AM DEBUG io.fusionauth.api.domain.ThemeMapper.retrieveCountByCriteria - <== Total: 1 2026-01-21 11:51:25.959 AM DEBUG io.fusionauth.api.domain.ThemeMapper.retrieveByCriteria - ==> Preparing: SELECT * FROM themes ORDER BY insert_instant ASC LIMIT ? OFFSET ? 2026-01-21 11:51:25.959 AM DEBUG io.fusionauth.api.domain.ThemeMapper.retrieveByCriteria - ==> Parameters: 25(Integer), 0(Integer) 2026-01-21 11:51:26.001 AM DEBUG io.fusionauth.api.domain.ThemeMapper.retrieveByCriteria - <== Total: 25 -
@david-cuen Thanks for the detailed message. I hope to have some time today to try and replicate this. I will let you know what I see.