Commit Graph

11416 Commits

Author SHA1 Message Date
Nazar Gargol 8a7e00c413 Enabled batched members import method through enableDeveloperExperiments flag
no issue

- Allows early testing of batched import method
2020-08-11 18:52:37 +12:00
Nazar Gargol bbcc0f5178 Added batched members import API method
no issue

- New Member API batched import is meant to be a substitution to current import
with improved performance while keeping same behaviore. Current
import processes 1 record at a time using internal API calls and times
out consistently when large number of members has to be imported (~10k
records without Stripe).
- New import's aim is to improve performance and process >50K
records without timing out both with and without Stripe connected
members
- Batched import can be conceptually devided into 3 stages which have
their own ways to improve performance:
  1. labels - can be at current performance as number of
labels is usually small, but could also be improved through batching
  2. member records + member<->labels relations - these could
be performed as batched inserts into the database
  3. Stripe connections - most challanging bottleneck to solve because
API request are slow by it's nature and have to deal with rate limits of
Stripe's API itself
- It's a heavy WIP, with lots of known pitfalls which are marked with
TODOs. Will be solved iteratively through time untill the method can be
declared stable
- The new batched import method will be hidden behind 'enableDeveloperExperiments' flag to
allow early testing
2020-08-11 18:31:31 +12:00
Renovate Bot b61ccf0889
Update dependency @tryghost/vhost-middleware to v1.0.7 2020-08-10 21:14:18 +00:00
Renovate Bot ca4b0cb9a0
Update dependency @tryghost/session-service to v0.1.7 2020-08-10 19:05:39 +00:00
Renovate Bot 7466218f75
Update dependency @tryghost/image-transform to v1.0.2 2020-08-10 18:05:10 +00:00
Renovate Bot d2fb84d228
Update dependency @tryghost/errors to v0.2.2 2020-08-10 17:17:59 +00:00
Renovate Bot 0e3dd89312
Update dependency @tryghost/adapter-manager to v0.1.9 2020-08-10 16:12:34 +00:00
Daniel Lockyer 30cbfd93f8 v3.29.0 2020-08-10 17:00:10 +01:00
Daniel Lockyer f83ee621a2 Updated Ghost-Admin to v3.29.0 2020-08-10 17:00:10 +01:00
Hannah Wolfe b0512f2c25 Added a server testmode to help test behaviour
- A simple way to test behaviours without having to do complex interactions to e.g. generate errors or slow requests
- Makes it easier to test the new shutdown behaviour, among other things
2020-08-10 16:38:49 +01:00
Renovate Bot a96f434163 Update dependency gscan to v3.5.6 2020-08-10 15:55:34 +01:00
Renovate Bot edef05c2ae
Update dependency knex to v0.21.4 2020-08-10 14:10:23 +00:00
Hannah Wolfe a9c6e081cf Added an additional log to notify shutdown start
- there can now be quite a big delay between SIGINT/TERM being received and shutdown finishing
- add an extra log message to acknowledge the SIGINT/TERM to facilitate debugging and just be clear
2020-08-10 14:53:05 +01:00
Renovate Bot 64856dc5a3
Update dependency knex-migrator to v3.4.7 2020-08-10 12:19:33 +00:00
Daniel Lockyer 226dc32ec5 Fixed default shutdown timeout
- should be 60s (60000ms), not 600s (600000ms)
2020-08-10 13:00:02 +01:00
Renovate Bot a255426c77
Update dependency ghost-ignition to v4.2.2 2020-08-10 10:50:33 +00:00
Hannah Wolfe 19e3b70c7a Added stoppable for graceful shutdown of requests
- stopppable is a dependency that handles closing connections properly, which server.close does not
    - active connections are allowed to complete what they are doing
    - idle connections are closed
    - no new connections are allowed
- we call stoppable in stop() instead of server.close so that idle connections don't hold the server open
- calling await stop() from shutdown then ensures that we have a consistent experience of stop
- all together this allows ghost to shutdown gracefully when there are long-running requests
- @TODO: handle graceful shutdown of long-running processes
- @TODO: consider do we need to send 503s whilst the server is shutting down?
2020-08-10 11:46:36 +01:00
Hannah Wolfe e72cc193c6 Refactored GhostServer to use a class
- use more up-to-date and less confusing syntax
- makes it easier to use async/await as well
2020-08-10 08:53:09 +01:00
Hannah Wolfe 2289b7c0f7 Moved sig event and stop message handling
- none of this should be inside the start message handling
- move to inside the start function, where it's clearer and makes more sense
2020-08-10 08:53:09 +01:00
Hannah Wolfe 31981d086b Updated stop messages to have a consistent interface
- changed method to logStopMessages, as we use start and stop, not start and shutdown
- changed logStopMesasges to output the "proper" messages and use this method consistently - the closing connections message isn't really useful
- changed uptime message to always be output cos I can't see a case where there isn't interesting/useful
2020-08-10 08:53:09 +01:00
Renovate Bot e2adc10a52
Update dependency knex to v0.21.3 2020-08-10 06:05:05 +00:00
Renovate Bot b56c858109
Update dependency @tryghost/zip to v1.1.2 2020-08-10 04:06:07 +00:00
Renovate Bot 45085cdd99
Update dependency @tryghost/vhost-middleware to v1.0.6 2020-08-10 02:06:10 +00:00
Renovate Bot 1f3363e0a9
Update dependency @tryghost/session-service to v0.1.6 2020-08-10 00:08:31 +00:00
Hannah Wolfe e4ab28b70f Prevent grunt from exiting without letting express stop 2020-08-09 17:40:38 +01:00
Hannah Wolfe f8cdaf0c24 Removed unused connection handling + restart method
- Connection handling is legacy code added in 1438278ce4
- Although we were tracking all connections in memory, we weren't actually closing any because stop isn't called
- This (and restart) were both added as part of the now long-deprecated system for using Ghost directly as an npm module
- If we want to close connections cleanly, we should use a tool to do this
2020-08-09 17:31:01 +01:00
Hannah Wolfe 71f02d25e9 Refactored server announce functions to be clearer
- the announce functions exist for the purpose of communicating with Ghost CLI
- the functions were called announceServerStart and announceServerStopped, which implies they tell Ghost CLI when the server starts and stops
- however, the true intention / purpose of these functions is to:
    - either tell Ghost CLI when Ghost has successfully booted (e.g. is ready to serve requests)
    - or tell Ghost CLI when the server failed to boot, and report the error so that Ghost CLI can communicate it to the user
- therefore, I've refactored the old functions into 1 function to make it clearer they do the same job, but with 2 different states
- also added some tests :D
2020-08-09 17:25:15 +01:00
Hannah Wolfe c577007afe Update dependency @tryghost/bootstrap-socket to v0.2.0
- includes API changes
2020-08-09 17:22:27 +01:00
Renovate Bot 7b4565cd3e
Update dependency @tryghost/mw-session-from-token to v0.1.6 2020-08-07 21:12:14 +00:00
Renovate Bot 8229c695cf
Update dependency @tryghost/image-transform to v1.0.1 2020-08-07 19:47:53 +00:00
Renovate Bot bee234f859
Update dependency @tryghost/errors to v0.2.1 2020-08-07 17:45:12 +00:00
Hannah Wolfe b765a30ee9 Moved bootstap-socket code to @tryghost/bootstrap-socket
- this code has zero deps and is much easier to reason about standalone
2020-08-07 18:43:46 +01:00
Renovate Bot d4843b4ea8
Update dependency @tryghost/adapter-manager to v0.1.8 2020-08-07 16:09:42 +00:00
Hannah Wolfe b09504e7cc Moved bootstrap socket logic out of server
- this logic is a dependency rather than part of the server code
- moved it out ready to be moved elsewhere, doesn't need to be here
2020-08-07 16:27:45 +01:00
Hannah Wolfe 028d3fc88b Added missing debug info for IPC on start
refs 022a433e56

- noticed I missed adding debug info in one place (not that it's used, just for consistency)
- also made the SIGINT/TERM code slightly more readable
2020-08-06 20:39:49 +01:00
Kevin Ansfield 2efcf94645
Improved performance of sending newsletter emails (#12091)
no-issue

- switch from `membersService.api.members.list` to using bookshelf `Member.findPage()` with the `{paid: true}` filter to avoid per-member queries (N+1) to decorate members with subscriptions and a heavy post-fetch filter via `contentGating`
- add concurrency to the Mailgun API requests in `bulk-email` service to reduce overall time submitting API requests
- add debug statements with timing output for easier measurements
2020-08-06 15:19:39 +02:00
Kevin Ansfield 490f9787fa
Added migration to create indexes and constraints for member tables (#12108)
no issue

For large numbers of members we're unable to perform queries for free/paid members in a reasonable time without indexes. Bulk delete is also very slow when looping through bookshelf models and having bookshelf manage deletion of child records, adding `ON DELETE CASCADE` to the foreign key indexes moves child deletion to the DB level and allows for performant bulk delete queries.

- migrations only run on mysql because sqlite does not support altering tables
- adds foreign key indexes and constraints with 'ON DELETE CASCADE' for members_labels, members_stripe_customers, and members_stripe_customers_subscriptions
2020-08-06 14:57:05 +02:00
Fabien 'egg' O'Carroll d3384975da
Cleaned up members_stripe_* tables on MySQL (#12103)
refs #12100

For performance reasons we want to add foreign key and unique constraints
to the members_stripe_* tables so we can utilised cascading deletes and 
joins across the tables when querying.

In order to do this we must first ensure that:
- There are no duplicate entries in the `subscription_id` or `customer_id` columns
- There are no orphaned rows in the subscription or customers tables

If the first is not true, the unique constraint will fail, and if the second is not true,
the foreign key constraint will fail.

As we are only adding the indexes to existing MySQL databases at this point, the
cleanup migrations will also only be done for existing MySQL databases too.

The migrations for removing orphaned rows splits the deletion into a `SELECT`
followed by a `WHERE IN` to avoid the database "optimising" the query into a
`JOIN` which ends up taking much longer due to the lack of indexes.
2020-08-06 11:13:41 +02:00
Fabien 'egg' O'Carroll d15446593a
Added support for ON DELETE CASCADE to the schema (#12105)
no-issue

We are in the process of creating migrations to add foreign key constraints
and cascading deletes to the members_stripe_* tables to make listing members
and deleting members faster. As well as the migrations we need to update the
database schema so that new installations have the correct indexes and constraints.

Co-authored-by: Kevin Ansfield <kevin@lookingsideways.co.uk>
2020-08-05 13:20:30 +02:00
Renovate Bot 0eed0d8c88
Update dependency mocha to v8.1.1 2020-08-04 19:31:20 +00:00
Daniel Lockyer 0304280d96 v3.28.0 2020-08-04 11:23:41 +01:00
Daniel Lockyer 226fa76c51 Updated Ghost-Admin to v3.28.0 2020-08-04 11:23:40 +01:00
Daniel Lockyer 82f4b179fa Updated Casper to v3.1.0 2020-08-04 11:23:40 +01:00
Daniel Lockyer 9ff68dc3b0 Updated @tryghost/url-utils dependency to 0.6.19 2020-08-04 11:04:14 +01:00
Daniel Lockyer bd14df328d Updated @tryghost/string dependency to 0.1.10 2020-08-04 11:03:34 +01:00
Renovate Bot 0e1708f220
Update dependency @tryghost/social-urls to v0.1.10 2020-08-04 07:59:42 +00:00
Renovate Bot 30fe92e3be Update dependency @tryghost/html-to-mobiledoc to v0.7.1 2020-08-04 07:58:49 +00:00
Renovate Bot 7239fdbe23
Update dependency @tryghost/helpers to v1.1.28 2020-08-04 06:01:45 +00:00
Nazar Gargol 60ae9e82f9 Fixed integration_id assignment for webhook when creating through API key auth
refs 173e3292fa

- The bug was initially introduced in referenced commit. When request is done with `api_key` context, there should always be an `integration` object associated with it - 71c17539d8/core/server/services/permissions/parse-context.js (L36) . An `id` from `context.integration` not `context.api_key` has to be assigned to newly created webhook!
- The webhooks API is about to be declared stable in upcoming release, so no migration will be done
2020-08-04 16:43:24 +12:00
CY Lim 71c17539d8
🐛 Fixed installation on windows #10890 (#12096)
closes #10890

- use platform agnostic `exit 0` to allow `yarn setup` to work on windows
- requires powershell to be run as admin
2020-08-03 20:15:58 +01:00