WeblateOrg / weblate

Web based localization tool with tight version control integration.
https://weblate.org/
GNU General Public License v3.0
4.65k stars 1.02k forks source link

Cannot commit pending changes #6036

Closed surli closed 3 years ago

surli commented 3 years ago

Describe the issue

We're running a weblate instance on https://l10n.xwiki.org on which we have a project with 87 linked components. Recently a new language has been added to the root component which is also the biggest in term of number of keys (3609 keys). Since then is seems that we cannot commit the pending changes on this project: at first we had "only" 2Gb of RAM on the server, and we kept getting the process killed by OOM, so we started to increase the memory, we now have 5Gb of RAM and 5Gb of swap on the server. Now the process is not killed anymore apparently, but whenever I try to commit the pending changes nothing happens and/or I obtain the following error:

Timeout at /js/git/xwiki-platform/
The file lock '/var/weblate/data/vcs/xwiki-platform/xwiki-core-resources.lock' could not be acquired.

I already tried

As explained I already tried to put more memory on the server, without much success. I also try to disable celery to only trigger the commit changes synchronously, but without much success. I did not find any errors in the logs, except the one concerning the lock. Note that I checked the repository manually I rebased it already without any issue, and nothing is committed besides what's in https://github.com/xwiki/xwiki-platform/pull/1621 which I cannot really merge right now. Anyway I don't think that's an issue here. Also I noticed that the repository contained uncommitted files such as: ApplicationResources_id.propertiesfor1d8o6, where my filemask is ApplicationResources_*.properties and the new language is indeed indonesian. I tried several times to delete those files (which are empty), but apparently it doesn't change anything.

So far the only move I can think of, would be to add more memory, but I don't know how much memory I'd need and usually we manage to run our Weblate server with only 2Gb so that's a bit worrying to need that much memory for adding a new language.

Exception traceback

Here's the full trace I obtain in case of lock error:

Internal Server Error: /js/git/xwiki-platform/

Timeout at /js/git/xwiki-platform/
The file lock '/var/weblate/data/vcs/xwiki-platform/xwiki-core-resources.lock' could not be acquired.

Request Method: GET
Request URL: https://l10n.xwiki.org/js/git/xwiki-platform/
Django Version: 3.1.5
Python Executable: /usr/bin/uwsgi-core
Python Version: 3.7.3
Python Path: ['/home/weblate/weblate-env/lib/python3.7/site-packages/git/ext/gitdb', '/', '.', '', '/home/weblate/weblate-env/lib/python37.zip', '/home/weblate/weblate-env/lib/python3.7', '/home/weblate/weblate-env/lib/python3.7/lib-dynload', '/usr/lib/python3.7', '/home/weblate/weblate-env/lib/python3.7/site-packages', '/home/weblate/weblate-env/lib/python3.7/site-packages/gitdb/ext/smmap']
Server time: Wed, 19 May 2021 08:09:11 +0000
Installed Applications:
['weblate.addons',
 'weblate.auth',
 'weblate.checks',
 'weblate.configuration',
 'weblate.formats',
 'weblate.glossary',
 'weblate.machinery',
 'weblate.trans',
 'weblate.lang',
 'weblate_language_data',
 'weblate.memory',
 'weblate.screenshots',
 'weblate.fonts',
 'weblate.accounts',
 'weblate.utils',
 'weblate.vcs',
 'weblate.wladmin',
 'weblate',
 'weblate.gitexport',
 'django.contrib.auth',
 'django.contrib.contenttypes',
 'django.contrib.sessions',
 'django.contrib.messages',
 'django.contrib.staticfiles',
 'django.contrib.admin.apps.SimpleAdminConfig',
 'django.contrib.admindocs',
 'django.contrib.sitemaps',
 'django.contrib.humanize',
 'social_django',
 'crispy_forms',
 'compressor',
 'rest_framework',
 'rest_framework.authtoken',
 'django_filters']
Installed Middleware:
['weblate.middleware.RedirectMiddleware',
 'weblate.middleware.ProxyMiddleware',
 'django.middleware.security.SecurityMiddleware',
 'django.contrib.sessions.middleware.SessionMiddleware',
 'django.middleware.csrf.CsrfViewMiddleware',
 'weblate.accounts.middleware.AuthenticationMiddleware',
 'django.contrib.messages.middleware.MessageMiddleware',
 'django.middleware.clickjacking.XFrameOptionsMiddleware',
 'social_django.middleware.SocialAuthExceptionMiddleware',
 'weblate.accounts.middleware.RequireLoginMiddleware',
 'weblate.api.middleware.ThrottlingMiddleware',
 'weblate.middleware.SecurityMiddleware']

Traceback (most recent call last):
  File "/home/weblate/weblate-env/lib/python3.7/site-packages/django/core/handlers/exception.py", line 47, in inner
    response = get_response(request)
  File "/home/weblate/weblate-env/lib/python3.7/site-packages/django/core/handlers/base.py", line 181, in _get_response
    response = wrapped_callback(request, *callback_args, **callback_kwargs)
  File "/home/weblate/weblate-env/lib/python3.7/site-packages/django/contrib/auth/decorators.py", line 21, in _wrapped_view
    return view_func(request, *args, **kwargs)
  File "/home/weblate/weblate-env/lib/python3.7/site-packages/weblate/trans/views/js.py", line 177, in git_status_project
    return git_status_shared(request, obj, obj.all_repo_components)
  File "/home/weblate/weblate-env/lib/python3.7/site-packages/weblate/trans/views/js.py", line 168, in git_status_shared
    "missing_commits": sum(repo.count_repo_missing for repo in repositories),
  File "/home/weblate/weblate-env/lib/python3.7/site-packages/django/shortcuts.py", line 19, in render
    content = loader.render_to_string(template_name, context, request, using=using)
  File "/home/weblate/weblate-env/lib/python3.7/site-packages/django/template/loader.py", line 62, in render_to_string
    return template.render(context, request)
  File "/home/weblate/weblate-env/lib/python3.7/site-packages/django/template/backends/django.py", line 61, in render
    return self.template.render(context)
  File "/home/weblate/weblate-env/lib/python3.7/site-packages/django/template/base.py", line 170, in render
    return self._render(context)
  File "/home/weblate/weblate-env/lib/python3.7/site-packages/django/template/base.py", line 162, in _render
    return self.nodelist.render(context)
  File "/home/weblate/weblate-env/lib/python3.7/site-packages/django/template/base.py", line 938, in render
    bit = node.render_annotated(context)
  File "/home/weblate/weblate-env/lib/python3.7/site-packages/django/template/base.py", line 905, in render_annotated
    return self.render(context)
  File "/home/weblate/weblate-env/lib/python3.7/site-packages/django/template/defaulttags.py", line 516, in render
    return self.nodelist.render(context)
  File "/home/weblate/weblate-env/lib/python3.7/site-packages/django/template/base.py", line 938, in render
    bit = node.render_annotated(context)
  File "/home/weblate/weblate-env/lib/python3.7/site-packages/django/template/base.py", line 905, in render_annotated
    return self.render(context)
  File "/home/weblate/weblate-env/lib/python3.7/site-packages/django/template/defaulttags.py", line 211, in render
    nodelist.append(node.render_annotated(context))
  File "/home/weblate/weblate-env/lib/python3.7/site-packages/django/template/base.py", line 905, in render_annotated
    return self.render(context)
  File "/home/weblate/weblate-env/lib/python3.7/site-packages/django/template/base.py", line 988, in render
    output = self.filter_expression.resolve(context)
  File "/home/weblate/weblate-env/lib/python3.7/site-packages/django/template/base.py", line 671, in resolve
    obj = self.var.resolve(context)
  File "/home/weblate/weblate-env/lib/python3.7/site-packages/django/template/base.py", line 796, in resolve
    value = self._resolve_lookup(context)
  File "/home/weblate/weblate-env/lib/python3.7/site-packages/django/template/base.py", line 858, in _resolve_lookup
    current = current()
  File "/home/weblate/weblate-env/lib/python3.7/site-packages/weblate/vcs/base.py", line 276, in status
    with self.lock:
  File "/home/weblate/weblate-env/lib/python3.7/site-packages/filelock.py", line 323, in __enter__
    self.acquire()
  File "/home/weblate/weblate-env/lib/python3.7/site-packages/filelock.py", line 278, in acquire
    raise Timeout(self._lock_file)

Exception Type: Timeout at /js/git/xwiki-platform/
Exception Value: The file lock '/var/weblate/data/vcs/xwiki-platform/xwiki-core-resources.lock' could not be acquired.
Request information:
USER: Simon Urli

GET: No GET data

POST: No POST data

FILES: No FILES data

COOKIES:[COOKIE INFO]

META:
CONTENT_LENGTH = ''
CONTENT_TYPE = ''
CSRF_COOKIE = 'DCP9uKKJxpmzjz9k0etf8EyinNQ61b0vsxxMM7U7cJzo2WHu6HaoCK9bI2ws7KBa'
CSRF_COOKIE_USED = True
DOCUMENT_ROOT = '/var/www/html'
HTTPS = 'on'
HTTP_ACCEPT = 'text/html, */*; q=0.01'
HTTP_ACCEPT_ENCODING = 'gzip, deflate, br'
HTTP_ACCEPT_LANGUAGE = 'fr,en-US;q=0.7,en;q=0.3'
HTTP_CONNECTION = 'keep-alive'
HTTP_COOKIE = '[COOKIE INFO]'
HTTP_DNT = '1'
HTTP_HOST = 'l10n.xwiki.org'
HTTP_REFERER = 'https://l10n.xwiki.org/'
HTTP_USER_AGENT = 'Mozilla/5.0 (X11; Linux x86_64; rv:88.0) Gecko/20100101 Firefox/88.0'
HTTP_X_REQUESTED_WITH = 'XMLHttpRequest'
PATH_INFO = '/js/git/xwiki-platform/'
QUERY_STRING = ''
REMOTE_ADDR = '212.198.27.104'
REMOTE_PORT = '51150'
REQUEST_METHOD = 'GET'
REQUEST_SCHEME = 'https'
REQUEST_URI = '/js/git/xwiki-platform/'
SCRIPT_NAME = ''
SERVER_NAME = 'l10n.xwiki.org'
SERVER_PORT = '443'
SERVER_PROTOCOL = 'HTTP/1.1'
WEBLATE_LANGUAGE = ''
WEBLATE_USER = "'surli'"
WEBLATE_VERSION:Cython = '0.29.21'
WEBLATE_VERSION:Django = '3.1.5'
WEBLATE_VERSION:Git = '2.20.1'
WEBLATE_VERSION:GitPython = '3.1.8'
WEBLATE_VERSION:Pillow = '7.1.2'
WEBLATE_VERSION:PostgreSQL server = '11.11'
WEBLATE_VERSION:Python = '3.7.3'
WEBLATE_VERSION:Redis server = '5.0.3'
WEBLATE_VERSION:Weblate = '4.4.2'
WEBLATE_VERSION:Whoosh = '2.7.4'
WEBLATE_VERSION:bleach = '3.1.5'
WEBLATE_VERSION:borgbackup = '1.1.13'
WEBLATE_VERSION:celery = '4.4.7'
WEBLATE_VERSION:chardet = '3.0.4'
WEBLATE_VERSION:diff-match-patch = '20200713'
WEBLATE_VERSION:django-appconf = '1.0.4'
WEBLATE_VERSION:django-compressor = '2.4'
WEBLATE_VERSION:django-crispy-forms = '1.9.2'
WEBLATE_VERSION:django-filter = '2.4.0'
WEBLATE_VERSION:django-redis = '4.12.1'
WEBLATE_VERSION:djangorestframework = '3.11.1'
WEBLATE_VERSION:filelock = '3.0.12'
WEBLATE_VERSION:hiredis = '1.0.1'
WEBLATE_VERSION:html2text = '2020.1.16'
WEBLATE_VERSION:jellyfish = '0.8.2'
WEBLATE_VERSION:kombu = '4.6.11'
WEBLATE_VERSION:lxml = '4.5.2'
WEBLATE_VERSION:misaka = '2.1.1'
WEBLATE_VERSION:oauthlib = '3.1.0'
WEBLATE_VERSION:openpyxl = '3.0.5'
WEBLATE_VERSION:psycopg2-binary = '2.8.6'
WEBLATE_VERSION:pycairo = '1.19.1'
WEBLATE_VERSION:pygobject = '3.38.0'
WEBLATE_VERSION:pyparsing = '2.4.7'
WEBLATE_VERSION:python-dateutil = '2.8.1'
WEBLATE_VERSION:requests = '2.24.0'
WEBLATE_VERSION:ruamel.yaml = '0.16.12'
WEBLATE_VERSION:sentry_sdk = '0.15.1'
WEBLATE_VERSION:setuptools = '50.3.0'
WEBLATE_VERSION:siphashc = '1.3'
WEBLATE_VERSION:social-auth-app-django = '4.0.0'
WEBLATE_VERSION:social-auth-core = '4.0.3'
WEBLATE_VERSION:translate-toolkit = '3.3.0'
WEBLATE_VERSION:translation-finder = '2.7'
WEBLATE_VERSION:user-agents = '2.1'
WEBLATE_VERSION:weblate-language-data = '2020.13'
uwsgi.node = b'l10n-prod'
uwsgi.version = b'2.0.18-debian'
wsgi.errors = <_io.TextIOWrapper name=2 mode='w' encoding='UTF-8'>
wsgi.file_wrapper = <built-in function uwsgi_sendfile>
wsgi.input = <uwsgi._Input object at 0x7fa2ac98ffd8>
wsgi.multiprocess = True
wsgi.multithread = False
wsgi.run_once = False
wsgi.url_scheme = 'https'
wsgi.version = '(1, 0)'

Settings:
Using settings module weblate.settings
ABSOLUTE_URL_OVERRIDES = {}
ADMINS = "(('XWiki.org Infra', 'simon.urli+weblate@xwiki.com'),)"
ADMINS_BILLING = []
ADMINS_CONTACT = []
ADMINS_HOSTING = []
AKISMET_API_KEY = '********************'
ALLOWED_HOSTS = ['l10n.xwiki.org', 'l10n-new.xwiki.org', '[IP]', '*']
ANONYMOUS_USER_NAME = 'anonymous'
APPEND_SLASH = True
AUDITLOG_EXPIRY = 180
AUTHENTICATION_BACKENDS = "('social_core.backends.email.EmailAuth', 'social_core.backends.github.GithubOAuth2', 'social_core.backends.suse.OpenSUSEOpenId', 'social_core.backends.ubuntu.UbuntuOpenId', 'social_core.backends.fedora.FedoraOpenId', 'weblate.accounts.auth.WeblateUserBackend', 'weblate.auth.xwiki.XWikiOAuth2')"
AUTH_LOCK_ATTEMPTS = 10
AUTH_PASSWORD_DAYS = '********************'
AUTH_PASSWORD_VALIDATORS = '********************'
AUTH_RESTRICT_ADMINS = {}
AUTH_TOKEN_VALID = '********************'
AUTH_USER_MODEL = 'weblate_auth.User'
AUTH_VALIDATE_PERMS = False
AUTOFIX_LIST = "('weblate.trans.autofixes.whitespace.SameBookendingWhitespace', 'weblate.trans.autofixes.chars.ReplaceTrailingDotsWithEllipsis', 'weblate.trans.autofixes.chars.RemoveZeroSpace', 'weblate.trans.autofixes.chars.RemoveControlChars', 'weblate.trans.autofixes.html.BleachHTML')"
AUTO_UPDATE = True
AVATAR_DEFAULT_IMAGE = 'identicon'
AVATAR_URL_PREFIX = 'https://www.gravatar.com/'
BASE_DIR = '/home/weblate/weblate-env/lib/python3.7/site-packages'
BASIC_LANGUAGES = None
CACHES = {'default': {'BACKEND': 'django_redis.cache.RedisCache', 'LOCATION': 'redis://127.0.0.1:6379/1', 'OPTIONS': {'CLIENT_CLASS': 'django_redis.client.DefaultClient', 'PARSER_CLASS': 'redis.connection.HiredisParser', 'PASSWORD': '********************', 'CONNECTION_POOL_KWARGS': {}}, 'KEY_PREFIX': '********************'}, 'avatar': {'BACKEND': 'django.core.cache.backends.filebased.FileBasedCache', 'LOCATION': '/var/weblate/data/avatar-cache', 'TIMEOUT': 86400, 'OPTIONS': {'MAX_ENTRIES': 1000}}}
CACHE_MIDDLEWARE_ALIAS = 'default'
CACHE_MIDDLEWARE_KEY_PREFIX = '********************'
CACHE_MIDDLEWARE_SECONDS = 600
CELERY_BEAT_SCHEDULE_FILENAME = '/var/weblate/data/celery/beat-schedule'
CELERY_BROKER_URL = 'redis://localhost:6379'
CELERY_RESULT_BACKEND = 'redis://localhost:6379'
CELERY_TASK_ALWAYS_EAGER = False
CELERY_TASK_ROUTES = {'weblate.trans.tasks.auto_translate': {'queue': 'translate'}, 'weblate.accounts.tasks.notify_*': {'queue': 'notify'}, 'weblate.accounts.tasks.send_mails': {'queue': 'notify'}, 'weblate.utils.tasks.settings_backup': {'queue': 'backup'}, 'weblate.utils.tasks.database_backup': {'queue': 'backup'}, 'weblate.wladmin.tasks.backup': {'queue': 'backup'}, 'weblate.wladmin.tasks.backup_service': {'queue': 'backup'}, 'weblate.memory.tasks.*': {'queue': 'memory'}}
CELERY_WORKER_MAX_MEMORY_PER_CHILD = 200000
CHECK_LIST = "('weblate.checks.same.SameCheck', 'weblate.checks.chars.BeginNewlineCheck', 'weblate.checks.chars.EndNewlineCheck', 'weblate.checks.chars.BeginSpaceCheck', 'weblate.checks.chars.EndSpaceCheck', 'weblate.checks.chars.DoubleSpaceCheck', 'weblate.checks.chars.EndStopCheck', 'weblate.checks.chars.EndColonCheck', 'weblate.checks.chars.EndQuestionCheck', 'weblate.checks.chars.EndExclamationCheck', 'weblate.checks.chars.EndEllipsisCheck', 'weblate.checks.chars.EndSemicolonCheck', 'weblate.checks.chars.MaxLengthCheck', 'weblate.checks.chars.KashidaCheck', 'weblate.checks.chars.PunctuationSpacingCheck', 'weblate.checks.format.PythonFormatCheck', 'weblate.checks.format.PythonBraceFormatCheck', 'weblate.checks.format.PHPFormatCheck', 'weblate.checks.format.CFormatCheck', 'weblate.checks.format.PerlFormatCheck', 'weblate.checks.format.JavaScriptFormatCheck', 'weblate.checks.format.CSharpFormatCheck', 'weblate.checks.format.JavaFormatCheck', 'weblate.checks.format.JavaMessageFormatCheck', 'weblate.checks.format.PercentPlaceholdersCheck', 'weblate.checks.format.VueFormattingCheck', 'weblate.checks.format.I18NextInterpolationCheck', 'weblate.checks.format.ESTemplateLiteralsCheck', 'weblate.checks.angularjs.AngularJSInterpolationCheck', 'weblate.checks.qt.QtFormatCheck', 'weblate.checks.qt.QtPluralCheck', 'weblate.checks.ruby.RubyFormatCheck', 'weblate.checks.consistency.PluralsCheck', 'weblate.checks.consistency.SamePluralsCheck', 'weblate.checks.consistency.ConsistencyCheck', 'weblate.checks.consistency.TranslatedCheck', 'weblate.checks.chars.EscapedNewlineCountingCheck', 'weblate.checks.chars.NewLineCountCheck', 'weblate.checks.markup.BBCodeCheck', 'weblate.checks.chars.ZeroWidthSpaceCheck', 'weblate.checks.render.MaxSizeCheck', 'weblate.checks.markup.XMLValidityCheck', 'weblate.checks.markup.XMLTagsCheck', 'weblate.checks.markup.MarkdownRefLinkCheck', 'weblate.checks.markup.MarkdownLinkCheck', 'weblate.checks.markup.MarkdownSyntaxCheck', 'weblate.checks.markup.URLCheck', 'weblate.checks.markup.SafeHTMLCheck', 'weblate.checks.placeholders.PlaceholderCheck', 'weblate.checks.placeholders.RegexCheck', 'weblate.checks.duplicate.DuplicateCheck', 'weblate.checks.source.OptionalPluralCheck', 'weblate.checks.source.EllipsisCheck', 'weblate.checks.source.MultipleFailingCheck', 'weblate.checks.source.LongUntranslatedCheck', 'weblate.checks.format.MultipleUnnamedFormatsCheck')"
COMMENT_CLEANUP_DAYS = None
COMMIT_PENDING_HOURS = 1
COMPRESSORS = {'css': 'compressor.css.CssCompressor', 'js': 'compressor.js.JsCompressor'}
COMPRESS_CACHEABLE_PRECOMPILERS = '()'
COMPRESS_CACHE_BACKEND = 'default'
COMPRESS_CACHE_KEY_FUNCTION = '********************'
COMPRESS_CLEAN_CSS_ARGUMENTS = ''
COMPRESS_CLEAN_CSS_BINARY = 'cleancss'
COMPRESS_CLOSURE_COMPILER_ARGUMENTS = ''
COMPRESS_CLOSURE_COMPILER_BINARY = 'java -jar compiler.jar'
COMPRESS_CSS_HASHING_METHOD = 'mtime'
COMPRESS_DATA_URI_MAX_SIZE = 1024
COMPRESS_DEBUG_TOGGLE = None
COMPRESS_ENABLED = True
COMPRESS_FILTERS = {'css': ['compressor.filters.css_default.CssAbsoluteFilter'], 'js': ['compressor.filters.jsmin.JSMinFilter']}
COMPRESS_JINJA2_GET_ENVIRONMENT = <function CompressorConf.JINJA2_GET_ENVIRONMENT at 0x7fa2aef0f9d8>
COMPRESS_MINT_DELAY = 30
COMPRESS_MTIME_DELAY = 10
COMPRESS_OFFLINE = True
COMPRESS_OFFLINE_CONTEXT = [{'fonts_cdn_url': None, 'STATIC_URL': '/static/', 'LANGUAGE_BIDI': True}, {'fonts_cdn_url': None, 'STATIC_URL': '/static/', 'LANGUAGE_BIDI': False}]
COMPRESS_OFFLINE_MANIFEST = 'manifest.json'
COMPRESS_OFFLINE_TIMEOUT = 31536000
COMPRESS_OUTPUT_DIR = 'CACHE'
COMPRESS_PARSER = 'compressor.parser.AutoSelectParser'
COMPRESS_PRECOMPILERS = '()'
COMPRESS_REBUILD_TIMEOUT = 2592000
COMPRESS_ROOT = '/var/weblate/data/static'
COMPRESS_STORAGE = 'compressor.storage.CompressorFileStorage'
COMPRESS_TEMPLATE_FILTER_CONTEXT = {'STATIC_URL': '/static/'}
COMPRESS_URL = '/static/'
COMPRESS_URL_PLACEHOLDER = '/__compressor_url_placeholder__/'
COMPRESS_VERBOSE = False
COMPRESS_YUGLIFY_BINARY = 'yuglify'
COMPRESS_YUGLIFY_CSS_ARGUMENTS = '--terminal'
COMPRESS_YUGLIFY_JS_ARGUMENTS = '--terminal'
COMPRESS_YUI_BINARY = 'java -jar yuicompressor.jar'
COMPRESS_YUI_CSS_ARGUMENTS = ''
COMPRESS_YUI_JS_ARGUMENTS = ''
CRISPY_TEMPLATE_PACK = 'bootstrap3'
CSP_CONNECT_SRC = []
CSP_FONT_SRC = []
CSP_IMG_SRC = []
CSP_SCRIPT_SRC = []
CSP_STYLE_SRC = []
CSRF_COOKIE_AGE = 31449600
CSRF_COOKIE_DOMAIN = None
CSRF_COOKIE_HTTPONLY = True
CSRF_COOKIE_NAME = 'csrftoken'
CSRF_COOKIE_PATH = '/'
CSRF_COOKIE_SAMESITE = 'Lax'
CSRF_COOKIE_SECURE = True
CSRF_FAILURE_VIEW = 'weblate.trans.views.error.csrf_failure'
CSRF_HEADER_NAME = 'HTTP_X_CSRFTOKEN'
CSRF_TRUSTED_ORIGINS = []
CSRF_USE_SESSIONS = True
DATABASES = {'default': {'ENGINE': 'django.db.backends.postgresql', 'NAME': 'weblate', 'USER': 'weblate', 'PASSWORD': '********************', 'HOST': '127.0.0.1', 'PORT': '', 'OPTIONS': {}, 'ATOMIC_REQUESTS': False, 'AUTOCOMMIT': True, 'CONN_MAX_AGE': 0, 'TIME_ZONE': None, 'TEST': {'CHARSET': None, 'COLLATION': None, 'MIGRATE': True, 'MIRROR': None, 'NAME': None}}}
DATABASE_BACKUP = 'plain'
DATABASE_ROUTERS = []
DATA_DIR = '/var/weblate/data'
DATA_UPLOAD_MAX_MEMORY_SIZE = 50000000
DATA_UPLOAD_MAX_NUMBER_FIELDS = 1000
DATETIME_FORMAT = 'N j, Y, P'
DATETIME_INPUT_FORMATS = ['%Y-%m-%d %H:%M:%S', '%Y-%m-%d %H:%M:%S.%f', '%Y-%m-%d %H:%M', '%m/%d/%Y %H:%M:%S', '%m/%d/%Y %H:%M:%S.%f', '%m/%d/%Y %H:%M', '%m/%d/%y %H:%M:%S', '%m/%d/%y %H:%M:%S.%f', '%m/%d/%y %H:%M']
DATE_FORMAT = 'N j, Y'
DATE_INPUT_FORMATS = ['%Y-%m-%d', '%m/%d/%Y', '%m/%d/%y', '%b %d %Y', '%b %d, %Y', '%d %b %Y', '%d %b, %Y', '%B %d %Y', '%B %d, %Y', '%d %B %Y', '%d %B, %Y']
DEBUG = False
DEBUG_PROPAGATE_EXCEPTIONS = False
DECIMAL_SEPARATOR = '.'
DEFAULT_ACCESS_CONTROL = 0
DEFAULT_ADDONS = {}
DEFAULT_ADDON_MESSAGE = 'Update translation files\n\nUpdated by "{{ addon_name }}" hook in Weblate.\n\nTranslation: {{ project_name }}/{{ component_name }}\nTranslate-URL: {{ url }}'
DEFAULT_ADD_MESSAGE = 'Added translation using Weblate ({{ language_name }})\n\n'
DEFAULT_AUTO_LOCK_ERROR = True
DEFAULT_CHARSET = 'utf-8'
DEFAULT_COMMITER_EMAIL = 'noreply@weblate.org'
DEFAULT_COMMITER_NAME = 'Weblate'
DEFAULT_COMMIT_MESSAGE = 'Translated using Weblate ({{ language_name }})\n\nCurrently translated at {{ stats.translated_percent }}% ({{ stats.translated }} of {{ stats.all }} strings)\n\nTranslation: {{ project_name }}/{{ component_name }}\nTranslate-URL: {{ url }}'
DEFAULT_DELETE_MESSAGE = 'Deleted translation using Weblate ({{ language_name }})\n\n'
DEFAULT_EXCEPTION_REPORTER = 'django.views.debug.ExceptionReporter'
DEFAULT_EXCEPTION_REPORTER_FILTER = 'weblate.trans.debug.WeblateExceptionReporterFilter'
DEFAULT_FILE_STORAGE = 'django.core.files.storage.FileSystemStorage'
DEFAULT_FROM_EMAIL = 'noreply-weblate@xwiki.org'
DEFAULT_HASHING_ALGORITHM = 'sha256'
DEFAULT_INDEX_TABLESPACE = ''
DEFAULT_LANGUAGE = 'en'
DEFAULT_LOG = 'syslog'
DEFAULT_LOGLEVEL = 'INFO'
DEFAULT_MERGE_MESSAGE = "Merge branch '{{ component_remote_branch }}' into Weblate.\n\n"
DEFAULT_MERGE_STYLE = 'rebase'
DEFAULT_PULL_MESSAGE = 'Translations update from Weblate\n\nTranslations update from [Weblate]({{url}}) for {{ project_name }}/{{ component_name }}.\n\n{% if component.linked_childs %}\nIt also includes following components:\n{% for linked in component.linked_child %}\n{{ component.project.name }}/{{ component.name }}\n{% endfor %}\n{% endif %}\n\nCurrent translation status:\n\n![Weblate translation status]({{widget_url}})\n\nIf a new locale is introduced by this pull request make sure to follow https://dev.xwiki.org/xwiki/bin/view/Community/L10N/SupportedLocales/#HNewlocalechecklist before applying it.\n'
DEFAULT_PUSH_ON_COMMIT = True
DEFAULT_RESTRICTED_COMPONENT = False
DEFAULT_SHARED_TM = True
DEFAULT_TABLESPACE = ''
DEFAULT_TRANSLATION_PROPAGATION = True
DEFAULT_VCS = 'git'
DISALLOWED_USER_AGENTS = []
EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend'
EMAIL_HOST = 'localhost'
EMAIL_HOST_PASSWORD = '********************'
EMAIL_HOST_USER = ''
EMAIL_PORT = 25
EMAIL_SEND_HTML = True
EMAIL_SSL_CERTFILE = None
EMAIL_SSL_KEYFILE = '********************'
EMAIL_SUBJECT_PREFIX = '[Weblate XWiki.org] '
EMAIL_TIMEOUT = None
EMAIL_USE_LOCALTIME = False
EMAIL_USE_SSL = False
EMAIL_USE_TLS = False
ENABLE_AVATARS = True
ENABLE_HOOKS = True
ENABLE_HTTPS = True
ENABLE_SHARING = True
FILE_UPLOAD_DIRECTORY_PERMISSIONS = None
FILE_UPLOAD_HANDLERS = ['django.core.files.uploadhandler.MemoryFileUploadHandler', 'django.core.files.uploadhandler.TemporaryFileUploadHandler']
FILE_UPLOAD_MAX_MEMORY_SIZE = 2621440
FILE_UPLOAD_PERMISSIONS = 420
FILE_UPLOAD_TEMP_DIR = None
FIRST_DAY_OF_WEEK = 0
FIXTURE_DIRS = []
FONTS_CDN_URL = None
FORCE_SCRIPT_NAME = None
FORMAT_MODULE_PATH = None
FORM_RENDERER = 'django.forms.renderers.DjangoTemplates'
GITHUB_CREDENTIALS = {}
GITHUB_TOKEN = '********************'
GITHUB_USERNAME = 'xwikiorgci'
GITLAB_CREDENTIALS = {}
GITLAB_TOKEN = '********************'
GITLAB_USERNAME = None
GOOGLE_ANALYTICS_ID = None
HAVE_SYSLOG = True
HIDE_REPO_CREDENTIALS = True
HIDE_VERSION = False
IGNORABLE_404_URLS = []
INSTALLED_APPS = ['weblate.addons', 'weblate.auth', 'weblate.checks', 'weblate.configuration', 'weblate.formats', 'weblate.glossary', 'weblate.machinery', 'weblate.trans', 'weblate.lang', 'weblate_language_data', 'weblate.memory', 'weblate.screenshots', 'weblate.fonts', 'weblate.accounts', 'weblate.utils', 'weblate.vcs', 'weblate.wladmin', 'weblate', 'weblate.gitexport', 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles', 'django.contrib.admin.apps.SimpleAdminConfig', 'django.contrib.admindocs', 'django.contrib.sitemaps', 'django.contrib.humanize', 'social_django', 'crispy_forms', 'compressor', 'rest_framework', 'rest_framework.authtoken', 'django_filters']
INTERNAL_IPS = []
INVOICE_PATH = ''
IP_BEHIND_REVERSE_PROXY = False
IP_PROXY_HEADER = 'HTTP_X_FORWARDED_FOR'
IP_PROXY_OFFSET = 0
LANGUAGES = "(('ar', 'العربية'), ('az', 'Azərbaycan'), ('be', 'Беларуская'), ('be@latin', 'Biełaruskaja'), ('bg', 'Български'), ('br', 'Brezhoneg'), ('ca', 'Català'), ('cs', 'Čeština'), ('da', 'Dansk'), ('de', 'Deutsch'), ('en', 'English'), ('el', 'Ελληνικά'), ('en-gb', 'English (United Kingdom)'), ('es', 'Español'), ('fi', 'Suomi'), ('fr', 'Français'), ('gl', 'Galego'), ('he', 'עברית'), ('hu', 'Magyar'), ('hr', 'Hrvatski'), ('id', 'Indonesia'), ('is', 'Íslenska'), ('it', 'Italiano'), ('ja', '日本語'), ('kab', 'Taqbaylit'), ('kk', 'Қазақ тілі'), ('ko', '한국어'), ('nb', 'Norsk bokmål'), ('nl', 'Nederlands'), ('pl', 'Polski'), ('pt', 'Português'), ('pt-br', 'Português brasileiro'), ('ru', 'Русский'), ('sk', 'Slovenčina'), ('sl', 'Slovenščina'), ('sq', 'Shqip'), ('sr', 'Српски'), ('sv', 'Svenska'), ('tr', 'Türkçe'), ('uk', 'Українська'), ('zh-hans', '简体字'), ('zh-hant', '正體字'))"
LANGUAGES_BIDI = ['he', 'ar', 'ar-dz', 'fa', 'ur']
LANGUAGE_CODE = 'en-us'
LANGUAGE_COOKIE_AGE = 12096000
LANGUAGE_COOKIE_DOMAIN = None
LANGUAGE_COOKIE_HTTPONLY = True
LANGUAGE_COOKIE_NAME = 'django_language'
LANGUAGE_COOKIE_PATH = '/'
LANGUAGE_COOKIE_SAMESITE = None
LANGUAGE_COOKIE_SECURE = True
LEGAL_URL = None
LICENSE_EXTRA = []
LICENSE_FILTER = None
LICENSE_REQUIRED = False
LIMIT_TRANSLATION_LENGTH_BY_SOURCE_LENGTH = True
LOCALE_PATHS = []
LOCALIZE_CDN_PATH = None
LOCALIZE_CDN_URL = None
LOGGING = {'version': 1, 'disable_existing_loggers': True, 'filters': {'require_debug_false': {'()': 'django.utils.log.RequireDebugFalse'}}, 'formatters': {'syslog': {'format': 'weblate[%(process)d]: %(levelname)s %(message)s'}, 'simple': {'format': '[%(asctime)s: %(levelname)s/%(process)s] %(message)s'}, 'logfile': {'format': '%(asctime)s %(levelname)s %(message)s'}, 'django.server': {'()': 'django.utils.log.ServerFormatter', 'format': '[%(server_time)s] %(message)s'}}, 'handlers': {'mail_admins': {'level': 'ERROR', 'filters': ['require_debug_false'], 'class': 'django.utils.log.AdminEmailHandler', 'include_html': True}, 'console': {'level': 'DEBUG', 'class': 'logging.StreamHandler', 'formatter': 'simple'}, 'django.server': {'level': 'INFO', 'class': 'logging.StreamHandler', 'formatter': 'django.server'}, 'syslog': {'level': 'DEBUG', 'class': 'logging.handlers.SysLogHandler', 'formatter': 'syslog', 'address': '/dev/log', 'facility': 18}}, 'loggers': {'django.request': {'handlers': ['mail_admins', 'syslog'], 'level': 'ERROR', 'propagate': True}, 'django.server': {'handlers': ['django.server'], 'level': 'INFO', 'propagate': False}, 'weblate': {'handlers': ['syslog'], 'level': 'INFO'}, 'weblate.vcs': {'handlers': ['syslog'], 'level': 'INFO'}, 'social': {'handlers': ['syslog'], 'level': 'INFO'}, 'django_auth_ldap': {'handlers': ['syslog'], 'level': 'INFO'}, 'djangosaml2idp': {'handlers': ['syslog'], 'level': 'INFO'}}}
LOGGING_CONFIG = 'logging.config.dictConfig'
LOGIN_REDIRECT_URL = '/'
LOGIN_REQUIRED_URLS = []
LOGIN_REQUIRED_URLS_EXCEPTIONS = "('{URL_PREFIX}/accounts/(.*)$', '{URL_PREFIX}/admin/login/(.*)$', '{URL_PREFIX}/static/(.*)$', '{URL_PREFIX}/widgets/(.*)$', '{URL_PREFIX}/data/(.*)$', '{URL_PREFIX}/hooks/(.*)$', '{URL_PREFIX}/healthz/$', '{URL_PREFIX}/api/(.*)$', '{URL_PREFIX}/js/i18n/$', '{URL_PREFIX}/contact/$', '{URL_PREFIX}/legal/(.*)$')"
LOGIN_URL = '/accounts/login/'
LOGOUT_REDIRECT_URL = None
LOGOUT_URL = '/accounts/logout/'
MANAGERS = "(('XWiki.org Infra', 'simon.urli+weblate@xwiki.com'),)"
MATOMO_SITE_ID = None
MATOMO_URL = None
MEDIA_ROOT = '/var/weblate/data/media'
MEDIA_URL = '/media/'
MESSAGE_STORAGE = 'django.contrib.messages.storage.session.SessionStorage'
MIDDLEWARE = ['weblate.middleware.RedirectMiddleware', 'weblate.middleware.ProxyMiddleware', 'django.middleware.security.SecurityMiddleware', 'django.contrib.sessions.middleware.SessionMiddleware', 'django.middleware.csrf.CsrfViewMiddleware', 'weblate.accounts.middleware.AuthenticationMiddleware', 'django.contrib.messages.middleware.MessageMiddleware', 'django.middleware.clickjacking.XFrameOptionsMiddleware', 'social_django.middleware.SocialAuthExceptionMiddleware', 'weblate.accounts.middleware.RequireLoginMiddleware', 'weblate.api.middleware.ThrottlingMiddleware', 'weblate.middleware.SecurityMiddleware']
MIGRATION_MODULES = {}
MONTH_DAY_FORMAT = 'F j'
MT_APERTIUM_APY = None
MT_AWS_ACCESS_KEY_ID = '********************'
MT_AWS_REGION = None
MT_AWS_SECRET_ACCESS_KEY = '********************'
MT_BAIDU_ID = None
MT_BAIDU_SECRET = '********************'
MT_DEEPL_API_VERSION = '********************'
MT_DEEPL_KEY = '********************'
MT_GOOGLE_CREDENTIALS = None
MT_GOOGLE_KEY = '********************'
MT_GOOGLE_LOCATION = 'global'
MT_GOOGLE_PROJECT = None
MT_MICROSOFT_BASE_URL = 'api.cognitive.microsofttranslator.com'
MT_MICROSOFT_COGNITIVE_KEY = '********************'
MT_MICROSOFT_ENDPOINT_URL = 'api.cognitive.microsoft.com'
MT_MICROSOFT_REGION = None
MT_MODERNMT_KEY = '********************'
MT_MODERNMT_URL = 'https://api.modernmt.com/'
MT_MYMEMORY_EMAIL = None
MT_MYMEMORY_KEY = '********************'
MT_MYMEMORY_USER = None
MT_NETEASE_KEY = '********************'
MT_NETEASE_SECRET = '********************'
MT_SAP_BASE_URL = None
MT_SAP_PASSWORD = '********************'
MT_SAP_SANDBOX_APIKEY = '********************'
MT_SAP_USERNAME = None
MT_SAP_USE_MT = True
MT_SERVICES = "('weblate.machinery.weblatetm.WeblateTranslation', 'weblate.memory.machine.WeblateMemory')"
MT_TMSERVER = None
MT_YANDEX_KEY = '********************'
MT_YOUDAO_ID = None
MT_YOUDAO_SECRET = '********************'
NEARBY_MESSAGES = 15
NUMBER_GROUPING = 0
OFFER_HOSTING = False
PAGURE_CREDENTIALS = {}
PAGURE_TOKEN = '********************'
PAGURE_USERNAME = None
PASSWORD_HASHERS = '********************'
PASSWORD_RESET_TIMEOUT = '********************'
PASSWORD_RESET_TIMEOUT_DAYS = '********************'
PREPEND_WWW = False
RATELIMIT_ATTEMPTS = 5
RATELIMIT_COMMENT_ATTEMPTS = 30
RATELIMIT_COMMENT_WINDOW = 60
RATELIMIT_GLOSSARY_ATTEMPTS = 30
RATELIMIT_GLOSSARY_WINDOW = 60
RATELIMIT_LOCKOUT = 600
RATELIMIT_SEARCH_ATTEMPTS = 30
RATELIMIT_SEARCH_LOCKOUT = 60
RATELIMIT_SEARCH_WINDOW = 60
RATELIMIT_TRANSLATE_ATTEMPTS = 30
RATELIMIT_TRANSLATE_WINDOW = 60
RATELIMIT_WINDOW = 300
REGISTRATION_ALLOW_BACKENDS = []
REGISTRATION_CAPTCHA = True
REGISTRATION_EMAIL_MATCH = '.*'
REGISTRATION_OPEN = True
REPOSITORY_ALERT_THRESHOLD = 25
REQUIRE_LOGIN = False
REST_FRAMEWORK = {'DEFAULT_PERMISSION_CLASSES': ['rest_framework.permissions.IsAuthenticatedOrReadOnly'], 'DEFAULT_AUTHENTICATION_CLASSES': ('rest_framework.authentication.TokenAuthentication', 'weblate.api.authentication.BearerAuthentication', 'rest_framework.authentication.SessionAuthentication'), 'DEFAULT_THROTTLE_CLASSES': ('weblate.api.throttling.UserRateThrottle', 'weblate.api.throttling.AnonRateThrottle'), 'DEFAULT_THROTTLE_RATES': {'anon': '100/day', 'user': '5000/hour'}, 'DEFAULT_PAGINATION_CLASS': 'rest_framework.pagination.PageNumberPagination', 'PAGE_SIZE': 20, 'VIEW_DESCRIPTION_FUNCTION': 'weblate.api.views.get_view_description', 'UNAUTHENTICATED_USER': 'weblate.auth.models.get_anonymous'}
ROOT_URLCONF = 'weblate.urls'
SECRET_KEY = '********************'
SECURE_BROWSER_XSS_FILTER = True
SECURE_CONTENT_TYPE_NOSNIFF = True
SECURE_HSTS_INCLUDE_SUBDOMAINS = True
SECURE_HSTS_PRELOAD = True
SECURE_HSTS_SECONDS = 31536000
SECURE_PROXY_SSL_HEADER = None
SECURE_REDIRECT_EXEMPT = "('healthz/$',)"
SECURE_REFERRER_POLICY = 'same-origin'
SECURE_SSL_HOST = None
SECURE_SSL_REDIRECT = True
SENTRY_DSN = None
SENTRY_ENVIRONMENT = 'devel'
SENTRY_EXTRA_ARGS = {}
SENTRY_ORGANIZATION = 'weblate'
SENTRY_PROJECTS = ['weblate']
SENTRY_SECURITY = None
SENTRY_TOKEN = '********************'
SERVER_EMAIL = 'noreply-weblate@xwiki.org'
SESSION_CACHE_ALIAS = 'default'
SESSION_COOKIE_AGE = 1000
SESSION_COOKIE_AGE_AUTHENTICATED = 1209600
SESSION_COOKIE_DOMAIN = None
SESSION_COOKIE_HTTPONLY = True
SESSION_COOKIE_NAME = 'sessionid'
SESSION_COOKIE_PATH = '/'
SESSION_COOKIE_SAMESITE = 'Lax'
SESSION_COOKIE_SECURE = True
SESSION_ENGINE = 'django.contrib.sessions.backends.cache'
SESSION_EXPIRE_AT_BROWSER_CLOSE = False
SESSION_FILE_PATH = None
SESSION_SAVE_EVERY_REQUEST = False
SESSION_SERIALIZER = 'django.contrib.sessions.serializers.JSONSerializer'
SETTINGS_MODULE = 'weblate.settings'
SHORT_DATETIME_FORMAT = 'm/d/Y P'
SHORT_DATE_FORMAT = 'm/d/Y'
SIGNING_BACKEND = 'django.core.signing.TimestampSigner'
SILENCED_SYSTEM_CHECKS = ['admin.E408']
SIMILAR_MESSAGES = 5
SIMPLIFY_LANGUAGES = True
SINGLE_PROJECT = False
SITE_DOMAIN = 'l10n.xwiki.org'
SITE_ID = 1
SITE_TITLE = 'Weblate XWiki.org'
SOCIAL_AUTH_AUTH0_IMAGE = 'auth0.svg'
SOCIAL_AUTH_AUTH0_TITLE = 'Auth0'
SOCIAL_AUTH_BITBUCKET_KEY = '********************'
SOCIAL_AUTH_BITBUCKET_SECRET = '********************'
SOCIAL_AUTH_BITBUCKET_VERIFIED_EMAILS_ONLY = True
SOCIAL_AUTH_DISCONNECT_PIPELINE = "('social_core.pipeline.disconnect.allowed_to_disconnect', 'social_core.pipeline.disconnect.get_entries', 'social_core.pipeline.disconnect.revoke_tokens', 'weblate.accounts.pipeline.cycle_session', 'weblate.accounts.pipeline.adjust_primary_mail', 'weblate.accounts.pipeline.notify_disconnect', 'social_core.pipeline.disconnect.disconnect', 'weblate.accounts.pipeline.cleanup_next')"
SOCIAL_AUTH_EMAIL_FORM_URL = '/accounts/email/'
SOCIAL_AUTH_EMAIL_VALIDATION_FUNCTION = 'weblate.accounts.pipeline.send_validation'
SOCIAL_AUTH_EMAIL_VALIDATION_URL = '/accounts/email-sent/'
SOCIAL_AUTH_FACEBOOK_KEY = '********************'
SOCIAL_AUTH_FACEBOOK_PROFILE_EXTRA_PARAMS = {'fields': 'id,name,email'}
SOCIAL_AUTH_FACEBOOK_SCOPE = ['email', 'public_profile']
SOCIAL_AUTH_FACEBOOK_SECRET = '********************'
SOCIAL_AUTH_GITHUB_KEY = '********************'
SOCIAL_AUTH_GITHUB_SCOPE = ['user:email']
SOCIAL_AUTH_GITHUB_SECRET = '********************'
SOCIAL_AUTH_GOOGLE_OAUTH2_KEY = '********************'
SOCIAL_AUTH_GOOGLE_OAUTH2_SECRET = '********************'
SOCIAL_AUTH_LOGIN_ERROR_URL = '/accounts/login/'
SOCIAL_AUTH_NEW_ASSOCIATION_REDIRECT_URL = '/accounts/profile/#account'
SOCIAL_AUTH_PIPELINE = "('social_core.pipeline.social_auth.social_details', 'social_core.pipeline.social_auth.social_uid', 'social_core.pipeline.social_auth.auth_allowed', 'social_core.pipeline.social_auth.social_user', 'weblate.accounts.pipeline.store_params', 'weblate.accounts.pipeline.verify_open', 'social_core.pipeline.user.get_username', 'weblate.accounts.pipeline.require_email', 'social_core.pipeline.mail.mail_validation', 'weblate.accounts.pipeline.revoke_mail_code', 'weblate.accounts.pipeline.ensure_valid', 'weblate.accounts.pipeline.remove_account', 'social_core.pipeline.social_auth.associate_by_email', 'weblate.accounts.pipeline.reauthenticate', 'weblate.accounts.pipeline.verify_username', 'social_core.pipeline.user.create_user', 'social_core.pipeline.social_auth.associate_user', 'social_core.pipeline.social_auth.load_extra_data', 'weblate.accounts.pipeline.cleanup_next', 'weblate.accounts.pipeline.user_full_name', 'weblate.accounts.pipeline.store_email', 'weblate.accounts.pipeline.notify_connect', 'weblate.accounts.pipeline.password_reset')"
SOCIAL_AUTH_PROTECTED_USER_FIELDS = "('email',)"
SOCIAL_AUTH_RAISE_EXCEPTIONS = True
SOCIAL_AUTH_REDIRECT_IS_HTTPS = True
SOCIAL_AUTH_SAML_IMAGE = 'saml.svg'
SOCIAL_AUTH_SAML_TITLE = 'SAML'
SOCIAL_AUTH_SLUGIFY_FUNCTION = 'weblate.accounts.pipeline.slugify_username'
SOCIAL_AUTH_SLUGIFY_USERNAMES = True
SOCIAL_AUTH_STRATEGY = 'weblate.accounts.strategy.WeblateStrategy'
SOCIAL_AUTH_XWIKI_KEY = '********************'
SPECIAL_CHARS = "('\\t', '\\n', '\\xa0', '…')"
STATICFILES_DIRS = '()'
STATICFILES_FINDERS = "('django.contrib.staticfiles.finders.FileSystemFinder', 'django.contrib.staticfiles.finders.AppDirectoriesFinder', 'compressor.finders.CompressorFinder')"
STATICFILES_STORAGE = 'django.contrib.staticfiles.storage.StaticFilesStorage'
STATIC_ROOT = '/var/weblate/data/static'
STATIC_URL = '/static/'
STATUS_URL = None
SUGGESTION_CLEANUP_DAYS = None
SUPPORT_API_URL = '********************'
TEMPLATES = [{'BACKEND': 'django.template.backends.django.DjangoTemplates', 'OPTIONS': {'context_processors': ['django.contrib.auth.context_processors.auth', 'django.template.context_processors.debug', 'django.template.context_processors.i18n', 'django.template.context_processors.request', 'django.template.context_processors.csrf', 'django.contrib.messages.context_processors.messages', 'weblate.trans.context_processors.weblate_context'], 'loaders': [('django.template.loaders.cached.Loader', ['django.template.loaders.filesystem.Loader', 'django.template.loaders.app_directories.Loader'])]}}]
TEST_NON_SERIALIZED_APPS = []
TEST_RUNNER = 'django.test.runner.DiscoverRunner'
THOUSAND_SEPARATOR = ','
TIME_FORMAT = 'P'
TIME_INPUT_FORMATS = ['%H:%M:%S', '%H:%M:%S.%f', '%H:%M']
TIME_ZONE = 'UTC'
UPDATE_LANGUAGES = True
URL_PREFIX = ''
USE_I18N = True
USE_L10N = True
USE_THOUSAND_SEPARATOR = False
USE_TZ = True
USE_X_FORWARDED_HOST = False
USE_X_FORWARDED_PORT = False
VAT_RATE = 1.21
VCS_BACKENDS = "('weblate.vcs.git.GitRepository', 'weblate.vcs.git.GitWithGerritRepository', 'weblate.vcs.git.SubversionRepository', 'weblate.vcs.git.GithubRepository', 'weblate.vcs.git.GitLabRepository', 'weblate.vcs.git.PagureRepository', 'weblate.vcs.git.LocalRepository', 'weblate.vcs.git.GitForcePushRepository', 'weblate.vcs.mercurial.HgRepository')"
VCS_CLONE_DEPTH = 1
WEBLATE_ADDONS = "('weblate.addons.gettext.GenerateMoAddon', 'weblate.addons.gettext.UpdateLinguasAddon', 'weblate.addons.gettext.UpdateConfigureAddon', 'weblate.addons.gettext.MsgmergeAddon', 'weblate.addons.gettext.GettextCustomizeAddon', 'weblate.addons.gettext.GettextAuthorComments', 'weblate.addons.cleanup.CleanupAddon', 'weblate.addons.cleanup.RemoveBlankAddon', 'weblate.addons.consistency.LangaugeConsistencyAddon', 'weblate.addons.discovery.DiscoveryAddon', 'weblate.addons.autotranslate.AutoTranslateAddon', 'weblate.addons.flags.SourceEditAddon', 'weblate.addons.flags.TargetEditAddon', 'weblate.addons.flags.SameEditAddon', 'weblate.addons.flags.BulkEditAddon', 'weblate.addons.generate.GenerateFileAddon', 'weblate.addons.json.JSONCustomizeAddon', 'weblate.addons.properties.PropertiesSortAddon', 'weblate.addons.git.GitSquashAddon', 'weblate.addons.removal.RemoveComments', 'weblate.addons.removal.RemoveSuggestions', 'weblate.addons.resx.ResxUpdateAddon', 'weblate.addons.yaml.YAMLCustomizeAddon', 'weblate.addons.cdn.CDNJSAddon')"
WEBLATE_EXPORTERS = "('weblate.formats.exporters.PoExporter', 'weblate.formats.exporters.PoXliffExporter', 'weblate.formats.exporters.XliffExporter', 'weblate.formats.exporters.TBXExporter', 'weblate.formats.exporters.TMXExporter', 'weblate.formats.exporters.MoExporter', 'weblate.formats.exporters.CSVExporter', 'weblate.formats.exporters.XlsxExporter', 'weblate.formats.exporters.JSONExporter', 'weblate.formats.exporters.AndroidResourceExporter', 'weblate.formats.exporters.StringsExporter')"
WEBLATE_FORMATS = "('weblate.formats.ttkit.PoFormat', 'weblate.formats.ttkit.PoMonoFormat', 'weblate.formats.ttkit.TSFormat', 'weblate.formats.ttkit.XliffFormat', 'weblate.formats.ttkit.PoXliffFormat', 'weblate.formats.ttkit.StringsFormat', 'weblate.formats.ttkit.StringsUtf8Format', 'weblate.formats.ttkit.PropertiesUtf8Format', 'weblate.formats.ttkit.PropertiesUtf16Format', 'weblate.formats.ttkit.PropertiesFormat', 'weblate.formats.ttkit.JoomlaFormat', 'weblate.formats.ttkit.GWTFormat', 'weblate.formats.ttkit.PhpFormat', 'weblate.formats.ttkit.LaravelPhpFormat', 'weblate.formats.ttkit.RESXFormat', 'weblate.formats.ttkit.AndroidFormat', 'weblate.formats.ttkit.JSONFormat', 'weblate.formats.ttkit.JSONNestedFormat', 'weblate.formats.ttkit.WebExtensionJSONFormat', 'weblate.formats.ttkit.I18NextFormat', 'weblate.formats.ttkit.GoI18JSONFormat', 'weblate.formats.ttkit.ARBFormat', 'weblate.formats.ttkit.CSVFormat', 'weblate.formats.ttkit.CSVSimpleFormat', 'weblate.formats.ttkit.CSVSimpleFormatISO', 'weblate.formats.ttkit.YAMLFormat', 'weblate.formats.ttkit.RubyYAMLFormat', 'weblate.formats.ttkit.SubRipFormat', 'weblate.formats.ttkit.MicroDVDFormat', 'weblate.formats.ttkit.AdvSubStationAlphaFormat', 'weblate.formats.ttkit.SubStationAlphaFormat', 'weblate.formats.ttkit.DTDFormat', 'weblate.formats.ttkit.FlatXMLFormat', 'weblate.formats.ttkit.INIFormat', 'weblate.formats.ttkit.InnoSetupINIFormat', 'weblate.formats.external.XlsxFormat', 'weblate.formats.txt.AppStoreFormat', 'weblate.formats.convert.HTMLFormat', 'weblate.formats.convert.IDMLFormat', 'weblate.formats.convert.OpenDocumentFormat', 'weblate.formats.convert.WindowsRCFormat', 'weblate.formats.ttkit.XWikiPropertiesFormat', 'weblate.formats.ttkit.XWikiPagePropertiesFormat', 'weblate.formats.ttkit.XWikiFullPageFormat')"
WEBLATE_GPG_ALGO = 'default'
WEBLATE_GPG_IDENTITY = None
WSGI_APPLICATION = None
X_FRAME_OPTIONS = 'DENY'
YEAR_MONTH_FORMAT = 'F Y'
_TEMPLATE_LOADERS = [('django.template.loaders.cached.Loader', ['django.template.loaders.filesystem.Loader', 'django.template.loaders.app_directories.Loader'])]

Server configuration and status

Weblate installation: PyPI

 * Weblate: 4.4.2
 * Django: 3.1.5
 * siphashc: 1.3
 * Whoosh: 2.7.4
 * translate-toolkit: 3.3.0
 * lxml: 4.5.2
 * Pillow: 7.1.2
 * bleach: 3.1.5
 * python-dateutil: 2.8.1
 * social-auth-core: 4.0.3
 * social-auth-app-django: 4.0.0
 * django-crispy-forms: 1.9.2
 * oauthlib: 3.1.0
 * django-compressor: 2.4
 * djangorestframework: 3.11.1
 * django-filter: 2.4.0
 * django-appconf: 1.0.4
 * user-agents: 2.1
 * filelock: 3.0.12
 * setuptools: 50.3.0
 * jellyfish: 0.8.2
 * openpyxl: 3.0.5
 * celery: 4.4.7
 * kombu: 4.6.11
 * translation-finder: 2.7
 * weblate-language-data: 2020.13
 * html2text: 2020.1.16
 * pycairo: 1.19.1
 * pygobject: 3.38.0
 * diff-match-patch: 20200713
 * requests: 2.24.0
 * django-redis: 4.12.1
 * hiredis: 1.0.1
 * sentry_sdk: 0.15.1
 * Cython: 0.29.21
 * misaka: 2.1.1
 * GitPython: 3.1.8
 * borgbackup: 1.1.13
 * pyparsing: 2.4.7
 * Python: 3.7.3
 * Git: 2.20.1
 * psycopg2-binary: 2.8.6
 * chardet: 3.0.4
 * ruamel.yaml: 0.16.12
 * Redis server: 5.0.3
 * PostgreSQL server: 11.11
 * Database backends: django.db.backends.postgresql
 * Cache backends: default:RedisCache, avatar:FileBasedCache
 * Email setup: django.core.mail.backends.smtp.EmailBackend: localhost
 * OS encoding: filesystem=utf-8, default=utf-8
 * Celery: redis://localhost:6379, redis://localhost:6379, regular
 * Platform: Linux 4.19.0-16-amd64 (x86_64)

Additional context

weblate@l10n-prod:~$ free -m
              total        used        free      shared  buff/cache   available
Mem:           5951        5688         103           5         159          55
Swap:          6047        4418        1629
(weblate-env) weblate@l10n-prod:~$ lscpu
Architecture:        x86_64
CPU op-mode(s):      32-bit, 64-bit
Byte Order:          Little Endian
Address sizes:       40 bits physical, 48 bits virtual
CPU(s):              4
On-line CPU(s) list: 0-3
Thread(s) per core:  1
Core(s) per socket:  1
Socket(s):           4
NUMA node(s):        1
Vendor ID:           AuthenticAMD
CPU family:          21
Model:               16
Model name:          AMD Opteron(tm) Processor 6386 SE
Stepping:            0
CPU MHz:             2800.000
nijel commented 3 years ago

Most likely there is another process accessing the repository at this time (it should be visible from the logs). Similar issue as https://github.com/WeblateOrg/weblate/issues/4666

surli commented 3 years ago

What I should look for in logs? I can see for example in journalctl, the following:

May 19 06:21:05 l10n-prod weblate[17981]: INFO xwiki-commons/xwiki-commons-extension-api: skipped push: nothing to push
May 19 09:15:10 l10n-prod weblate[35362]: INFO xwiki-platform/xwiki-core-resources/id: committing pending changes (commit)
May 19 09:29:17 l10n-prod weblate[17984]: ERROR Internal Server Error: /js/git/xwiki-platform/xwiki-core-resources/

So it's not clear that another process access the repo here, unless the access is done because the commitpending is not done and the UI tries to display the repo status?

surli commented 3 years ago

Also note that for a reason that I don't understand sometime the repository status indicates "69 pending changes" sometimes it indicates "15 pending changes"

nijel commented 3 years ago

I've just noticed that you're on quite old version, can you try upgrading? There has been several changes in the locking meanwhile and it might address this...

surli commented 3 years ago

I've just noticed that you're on quite old version, can you try upgrading?

is it safe to upgrade while there's pending changes?

nijel commented 3 years ago

Yes, the only thing to look at are celery queues, these should be empty.<

surli commented 3 years ago

Hi @nijel so I just upgraded to Weblate 4.6.2 and it seems I keep getting the same behaviour, even though the error is slightly different, now I get this:

Internal Server Error: /js/git/xwiki-platform/

WeblateLockTimeout at /js/git/xwiki-platform/
No exception message supplied

Request Method: GET
Request URL: https://l10n.xwiki.org/js/git/xwiki-platform/
Django Version: 3.1.5
Python Executable: /usr/bin/uwsgi-core
Python Version: 3.7.3
Python Path: ['/home/weblate/weblate-env/lib/python3.7/site-packages/git/ext/gitdb', '/', '.', '', '/home/weblate/weblate-env/lib/python37.zip', '/home/weblate/weblate-env/lib/python3.7', '/home/weblate/weblate-env/lib/python3.7/lib-dynload', '/usr/lib/python3.7', '/home/weblate/weblate-env/lib/python3.7/site-packages', '/home/weblate/weblate-env/lib/python3.7/site-packages/gitdb/ext/smmap']
Server time: Fri, 21 May 2021 08:41:13 +0000
Installed Applications:
['weblate.addons',
 'weblate.auth',
 'weblate.checks',
 'weblate.configuration',
 'weblate.formats',
 'weblate.glossary',
 'weblate.machinery',
 'weblate.trans',
 'weblate.lang',
 'weblate_language_data',
 'weblate.memory',
 'weblate.metrics',
 'weblate.screenshots',
 'weblate.fonts',
 'weblate.accounts',
 'weblate.utils',
 'weblate.vcs',
 'weblate.wladmin',
 'weblate',
 'weblate.gitexport',
 'django.contrib.auth',
 'django.contrib.contenttypes',
 'django.contrib.sessions',
 'django.contrib.messages',
 'django.contrib.staticfiles',
 'django.contrib.admin.apps.SimpleAdminConfig',
 'django.contrib.admindocs',
 'django.contrib.sitemaps',
 'django.contrib.humanize',
 'social_django',
 'crispy_forms',
 'compressor',
 'rest_framework',
 'rest_framework.authtoken',
 'django_filters']
Installed Middleware:
['weblate.middleware.RedirectMiddleware',
 'weblate.middleware.ProxyMiddleware',
 'django.middleware.security.SecurityMiddleware',
 'django.contrib.sessions.middleware.SessionMiddleware',
 'django.middleware.csrf.CsrfViewMiddleware',
 'weblate.accounts.middleware.AuthenticationMiddleware',
 'django.contrib.messages.middleware.MessageMiddleware',
 'django.middleware.clickjacking.XFrameOptionsMiddleware',
 'social_django.middleware.SocialAuthExceptionMiddleware',
 'weblate.accounts.middleware.RequireLoginMiddleware',
 'weblate.api.middleware.ThrottlingMiddleware',
 'weblate.middleware.SecurityMiddleware']

Traceback (most recent call last):
  File "/home/weblate/weblate-env/lib/python3.7/site-packages/django/core/handlers/exception.py", line 47, in inner
    response = get_response(request)
  File "/home/weblate/weblate-env/lib/python3.7/site-packages/django/core/handlers/base.py", line 181, in _get_response
    response = wrapped_callback(request, *callback_args, **callback_kwargs)
  File "/home/weblate/weblate-env/lib/python3.7/site-packages/django/contrib/auth/decorators.py", line 21, in _wrapped_view
    return view_func(request, *args, **kwargs)
  File "/home/weblate/weblate-env/lib/python3.7/site-packages/weblate/trans/views/js.py", line 181, in git_status_project
    return git_status_shared(request, obj, obj.all_repo_components)
  File "/home/weblate/weblate-env/lib/python3.7/site-packages/weblate/trans/views/js.py", line 172, in git_status_shared
    "missing_commits": sum(repo.count_repo_missing for repo in repositories),
  File "/home/weblate/weblate-env/lib/python3.7/site-packages/django/shortcuts.py", line 19, in render
    content = loader.render_to_string(template_name, context, request, using=using)
  File "/home/weblate/weblate-env/lib/python3.7/site-packages/django/template/loader.py", line 62, in render_to_string
    return template.render(context, request)
  File "/home/weblate/weblate-env/lib/python3.7/site-packages/django/template/backends/django.py", line 61, in render
    return self.template.render(context)
  File "/home/weblate/weblate-env/lib/python3.7/site-packages/django/template/base.py", line 170, in render
    return self._render(context)
  File "/home/weblate/weblate-env/lib/python3.7/site-packages/django/template/base.py", line 162, in _render
    return self.nodelist.render(context)
  File "/home/weblate/weblate-env/lib/python3.7/site-packages/django/template/base.py", line 938, in render
    bit = node.render_annotated(context)
  File "/home/weblate/weblate-env/lib/python3.7/site-packages/django/template/base.py", line 905, in render_annotated
    return self.render(context)
  File "/home/weblate/weblate-env/lib/python3.7/site-packages/django/template/defaulttags.py", line 516, in render
    return self.nodelist.render(context)
  File "/home/weblate/weblate-env/lib/python3.7/site-packages/django/template/base.py", line 938, in render
    bit = node.render_annotated(context)
  File "/home/weblate/weblate-env/lib/python3.7/site-packages/django/template/base.py", line 905, in render_annotated
    return self.render(context)
  File "/home/weblate/weblate-env/lib/python3.7/site-packages/django/template/defaulttags.py", line 211, in render
    nodelist.append(node.render_annotated(context))
  File "/home/weblate/weblate-env/lib/python3.7/site-packages/django/template/base.py", line 905, in render_annotated
    return self.render(context)
  File "/home/weblate/weblate-env/lib/python3.7/site-packages/django/template/base.py", line 988, in render
    output = self.filter_expression.resolve(context)
  File "/home/weblate/weblate-env/lib/python3.7/site-packages/django/template/base.py", line 671, in resolve
    obj = self.var.resolve(context)
  File "/home/weblate/weblate-env/lib/python3.7/site-packages/django/template/base.py", line 796, in resolve
    value = self._resolve_lookup(context)
  File "/home/weblate/weblate-env/lib/python3.7/site-packages/django/template/base.py", line 858, in _resolve_lookup
    current = current()
  File "/home/weblate/weblate-env/lib/python3.7/site-packages/weblate/vcs/base.py", line 292, in status
    with self.lock:
  File "/home/weblate/weblate-env/lib/python3.7/site-packages/weblate/utils/lock.py", line 82, in __enter__
    raise WeblateLockTimeout()

Exception Type: WeblateLockTimeout at /js/git/xwiki-platform/

Request information:
USER: Simon Urli

GET: No GET data

POST: No POST data

FILES: No FILES data

COOKIES:[COOKIE INFO]

META:
CONTENT_LENGTH = ''
CONTENT_TYPE = ''
CSRF_COOKIE = 
CSRF_COOKIE_USED = True
DOCUMENT_ROOT = '/var/www/html'
HTTPS = 'on'
HTTP_ACCEPT = 'text/html, */*; q=0.01'
HTTP_ACCEPT_ENCODING = 'gzip, deflate, br'
HTTP_ACCEPT_LANGUAGE = 'fr,en-US;q=0.7,en;q=0.3'
HTTP_CONNECTION = 'keep-alive'
HTTP_COOKIE =[COOKIE INFO]
HTTP_DNT = '1'
HTTP_HOST = 'l10n.xwiki.org'
HTTP_REFERER = 'https://l10n.xwiki.org/'
HTTP_USER_AGENT = 'Mozilla/5.0 (X11; Linux x86_64; rv:88.0) Gecko/20100101 Firefox/88.0'
HTTP_X_REQUESTED_WITH = 'XMLHttpRequest'
PATH_INFO = '/js/git/xwiki-platform/'
QUERY_STRING = ''
REMOTE_ADDR = '212.198.27.104'
REMOTE_PORT = '54748'
REQUEST_METHOD = 'GET'
REQUEST_SCHEME = 'https'
REQUEST_URI = '/js/git/xwiki-platform/'
SCRIPT_NAME = ''
SERVER_NAME = 'l10n.xwiki.org'
SERVER_PORT = '443'
SERVER_PROTOCOL = 'HTTP/1.1'
WEBLATE_LANGUAGE = ''
WEBLATE_USER = "'surli'"
WEBLATE_VERSION:Cython = '0.29.21'
WEBLATE_VERSION:Django = '3.1.5'
WEBLATE_VERSION:Git = '2.20.1'
WEBLATE_VERSION:GitPython = '3.1.8'
WEBLATE_VERSION:Pillow = '7.1.2'
WEBLATE_VERSION:PostgreSQL server = '11.11'
WEBLATE_VERSION:Python = '3.7.3'
WEBLATE_VERSION:Redis server = '5.0.3'
WEBLATE_VERSION:Weblate = '4.6.2'
WEBLATE_VERSION:bleach = '3.1.5'
WEBLATE_VERSION:borgbackup = '1.1.13'
WEBLATE_VERSION:celery = '4.4.7'
WEBLATE_VERSION:chardet = '3.0.4'
WEBLATE_VERSION:diff-match-patch = '20200713'
WEBLATE_VERSION:django-appconf = '1.0.4'
WEBLATE_VERSION:django-compressor = '2.4'
WEBLATE_VERSION:django-crispy-forms = '1.9.2'
WEBLATE_VERSION:django-filter = '2.4.0'
WEBLATE_VERSION:django-redis = '4.12.1'
WEBLATE_VERSION:djangorestframework = '3.11.1'
WEBLATE_VERSION:filelock = '3.0.12'
WEBLATE_VERSION:hiredis = '1.0.1'
WEBLATE_VERSION:html2text = '2020.1.16'
WEBLATE_VERSION:jellyfish = '0.8.2'
WEBLATE_VERSION:kombu = '4.6.11'
WEBLATE_VERSION:lxml = '4.6.3'
WEBLATE_VERSION:misaka = '2.1.1'
WEBLATE_VERSION:oauthlib = '3.1.0'
WEBLATE_VERSION:openpyxl = '3.0.5'
WEBLATE_VERSION:psycopg2-binary = '2.8.6'
WEBLATE_VERSION:pyahocorasick = '1.4.2'
WEBLATE_VERSION:pycairo = '1.19.1'
WEBLATE_VERSION:pygobject = '3.38.0'
WEBLATE_VERSION:pyparsing = '2.4.7'
WEBLATE_VERSION:python-dateutil = '2.8.1'
WEBLATE_VERSION:python-redis-lock = '3.7.0'
WEBLATE_VERSION:requests = '2.24.0'
WEBLATE_VERSION:ruamel.yaml = '0.16.12'
WEBLATE_VERSION:sentry_sdk = '0.15.1'
WEBLATE_VERSION:setuptools = '50.3.0'
WEBLATE_VERSION:siphashc = '1.3'
WEBLATE_VERSION:social-auth-app-django = '4.0.0'
WEBLATE_VERSION:social-auth-core = '4.1.0'
WEBLATE_VERSION:translate-toolkit = '3.3.6'
WEBLATE_VERSION:translation-finder = '2.7'
WEBLATE_VERSION:user-agents = '2.1'
WEBLATE_VERSION:weblate-language-data = '2021.4'
uwsgi.node = b'l10n-prod'
uwsgi.version = b'2.0.18-debian'
wsgi.errors = <_io.TextIOWrapper name=2 mode='w' encoding='UTF-8'>
wsgi.file_wrapper = <built-in function uwsgi_sendfile>
wsgi.input = <uwsgi._Input object at 0x7f5a7b10c120>
wsgi.multiprocess = True
wsgi.multithread = False
wsgi.run_once = False
wsgi.url_scheme = 'https'
wsgi.version = '(1, 0)'

Settings:
Using settings module weblate.settings
ABSOLUTE_URL_OVERRIDES = {}
ADMINS = "(('XWiki.org Infra', 'simon.urli+weblate@xwiki.com'),)"
ADMINS_BILLING = []
ADMINS_CONTACT = []
ADMINS_HOSTING = []
AKISMET_API_KEY = '********************'
ALLOWED_HOSTS = ['l10n.xwiki.org', 'l10n-new.xwiki.org', '*']
ANONYMOUS_USER_NAME = 'anonymous'
APPEND_SLASH = True
AUDITLOG_EXPIRY = 180
AUTHENTICATION_BACKENDS = "('social_core.backends.email.EmailAuth', 'social_core.backends.github.GithubOAuth2', 'social_core.backends.suse.OpenSUSEOpenId', 'social_core.backends.ubuntu.UbuntuOpenId', 'social_core.backends.fedora.FedoraOpenId', 'weblate.accounts.auth.WeblateUserBackend', 'weblate.auth.xwiki.XWikiOAuth2')"
AUTH_LOCK_ATTEMPTS = 10
AUTH_PASSWORD_DAYS = '********************'
AUTH_PASSWORD_VALIDATORS = '********************'
AUTH_RESTRICT_ADMINS = {}
AUTH_TOKEN_VALID = '********************'
AUTH_USER_MODEL = 'weblate_auth.User'
AUTOFIX_LIST = "('weblate.trans.autofixes.whitespace.SameBookendingWhitespace', 'weblate.trans.autofixes.chars.ReplaceTrailingDotsWithEllipsis', 'weblate.trans.autofixes.chars.RemoveZeroSpace', 'weblate.trans.autofixes.chars.RemoveControlChars', 'weblate.trans.autofixes.html.BleachHTML')"
AUTO_UPDATE = True
AVATAR_DEFAULT_IMAGE = 'identicon'
AVATAR_URL_PREFIX = 'https://www.gravatar.com/'
BACKGROUND_TASKS = 'monthly'
BASE_DIR = '/home/weblate/weblate-env/lib/python3.7/site-packages'
BASIC_LANGUAGES = None
CACHES = {'default': {'BACKEND': 'django_redis.cache.RedisCache', 'LOCATION': 'redis://127.0.0.1:6379/1', 'OPTIONS': {'CLIENT_CLASS': 'django_redis.client.DefaultClient', 'PARSER_CLASS': 'redis.connection.HiredisParser', 'PASSWORD': '********************', 'CONNECTION_POOL_KWARGS': {}}, 'KEY_PREFIX': '********************'}, 'avatar': {'BACKEND': 'django.core.cache.backends.filebased.FileBasedCache', 'LOCATION': '/var/weblate/data/avatar-cache', 'TIMEOUT': 86400, 'OPTIONS': {'MAX_ENTRIES': 1000}}}
CACHE_MIDDLEWARE_ALIAS = 'default'
CACHE_MIDDLEWARE_KEY_PREFIX = '********************'
CACHE_MIDDLEWARE_SECONDS = 600
CELERY_BEAT_SCHEDULE_FILENAME = '/var/weblate/data/celery/beat-schedule'
CELERY_BROKER_URL = 'redis://localhost:6379'
CELERY_RESULT_BACKEND = 'redis://localhost:6379'
CELERY_TASK_ALWAYS_EAGER = False
CELERY_TASK_ROUTES = {'weblate.trans.tasks.auto_translate': {'queue': 'translate'}, 'weblate.accounts.tasks.notify_*': {'queue': 'notify'}, 'weblate.accounts.tasks.send_mails': {'queue': 'notify'}, 'weblate.utils.tasks.settings_backup': {'queue': 'backup'}, 'weblate.utils.tasks.database_backup': {'queue': 'backup'}, 'weblate.wladmin.tasks.backup': {'queue': 'backup'}, 'weblate.wladmin.tasks.backup_service': {'queue': 'backup'}, 'weblate.memory.tasks.*': {'queue': 'memory'}}
CELERY_WORKER_MAX_MEMORY_PER_CHILD = 200000
CHECK_LIST = "('weblate.checks.same.SameCheck', 'weblate.checks.chars.BeginNewlineCheck', 'weblate.checks.chars.EndNewlineCheck', 'weblate.checks.chars.BeginSpaceCheck', 'weblate.checks.chars.EndSpaceCheck', 'weblate.checks.chars.DoubleSpaceCheck', 'weblate.checks.chars.EndStopCheck', 'weblate.checks.chars.EndColonCheck', 'weblate.checks.chars.EndQuestionCheck', 'weblate.checks.chars.EndExclamationCheck', 'weblate.checks.chars.EndEllipsisCheck', 'weblate.checks.chars.EndSemicolonCheck', 'weblate.checks.chars.MaxLengthCheck', 'weblate.checks.chars.KashidaCheck', 'weblate.checks.chars.PunctuationSpacingCheck', 'weblate.checks.format.PythonFormatCheck', 'weblate.checks.format.PythonBraceFormatCheck', 'weblate.checks.format.PHPFormatCheck', 'weblate.checks.format.CFormatCheck', 'weblate.checks.format.PerlFormatCheck', 'weblate.checks.format.JavaScriptFormatCheck', 'weblate.checks.format.LuaFormatCheck', 'weblate.checks.format.SchemeFormatCheck', 'weblate.checks.format.CSharpFormatCheck', 'weblate.checks.format.JavaFormatCheck', 'weblate.checks.format.JavaMessageFormatCheck', 'weblate.checks.format.PercentPlaceholdersCheck', 'weblate.checks.format.VueFormattingCheck', 'weblate.checks.format.I18NextInterpolationCheck', 'weblate.checks.format.ESTemplateLiteralsCheck', 'weblate.checks.angularjs.AngularJSInterpolationCheck', 'weblate.checks.qt.QtFormatCheck', 'weblate.checks.qt.QtPluralCheck', 'weblate.checks.ruby.RubyFormatCheck', 'weblate.checks.consistency.PluralsCheck', 'weblate.checks.consistency.SamePluralsCheck', 'weblate.checks.consistency.ConsistencyCheck', 'weblate.checks.consistency.TranslatedCheck', 'weblate.checks.chars.EscapedNewlineCountingCheck', 'weblate.checks.chars.NewLineCountCheck', 'weblate.checks.markup.BBCodeCheck', 'weblate.checks.chars.ZeroWidthSpaceCheck', 'weblate.checks.render.MaxSizeCheck', 'weblate.checks.markup.XMLValidityCheck', 'weblate.checks.markup.XMLTagsCheck', 'weblate.checks.markup.MarkdownRefLinkCheck', 'weblate.checks.markup.MarkdownLinkCheck', 'weblate.checks.markup.MarkdownSyntaxCheck', 'weblate.checks.markup.URLCheck', 'weblate.checks.markup.SafeHTMLCheck', 'weblate.checks.placeholders.PlaceholderCheck', 'weblate.checks.placeholders.RegexCheck', 'weblate.checks.duplicate.DuplicateCheck', 'weblate.checks.source.OptionalPluralCheck', 'weblate.checks.source.EllipsisCheck', 'weblate.checks.source.MultipleFailingCheck', 'weblate.checks.source.LongUntranslatedCheck', 'weblate.checks.format.MultipleUnnamedFormatsCheck', 'weblate.checks.glossary.GlossaryCheck')"
COMMENT_CLEANUP_DAYS = None
COMMIT_PENDING_HOURS = 1
COMPRESSORS = {'css': 'compressor.css.CssCompressor', 'js': 'compressor.js.JsCompressor'}
COMPRESS_CACHEABLE_PRECOMPILERS = '()'
COMPRESS_CACHE_BACKEND = 'default'
COMPRESS_CACHE_KEY_FUNCTION = '********************'
COMPRESS_CLEAN_CSS_ARGUMENTS = ''
COMPRESS_CLEAN_CSS_BINARY = 'cleancss'
COMPRESS_CLOSURE_COMPILER_ARGUMENTS = ''
COMPRESS_CLOSURE_COMPILER_BINARY = 'java -jar compiler.jar'
COMPRESS_CSS_HASHING_METHOD = 'mtime'
COMPRESS_DATA_URI_MAX_SIZE = 1024
COMPRESS_DEBUG_TOGGLE = None
COMPRESS_ENABLED = True
COMPRESS_FILTERS = {'css': ['compressor.filters.css_default.CssAbsoluteFilter'], 'js': ['compressor.filters.jsmin.JSMinFilter']}
COMPRESS_JINJA2_GET_ENVIRONMENT = <function CompressorConf.JINJA2_GET_ENVIRONMENT at 0x7f5a7ac38488>
COMPRESS_MINT_DELAY = 30
COMPRESS_MTIME_DELAY = 10
COMPRESS_OFFLINE = True
COMPRESS_OFFLINE_CONTEXT = [{'fonts_cdn_url': None, 'STATIC_URL': '/static/', 'LANGUAGE_BIDI': True}, {'fonts_cdn_url': None, 'STATIC_URL': '/static/', 'LANGUAGE_BIDI': False}]
COMPRESS_OFFLINE_MANIFEST = 'manifest.json'
COMPRESS_OFFLINE_TIMEOUT = 31536000
COMPRESS_OUTPUT_DIR = 'CACHE'
COMPRESS_PARSER = 'compressor.parser.AutoSelectParser'
COMPRESS_PRECOMPILERS = '()'
COMPRESS_REBUILD_TIMEOUT = 2592000
COMPRESS_ROOT = '/var/weblate/data/static'
COMPRESS_STORAGE = 'compressor.storage.CompressorFileStorage'
COMPRESS_TEMPLATE_FILTER_CONTEXT = {'STATIC_URL': '/static/'}
COMPRESS_URL = '/static/'
COMPRESS_URL_PLACEHOLDER = '/__compressor_url_placeholder__/'
COMPRESS_VERBOSE = False
COMPRESS_YUGLIFY_BINARY = 'yuglify'
COMPRESS_YUGLIFY_CSS_ARGUMENTS = '--terminal'
COMPRESS_YUGLIFY_JS_ARGUMENTS = '--terminal'
COMPRESS_YUI_BINARY = 'java -jar yuicompressor.jar'
COMPRESS_YUI_CSS_ARGUMENTS = ''
COMPRESS_YUI_JS_ARGUMENTS = ''
CONTACT_FORM = 'reply-to'
CRISPY_TEMPLATE_PACK = 'bootstrap3'
CSP_CONNECT_SRC = []
CSP_FONT_SRC = []
CSP_IMG_SRC = []
CSP_SCRIPT_SRC = []
CSP_STYLE_SRC = []
CSRF_COOKIE_AGE = 31449600
CSRF_COOKIE_DOMAIN = None
CSRF_COOKIE_HTTPONLY = True
CSRF_COOKIE_NAME = 'csrftoken'
CSRF_COOKIE_PATH = '/'
CSRF_COOKIE_SAMESITE = 'Lax'
CSRF_COOKIE_SECURE = True
CSRF_FAILURE_VIEW = 'weblate.trans.views.error.csrf_failure'
CSRF_HEADER_NAME = 'HTTP_X_CSRFTOKEN'
CSRF_TRUSTED_ORIGINS = []
CSRF_USE_SESSIONS = True
DATABASES = {'default': {'ENGINE': 'django.db.backends.postgresql', 'NAME': 'weblate', 'USER': 'weblate', 'PASSWORD': '********************', 'HOST': '127.0.0.1', 'PORT': '', 'OPTIONS': {}, 'ATOMIC_REQUESTS': False, 'AUTOCOMMIT': True, 'CONN_MAX_AGE': 0, 'TIME_ZONE': None, 'TEST': {'CHARSET': None, 'COLLATION': None, 'MIGRATE': True, 'MIRROR': None, 'NAME': None}}}
DATABASE_BACKUP = 'compress'
DATABASE_ROUTERS = []
DATA_DIR = '/var/weblate/data'
DATA_UPLOAD_MAX_MEMORY_SIZE = 50000000
DATA_UPLOAD_MAX_NUMBER_FIELDS = 1000
DATETIME_FORMAT = 'N j, Y, P'
DATETIME_INPUT_FORMATS = ['%Y-%m-%d %H:%M:%S', '%Y-%m-%d %H:%M:%S.%f', '%Y-%m-%d %H:%M', '%m/%d/%Y %H:%M:%S', '%m/%d/%Y %H:%M:%S.%f', '%m/%d/%Y %H:%M', '%m/%d/%y %H:%M:%S', '%m/%d/%y %H:%M:%S.%f', '%m/%d/%y %H:%M']
DATE_FORMAT = 'N j, Y'
DATE_INPUT_FORMATS = ['%Y-%m-%d', '%m/%d/%Y', '%m/%d/%y', '%b %d %Y', '%b %d, %Y', '%d %b %Y', '%d %b, %Y', '%B %d %Y', '%B %d, %Y', '%d %B %Y', '%d %B, %Y']
DEBUG = False
DEBUG_PROPAGATE_EXCEPTIONS = False
DECIMAL_SEPARATOR = '.'
DEFAULT_ACCESS_CONTROL = 0
DEFAULT_ADDONS = {}
DEFAULT_ADDON_MESSAGE = 'Update translation files\n\nUpdated by "{{ addon_name }}" hook in Weblate.\n\nTranslation: {{ project_name }}/{{ component_name }}\nTranslate-URL: {{ url }}'
DEFAULT_ADD_MESSAGE = 'Added translation using Weblate ({{ language_name }})\n\n'
DEFAULT_AUTO_LOCK_ERROR = True
DEFAULT_AUTO_WATCH = True
DEFAULT_CHARSET = 'utf-8'
DEFAULT_COMMITER_EMAIL = 'noreply@weblate.org'
DEFAULT_COMMITER_NAME = 'Weblate'
DEFAULT_COMMIT_MESSAGE = 'Translated using Weblate ({{ language_name }})\n\nCurrently translated at {{ stats.translated_percent }}% ({{ stats.translated }} of {{ stats.all }} strings)\n\nTranslation: {{ project_name }}/{{ component_name }}\nTranslate-URL: {{ url }}'
DEFAULT_DELETE_MESSAGE = 'Deleted translation using Weblate ({{ language_name }})\n\n'
DEFAULT_EXCEPTION_REPORTER = 'django.views.debug.ExceptionReporter'
DEFAULT_EXCEPTION_REPORTER_FILTER = 'weblate.trans.debug.WeblateExceptionReporterFilter'
DEFAULT_FILE_STORAGE = 'django.core.files.storage.FileSystemStorage'
DEFAULT_FROM_EMAIL = 'noreply-weblate@xwiki.org'
DEFAULT_HASHING_ALGORITHM = 'sha256'
DEFAULT_INDEX_TABLESPACE = ''
DEFAULT_LANGUAGE = 'en'
DEFAULT_LOG = 'syslog'
DEFAULT_LOGLEVEL = 'INFO'
DEFAULT_MERGE_MESSAGE = "Merge branch '{{ component_remote_branch }}' into Weblate.\n\n"
DEFAULT_MERGE_STYLE = 'rebase'
DEFAULT_PULL_MESSAGE = 'Translations update from Weblate\n\nTranslations update from [Weblate]({{url}}) for {{ project_name }}/{{ component_name }}.\n\n{% if component.linked_childs %}\nIt also includes following components:\n{% for linked in component.linked_child %}\n{{ component.project.name }}/{{ component.name }}\n{% endfor %}\n{% endif %}\n\nCurrent translation status:\n\n![Weblate translation status]({{widget_url}})\n\nIf a new locale is introduced by this pull request make sure to follow https://dev.xwiki.org/xwiki/bin/view/Community/L10N/SupportedLocales/#HNewlocalechecklist before applying it.\n'
DEFAULT_PUSH_ON_COMMIT = True
DEFAULT_RESTRICTED_COMPONENT = False
DEFAULT_SHARED_TM = True
DEFAULT_TABLESPACE = ''
DEFAULT_TRANSLATION_PROPAGATION = True
DEFAULT_VCS = 'git'
DISALLOWED_USER_AGENTS = []
EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend'
EMAIL_HOST = 'localhost'
EMAIL_HOST_PASSWORD = '********************'
EMAIL_HOST_USER = ''
EMAIL_PORT = 25
EMAIL_SEND_HTML = True
EMAIL_SSL_CERTFILE = None
EMAIL_SSL_KEYFILE = '********************'
EMAIL_SUBJECT_PREFIX = '[Weblate XWiki.org] '
EMAIL_TIMEOUT = None
EMAIL_USE_LOCALTIME = False
EMAIL_USE_SSL = False
EMAIL_USE_TLS = False
ENABLE_AVATARS = True
ENABLE_HOOKS = True
ENABLE_HTTPS = True
ENABLE_SHARING = True
FILE_UPLOAD_DIRECTORY_PERMISSIONS = None
FILE_UPLOAD_HANDLERS = ['django.core.files.uploadhandler.MemoryFileUploadHandler', 'django.core.files.uploadhandler.TemporaryFileUploadHandler']
FILE_UPLOAD_MAX_MEMORY_SIZE = 2621440
FILE_UPLOAD_PERMISSIONS = 420
FILE_UPLOAD_TEMP_DIR = None
FIRST_DAY_OF_WEEK = 0
FIXTURE_DIRS = []
FONTS_CDN_URL = None
FORCE_SCRIPT_NAME = None
FORMAT_MODULE_PATH = None
FORM_RENDERER = 'django.forms.renderers.DjangoTemplates'
GET_HELP_URL = None
GITHUB_CREDENTIALS = {}
GITHUB_TOKEN = '********************'
GITHUB_USERNAME = 'xwikiorgci'
GITLAB_CREDENTIALS = {}
GITLAB_TOKEN = '********************'
GITLAB_USERNAME = None
GOOGLE_ANALYTICS_ID = None
HAVE_SYSLOG = True
HIDE_REPO_CREDENTIALS = True
HIDE_VERSION = False
IGNORABLE_404_URLS = []
INSTALLED_APPS = ['weblate.addons', 'weblate.auth', 'weblate.checks', 'weblate.configuration', 'weblate.formats', 'weblate.glossary', 'weblate.machinery', 'weblate.trans', 'weblate.lang', 'weblate_language_data', 'weblate.memory', 'weblate.metrics', 'weblate.screenshots', 'weblate.fonts', 'weblate.accounts', 'weblate.utils', 'weblate.vcs', 'weblate.wladmin', 'weblate', 'weblate.gitexport', 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles', 'django.contrib.admin.apps.SimpleAdminConfig', 'django.contrib.admindocs', 'django.contrib.sitemaps', 'django.contrib.humanize', 'social_django', 'crispy_forms', 'compressor', 'rest_framework', 'rest_framework.authtoken', 'django_filters']
INTERNAL_IPS = []
INVOICE_PATH = ''
IP_BEHIND_REVERSE_PROXY = False
IP_PROXY_HEADER = 'HTTP_X_FORWARDED_FOR'
IP_PROXY_OFFSET = 0
LANGUAGES = "(('ar', 'العربية'), ('az', 'Azərbaycan'), ('be', 'Беларуская'), ('be@latin', 'Biełaruskaja'), ('bg', 'Български'), ('br', 'Brezhoneg'), ('ca', 'Català'), ('cs', 'Čeština'), ('da', 'Dansk'), ('de', 'Deutsch'), ('en', 'English'), ('el', 'Ελληνικά'), ('en-gb', 'English (United Kingdom)'), ('es', 'Español'), ('fi', 'Suomi'), ('fr', 'Français'), ('gl', 'Galego'), ('he', 'עברית'), ('hu', 'Magyar'), ('hr', 'Hrvatski'), ('id', 'Indonesia'), ('is', 'Íslenska'), ('it', 'Italiano'), ('ja', '日本語'), ('kab', 'Taqbaylit'), ('kk', 'Қазақ тілі'), ('ko', '한국어'), ('nb', 'Norsk bokmål'), ('nl', 'Nederlands'), ('pl', 'Polski'), ('pt', 'Português'), ('pt-br', 'Português brasileiro'), ('ru', 'Русский'), ('sk', 'Slovenčina'), ('sl', 'Slovenščina'), ('sq', 'Shqip'), ('sr', 'Српски'), ('sv', 'Svenska'), ('tr', 'Türkçe'), ('uk', 'Українська'), ('zh-hans', '简体字'), ('zh-hant', '正體字'))"
LANGUAGES_BIDI = ['he', 'ar', 'ar-dz', 'fa', 'ur']
LANGUAGE_CODE = 'en-us'
LANGUAGE_COOKIE_AGE = 12096000
LANGUAGE_COOKIE_DOMAIN = None
LANGUAGE_COOKIE_HTTPONLY = True
LANGUAGE_COOKIE_NAME = 'django_language'
LANGUAGE_COOKIE_PATH = '/'
LANGUAGE_COOKIE_SAMESITE = None
LANGUAGE_COOKIE_SECURE = True
LEGAL_URL = None
LICENSE_EXTRA = []
LICENSE_FILTER = None
LICENSE_REQUIRED = False
LIMIT_TRANSLATION_LENGTH_BY_SOURCE_LENGTH = True
LOCALE_PATHS = []
LOCALIZE_CDN_PATH = None
LOCALIZE_CDN_URL = None
LOGGING = {'version': 1, 'disable_existing_loggers': True, 'filters': {'require_debug_false': {'()': 'django.utils.log.RequireDebugFalse'}}, 'formatters': {'syslog': {'format': 'weblate[%(process)d]: %(levelname)s %(message)s'}, 'simple': {'format': '[%(asctime)s: %(levelname)s/%(process)s] %(message)s'}, 'logfile': {'format': '%(asctime)s %(levelname)s %(message)s'}, 'django.server': {'()': 'django.utils.log.ServerFormatter', 'format': '[%(server_time)s] %(message)s'}}, 'handlers': {'mail_admins': {'level': 'ERROR', 'filters': ['require_debug_false'], 'class': 'django.utils.log.AdminEmailHandler', 'include_html': True}, 'console': {'level': 'DEBUG', 'class': 'logging.StreamHandler', 'formatter': 'simple'}, 'django.server': {'level': 'INFO', 'class': 'logging.StreamHandler', 'formatter': 'django.server'}, 'syslog': {'level': 'DEBUG', 'class': 'logging.handlers.SysLogHandler', 'formatter': 'syslog', 'address': '/dev/log', 'facility': 18}}, 'loggers': {'django.request': {'handlers': ['mail_admins', 'syslog'], 'level': 'ERROR', 'propagate': True}, 'django.server': {'handlers': ['django.server'], 'level': 'INFO', 'propagate': False}, 'weblate': {'handlers': ['syslog'], 'level': 'INFO'}, 'weblate.vcs': {'handlers': ['syslog'], 'level': 'INFO'}, 'social': {'handlers': ['syslog'], 'level': 'INFO'}, 'django_auth_ldap': {'handlers': ['syslog'], 'level': 'INFO'}, 'djangosaml2idp': {'handlers': ['syslog'], 'level': 'INFO'}}}
LOGGING_CONFIG = 'logging.config.dictConfig'
LOGIN_REDIRECT_URL = '/'
LOGIN_REQUIRED_URLS = []
LOGIN_REQUIRED_URLS_EXCEPTIONS = "('{URL_PREFIX}/accounts/(.*)$', '{URL_PREFIX}/admin/login/(.*)$', '{URL_PREFIX}/static/(.*)$', '{URL_PREFIX}/widgets/(.*)$', '{URL_PREFIX}/data/(.*)$', '{URL_PREFIX}/hooks/(.*)$', '{URL_PREFIX}/healthz/$', '{URL_PREFIX}/api/(.*)$', '{URL_PREFIX}/js/i18n/$', '{URL_PREFIX}/contact/$', '{URL_PREFIX}/legal/(.*)$')"
LOGIN_URL = '/accounts/login/'
LOGOUT_REDIRECT_URL = None
LOGOUT_URL = '/accounts/logout/'
MANAGERS = "(('XWiki.org Infra', 'simon.urli+weblate@xwiki.com'),)"
MATOMO_SITE_ID = None
MATOMO_URL = None
MEDIA_ROOT = '/var/weblate/data/media'
MEDIA_URL = '/media/'
MESSAGE_STORAGE = 'django.contrib.messages.storage.session.SessionStorage'
MIDDLEWARE = ['weblate.middleware.RedirectMiddleware', 'weblate.middleware.ProxyMiddleware', 'django.middleware.security.SecurityMiddleware', 'django.contrib.sessions.middleware.SessionMiddleware', 'django.middleware.csrf.CsrfViewMiddleware', 'weblate.accounts.middleware.AuthenticationMiddleware', 'django.contrib.messages.middleware.MessageMiddleware', 'django.middleware.clickjacking.XFrameOptionsMiddleware', 'social_django.middleware.SocialAuthExceptionMiddleware', 'weblate.accounts.middleware.RequireLoginMiddleware', 'weblate.api.middleware.ThrottlingMiddleware', 'weblate.middleware.SecurityMiddleware']
MIGRATION_MODULES = {}
MONTH_DAY_FORMAT = 'F j'
MT_APERTIUM_APY = None
MT_AWS_ACCESS_KEY_ID = '********************'
MT_AWS_REGION = None
MT_AWS_SECRET_ACCESS_KEY = '********************'
MT_BAIDU_ID = None
MT_BAIDU_SECRET = '********************'
MT_DEEPL_API_VERSION = '********************'
MT_DEEPL_KEY = '********************'
MT_GOOGLE_CREDENTIALS = None
MT_GOOGLE_KEY = '********************'
MT_GOOGLE_LOCATION = 'global'
MT_GOOGLE_PROJECT = None
MT_MICROSOFT_BASE_URL = 'api.cognitive.microsofttranslator.com'
MT_MICROSOFT_COGNITIVE_KEY = '********************'
MT_MICROSOFT_ENDPOINT_URL = 'api.cognitive.microsoft.com'
MT_MICROSOFT_REGION = None
MT_MODERNMT_KEY = '********************'
MT_MODERNMT_URL = 'https://api.modernmt.com/'
MT_MYMEMORY_EMAIL = None
MT_MYMEMORY_KEY = '********************'
MT_MYMEMORY_USER = None
MT_NETEASE_KEY = '********************'
MT_NETEASE_SECRET = '********************'
MT_SAP_BASE_URL = None
MT_SAP_PASSWORD = '********************'
MT_SAP_SANDBOX_APIKEY = '********************'
MT_SAP_USERNAME = None
MT_SAP_USE_MT = True
MT_SERVICES = "('weblate.machinery.weblatetm.WeblateTranslation', 'weblate.memory.machine.WeblateMemory')"
MT_TMSERVER = None
MT_YANDEX_KEY = '********************'
MT_YOUDAO_ID = None
MT_YOUDAO_SECRET = '********************'
NEARBY_MESSAGES = 15
NUMBER_GROUPING = 0
OFFER_HOSTING = False
PAGURE_CREDENTIALS = {}
PAGURE_TOKEN = '********************'
PAGURE_USERNAME = None
PASSWORD_HASHERS = '********************'
PASSWORD_RESET_TIMEOUT = '********************'
PASSWORD_RESET_TIMEOUT_DAYS = '********************'
PREPEND_WWW = False
RATELIMIT_ATTEMPTS = 5
RATELIMIT_COMMENT_ATTEMPTS = 30
RATELIMIT_COMMENT_WINDOW = 60
RATELIMIT_GLOSSARY_ATTEMPTS = 30
RATELIMIT_GLOSSARY_WINDOW = 60
RATELIMIT_LANGUAGE_ATTEMPTS = 2
RATELIMIT_LANGUAGE_LOCKOUT = 600
RATELIMIT_LANGUAGE_WINDOW = 300
RATELIMIT_LOCKOUT = 600
RATELIMIT_SEARCH_ATTEMPTS = 30
RATELIMIT_SEARCH_LOCKOUT = 60
RATELIMIT_SEARCH_WINDOW = 60
RATELIMIT_TRANSLATE_ATTEMPTS = 30
RATELIMIT_TRANSLATE_WINDOW = 60
RATELIMIT_TRIAL_ATTEMPTS = 1
RATELIMIT_TRIAL_LOCKOUT = 600
RATELIMIT_TRIAL_WINDOW = 60
RATELIMIT_WINDOW = 300
REGISTRATION_ALLOW_BACKENDS = []
REGISTRATION_CAPTCHA = True
REGISTRATION_EMAIL_MATCH = '.*'
REGISTRATION_OPEN = True
REPOSITORY_ALERT_THRESHOLD = 25
REQUIRE_LOGIN = False
REST_FRAMEWORK = {'DEFAULT_PERMISSION_CLASSES': ['rest_framework.permissions.IsAuthenticatedOrReadOnly'], 'DEFAULT_AUTHENTICATION_CLASSES': ('rest_framework.authentication.TokenAuthentication', 'weblate.api.authentication.BearerAuthentication', 'rest_framework.authentication.SessionAuthentication'), 'DEFAULT_THROTTLE_CLASSES': ('weblate.api.throttling.UserRateThrottle', 'weblate.api.throttling.AnonRateThrottle'), 'DEFAULT_THROTTLE_RATES': {'anon': '100/day', 'user': '5000/hour'}, 'DEFAULT_PAGINATION_CLASS': 'rest_framework.pagination.PageNumberPagination', 'PAGE_SIZE': 20, 'VIEW_DESCRIPTION_FUNCTION': 'weblate.api.views.get_view_description', 'UNAUTHENTICATED_USER': 'weblate.auth.models.get_anonymous'}
ROOT_URLCONF = 'weblate.urls'
SECRET_KEY = '********************'
SECURE_BROWSER_XSS_FILTER = True
SECURE_CONTENT_TYPE_NOSNIFF = True
SECURE_HSTS_INCLUDE_SUBDOMAINS = True
SECURE_HSTS_PRELOAD = True
SECURE_HSTS_SECONDS = 31536000
SECURE_PROXY_SSL_HEADER = None
SECURE_REDIRECT_EXEMPT = "('healthz/$',)"
SECURE_REFERRER_POLICY = 'same-origin'
SECURE_SSL_HOST = None
SECURE_SSL_REDIRECT = True
SENTRY_DSN = None
SENTRY_ENVIRONMENT = 'devel'
SENTRY_EXTRA_ARGS = {}
SENTRY_ORGANIZATION = 'weblate'
SENTRY_PROJECTS = ['weblate']
SENTRY_SECURITY = None
SENTRY_TOKEN = '********************'
SERVER_EMAIL = 'noreply-weblate@xwiki.org'
SESSION_CACHE_ALIAS = 'default'
SESSION_COOKIE_AGE = 1000
SESSION_COOKIE_AGE_AUTHENTICATED = 1209600
SESSION_COOKIE_DOMAIN = None
SESSION_COOKIE_HTTPONLY = True
SESSION_COOKIE_NAME = 'sessionid'
SESSION_COOKIE_PATH = '/'
SESSION_COOKIE_SAMESITE = 'Lax'
SESSION_COOKIE_SECURE = True
SESSION_ENGINE = 'django.contrib.sessions.backends.cache'
SESSION_EXPIRE_AT_BROWSER_CLOSE = False
SESSION_FILE_PATH = None
SESSION_SAVE_EVERY_REQUEST = False
SESSION_SERIALIZER = 'django.contrib.sessions.serializers.JSONSerializer'
SETTINGS_MODULE = 'weblate.settings'
SHORT_DATETIME_FORMAT = 'm/d/Y P'
SHORT_DATE_FORMAT = 'm/d/Y'
SIGNING_BACKEND = 'django.core.signing.TimestampSigner'
SILENCED_SYSTEM_CHECKS = ['admin.E408']
SIMILAR_MESSAGES = 5
SIMPLIFY_LANGUAGES = True
SINGLE_PROJECT = False
SITE_DOMAIN = 'l10n.xwiki.org'
SITE_ID = 1
SITE_TITLE = 'Weblate XWiki.org'
SOCIAL_AUTH_AUTH0_IMAGE = 'auth0.svg'
SOCIAL_AUTH_AUTH0_TITLE = 'Auth0'
SOCIAL_AUTH_BITBUCKET_KEY = '********************'
SOCIAL_AUTH_BITBUCKET_SECRET = '********************'
SOCIAL_AUTH_BITBUCKET_VERIFIED_EMAILS_ONLY = True
SOCIAL_AUTH_DISCONNECT_PIPELINE = "('social_core.pipeline.disconnect.allowed_to_disconnect', 'social_core.pipeline.disconnect.get_entries', 'social_core.pipeline.disconnect.revoke_tokens', 'weblate.accounts.pipeline.cycle_session', 'weblate.accounts.pipeline.adjust_primary_mail', 'weblate.accounts.pipeline.notify_disconnect', 'social_core.pipeline.disconnect.disconnect', 'weblate.accounts.pipeline.cleanup_next')"
SOCIAL_AUTH_EMAIL_FORM_URL = '/accounts/email/'
SOCIAL_AUTH_EMAIL_VALIDATION_FUNCTION = 'weblate.accounts.pipeline.send_validation'
SOCIAL_AUTH_EMAIL_VALIDATION_URL = '/accounts/email-sent/'
SOCIAL_AUTH_FACEBOOK_KEY = '********************'
SOCIAL_AUTH_FACEBOOK_PROFILE_EXTRA_PARAMS = {'fields': 'id,name,email'}
SOCIAL_AUTH_FACEBOOK_SCOPE = ['email', 'public_profile']
SOCIAL_AUTH_FACEBOOK_SECRET = '********************'
SOCIAL_AUTH_GITHUB_KEY = '********************'
SOCIAL_AUTH_GITHUB_SCOPE = ['user:email']
SOCIAL_AUTH_GITHUB_SECRET = '********************'
SOCIAL_AUTH_GOOGLE_OAUTH2_KEY = '********************'
SOCIAL_AUTH_GOOGLE_OAUTH2_SECRET = '********************'
SOCIAL_AUTH_LOGIN_ERROR_URL = '/accounts/login/'
SOCIAL_AUTH_NEW_ASSOCIATION_REDIRECT_URL = '/accounts/profile/#account'
SOCIAL_AUTH_PIPELINE = "('social_core.pipeline.social_auth.social_details', 'social_core.pipeline.social_auth.social_uid', 'social_core.pipeline.social_auth.auth_allowed', 'social_core.pipeline.social_auth.social_user', 'weblate.accounts.pipeline.store_params', 'weblate.accounts.pipeline.verify_open', 'social_core.pipeline.user.get_username', 'weblate.accounts.pipeline.require_email', 'social_core.pipeline.mail.mail_validation', 'weblate.accounts.pipeline.revoke_mail_code', 'weblate.accounts.pipeline.ensure_valid', 'weblate.accounts.pipeline.remove_account', 'social_core.pipeline.social_auth.associate_by_email', 'weblate.accounts.pipeline.reauthenticate', 'weblate.accounts.pipeline.verify_username', 'social_core.pipeline.user.create_user', 'social_core.pipeline.social_auth.associate_user', 'social_core.pipeline.social_auth.load_extra_data', 'weblate.accounts.pipeline.cleanup_next', 'weblate.accounts.pipeline.user_full_name', 'weblate.accounts.pipeline.store_email', 'weblate.accounts.pipeline.notify_connect', 'weblate.accounts.pipeline.password_reset')"
SOCIAL_AUTH_PROTECTED_USER_FIELDS = "('email',)"
SOCIAL_AUTH_RAISE_EXCEPTIONS = True
SOCIAL_AUTH_REDIRECT_IS_HTTPS = True
SOCIAL_AUTH_SAML_IMAGE = 'saml.svg'
SOCIAL_AUTH_SAML_TITLE = 'SAML'
SOCIAL_AUTH_SLUGIFY_FUNCTION = 'weblate.accounts.pipeline.slugify_username'
SOCIAL_AUTH_SLUGIFY_USERNAMES = True
SOCIAL_AUTH_STRATEGY = 'weblate.accounts.strategy.WeblateStrategy'
SOCIAL_AUTH_XWIKI_KEY = '********************'
SPECIAL_CHARS = "('\\t', '\\n', '\\xa0', '…')"
STATICFILES_DIRS = '()'
STATICFILES_FINDERS = "('django.contrib.staticfiles.finders.FileSystemFinder', 'django.contrib.staticfiles.finders.AppDirectoriesFinder', 'compressor.finders.CompressorFinder')"
STATICFILES_STORAGE = 'django.contrib.staticfiles.storage.StaticFilesStorage'
STATIC_ROOT = '/var/weblate/data/static'
STATIC_URL = '/static/'
STATUS_URL = None
SUGGESTION_CLEANUP_DAYS = None
SUPPORT_API_URL = '********************'
TEMPLATES = [{'BACKEND': 'django.template.backends.django.DjangoTemplates', 'OPTIONS': {'context_processors': ['django.contrib.auth.context_processors.auth', 'django.template.context_processors.debug', 'django.template.context_processors.i18n', 'django.template.context_processors.request', 'django.template.context_processors.csrf', 'django.contrib.messages.context_processors.messages', 'weblate.trans.context_processors.weblate_context'], 'loaders': [('django.template.loaders.cached.Loader', ['django.template.loaders.filesystem.Loader', 'django.template.loaders.app_directories.Loader'])]}}]
TEST_NON_SERIALIZED_APPS = []
TEST_RUNNER = 'django.test.runner.DiscoverRunner'
THOUSAND_SEPARATOR = ','
TIME_FORMAT = 'P'
TIME_INPUT_FORMATS = ['%H:%M:%S', '%H:%M:%S.%f', '%H:%M']
TIME_ZONE = 'UTC'
UPDATE_LANGUAGES = True
URL_PREFIX = ''
USE_I18N = True
USE_L10N = True
USE_THOUSAND_SEPARATOR = False
USE_TZ = True
USE_X_FORWARDED_HOST = False
USE_X_FORWARDED_PORT = False
VAT_RATE = 1.21
VCS_BACKENDS = "('weblate.vcs.git.GitRepository', 'weblate.vcs.git.GitWithGerritRepository', 'weblate.vcs.git.SubversionRepository', 'weblate.vcs.git.GithubRepository', 'weblate.vcs.git.GitLabRepository', 'weblate.vcs.git.PagureRepository', 'weblate.vcs.git.LocalRepository', 'weblate.vcs.git.GitForcePushRepository', 'weblate.vcs.mercurial.HgRepository')"
VCS_CLONE_DEPTH = 1
WEBLATE_ADDONS = "('weblate.addons.gettext.GenerateMoAddon', 'weblate.addons.gettext.UpdateLinguasAddon', 'weblate.addons.gettext.UpdateConfigureAddon', 'weblate.addons.gettext.MsgmergeAddon', 'weblate.addons.gettext.GettextCustomizeAddon', 'weblate.addons.gettext.GettextAuthorComments', 'weblate.addons.cleanup.CleanupAddon', 'weblate.addons.cleanup.RemoveBlankAddon', 'weblate.addons.consistency.LangaugeConsistencyAddon', 'weblate.addons.discovery.DiscoveryAddon', 'weblate.addons.autotranslate.AutoTranslateAddon', 'weblate.addons.flags.SourceEditAddon', 'weblate.addons.flags.TargetEditAddon', 'weblate.addons.flags.SameEditAddon', 'weblate.addons.flags.BulkEditAddon', 'weblate.addons.generate.GenerateFileAddon', 'weblate.addons.generate.PseudolocaleAddon', 'weblate.addons.json.JSONCustomizeAddon', 'weblate.addons.properties.PropertiesSortAddon', 'weblate.addons.git.GitSquashAddon', 'weblate.addons.removal.RemoveComments', 'weblate.addons.removal.RemoveSuggestions', 'weblate.addons.resx.ResxUpdateAddon', 'weblate.addons.yaml.YAMLCustomizeAddon', 'weblate.addons.cdn.CDNJSAddon')"
WEBLATE_EXPORTERS = "('weblate.formats.exporters.PoExporter', 'weblate.formats.exporters.PoXliffExporter', 'weblate.formats.exporters.XliffExporter', 'weblate.formats.exporters.TBXExporter', 'weblate.formats.exporters.TMXExporter', 'weblate.formats.exporters.MoExporter', 'weblate.formats.exporters.CSVExporter', 'weblate.formats.exporters.XlsxExporter', 'weblate.formats.exporters.JSONExporter', 'weblate.formats.exporters.AndroidResourceExporter', 'weblate.formats.exporters.StringsExporter')"
WEBLATE_FORMATS = "('weblate.formats.ttkit.PoFormat', 'weblate.formats.ttkit.PoMonoFormat', 'weblate.formats.ttkit.TSFormat', 'weblate.formats.ttkit.XliffFormat', 'weblate.formats.ttkit.PoXliffFormat', 'weblate.formats.ttkit.StringsFormat', 'weblate.formats.ttkit.StringsUtf8Format', 'weblate.formats.ttkit.PropertiesUtf8Format', 'weblate.formats.ttkit.PropertiesUtf16Format', 'weblate.formats.ttkit.PropertiesFormat', 'weblate.formats.ttkit.JoomlaFormat', 'weblate.formats.ttkit.GWTFormat', 'weblate.formats.ttkit.PhpFormat', 'weblate.formats.ttkit.LaravelPhpFormat', 'weblate.formats.ttkit.RESXFormat', 'weblate.formats.ttkit.AndroidFormat', 'weblate.formats.ttkit.JSONFormat', 'weblate.formats.ttkit.JSONNestedFormat', 'weblate.formats.ttkit.WebExtensionJSONFormat', 'weblate.formats.ttkit.I18NextFormat', 'weblate.formats.ttkit.GoI18JSONFormat', 'weblate.formats.ttkit.ARBFormat', 'weblate.formats.ttkit.CSVFormat', 'weblate.formats.ttkit.CSVSimpleFormat', 'weblate.formats.ttkit.CSVSimpleFormatISO', 'weblate.formats.ttkit.YAMLFormat', 'weblate.formats.ttkit.RubyYAMLFormat', 'weblate.formats.ttkit.SubRipFormat', 'weblate.formats.ttkit.MicroDVDFormat', 'weblate.formats.ttkit.AdvSubStationAlphaFormat', 'weblate.formats.ttkit.SubStationAlphaFormat', 'weblate.formats.ttkit.DTDFormat', 'weblate.formats.ttkit.FlatXMLFormat', 'weblate.formats.ttkit.INIFormat', 'weblate.formats.ttkit.InnoSetupINIFormat', 'weblate.formats.external.XlsxFormat', 'weblate.formats.txt.AppStoreFormat', 'weblate.formats.convert.HTMLFormat', 'weblate.formats.convert.IDMLFormat', 'weblate.formats.convert.OpenDocumentFormat', 'weblate.formats.convert.PlainTextFormat', 'weblate.formats.convert.DokuWikiFormat', 'weblate.formats.convert.MediaWikiFormat', 'weblate.formats.convert.WindowsRCFormat', 'weblate.formats.ttkit.XWikiPropertiesFormat', 'weblate.formats.ttkit.XWikiPagePropertiesFormat', 'weblate.formats.ttkit.XWikiFullPageFormat', 'weblate.formats.ttkit.TBXFormat')"
WEBLATE_GPG_ALGO = 'default'
WEBLATE_GPG_IDENTITY = None
WEBSITE_REQUIRED = True
WSGI_APPLICATION = None
X_FRAME_OPTIONS = 'DENY'
YEAR_MONTH_FORMAT = 'F Y'
_TEMPLATE_LOADERS = [('django.template.loaders.cached.Loader', ['django.template.loaders.filesystem.Loader', 'django.template.loaders.app_directories.Loader'])]
nijel commented 3 years ago

Okay, this error is while getting repository status, not while committing. That should be addressable...

nijel commented 3 years ago

https://github.com/WeblateOrg/weblate/pull/6055 could address this...

surli commented 3 years ago

The fix of #6055 looks quite easy, do you want me to apply the changes locally so I can check if it's fixing my issue without waiting the release?

nijel commented 3 years ago

At least wait until the tests complete and it is merged. For the first iteration I messed up parameters ordering and it failed...

github-actions[bot] commented 3 years ago

Thank you for your report; the issue you have reported has just been fixed.

surli commented 3 years ago

For information I tried to apply the changes from #6055 apparently I don't get anymore the timeout because of the lock when trying to display the status of the repository, but apparently I still don't get my pending changes committed...

EDIT: Actually when I hit "commit" in the UI, I see the page loading and few minutes after I get it reloaded with an error message saying:

Failed to lock the repository, another operation is in progress. weblate-lock

surli commented 3 years ago

I also still see those weird files created in the repository:

xwiki-platform-core/xwiki-platform-oldcore/src/main/resources/ApplicationResources_id.propertiesb0lnem3o

nijel commented 3 years ago

Using linked components (weblate:// URLs, see https://docs.weblate.org/en/latest/vcs.html#weblate-internal-urls)? In that case, the project level commit doesn't behave well in 4.6, the fix is already in the git, but it consisted of too many changes to backport.

surli commented 3 years ago

Using linked components (weblate:// URLs, see https://docs.weblate.org/en/latest/vcs.html#weblate-internal-urls)?

yes

In that case, the project level commit doesn't behave well in 4.6, the fix is already in the git, but it consisted of too many changes to backport.

Ok then I guess I'll wait the release

surli commented 3 years ago

So I just upgraded to 4.7 and I'm still getting the exact same error message than before, same screenshot as in previous comment: image

nijel commented 3 years ago

Maybe there is some old Weblate process holding the lock?

surli commented 3 years ago

Maybe there is some old Weblate process holding the lock?

I paid attention to stop uwsgi and celery before the upgrade. Now I can try to reboot the machine to ensure there's no remaining process that could cause an issue.

surli commented 3 years ago

So I confirm, getting still the same issue after a reboot.

nijel commented 3 years ago

Can you please share the exception from the log now? It should be different that what we observed in the earlier versions.

surli commented 3 years ago

I can see those logs in celery weblate logs:

[2021-06-21 10:47:56,797: INFO/ForkPoolWorker-95] xwiki-platform/xwiki-core-resources/id: committing pending changes (commit_pending) [2021-06-21 11:01:06,997: WARNING/ForkPoolWorker-95] Exception in thread Thread-6: Traceback (most recent call last): File "/usr/lib/python3.7/threading.py", line 917, in _bootstrap_inner self.run() File "/usr/lib/python3.7/threading.py", line 865, in run self._target(*self._args, **self._kwargs) File "/home/weblate/weblate-env/lib/python3.7/site-packages/redis_lock/init.py", line 300, in _lock_renewer lock.extend(expire=lock._expire) File "/home/weblate/weblate-env/lib/python3.7/site-packages/redis_lock/init.py", line 280, in extend raise NotAcquired("Lock %s is not acquired or it already expired." % self._name) redis_lock.NotAcquired: Lock lock:lock:repo:17 is not acquired or it already expired.

nijel commented 3 years ago

What version of python-redis-lock do you have installed?

surli commented 3 years ago

What version of python-redis-lock do you have installed?

python-redis-lock 3.7.0

surli commented 3 years ago

So I kept investigating a bit, I have a few more information:

  1. I had locked my components through the "Repository Maintenance" UI: I forgot it because after a restart of Weblate it wasn't presenting the possibility to unlock it. I just clicked again on Lock and then Unlock, so my components are now unlocked. Apparently I still cannot commit the pending changes, or even update the repository I still have the same message
  2. I checked a bit the configuration and I was using redis through the network: I changed it to use the unix socket, in case it could help. But apparently it doesn't change anything.
  3. I noticed in my journalctl logs, the following logs:

    Jun 22 09:22:00 l10n-prod weblate[53068]: ERROR Failure while executing task: WeblateLockTimeout: {'signal': <Signal: task_failure providing_args={'traceback', 'exception', 'task_id', 'einfo Jun 22 09:22:00 l10n-prod weblate[53068]: ERROR Failure while executing task Traceback (most recent call last): File "/home/weblate/weblate-env/lib/python3.7/site-packages/celery/app/trace.py", line 450, in trace_task R = retval = fun(*args, kwargs) File "/home/weblate/weblate-env/lib/python3.7/site-packages/celery/app/trace.py", line 731, in __protected_call return self.run(*args, **kwargs) File "/home/weblate/weblate-env/lib/python3.7/site-packages/weblate/trans/tasks.py", line 220, in update_remotes perform_update("Component", -1, auto=True, obj=component) File "/home/weblate/weblate-env/lib/python3.7/site-packages/celery/local.py", line 188, in call__ return self._get_current_object()(*a, kw) File "/home/weblate/weblate-env/lib/python3.7/site-packages/celery/app/trace.py", line 732, in __protected_call return orig(self, *args, **kwargs) File "/home/weblate/weblate-env/lib/python3.7/site-packages/celery/app/task.py", line 389, in call return self.run(args, kwargs) File "/home/weblate/weblate-env/lib/python3.7/site-packages/celery/app/autoretry.py", line 54, in run ret = task.retry(exc=exc, retry_kwargs) File "/home/weblate/weblate-env/lib/python3.7/site-packages/celery/app/task.py", line 698, in retry raise_with_context(exc or Retry('Task can be retried', None)) File "/home/weblate/weblate-env/lib/python3.7/site-packages/celery/app/autoretry.py", line 34, in run return task._orig_run(args, *kwargs) File "/home/weblate/weblate-env/lib/python3.7/site-packages/weblate/trans/tasks.py", line 70, in perform_update obj.do_update() File "/home/weblate/weblate-env/lib/python3.7/site-packages/weblate/trans/models/component.py", line 155, in on_link_wrapper return func(self, args, **kwargs) File "/home/weblate/weblate-env/lib/python3.7/site-packages/weblate/trans/models/component.py", line 1308, in do_update with self.repository.lock: File "/home/weblate/weblate-env/lib/python3.7/site-packages/weblate/utils/lock.py", line 82, in enter__ raise WeblateLockTimeout() weblate.utils.lock.WeblateLockTimeout

nijel commented 3 years ago

That has most likely same case as the UI error you see. Is there any other Weblate process running? Maybe there are some tasks in the Celery queue which are now being processed and hold the lock?

nijel commented 3 years ago

a06e4149f6 might make some difference in corner cases if you want to test that.

surli commented 3 years ago

Thanks I'll check that

surli commented 3 years ago

So even with those changes I keep having the same problem.

Maybe there are some tasks in the Celery queue which are now being processed and hold the lock?

That's possible yes, but then that would be the automatic commit task I guess. Maybe it's better if I test without starting celery in my case?

nijel commented 3 years ago

Yes, that could rule out some of the issues.

surli commented 3 years ago

Yes, that could rule out some of the issues.

So I'm trying to commit the pending changes since yesterday without celery, but I'm now facing constant timeouts when I'm trying to do that, more specifically I'm getting a PR_IO_TIMEOUT_ERROR. I'm running weblate with a nginx in front of it, so I edited my nginx config to increase those timeouts:

proxy_read_timeout 3600;
proxy_connect_timeout 3600;
proxy_send_timeout 3600;
uwsgi_read_timeout 3600;

but apparently it's not enough: I'm still getting the timeout way before the 1h I'm expecting. Any idea how I can prevent that? Cannot find a good answer on the net about those PR_IO_TIMEOUT_ERROR.

surli commented 3 years ago

So a bit of follow up on this issue:

So right now I saved locally the translations using the REST API and I'm going to remove them, I hope to fix the status of the prod by doing so. I'll try to replicate the problem later to see if I can reproduce.

surli commented 3 years ago

Hi @nijel I'd like to reopen this issue, I'm getting the same kind of error on another component but basically it reproduces on same condition. I have a linked component with a new language added. This time the component is not that huge, and also I have a different error stack received by email which might help to understand what's happening:

Internal Server Error: /translate/xwiki-platform/livedata-macro/fr/

OperationalError at /translate/xwiki-platform/livedata-macro/fr/
deadlock detected
DETAIL:  Process 22667 waits for ExclusiveLock on tuple (5638,32) of relation 196234 of database 16385; blocked by process 19360.
Process 19360 waits for ShareLock on transaction 1493849; blocked by process 16834.
Process 16834 waits for ShareLock on transaction 1493850; blocked by process 22667.
HINT:  See server log for query details.

Here's the stack:

The above exception (deadlock detected
DETAIL:  Process 22667 waits for ExclusiveLock on tuple (5638,32) of relation 196234 of database 16385; blocked by process 19360.
Process 19360 waits for ShareLock on transaction 1493849; blocked by process 16834.
Process 16834 waits for ShareLock on transaction 1493850; blocked by process 22667.
HINT:  See server log for query details.
) was the direct cause of the following exception:
  File "/home/weblate/weblate-env/lib/python3.7/site-packages/django/core/handlers/exception.py", line 47, in inner
    response = get_response(request)
  File "/home/weblate/weblate-env/lib/python3.7/site-packages/django/core/handlers/base.py", line 181, in _get_response
    response = wrapped_callback(request, *callback_args, **callback_kwargs)
  File "/home/weblate/weblate-env/lib/python3.7/site-packages/weblate/trans/views/edit.py", line 572, in translate
    response = handle_translate(request, unit, this_unit_url, next_unit_url)
  File "/home/weblate/weblate-env/lib/python3.7/site-packages/weblate/utils/ratelimit.py", line 118, in rate_wrap
    return function(request, *args, **kwargs)
  File "/home/weblate/weblate-env/lib/python3.7/site-packages/weblate/trans/views/edit.py", line 386, in handle_translate
    go_next = perform_translation(unit, form, request)
  File "/home/weblate/weblate-env/lib/python3.7/site-packages/weblate/trans/views/edit.py", line 309, in perform_translation
    user, form.cleaned_data["target"], form.cleaned_data["state"]
  File "/usr/lib/python3.7/contextlib.py", line 74, in inner
    return func(*args, **kwds)
  File "/home/weblate/weblate-env/lib/python3.7/site-packages/weblate/trans/models/unit.py", line 1221, in translate
    user, change_action=change_action, propagate=propagate, author=author
  File "/home/weblate/weblate-env/lib/python3.7/site-packages/weblate/trans/models/unit.py", line 862, in save_backend
    self.translation.commit_pending("pending unit", user, force=True)
  File "/usr/lib/python3.7/contextlib.py", line 74, in inner
    return func(*args, **kwds)
  File "/home/weblate/weblate-env/lib/python3.7/site-packages/weblate/trans/models/translation.py", line 544, in commit_pending
    for unit in units:
  File "/home/weblate/weblate-env/lib/python3.7/site-packages/django/db/models/query.py", line 280, in __iter__
    self._fetch_all()
  File "/home/weblate/weblate-env/lib/python3.7/site-packages/django/db/models/query.py", line 1324, in _fetch_all
    self._result_cache = list(self._iterable_class(self))
  File "/home/weblate/weblate-env/lib/python3.7/site-packages/django/db/models/query.py", line 51, in __iter__
    results = compiler.execute_sql(chunked_fetch=self.chunked_fetch, chunk_size=self.chunk_size)
  File "/home/weblate/weblate-env/lib/python3.7/site-packages/django/db/models/sql/compiler.py", line 1175, in execute_sql
    cursor.execute(sql, params)
  File "/home/weblate/weblate-env/lib/python3.7/site-packages/django/db/backends/utils.py", line 66, in execute
    return self._execute_with_wrappers(sql, params, many=False, executor=self._execute)
  File "/home/weblate/weblate-env/lib/python3.7/site-packages/django/db/backends/utils.py", line 75, in _execute_with_wrappers
    return executor(sql, params, many, context)
  File "/home/weblate/weblate-env/lib/python3.7/site-packages/django/db/backends/utils.py", line 84, in _execute
    return self.cursor.execute(sql, params)
  File "/home/weblate/weblate-env/lib/python3.7/site-packages/django/db/utils.py", line 90, in __exit__
    raise dj_exc_value.with_traceback(traceback) from exc_value
  File "/home/weblate/weblate-env/lib/python3.7/site-packages/django/db/backends/utils.py", line 84, in _execute
    return self.cursor.execute(sql, params)

I'm running Weblate 4.7, I saw that #5279 was also apparently about deadlock but sounds like it has been fixed in Weblate 4.6 so maybe not the same issue.

surli commented 3 years ago

Any idea what would be the problem there?

surli commented 3 years ago

@nijel so I'm slowly progressing, I just found out the following stack trace in the celery logs, sounds like there is a problem with a recursive call, I guess it's related to some bug in the xwiki properties format we are using:

[2021-10-10 09:07:53,609: ERROR/ForkPoolWorker-9] Failure while executing task: MemoryError: {'signal': <Signal: task_failure providing_args={'kwargs', 'einfo', 'traceback', 'task_id', 'args', 'exception'}>, 'sender': <@task: weblate.trans.tasks.perform_commit of weblate at 0x7f4193de3940>, 'task_id': '23ea60d9-5068-4d87-bc42-74bd78c04b5e', 'args': [194, 'commit_pending', None], 'kwargs': {}, 'traceback': <traceback object at 0x7f3fd93f2b88>, 'einfo': <ExceptionInfo: MemoryError()>}
[2021-10-10 09:07:53,652: ERROR/ForkPoolWorker-9] Failure while executing task
Traceback (most recent call last):
  File "/home/weblate/weblate-env/lib/python3.7/site-packages/celery/app/trace.py", line 450, in trace_task
    R = retval = fun(*args, **kwargs)
  File "/home/weblate/weblate-env/lib/python3.7/site-packages/celery/app/trace.py", line 731, in __protected_call__
    return self.run(*args, **kwargs)
  File "/home/weblate/weblate-env/lib/python3.7/site-packages/celery/app/autoretry.py", line 34, in run
    return task._orig_run(*args, **kwargs)
  File "/home/weblate/weblate-env/lib/python3.7/site-packages/weblate/trans/tasks.py", line 105, in perform_commit
    component.commit_pending(*args)
  File "/home/weblate/weblate-env/lib/python3.7/site-packages/weblate/trans/models/component.py", line 155, in on_link_wrapper
    return getattr(linked, func.__name__)(*args, **kwargs)
  File "/home/weblate/weblate-env/lib/python3.7/site-packages/weblate/trans/models/component.py", line 156, in on_link_wrapper
    return func(self, *args, **kwargs)
  File "/home/weblate/weblate-env/lib/python3.7/site-packages/weblate/trans/models/component.py", line 1578, in commit_pending
    translation.commit_pending(reason, user, skip_push=True, signals=False)
  File "/usr/lib/python3.7/contextlib.py", line 74, in inner
    return func(*args, **kwds)
  File "/home/weblate/weblate-env/lib/python3.7/site-packages/weblate/trans/models/translation.py", line 559, in commit_pending
    self.update_units(units, store, author_name, author.id)
  File "/home/weblate/weblate-env/lib/python3.7/site-packages/weblate/trans/models/translation.py", line 733, in update_units
    store.save()
  File "/home/weblate/weblate-env/lib/python3.7/site-packages/weblate/formats/ttkit.py", line 304, in save
    self.save_atomic(self.storefile, self.save_content)
  File "/home/weblate/weblate-env/lib/python3.7/site-packages/weblate/formats/base.py", line 314, in save_atomic
    callback(temp)
  File "/home/weblate/weblate-env/lib/python3.7/site-packages/weblate/formats/ttkit.py", line 1679, in save_content
    missingunit = self.find_unit(unit.context, unit.source)[0]
  File "/home/weblate/weblate-env/lib/python3.7/site-packages/weblate/formats/base.py", line 297, in find_unit
    return self._find_unit_template(context)
  File "/home/weblate/weblate-env/lib/python3.7/site-packages/weblate/formats/base.py", line 273, in _find_unit_template
    ttkit_unit = deepcopy(template_ttkit_unit)
  File "/home/weblate/weblate-env/lib/python3.7/copy.py", line 180, in deepcopy
    y = _reconstruct(x, memo, *rv)
  File "/home/weblate/weblate-env/lib/python3.7/copy.py", line 280, in _reconstruct
    state = deepcopy(state, memo)
  File "/home/weblate/weblate-env/lib/python3.7/copy.py", line 150, in deepcopy
    y = copier(x, memo)
  File "/home/weblate/weblate-env/lib/python3.7/copy.py", line 240, in _deepcopy_dict
    y[deepcopy(key, memo)] = deepcopy(value, memo)
  File "/home/weblate/weblate-env/lib/python3.7/copy.py", line 180, in deepcopy
    y = _reconstruct(x, memo, *rv)
File "/home/weblate/weblate-env/lib/python3.7/copy.py", line 306, in _reconstruct
    value = deepcopy(value, memo)
  File "/home/weblate/weblate-env/lib/python3.7/copy.py", line 180, in deepcopy
    y = _reconstruct(x, memo, *rv)
  File "/home/weblate/weblate-env/lib/python3.7/copy.py", line 280, in _reconstruct
    state = deepcopy(state, memo)
  File "/home/weblate/weblate-env/lib/python3.7/copy.py", line 150, in deepcopy
    y = copier(x, memo)
  File "/home/weblate/weblate-env/lib/python3.7/copy.py", line 240, in _deepcopy_dict
    y[deepcopy(key, memo)] = deepcopy(value, memo)
  File "/home/weblate/weblate-env/lib/python3.7/copy.py", line 180, in deepcopy
    y = _reconstruct(x, memo, *rv)
  File "/home/weblate/weblate-env/lib/python3.7/copy.py", line 280, in _reconstruct
    state = deepcopy(state, memo)
  File "/home/weblate/weblate-env/lib/python3.7/copy.py", line 150, in deepcopy
    y = copier(x, memo)
  File "/home/weblate/weblate-env/lib/python3.7/copy.py", line 240, in _deepcopy_dict
    y[deepcopy(key, memo)] = deepcopy(value, memo)
  File "/home/weblate/weblate-env/lib/python3.7/copy.py", line 150, in deepcopy
    y = copier(x, memo)
  File "/home/weblate/weblate-env/lib/python3.7/copy.py", line 215, in _deepcopy_list
    append(deepcopy(a, memo))
[...]
  File "/home/weblate/weblate-env/lib/python3.7/copy.py", line 212, in _deepcopy_list
    memo[id(x)] = y
MemoryError

I'll try to review again the code of this format, but I'm taking ideas if you have any.

surli commented 3 years ago

I'm actually failing to find why calling a deepcopy on a template can lead to a recursive call... Note that clearly this call to find_unit is related to the XWiki format since the beginning of the stacktrace leads to https://github.com/WeblateOrg/weblate/blob/main/weblate/formats/ttkit.py#L1688 but I'm failing to see why this call would create the stackoverflow here.

github-actions[bot] commented 3 years ago

Thank you for your report; the issue you have reported has just been fixed.