n8n
Version:
n8n Workflow Automation Tool
67 lines • 2.84 kB
JavaScript
;
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
return c > 3 && r && Object.defineProperty(target, key, r), r;
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.SplitBrainCheck = void 0;
const decorators_1 = require("@n8n/decorators");
const CHECK_CODE = 'cluster.split-brain';
const AUDIT_DETECTED = 'n8n.audit.cluster.split-brain.detected';
const AUDIT_RESOLVED = 'n8n.audit.cluster.split-brain.resolved';
function computeFingerprint(instances) {
const leaders = [...instances]
.filter((i) => i.instanceRole === 'leader')
.map((i) => ({
instanceKey: i.instanceKey,
hostId: i.hostId,
instanceType: i.instanceType,
}))
.sort((a, b) => a.instanceKey.localeCompare(b.instanceKey));
const splitBrain = leaders.length > 1;
return {
splitBrain,
fingerprint: splitBrain ? leaders.map((l) => l.instanceKey).join('|') : '',
leaders,
};
}
let SplitBrainCheck = class SplitBrainCheck {
constructor() {
this.checkDescription = {
name: 'split-brain',
displayName: 'Split-brain',
};
}
async run(context) {
const current = computeFingerprint(context.currentState.values());
const previous = computeFingerprint(context.previousState.values());
if (!current.splitBrain) {
if (previous.splitBrain) {
return { auditEvents: [{ eventName: AUDIT_RESOLVED, payload: {} }] };
}
return {};
}
const leaderKeys = current.leaders.map((l) => l.instanceKey);
const result = {
warnings: [
{
code: CHECK_CODE,
message: `Detected ${current.leaders.length} instances claiming leader role: ${leaderKeys.join(', ')}`,
severity: 'error',
context: { leaders: current.leaders },
},
],
};
if (current.fingerprint !== previous.fingerprint) {
result.auditEvents = [{ eventName: AUDIT_DETECTED, payload: { leaders: current.leaders } }];
}
return result;
}
};
exports.SplitBrainCheck = SplitBrainCheck;
exports.SplitBrainCheck = SplitBrainCheck = __decorate([
(0, decorators_1.ClusterCheck)()
], SplitBrainCheck);
//# sourceMappingURL=split-brain.check.js.map