Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

refactor(core): Streamline flows in multi-main mode (no-changelog) #8446

Merged
merged 33 commits into from
Feb 5, 2024

Conversation

ivov
Copy link
Contributor

@ivov ivov commented Jan 25, 2024

Summary

This PR brings multi-main mode in line with our current understanding of the best approach to handle all n8n flows relevant to multi-main mode.

Details

See diagram

On instance startup (single- or multi-main mode)

  • In single-main mode, the main instance retrieves all workflows marked as active in the database and adds triggers and pollers for active workflows, but it does not add webhooks for active workflows, because we no longer deregister webhooks on shutdown. The main instance also starts pruning.
  • In multi-main mode, the leader behaves exactly like the single main instance in single-main mode, whereas the follower does nothing - webhooks need not be added because they were never removed on shutdown, and managing triggers and pollers is solely the responsibility of the leader.

On leader stepdown (only multi-main mode)

  • The leader stepdown event is fired if either a former leader found the leader is another main, or if a main found there is no leader at all. In reaction to this event, the former leader stops running triggers and pollers and stops pruning, reaching the same state as the follower on instance startup. Additionally, if this event was fired because the former leader found there is no leader at all, then the former leader attempts to become leader again, where it will be competing with all other followers.

On leader takeover (only multi-main mode)

  • The leader takeover event is fired if a main instance successfully set the leader key and marked itself as leader in memory via config.set('multiMainSetup.instanceType', 'leader'). In reaction to this event, the new leader behaves exactly like the leader on instance startup.

On workflow update (single- or multi-main mode)

  • In single-main mode, we handle a workflow update differently depending on what changed.
    • If the workflow was updated and activated, the single main instance updates the workflow in the database, and adds webhooks, triggers and pollers for the workflow.
    • If the workflow was updated and deactivated, the single main instance updates the workflow in the database, and removes webhooks, triggers and pollers for the workflow. Removing workflows means deleting them from the webhook_entity table, and deregistering them from external services.
    • If the workflow was updated with no change to its active state, the single main instance updates the workflow in the database, removes webhooks, triggers and pollers for the workflow, and adds them all back again after updating. This allows any changes to the nodes to take effect, e.g. Schedule Trigger frequency.
  • In multi-main mode, we handle the three kinds of workflow updates as above, but distributing additions and removals among leader and followers:
    • If the workflow was updated and activated, the instance that received the request, whether leader or follower, updates the workflow in the database, and sends a message to all other main instances with a payload containing the workflow ID to activate. Of the recipient main instances, only the leader reacts to this message by adding webhooks, triggers and pollers for the workflow.
    • If the workflow was updated and deactivated, the instance that received the request, whether leader or follower, updates the workflow in the database, removes webhooks for the workflow, and sends a message to all other main instances with a payload containing the workflow ID for which triggers and pollers need to be removed. Of the recipient main instances, only the leader reacts to this message by adding triggers and pollers for the workflow.
    • If the workflow was updated with no change to its active state, we first remove (same as the above deactivation flow), and then we re-add (same as the above activation flow).

Notes on workflow update flow and its subflows:

  • All three subflows apply to both internal and public APIs.
  • The deactivation subflow applies also to source control import and user deletion. When importing an active workflow, we deactivate the pre-import workflow. When there is no transferee on user deletion, we deactivate the user's workflows before deleting them.
  • The activation subflow applies also to source control import. When importing an active workflow, after deactivating the pre-import workflow, we activate the imported workflow.
  • In the activation subflow, on activation failure e.g. due to expired credentials in a trigger, the leader sets the workflow's active state in the database back to false, informs all its connected FEs of the activation failure, and sends a message to all other main instances, which react by also informing all their connected FEs of the activation failure. This update in reaction to an activation failure does not rely on versionId because there is no user intervention. Activation failure state resides in Redis and therefore is available to all connected FEs.
  • Why handle webhooks on the recipient but triggers and pollers on the leader? Deactivation in multi-main mode needs to keep the webhook removal at the instance that received the workflow update request, because the update may have removed a webhook node. If webhook removal were to be handled by the leader, when an update removes e.g. a GitHub Trigger node and deactivates the workflow, the instance that received the workflow update request would update the workflow in the database and then send a message for the leader to remove webhooks, triggers and pollers for the workflow - and the leader would do so, but it would never deregister the webhook from GitHub, because by the time the leader takes action, it would be unaware of the GitHub Trigger node that used to be in the workflow and that still requires deregistration from the external service. Hence we keep webhook removal (deletion from database and deregistration from external service) at the instance that received the workflow update request.

On test webhook (single- or multi-main mode)

  • In single-main mode, the single main instance registers the test webhook on the cache (to prepare for any request from the external service to confirm the creation of a test webhook), sends a request to register a webhook at the external service, and stores static data from the registration in the cache. The class to manage test webhooks relies on the test webhook registration in the cache to set up and tear down test webhooks, and uses the Workflow.testStaticData property to make test static data available to nodes. Then, when the single main instance receives a webhook from the external service, it executes the workflow, pushes execution lifecycle events to the FE, deregisters the test webhook from the external service, removes the test webhook from the cache, and pushes the final execution lifecycle event to the FE.
  • In multi-main mode, a main instance, whether leader or follower, follows the above steps until waiting for a webhook from the external service. When the webhook arrives, the load balancer may forward it to any main instance. If the webhook is forwarded to the instance where the test webhook was created, the rest of the above steps apply. If the webhook is any main instance other than the main instance where the webhook was created, the recipient main instance executes the workflow and relays execution lifecycle events to all other main instances. Of the recipient main instances, the one having the session ID where the webhook was created pushes the execution lifecycle events to the FE. When the execution finishes, the main instance handling the execution deregisters the test webhook from the external service (using Workflow.testStaticData if needed), removes the test webhook from the cache, and relays the final execution lifecycle event to all other main instances. Of the recipient main instances, the one having the session ID where the webhook was created pushes the final execution lifecycle event to the FE.

Manual testing

Single-main regular mode

  • Activating a webhook-based workflow should cause the instance to start listening for webhook calls.
  • Running a test webhook should cause the instance to start listening for a test webhook call for two minutes.
  • Activating a trigger-based workflow should cause the instance to start firing triggers.
  • Deactivating a webhook-based workflow should deregister the webhook.
  • Cancelling a test webhook should deregister the test webhook.
  • Deactivating a trigger-based workflow should cause the instance to stop firing triggers.
  • Live editing and saving an active webhook-based workflow should cause the change to take effect.
  • Live editing and saving an active trigger-based workflow should cause the change to take effecct.
  • Initializing the instance should cause the instance to activate all active workflows and start pruning.
  • Activating a workflow leading to an activation failure that should cause the frontend to display the activation failure. (To test this, create a workflow with a webhook-based trigger, add an invalid credential, change active to true in the database, and start instance.)

Multi-main queue mode

  • Activating a webhook-based workflow on the leader should cause the instance to start listening for webhook calls.
  • Activating a webhook-based workflow on a follower should cause the instance to start listening for webhook calls.
  • Activating a trigger-based workflow on the leader should cause the leader to start firing triggers.
  • Activating a trigger-based workflow on a follower should cause the leader to start firing triggers.
  • Deactivating a webhook-based workflow on the leader should cause the instance to stop listening for webhook calls.
  • Deactivating a webhook-based workflow on a follower should cause the instance to stop listening for webhook calls.
  • Deactivating a trigger-based workflow on the leader should cause the leader to stop firing triggers.
  • Deactivating a trigger-based workflow on a follower should cause the leader to stop firing triggers.
  • Live editing and saving an active webhook-based workflow on the leader should cause the change to take effect.
  • Live editing and saving an active webhook-based workflow on a follower should cause the change to take effect.
  • Live editing and saving an active trigger-based workflow on the leader should cause the change to take effect.
  • Live editing and saving an active trigger-based workflow on a follower should cause the change to take effect.
  • Live replacing a webhook for a trigger in an active workflow in the leader should cause the webhook to stop listening and the trigger to start firing.
  • Live replacing a trigger for a webhook in an active workflow in the leader should cause the webhook to start listening and the trigger to stop firing.
  • Live replacing a webhook for a trigger in a follower should cause the webhook to stop listening and the trigger to start firing.
  • Live replacing a trigger for a webhook in a follower should cause the webhook to start listening and the trigger to stop firing.
  • Initializing the leader should cause the instance to add triggers and pollers for all active workflows and start pruning.
  • Initializing a follower should cause the instance to neither add triggers and pollers for all active workflows nor start pruning.
  • On the former leader, losing leadership should cause the instance to remove all triggers and pollers and stop pruning.
  • On the new leader, gaining leadership should cause the instance to add all triggers and pollers and start pruning.
  • Regardless of leader or follower, a main that created a test webhook should cause the instance to start listening for a test webhook call for two minutes.
  • Regardless of leader or follower, a main that did not create a test webhook, on receiving a call for it, should relay lifecycle events to the main that created the test webhook.
  • Regardless of leader or follower, a main that created a test webhook, on cancelling it, should cause the instance to deregister the test webhook.

@n8n-assistant n8n-assistant bot added core Enhancement outside /nodes-base and /editor-ui n8n team Authored by the n8n team labels Jan 25, 2024
@ivov ivov marked this pull request as ready for review January 25, 2024 18:09
packages/cli/src/ActiveWorkflowRunner.ts Outdated Show resolved Hide resolved
packages/cli/src/commands/start.ts Outdated Show resolved Hide resolved
packages/cli/src/workflows/workflow.service.ts Outdated Show resolved Hide resolved
krynble
krynble previously approved these changes Jan 31, 2024
Copy link

cypress bot commented Jan 31, 2024

2 flaky tests on run #3979 ↗︎

0 339 5 0 Flakiness 2

Details:

🌳 🖥️ browsers:node18.12.0-chrome107 🤖 ivov 🗃️ e2e/*
Project: n8n Commit: 1a352969ae
Status: Passed Duration: 03:32 💡
Started: Jan 31, 2024 3:16 PM Ended: Jan 31, 2024 3:19 PM
Flakiness  5-ndv.cy.ts • 1 flaky test

View Output Video

Test Artifacts
NDV > should not retrieve remote options when required params throw errors Test Replay Screenshots Video
Flakiness  19-execution.cy.ts • 1 flaky test

View Output Video

Test Artifacts
Execution > should test manual workflow stop Test Replay Screenshots Video

Review all test suite changes for PR #8446 ↗︎

Copy link
Contributor

✅ All Cypress E2E specs passed

@ivov ivov changed the title refactor(core): Simplify flows in multi-main mode (no-changelog) refactor(core): Streamline flows in multi-main mode (no-changelog) Feb 1, 2024
Copy link
Contributor

@krynble krynble left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I'm loving to see the progress.

Left a comment about console messages and noticed something a bit odd - if I click the toggle to deactivate a workflow on a follower, the main won't reflect the deactivation in the UI, when I have the same workflow open in both leader and follower.


const shouldAddWebhooks = this.orchestrationService.shouldAddWebhooks(activationMode);
const shouldAddTriggersAndPollers = this.orchestrationService.shouldAddTriggersAndPollers();

const shouldActivate = shouldAddWebhooks || shouldAddTriggersAndPollers;
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This should check be shouldDisplayActivationMessages and be based on whether activationMode === 'init' instead.

The result we're getting now is that whenever i disable and enable a workflow I get the messages on the current leader and I'm almost sure we used to display those messages only on init.


if (typeof workflowId !== 'string') break;

push.broadcast('workflowActivated', { workflowId });
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Just to be sure, the UI is ready to only display this if the currently open workflow ID matches to the one sent in the payload right?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The FE at pushConnection.ts receives this workflow ID and calls store methods:

if (receivedData.type === 'workflowActivated') {
	this.workflowsStore.setWorkflowActive(receivedData.data.workflowId);
	return true;
}

if (receivedData.type === 'workflowDeactivated') {
	this.workflowsStore.setWorkflowInactive(receivedData.data.workflowId);
	return true;
}

And the store methods compare the pushed workflow ID against this.workflow.id, which as far as I understand is the workflow on canvas.

setWorkflowActive(workflowId: string): void {
	const uiStore = useUIStore();
	uiStore.stateIsDirty = false;
	const index = this.activeWorkflows.indexOf(workflowId);
	if (index === -1) {
		this.activeWorkflows.push(workflowId);
	}
	if (this.workflowsById[workflowId]) {
		this.workflowsById[workflowId].active = true;
	}
	if (workflowId === this.workflow.id) {
		this.setActive(true);
	}
},

setWorkflowInactive(workflowId: string): void {
	const index = this.activeWorkflows.indexOf(workflowId);
	if (index !== -1) {
		this.activeWorkflows.splice(index, 1);
	}
	if (this.workflowsById[workflowId]) {
		this.workflowsById[workflowId].active = false;
	}
	if (workflowId === this.workflow.id) {
		this.setActive(false);
	}
},

@ivov ivov merged commit dc5ec8f into master Feb 5, 2024
14 of 33 checks passed
@ivov ivov deleted the simplify-flows-in-multi-main-mode branch February 5, 2024 08:26
@janober
Copy link
Member

janober commented Feb 7, 2024

Got released with n8n@1.28.0

andyjoyous added a commit to eyaljoyous/n8n that referenced this pull request Feb 9, 2024
* refactor(core): Replace promisify-d node calls with native promises (no-changelog) (n8n-io#8464)

* fix(editor): Send template id as a number in telemetry events (n8n-io#8484)

* refactor(editor): Prevent router.replace from computed property (no-changelog) (n8n-io#8489)

Signed-off-by: Oleg Ivaniv <me@olegivaniv.com>

* feat(core): Remove `own` execution-process mode (n8n-io#8490)

* feat(editor): Implement loading and error states for dynamically loaded components in node parameter list (n8n-io#8477)

* fix(AwsS3 Node): Fix handling of bucket with dot in name (n8n-io#8475)

* refactor(core): Modernize credentials controllers and services (no-changelog) (n8n-io#8488)

Co-authored-by: कारतोफ्फेलस्क्रिप्ट™ <aditya@netroy.in>

* fix(core): Don't report executions that have been paused as failed to rudderstack and log streams (n8n-io#8501)

* fix: Properly iterate over credentials with expressions (n8n-io#8502)

* refactor(core): Move all code related to `onServerStarted` into `InternalHooks` (no-changelog) (n8n-io#8500)

* feat(editor): Send template id as string in all telemetry events (n8n-io#8498)

* fix(core): Handle possibly invalid `updatedAt` timestamps in source-control (n8n-io#8485)

* fix(core): Forward authorization header when on same domain (n8n-io#8507)

* fix(core): Improve handling of wrapped errors (n8n-io#8510)

* 🚀 Release 1.27.0 (n8n-io#8512)

Co-authored-by: ivov <ivov@users.noreply.github.com>

* ci: Skip running `postInstall` scripts for all packages except sqlite3 (no-changelog) (n8n-io#8514)

* ci: Fix DB tests (no-changelog) (n8n-io#8513)

* fix(core): Fix new graceful shutdown env being always overridden by deprecated env (n8n-io#8503)

* fix(HTTP Request Node): Support form data when using pagination (n8n-io#8497)

* fix(HTTP Request Node): Require parameter with filled name and value to avoid infinite loop (n8n-io#8454)

Co-authored-by: कारतोफ्फेलस्क्रिप्ट™ <netroy@users.noreply.github.com>
Co-authored-by: Elias Meire <elias@meire.dev>

* fix(Microsoft Excel 365 Node): Upsert append new rows at the end of used range, option to append at the end of selected range (n8n-io#8461)

* fix(Slack Node): Attachments fix (n8n-io#8471)

Co-authored-by: Elias Meire <elias@meire.dev>

* feat: Azure Open AI chat model & embeddings (n8n-io#8522)

Signed-off-by: Oleg Ivaniv <me@olegivaniv.com>

* fix(core): Fix test runs of triggers that rely on static data (n8n-io#8524)

* ci: Replace `pnpm/action-setup` action with corepack (no-changelog) (n8n-io#8504)

* fix(MongoDB Node): Fix "Maximum call stack size exceeded" error on too many rows (n8n-io#8530)

* fix: Allow Date/Luxon objects and additional formats in DateTime validation (n8n-io#8525)

* fix(editor): Prune values that are not in the schema in the ResourceMapper component (n8n-io#8478)

* fix(core): Fix PermissionChecker.check, and add additional unit tests (n8n-io#8528)

* fix(core): Fix DropRoleMapping migration (n8n-io#8521)

* fix(core): Ensure AxiosError status always gets copied over to NodeApiError (n8n-io#8509)

* fix(Embeddings OpenAI Node): Fix dynamic models fetching (n8n-io#8533)

Signed-off-by: Oleg Ivaniv <me@olegivaniv.com>

* fix(core): Fix workflow tagging failure due to unique constraint check (n8n-io#8505)

* ci: Fix release-create-pr.yml (no-changelog)

* fix(core): Upgrade nodemailer to address an exploit (n8n-io#8535)

* feat(RabbitMQ Trigger Node): Add options to configure assert of exchanges and queues (n8n-io#8430)

* feat(editor): Add delete and disable button to nodes on hover (n8n-io#8482)

* feat(Email Trigger (IMAP) Node): Upgrade mailparser (n8n-io#8539)

* refactor(core): Streamline flows in multi-main mode (no-changelog) (n8n-io#8446)

* fix: Remove ts-node from overrides and typeorm script (no-changelog) (n8n-io#8547)

* fix: Update BaseChatModel import checks for MistralAI compatibility (n8n-io#8527)

Signed-off-by: Oleg Ivaniv <me@olegivaniv.com>

* docs: Add encryption key check to breaking changes list (n8n-io#8551)

* refactor(core): Lock `webhook` process out of multi-main setup (no-changelog) (n8n-io#8549)

* refactor(core): Continue breaking dependency cycles (no-changelog) (n8n-io#8545)

* fix(core): Use trx manager instead of repository for tags overwrite (n8n-io#8557)

* build: Fix outdated import to fix build (no-changelog) (n8n-io#8558)

* refactor(core): Couple of refactors on WorkflowRunner and ActiveExecutions (no-changelog) (n8n-io#8487)

* feat: Add assignment component with drag and drop to Set node (n8n-io#8283)

Co-authored-by: Giulio Andreini <andreini@netseven.it>

* ci: Update validate-n8n-pull-request-title action (no-changelog) (n8n-io#8553)

* fix(core): Use hostname from URL instead of Host header for SNI (n8n-io#8562)

* fix(Microsoft Outlook Node): Download executes more than once per incoming item (n8n-io#8566)

* 🚀 Release 1.28.0 (n8n-io#8569)

Co-authored-by: ivov <ivov@users.noreply.github.com>

* ci(core): Avoid slow bcrypt calls in tests (no-changelog) (n8n-io#8570)

* fix(core): Upgrade rudderstack sdk to address npm postInstall issues (n8n-io#8568)

* feat: Upgrade typeorm, sqlite3, and pg/pg-promise (n8n-io#8579)

* build: Add GitHub issue form for reporting bugs (n8n-io#8585)

* fix(Google Sheets Trigger Node): First non-header row is ignored when using on row added event (n8n-io#8580)

* fix(RSS Feed Trigger Node): Save last item's date instead of last execution date (n8n-io#8572)

* feat(core): Migrate to n8n's typeorm fork (n8n-io#8590)

* refactor: Add lint rule for unsafe property access with lodash get/set (no-changelog) (n8n-io#8587)

* fix(HTTP Request Node): Errorneous binary object without content-disposition response header (n8n-io#8583)

Co-authored-by: Marcus <marcus@n8n.io>

* fix(core): Custom workflow tool tweaks  (n8n-io#8561)

* Fixes imports and enables workers view

---------

Signed-off-by: Oleg Ivaniv <me@olegivaniv.com>
Co-authored-by: कारतोफ्फेलस्क्रिप्ट™ <netroy@users.noreply.github.com>
Co-authored-by: Milorad FIlipović <milorad@n8n.io>
Co-authored-by: oleg <me@olegivaniv.com>
Co-authored-by: Iván Ovejero <ivov.src@gmail.com>
Co-authored-by: कारतोफ्फेलस्क्रिप्ट™ <aditya@netroy.in>
Co-authored-by: Danny Martini <despair.blue@gmail.com>
Co-authored-by: Omar Ajoue <krynble@gmail.com>
Co-authored-by: Elias Meire <elias@meire.dev>
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
Co-authored-by: ivov <ivov@users.noreply.github.com>
Co-authored-by: Michael Kret <88898367+michael-radency@users.noreply.github.com>
Co-authored-by: Andrea Ascari <dev.ascariandrea@gmail.com>
Co-authored-by: Giulio Andreini <andreini@netseven.it>
Co-authored-by: Cornelius Suermann <cornelius@n8n.io>
Co-authored-by: Bruno Inec <contact@sweenu.xyz>
Co-authored-by: Marcus <marcus@n8n.io>
andyjoyous added a commit to eyaljoyous/n8n that referenced this pull request Feb 10, 2024
* Andy/joy 277 mergeupdate n8n 128 (#54)

* refactor(core): Replace promisify-d node calls with native promises (no-changelog) (n8n-io#8464)

* fix(editor): Send template id as a number in telemetry events (n8n-io#8484)

* refactor(editor): Prevent router.replace from computed property (no-changelog) (n8n-io#8489)

Signed-off-by: Oleg Ivaniv <me@olegivaniv.com>

* feat(core): Remove `own` execution-process mode (n8n-io#8490)

* feat(editor): Implement loading and error states for dynamically loaded components in node parameter list (n8n-io#8477)

* fix(AwsS3 Node): Fix handling of bucket with dot in name (n8n-io#8475)

* refactor(core): Modernize credentials controllers and services (no-changelog) (n8n-io#8488)

Co-authored-by: कारतोफ्फेलस्क्रिप्ट™ <aditya@netroy.in>

* fix(core): Don't report executions that have been paused as failed to rudderstack and log streams (n8n-io#8501)

* fix: Properly iterate over credentials with expressions (n8n-io#8502)

* refactor(core): Move all code related to `onServerStarted` into `InternalHooks` (no-changelog) (n8n-io#8500)

* feat(editor): Send template id as string in all telemetry events (n8n-io#8498)

* fix(core): Handle possibly invalid `updatedAt` timestamps in source-control (n8n-io#8485)

* fix(core): Forward authorization header when on same domain (n8n-io#8507)

* fix(core): Improve handling of wrapped errors (n8n-io#8510)

* 🚀 Release 1.27.0 (n8n-io#8512)

Co-authored-by: ivov <ivov@users.noreply.github.com>

* ci: Skip running `postInstall` scripts for all packages except sqlite3 (no-changelog) (n8n-io#8514)

* ci: Fix DB tests (no-changelog) (n8n-io#8513)

* fix(core): Fix new graceful shutdown env being always overridden by deprecated env (n8n-io#8503)

* fix(HTTP Request Node): Support form data when using pagination (n8n-io#8497)

* fix(HTTP Request Node): Require parameter with filled name and value to avoid infinite loop (n8n-io#8454)

Co-authored-by: कारतोफ्फेलस्क्रिप्ट™ <netroy@users.noreply.github.com>
Co-authored-by: Elias Meire <elias@meire.dev>

* fix(Microsoft Excel 365 Node): Upsert append new rows at the end of used range, option to append at the end of selected range (n8n-io#8461)

* fix(Slack Node): Attachments fix (n8n-io#8471)

Co-authored-by: Elias Meire <elias@meire.dev>

* feat: Azure Open AI chat model & embeddings (n8n-io#8522)

Signed-off-by: Oleg Ivaniv <me@olegivaniv.com>

* fix(core): Fix test runs of triggers that rely on static data (n8n-io#8524)

* ci: Replace `pnpm/action-setup` action with corepack (no-changelog) (n8n-io#8504)

* fix(MongoDB Node): Fix "Maximum call stack size exceeded" error on too many rows (n8n-io#8530)

* fix: Allow Date/Luxon objects and additional formats in DateTime validation (n8n-io#8525)

* fix(editor): Prune values that are not in the schema in the ResourceMapper component (n8n-io#8478)

* fix(core): Fix PermissionChecker.check, and add additional unit tests (n8n-io#8528)

* fix(core): Fix DropRoleMapping migration (n8n-io#8521)

* fix(core): Ensure AxiosError status always gets copied over to NodeApiError (n8n-io#8509)

* fix(Embeddings OpenAI Node): Fix dynamic models fetching (n8n-io#8533)

Signed-off-by: Oleg Ivaniv <me@olegivaniv.com>

* fix(core): Fix workflow tagging failure due to unique constraint check (n8n-io#8505)

* ci: Fix release-create-pr.yml (no-changelog)

* fix(core): Upgrade nodemailer to address an exploit (n8n-io#8535)

* feat(RabbitMQ Trigger Node): Add options to configure assert of exchanges and queues (n8n-io#8430)

* feat(editor): Add delete and disable button to nodes on hover (n8n-io#8482)

* feat(Email Trigger (IMAP) Node): Upgrade mailparser (n8n-io#8539)

* refactor(core): Streamline flows in multi-main mode (no-changelog) (n8n-io#8446)

* fix: Remove ts-node from overrides and typeorm script (no-changelog) (n8n-io#8547)

* fix: Update BaseChatModel import checks for MistralAI compatibility (n8n-io#8527)

Signed-off-by: Oleg Ivaniv <me@olegivaniv.com>

* docs: Add encryption key check to breaking changes list (n8n-io#8551)

* refactor(core): Lock `webhook` process out of multi-main setup (no-changelog) (n8n-io#8549)

* refactor(core): Continue breaking dependency cycles (no-changelog) (n8n-io#8545)

* fix(core): Use trx manager instead of repository for tags overwrite (n8n-io#8557)

* build: Fix outdated import to fix build (no-changelog) (n8n-io#8558)

* refactor(core): Couple of refactors on WorkflowRunner and ActiveExecutions (no-changelog) (n8n-io#8487)

* feat: Add assignment component with drag and drop to Set node (n8n-io#8283)

Co-authored-by: Giulio Andreini <andreini@netseven.it>

* ci: Update validate-n8n-pull-request-title action (no-changelog) (n8n-io#8553)

* fix(core): Use hostname from URL instead of Host header for SNI (n8n-io#8562)

* fix(Microsoft Outlook Node): Download executes more than once per incoming item (n8n-io#8566)

* 🚀 Release 1.28.0 (n8n-io#8569)

Co-authored-by: ivov <ivov@users.noreply.github.com>

* ci(core): Avoid slow bcrypt calls in tests (no-changelog) (n8n-io#8570)

* fix(core): Upgrade rudderstack sdk to address npm postInstall issues (n8n-io#8568)

* feat: Upgrade typeorm, sqlite3, and pg/pg-promise (n8n-io#8579)

* build: Add GitHub issue form for reporting bugs (n8n-io#8585)

* fix(Google Sheets Trigger Node): First non-header row is ignored when using on row added event (n8n-io#8580)

* fix(RSS Feed Trigger Node): Save last item's date instead of last execution date (n8n-io#8572)

* feat(core): Migrate to n8n's typeorm fork (n8n-io#8590)

* refactor: Add lint rule for unsafe property access with lodash get/set (no-changelog) (n8n-io#8587)

* fix(HTTP Request Node): Errorneous binary object without content-disposition response header (n8n-io#8583)

Co-authored-by: Marcus <marcus@n8n.io>

* fix(core): Custom workflow tool tweaks  (n8n-io#8561)

* Fixes imports and enables workers view

---------

Signed-off-by: Oleg Ivaniv <me@olegivaniv.com>
Co-authored-by: कारतोफ्फेलस्क्रिप्ट™ <netroy@users.noreply.github.com>
Co-authored-by: Milorad FIlipović <milorad@n8n.io>
Co-authored-by: oleg <me@olegivaniv.com>
Co-authored-by: Iván Ovejero <ivov.src@gmail.com>
Co-authored-by: कारतोफ्फेलस्क्रिप्ट™ <aditya@netroy.in>
Co-authored-by: Danny Martini <despair.blue@gmail.com>
Co-authored-by: Omar Ajoue <krynble@gmail.com>
Co-authored-by: Elias Meire <elias@meire.dev>
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
Co-authored-by: ivov <ivov@users.noreply.github.com>
Co-authored-by: Michael Kret <88898367+michael-radency@users.noreply.github.com>
Co-authored-by: Andrea Ascari <dev.ascariandrea@gmail.com>
Co-authored-by: Giulio Andreini <andreini@netseven.it>
Co-authored-by: Cornelius Suermann <cornelius@n8n.io>
Co-authored-by: Bruno Inec <contact@sweenu.xyz>
Co-authored-by: Marcus <marcus@n8n.io>

* Enables advanced permissions

* Fixes workflow statistics update errors

---------

Signed-off-by: Oleg Ivaniv <me@olegivaniv.com>
Co-authored-by: कारतोफ्फेलस्क्रिप्ट™ <netroy@users.noreply.github.com>
Co-authored-by: Milorad FIlipović <milorad@n8n.io>
Co-authored-by: oleg <me@olegivaniv.com>
Co-authored-by: Iván Ovejero <ivov.src@gmail.com>
Co-authored-by: कारतोफ्फेलस्क्रिप्ट™ <aditya@netroy.in>
Co-authored-by: Danny Martini <despair.blue@gmail.com>
Co-authored-by: Omar Ajoue <krynble@gmail.com>
Co-authored-by: Elias Meire <elias@meire.dev>
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
Co-authored-by: ivov <ivov@users.noreply.github.com>
Co-authored-by: Michael Kret <88898367+michael-radency@users.noreply.github.com>
Co-authored-by: Andrea Ascari <dev.ascariandrea@gmail.com>
Co-authored-by: Giulio Andreini <andreini@netseven.it>
Co-authored-by: Cornelius Suermann <cornelius@n8n.io>
Co-authored-by: Bruno Inec <contact@sweenu.xyz>
Co-authored-by: Marcus <marcus@n8n.io>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
core Enhancement outside /nodes-base and /editor-ui n8n team Authored by the n8n team Released
Projects
None yet
Development

Successfully merging this pull request may close these issues.

None yet

3 participants