Go to file
Alex Vandiver 6218ed91c2 puppet: Use lazy-apps and uwsgi control sockets for rolling reloads.
Restarting the uwsgi processes by way of supervisor opens a window
during which nginx 502's all responses.  uwsgi has a configuration
called "chain reloading" which allows for rolling restart of the uwsgi
processes, such that only one process at once in unavailable; see
uwsgi documentation ([1]).

The tradeoff is that this requires that the uwsgi processes load the
libraries after forking, rather than before ("lazy apps"); in theory
this can lead to larger memory footprints, since they are not shared.
In practice, as Django defers much of the loading, this is not as much
of an issue.  In a very basic test of memory consumption (measured by
total memory - free - caches - buffers; 6 uwsgi workers), both
immediately after restarting Django, and after requesting `/` 60 times
with 6 concurrent requests:

                      |  Non-lazy  |  Lazy app  | Difference
    ------------------+------------+------------+-------------
    Fresh             |  2,827,216 |  2,870,480 |   +43,264
    After 60 requests |  3,332,284 |  3,409,608 |   +77,324
    ..................|............|............|.............
    Difference        |   +505,068 |   +539,128 |   +34,060

That is, "lazy app" loading increased the footprint pre-requests by
43MB, and after 60 requests grew the memory footprint by 539MB, as
opposed to non-lazy loading, which grew it by 505MB.  Using wsgi "lazy
app" loading does increase the memory footprint, but not by a large
percentage.

The other effect is that processes may be served by either old or new
code during the restart window.  This may cause transient failures
when new frontend code talks to old backend code.

Enable chain-reloading during graceful, puppetless restarts, but only
if enabled via a zulip.conf configuration flag.

Fixes #2559.

[1]: https://uwsgi-docs.readthedocs.io/en/latest/articles/TheArtOfGracefulReloading.html#chain-reloading-lazy-apps
2022-01-05 14:48:52 -08:00
.github puppet: process_fts_updates connects as nagios (or provided username). 2021-12-14 14:48:53 -08:00
.tx
.vscode vscode: Recommend remote development extension. 2021-11-03 16:03:46 -07:00
analytics actions: Rename do_change_plan_type -> do change_realm_plan_type. 2021-12-06 16:18:53 -08:00
confirmation lint: Enforce consistent style of using transaction.atomic decorator. 2021-12-12 11:15:33 -08:00
corporate corporate: Add helper for deactivating remote server registrations. 2022-01-03 14:02:48 -08:00
docs puppet: Use lazy-apps and uwsgi control sockets for rolling reloads. 2022-01-05 14:48:52 -08:00
frontend_tests settings: Make banner asking to confirm new email sticky. 2022-01-05 14:42:23 -08:00
locale i18n: Update translation data from Transifex. 2021-12-03 16:04:23 -08:00
pgroonga pgroonga: Remove unnecessary code from first migration. 2021-05-28 09:42:33 -07:00
puppet puppet: Use lazy-apps and uwsgi control sockets for rolling reloads. 2022-01-05 14:48:52 -08:00
requirements requirements: Upgrade Python requirements. 2021-12-29 16:48:47 -08:00
scripts puppet: Use lazy-apps and uwsgi control sockets for rolling reloads. 2022-01-05 14:48:52 -08:00
static settings: Make banner asking to confirm new email sticky. 2022-01-05 14:42:23 -08:00
stubs billing: Enforce the Stripe API version is in sync with billing system. 2021-11-05 17:23:10 -07:00
templates help: Document that linkifiers use re2. 2021-12-31 11:14:02 -08:00
tools do_delete_user: Add migration to fix bugged UserProfiles. 2022-01-04 15:42:03 -08:00
var/puppeteer puppeteer_tests: Port to TypeScript. 2021-02-22 16:03:10 -08:00
zerver api_documentation: Clarify `update_message` event description. 2022-01-05 14:45:19 -08:00
zilencer remote_server: Handle invalid server uuid being given authing to API. 2022-01-04 14:40:49 -08:00
zproject webhooks/jira: Handle anomalous payloads properly. 2021-12-28 10:56:25 -08:00
.browserslistrc browserslist: Drop 0.2% usage threshold to 0.15%. 2020-09-28 10:57:49 -07:00
.codecov.yml
.codespellignore CI: Add Codespell linter. 2021-10-27 16:49:30 -07:00
.editorconfig editorconfig: Restore indent_size = 2 for Markdown. 2021-08-20 23:14:37 -07:00
.eslintignore requirements: Remove Thumbor. 2021-05-06 20:07:32 -07:00
.eslintrc.json dependencies: Upgrade JavaScript dependencies. 2021-12-03 14:33:53 -08:00
.gitattributes git: Suppress diffs by default on giant Stripe API fixtures 2021-12-06 11:36:49 -08:00
.gitignore editor: Add `.vscode/extensions.json` file. 2021-10-29 15:47:44 -07:00
.gitlint lint: Re-enable imperative-mood checking. 2021-02-23 14:54:07 -08:00
.mailmap mailmap: Add mailmap entry for Sahil Batra. 2021-07-21 10:46:34 -07:00
.npmignore
.prettierignore prettier: Exclude backend-processed Markdown files. 2021-08-20 23:14:37 -07:00
.pyre_configuration pysa: Update .pyre_configuration to point to typeshed. 2020-09-22 15:44:47 -07:00
.sonarcloud.properties tools: Configure Zulip to be scannable by SonarCloud. 2020-06-24 12:41:17 -07:00
.yarnrc
CODE_OF_CONDUCT.md docs: Apply bullet style changes from Prettier. 2021-09-08 12:06:24 -07:00
CONTRIBUTING.md external links: Migrate the rest of /developer-community links. 2021-12-09 12:14:26 -08:00
Dockerfile-postgresql docs: Standardize on PostgreSQL, not Postgres. 2020-10-28 11:55:16 -07:00
LICENSE license: Move copyright notice from LICENSE to NOTICE. 2021-02-05 09:28:12 -08:00
NOTICE docs: Bump copyright year. 2021-02-05 09:28:15 -08:00
README.md external links: Migrate the rest of /developer-community links. 2021-12-09 12:14:26 -08:00
SECURITY.md docs: Apply sentence single-spacing from Prettier. 2021-09-08 12:06:24 -07:00
Vagrantfile Vagrantfile: Move inline provision script to a separate file. 2021-09-14 10:22:48 -07:00
babel.config.js i18n: Initialize FormatJS. 2021-04-13 17:41:10 -07:00
manage.py manage: Restore `changepassword` back to documented_commands. 2021-06-18 09:11:01 -07:00
package.json yarn: Add package which allows creating css mixins. 2021-12-09 18:15:18 -08:00
postcss.config.js css: Replace "night-mode-block" with "dark-theme-block". 2021-11-26 22:03:29 -08:00
prettier.config.js prettier: Disable embedded language formatting for Markdown. 2021-08-20 23:14:37 -07:00
pyproject.toml rate_limit: Add a flag to lump all TOR exit node IPs together. 2021-11-16 11:42:00 -08:00
setup.cfg pycodestyle: Improve comments documenting excludes. 2021-02-12 13:11:25 -08:00
stylelint.config.js yarn: Add package which allows creating css mixins. 2021-12-09 18:15:18 -08:00
tsconfig.json tsconfig: Enable noImplicitOverride. 2021-09-13 10:10:34 -07:00
version.py mypy: Add EmojiInfo type. 2021-12-30 11:28:14 -08:00
webpack.config.ts webpack: Remove LoaderOptionsPlugin. 2021-10-17 07:13:57 -07:00
yarn.lock yarn: Add package which allows creating css mixins. 2021-12-09 18:15:18 -08:00

README.md

Zulip overview

Zulip is a powerful, open source group chat application that combines the immediacy of real-time chat with the productivity benefits of threaded conversations. Zulip is used by open source projects, Fortune 500 companies, large standards bodies, and others who need a real-time chat system that allows users to easily process hundreds or thousands of messages a day. With over 700 contributors merging over 500 commits a month, Zulip is also the largest and fastest growing open source group chat project.

GitHub Actions build status coverage status Mypy coverage code style: black code style: prettier GitHub release docs Zulip chat Twitter GitHub Sponsors

Getting started

Click on the appropriate link below. If nothing seems to apply, join us on the Zulip community server and tell us what's up!

You might be interested in:

You may also be interested in reading our blog or following us on Twitter. Zulip is distributed under the Apache 2.0 license.