clawsql 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.env.example +97 -0
- package/README.md +372 -0
- package/dist/__tests__/config/settings.test.d.ts +5 -0
- package/dist/__tests__/config/settings.test.d.ts.map +1 -0
- package/dist/__tests__/config/settings.test.js +154 -0
- package/dist/__tests__/config/settings.test.js.map +1 -0
- package/dist/__tests__/core/discovery/topology.test.d.ts +5 -0
- package/dist/__tests__/core/discovery/topology.test.d.ts.map +1 -0
- package/dist/__tests__/core/discovery/topology.test.js +191 -0
- package/dist/__tests__/core/discovery/topology.test.js.map +1 -0
- package/dist/__tests__/core/failover/executor.test.d.ts +5 -0
- package/dist/__tests__/core/failover/executor.test.d.ts.map +1 -0
- package/dist/__tests__/core/failover/executor.test.js +256 -0
- package/dist/__tests__/core/failover/executor.test.js.map +1 -0
- package/dist/__tests__/core/monitoring/collector.test.d.ts +5 -0
- package/dist/__tests__/core/monitoring/collector.test.d.ts.map +1 -0
- package/dist/__tests__/core/monitoring/collector.test.js +131 -0
- package/dist/__tests__/core/monitoring/collector.test.js.map +1 -0
- package/dist/__tests__/core/monitoring/exporters.test.d.ts +5 -0
- package/dist/__tests__/core/monitoring/exporters.test.d.ts.map +1 -0
- package/dist/__tests__/core/monitoring/exporters.test.js +90 -0
- package/dist/__tests__/core/monitoring/exporters.test.js.map +1 -0
- package/dist/__tests__/core/routing/proxysql-manager.test.d.ts +5 -0
- package/dist/__tests__/core/routing/proxysql-manager.test.d.ts.map +1 -0
- package/dist/__tests__/core/routing/proxysql-manager.test.js +155 -0
- package/dist/__tests__/core/routing/proxysql-manager.test.js.map +1 -0
- package/dist/__tests__/types/index.test.d.ts +5 -0
- package/dist/__tests__/types/index.test.d.ts.map +1 -0
- package/dist/__tests__/types/index.test.js +290 -0
- package/dist/__tests__/types/index.test.js.map +1 -0
- package/dist/__tests__/utils/exceptions.test.d.ts +5 -0
- package/dist/__tests__/utils/exceptions.test.d.ts.map +1 -0
- package/dist/__tests__/utils/exceptions.test.js +142 -0
- package/dist/__tests__/utils/exceptions.test.js.map +1 -0
- package/dist/api/routes/clusters.d.ts +7 -0
- package/dist/api/routes/clusters.d.ts.map +1 -0
- package/dist/api/routes/clusters.js +123 -0
- package/dist/api/routes/clusters.js.map +1 -0
- package/dist/api/routes/config.d.ts +7 -0
- package/dist/api/routes/config.d.ts.map +1 -0
- package/dist/api/routes/config.js +65 -0
- package/dist/api/routes/config.js.map +1 -0
- package/dist/api/routes/failover.d.ts +7 -0
- package/dist/api/routes/failover.d.ts.map +1 -0
- package/dist/api/routes/failover.js +100 -0
- package/dist/api/routes/failover.js.map +1 -0
- package/dist/api/routes/instances.d.ts +11 -0
- package/dist/api/routes/instances.d.ts.map +1 -0
- package/dist/api/routes/instances.js +315 -0
- package/dist/api/routes/instances.js.map +1 -0
- package/dist/api/routes/monitoring.d.ts +7 -0
- package/dist/api/routes/monitoring.d.ts.map +1 -0
- package/dist/api/routes/monitoring.js +72 -0
- package/dist/api/routes/monitoring.js.map +1 -0
- package/dist/api/routes/webhooks.d.ts +12 -0
- package/dist/api/routes/webhooks.d.ts.map +1 -0
- package/dist/api/routes/webhooks.js +232 -0
- package/dist/api/routes/webhooks.js.map +1 -0
- package/dist/api/schemas/index.d.ts +965 -0
- package/dist/api/schemas/index.d.ts.map +1 -0
- package/dist/api/schemas/index.js +171 -0
- package/dist/api/schemas/index.js.map +1 -0
- package/dist/app.d.ts +13 -0
- package/dist/app.d.ts.map +1 -0
- package/dist/app.js +197 -0
- package/dist/app.js.map +1 -0
- package/dist/bin/clawsql.d.ts +12 -0
- package/dist/bin/clawsql.d.ts.map +1 -0
- package/dist/bin/clawsql.js +43 -0
- package/dist/bin/clawsql.js.map +1 -0
- package/dist/cli/agent/handler.d.ts +73 -0
- package/dist/cli/agent/handler.d.ts.map +1 -0
- package/dist/cli/agent/handler.js +258 -0
- package/dist/cli/agent/handler.js.map +1 -0
- package/dist/cli/agent/index.d.ts +14 -0
- package/dist/cli/agent/index.d.ts.map +1 -0
- package/dist/cli/agent/index.js +30 -0
- package/dist/cli/agent/index.js.map +1 -0
- package/dist/cli/agent/openclaw-integration.d.ts +81 -0
- package/dist/cli/agent/openclaw-integration.d.ts.map +1 -0
- package/dist/cli/agent/openclaw-integration.js +341 -0
- package/dist/cli/agent/openclaw-integration.js.map +1 -0
- package/dist/cli/agent/providers/anthropic.d.ts +27 -0
- package/dist/cli/agent/providers/anthropic.d.ts.map +1 -0
- package/dist/cli/agent/providers/anthropic.js +106 -0
- package/dist/cli/agent/providers/anthropic.js.map +1 -0
- package/dist/cli/agent/providers/base.d.ts +91 -0
- package/dist/cli/agent/providers/base.d.ts.map +1 -0
- package/dist/cli/agent/providers/base.js +24 -0
- package/dist/cli/agent/providers/base.js.map +1 -0
- package/dist/cli/agent/providers/openai.d.ts +27 -0
- package/dist/cli/agent/providers/openai.d.ts.map +1 -0
- package/dist/cli/agent/providers/openai.js +98 -0
- package/dist/cli/agent/providers/openai.js.map +1 -0
- package/dist/cli/agent/tools/index.d.ts +32 -0
- package/dist/cli/agent/tools/index.d.ts.map +1 -0
- package/dist/cli/agent/tools/index.js +263 -0
- package/dist/cli/agent/tools/index.js.map +1 -0
- package/dist/cli/commands/cleanup.d.ts +12 -0
- package/dist/cli/commands/cleanup.d.ts.map +1 -0
- package/dist/cli/commands/cleanup.js +205 -0
- package/dist/cli/commands/cleanup.js.map +1 -0
- package/dist/cli/commands/clusters.d.ts +12 -0
- package/dist/cli/commands/clusters.d.ts.map +1 -0
- package/dist/cli/commands/clusters.js +468 -0
- package/dist/cli/commands/clusters.js.map +1 -0
- package/dist/cli/commands/config.d.ts +12 -0
- package/dist/cli/commands/config.d.ts.map +1 -0
- package/dist/cli/commands/config.js +406 -0
- package/dist/cli/commands/config.js.map +1 -0
- package/dist/cli/commands/cron.d.ts +12 -0
- package/dist/cli/commands/cron.d.ts.map +1 -0
- package/dist/cli/commands/cron.js +215 -0
- package/dist/cli/commands/cron.js.map +1 -0
- package/dist/cli/commands/doctor.d.ts +13 -0
- package/dist/cli/commands/doctor.d.ts.map +1 -0
- package/dist/cli/commands/doctor.js +687 -0
- package/dist/cli/commands/doctor.js.map +1 -0
- package/dist/cli/commands/failover.d.ts +16 -0
- package/dist/cli/commands/failover.d.ts.map +1 -0
- package/dist/cli/commands/failover.js +333 -0
- package/dist/cli/commands/failover.js.map +1 -0
- package/dist/cli/commands/health.d.ts +12 -0
- package/dist/cli/commands/health.d.ts.map +1 -0
- package/dist/cli/commands/health.js +125 -0
- package/dist/cli/commands/health.js.map +1 -0
- package/dist/cli/commands/help.d.ts +12 -0
- package/dist/cli/commands/help.d.ts.map +1 -0
- package/dist/cli/commands/help.js +52 -0
- package/dist/cli/commands/help.js.map +1 -0
- package/dist/cli/commands/instances.d.ts +12 -0
- package/dist/cli/commands/instances.d.ts.map +1 -0
- package/dist/cli/commands/instances.js +801 -0
- package/dist/cli/commands/instances.js.map +1 -0
- package/dist/cli/commands/notify.d.ts +12 -0
- package/dist/cli/commands/notify.d.ts.map +1 -0
- package/dist/cli/commands/notify.js +43 -0
- package/dist/cli/commands/notify.js.map +1 -0
- package/dist/cli/commands/sql.d.ts +12 -0
- package/dist/cli/commands/sql.d.ts.map +1 -0
- package/dist/cli/commands/sql.js +90 -0
- package/dist/cli/commands/sql.js.map +1 -0
- package/dist/cli/commands/start.d.ts +12 -0
- package/dist/cli/commands/start.d.ts.map +1 -0
- package/dist/cli/commands/start.js +174 -0
- package/dist/cli/commands/start.js.map +1 -0
- package/dist/cli/commands/status.d.ts +12 -0
- package/dist/cli/commands/status.d.ts.map +1 -0
- package/dist/cli/commands/status.js +218 -0
- package/dist/cli/commands/status.js.map +1 -0
- package/dist/cli/commands/stop.d.ts +12 -0
- package/dist/cli/commands/stop.d.ts.map +1 -0
- package/dist/cli/commands/stop.js +128 -0
- package/dist/cli/commands/stop.js.map +1 -0
- package/dist/cli/commands/topology.d.ts +12 -0
- package/dist/cli/commands/topology.d.ts.map +1 -0
- package/dist/cli/commands/topology.js +106 -0
- package/dist/cli/commands/topology.js.map +1 -0
- package/dist/cli/completer.d.ts +47 -0
- package/dist/cli/completer.d.ts.map +1 -0
- package/dist/cli/completer.js +332 -0
- package/dist/cli/completer.js.map +1 -0
- package/dist/cli/formatter.d.ts +165 -0
- package/dist/cli/formatter.d.ts.map +1 -0
- package/dist/cli/formatter.js +408 -0
- package/dist/cli/formatter.js.map +1 -0
- package/dist/cli/index.d.ts +21 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +79 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/cli/raw-input.d.ts +97 -0
- package/dist/cli/raw-input.d.ts.map +1 -0
- package/dist/cli/raw-input.js +493 -0
- package/dist/cli/raw-input.js.map +1 -0
- package/dist/cli/registry.d.ts +103 -0
- package/dist/cli/registry.d.ts.map +1 -0
- package/dist/cli/registry.js +205 -0
- package/dist/cli/registry.js.map +1 -0
- package/dist/cli/repl.d.ts +83 -0
- package/dist/cli/repl.d.ts.map +1 -0
- package/dist/cli/repl.js +447 -0
- package/dist/cli/repl.js.map +1 -0
- package/dist/cli/ui/components.d.ts +144 -0
- package/dist/cli/ui/components.d.ts.map +1 -0
- package/dist/cli/ui/components.js +331 -0
- package/dist/cli/ui/components.js.map +1 -0
- package/dist/cli/ui/index.d.ts +7 -0
- package/dist/cli/ui/index.d.ts.map +1 -0
- package/dist/cli/ui/index.js +23 -0
- package/dist/cli/ui/index.js.map +1 -0
- package/dist/cli/utils/docker-files.d.ts +39 -0
- package/dist/cli/utils/docker-files.d.ts.map +1 -0
- package/dist/cli/utils/docker-files.js +223 -0
- package/dist/cli/utils/docker-files.js.map +1 -0
- package/dist/cli/utils/docker-prereq.d.ts +48 -0
- package/dist/cli/utils/docker-prereq.d.ts.map +1 -0
- package/dist/cli/utils/docker-prereq.js +203 -0
- package/dist/cli/utils/docker-prereq.js.map +1 -0
- package/dist/config/settings.d.ts +594 -0
- package/dist/config/settings.d.ts.map +1 -0
- package/dist/config/settings.js +250 -0
- package/dist/config/settings.js.map +1 -0
- package/dist/core/discovery/cluster-view.d.ts +50 -0
- package/dist/core/discovery/cluster-view.d.ts.map +1 -0
- package/dist/core/discovery/cluster-view.js +235 -0
- package/dist/core/discovery/cluster-view.js.map +1 -0
- package/dist/core/discovery/scanner.d.ts +70 -0
- package/dist/core/discovery/scanner.d.ts.map +1 -0
- package/dist/core/discovery/scanner.js +197 -0
- package/dist/core/discovery/scanner.js.map +1 -0
- package/dist/core/discovery/topology.d.ts +118 -0
- package/dist/core/discovery/topology.d.ts.map +1 -0
- package/dist/core/discovery/topology.js +550 -0
- package/dist/core/discovery/topology.js.map +1 -0
- package/dist/core/failover/candidate-selector.d.ts +46 -0
- package/dist/core/failover/candidate-selector.d.ts.map +1 -0
- package/dist/core/failover/candidate-selector.js +70 -0
- package/dist/core/failover/candidate-selector.js.map +1 -0
- package/dist/core/failover/executor.d.ts +104 -0
- package/dist/core/failover/executor.d.ts.map +1 -0
- package/dist/core/failover/executor.js +248 -0
- package/dist/core/failover/executor.js.map +1 -0
- package/dist/core/failover/operation-builder.d.ts +71 -0
- package/dist/core/failover/operation-builder.d.ts.map +1 -0
- package/dist/core/failover/operation-builder.js +157 -0
- package/dist/core/failover/operation-builder.js.map +1 -0
- package/dist/core/failover/operation-runner.d.ts +75 -0
- package/dist/core/failover/operation-runner.d.ts.map +1 -0
- package/dist/core/failover/operation-runner.js +191 -0
- package/dist/core/failover/operation-runner.js.map +1 -0
- package/dist/core/failover/promoter.d.ts +33 -0
- package/dist/core/failover/promoter.d.ts.map +1 -0
- package/dist/core/failover/promoter.js +97 -0
- package/dist/core/failover/promoter.js.map +1 -0
- package/dist/core/failover/recovery-manager.d.ts +47 -0
- package/dist/core/failover/recovery-manager.d.ts.map +1 -0
- package/dist/core/failover/recovery-manager.js +145 -0
- package/dist/core/failover/recovery-manager.js.map +1 -0
- package/dist/core/failover/types.d.ts +54 -0
- package/dist/core/failover/types.d.ts.map +1 -0
- package/dist/core/failover/types.js +8 -0
- package/dist/core/failover/types.js.map +1 -0
- package/dist/core/monitoring/collector.d.ts +25 -0
- package/dist/core/monitoring/collector.d.ts.map +1 -0
- package/dist/core/monitoring/collector.js +115 -0
- package/dist/core/monitoring/collector.js.map +1 -0
- package/dist/core/monitoring/exporters.d.ts +49 -0
- package/dist/core/monitoring/exporters.d.ts.map +1 -0
- package/dist/core/monitoring/exporters.js +126 -0
- package/dist/core/monitoring/exporters.js.map +1 -0
- package/dist/core/routing/proxysql-manager.d.ts +213 -0
- package/dist/core/routing/proxysql-manager.d.ts.map +1 -0
- package/dist/core/routing/proxysql-manager.js +632 -0
- package/dist/core/routing/proxysql-manager.js.map +1 -0
- package/dist/core/sync/replica-recovery.d.ts +40 -0
- package/dist/core/sync/replica-recovery.d.ts.map +1 -0
- package/dist/core/sync/replica-recovery.js +134 -0
- package/dist/core/sync/replica-recovery.js.map +1 -0
- package/dist/core/sync/sync-coordinator.d.ts +83 -0
- package/dist/core/sync/sync-coordinator.d.ts.map +1 -0
- package/dist/core/sync/sync-coordinator.js +254 -0
- package/dist/core/sync/sync-coordinator.js.map +1 -0
- package/dist/core/sync/topology-watcher.d.ts +76 -0
- package/dist/core/sync/topology-watcher.d.ts.map +1 -0
- package/dist/core/sync/topology-watcher.js +222 -0
- package/dist/core/sync/topology-watcher.js.map +1 -0
- package/dist/core/sync/types.d.ts +85 -0
- package/dist/core/sync/types.d.ts.map +1 -0
- package/dist/core/sync/types.js +8 -0
- package/dist/core/sync/types.js.map +1 -0
- package/dist/index.d.ts +5 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +9 -0
- package/dist/index.js.map +1 -0
- package/dist/types/index.d.ts +212 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +153 -0
- package/dist/types/index.js.map +1 -0
- package/dist/utils/database.d.ts +62 -0
- package/dist/utils/database.d.ts.map +1 -0
- package/dist/utils/database.js +257 -0
- package/dist/utils/database.js.map +1 -0
- package/dist/utils/exceptions.d.ts +69 -0
- package/dist/utils/exceptions.d.ts.map +1 -0
- package/dist/utils/exceptions.js +121 -0
- package/dist/utils/exceptions.js.map +1 -0
- package/dist/utils/logger.d.ts +20 -0
- package/dist/utils/logger.d.ts.map +1 -0
- package/dist/utils/logger.js +90 -0
- package/dist/utils/logger.js.map +1 -0
- package/dist/utils/mysql-client.d.ts +43 -0
- package/dist/utils/mysql-client.d.ts.map +1 -0
- package/dist/utils/mysql-client.js +125 -0
- package/dist/utils/mysql-client.js.map +1 -0
- package/docker/Dockerfile +61 -0
- package/docker/Dockerfile.node +41 -0
- package/docker/grafana/dashboards/clawsql.json +212 -0
- package/docker/grafana/provisioning/dashboards/dashboards.yml +13 -0
- package/docker/grafana/provisioning/datasources/datasources.yml +12 -0
- package/docker/init/primary.sql +26 -0
- package/docker/init/replica.sql +16 -0
- package/docker/orchestrator/orchestrator.conf.json +98 -0
- package/docker/prometheus/prometheus.yml +45 -0
- package/docker/proxysql/entrypoint.sh +8 -0
- package/docker/proxysql/init.sql.demo +30 -0
- package/docker/proxysql/proxysql.cnf +38 -0
- package/docker-compose.demo.yml +115 -0
- package/docker-compose.yml +217 -0
- package/init/primary.sql +19 -0
- package/init/replica.sql +13 -0
- package/package.json +84 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"operation-builder.js","sourceRoot":"","sources":["../../../src/core/failover/operation-builder.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ClawSQL - Operation Runner
|
|
3
|
+
*
|
|
4
|
+
* Base runner for failover operations.
|
|
5
|
+
* Implements the Template Method Pattern for operation execution.
|
|
6
|
+
*/
|
|
7
|
+
import { MySQLCluster, FailoverOperation } from '../../types/index.js';
|
|
8
|
+
import { FailoverHook } from './types.js';
|
|
9
|
+
import { InstancePromoter } from './promoter.js';
|
|
10
|
+
import { ProxySQLManager } from '../routing/proxysql-manager.js';
|
|
11
|
+
/**
|
|
12
|
+
* Operation Runner
|
|
13
|
+
* Executes the common flow for failover operations.
|
|
14
|
+
*/
|
|
15
|
+
export declare class OperationRunner {
|
|
16
|
+
private promoter;
|
|
17
|
+
private proxysql;
|
|
18
|
+
private preHooks;
|
|
19
|
+
private postHooks;
|
|
20
|
+
constructor(promoter: InstancePromoter, proxysql: ProxySQLManager);
|
|
21
|
+
/**
|
|
22
|
+
* Register a pre-execution hook
|
|
23
|
+
*/
|
|
24
|
+
registerPreHook(hook: FailoverHook): void;
|
|
25
|
+
/**
|
|
26
|
+
* Register a post-execution hook
|
|
27
|
+
*/
|
|
28
|
+
registerPostHook(hook: FailoverHook): void;
|
|
29
|
+
/**
|
|
30
|
+
* Execute the operation
|
|
31
|
+
* Template method that defines the skeleton of the operation.
|
|
32
|
+
*/
|
|
33
|
+
execute(operation: FailoverOperation, cluster: MySQLCluster, isSwitchover: boolean): Promise<FailoverOperation>;
|
|
34
|
+
/**
|
|
35
|
+
* Create a step logging function
|
|
36
|
+
*/
|
|
37
|
+
private createStepLogger;
|
|
38
|
+
/**
|
|
39
|
+
* Run pre-execution hooks
|
|
40
|
+
*/
|
|
41
|
+
private runPreHooks;
|
|
42
|
+
/**
|
|
43
|
+
* Select candidate for promotion
|
|
44
|
+
*/
|
|
45
|
+
private selectCandidate;
|
|
46
|
+
/**
|
|
47
|
+
* Promote the instance
|
|
48
|
+
*/
|
|
49
|
+
private promoteInstance;
|
|
50
|
+
/**
|
|
51
|
+
* Reconfigure replicas to follow new primary
|
|
52
|
+
*/
|
|
53
|
+
private reconfigureReplicas;
|
|
54
|
+
/**
|
|
55
|
+
* Update routing rules
|
|
56
|
+
*/
|
|
57
|
+
private updateRouting;
|
|
58
|
+
/**
|
|
59
|
+
* Run post-execution hooks
|
|
60
|
+
*/
|
|
61
|
+
private runPostHooks;
|
|
62
|
+
/**
|
|
63
|
+
* Handle operation failure
|
|
64
|
+
*/
|
|
65
|
+
private handleFailure;
|
|
66
|
+
/**
|
|
67
|
+
* Get promotion message
|
|
68
|
+
*/
|
|
69
|
+
private getPromotionMessage;
|
|
70
|
+
/**
|
|
71
|
+
* Get success message
|
|
72
|
+
*/
|
|
73
|
+
private getSuccessMessage;
|
|
74
|
+
}
|
|
75
|
+
//# sourceMappingURL=operation-runner.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"operation-runner.d.ts","sourceRoot":"","sources":["../../../src/core/failover/operation-runner.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,EAAE,YAAY,EAAiB,iBAAiB,EAAiB,MAAM,sBAAsB,CAAC;AAErG,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAC1C,OAAO,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AAEjD,OAAO,EAAE,eAAe,EAAE,MAAM,gCAAgC,CAAC;AASjE;;;GAGG;AACH,qBAAa,eAAe;IAKxB,OAAO,CAAC,QAAQ;IAChB,OAAO,CAAC,QAAQ;IALlB,OAAO,CAAC,QAAQ,CAAsB;IACtC,OAAO,CAAC,SAAS,CAAsB;gBAG7B,QAAQ,EAAE,gBAAgB,EAC1B,QAAQ,EAAE,eAAe;IAGnC;;OAEG;IACH,eAAe,CAAC,IAAI,EAAE,YAAY,GAAG,IAAI;IAIzC;;OAEG;IACH,gBAAgB,CAAC,IAAI,EAAE,YAAY,GAAG,IAAI;IAI1C;;;OAGG;IACG,OAAO,CACX,SAAS,EAAE,iBAAiB,EAC5B,OAAO,EAAE,YAAY,EACrB,YAAY,EAAE,OAAO,GACpB,OAAO,CAAC,iBAAiB,CAAC;IAwC7B;;OAEG;IACH,OAAO,CAAC,gBAAgB;IAOxB;;OAEG;YACW,WAAW;IAWzB;;OAEG;YACW,eAAe;IA2B7B;;OAEG;YACW,eAAe;IAqB7B;;OAEG;YACW,mBAAmB;IAsBjC;;OAEG;YACW,aAAa;IAe3B;;OAEG;YACW,YAAY;IAa1B;;OAEG;IACH,OAAO,CAAC,aAAa;IAgBrB;;OAEG;IACH,OAAO,CAAC,mBAAmB;IAM3B;;OAEG;IACH,OAAO,CAAC,iBAAiB;CAG1B"}
|
|
@@ -0,0 +1,191 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* ClawSQL - Operation Runner
|
|
4
|
+
*
|
|
5
|
+
* Base runner for failover operations.
|
|
6
|
+
* Implements the Template Method Pattern for operation execution.
|
|
7
|
+
*/
|
|
8
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
9
|
+
exports.OperationRunner = void 0;
|
|
10
|
+
const logger_js_1 = require("../../utils/logger.js");
|
|
11
|
+
const index_js_1 = require("../../types/index.js");
|
|
12
|
+
const exceptions_js_1 = require("../../utils/exceptions.js");
|
|
13
|
+
const candidate_selector_js_1 = require("./candidate-selector.js");
|
|
14
|
+
const proxysql_manager_js_1 = require("../routing/proxysql-manager.js");
|
|
15
|
+
const logger = (0, logger_js_1.getLogger)('failover');
|
|
16
|
+
/**
|
|
17
|
+
* Operation Runner
|
|
18
|
+
* Executes the common flow for failover operations.
|
|
19
|
+
*/
|
|
20
|
+
class OperationRunner {
|
|
21
|
+
promoter;
|
|
22
|
+
proxysql;
|
|
23
|
+
preHooks = [];
|
|
24
|
+
postHooks = [];
|
|
25
|
+
constructor(promoter, proxysql) {
|
|
26
|
+
this.promoter = promoter;
|
|
27
|
+
this.proxysql = proxysql;
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Register a pre-execution hook
|
|
31
|
+
*/
|
|
32
|
+
registerPreHook(hook) {
|
|
33
|
+
this.preHooks.push(hook);
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Register a post-execution hook
|
|
37
|
+
*/
|
|
38
|
+
registerPostHook(hook) {
|
|
39
|
+
this.postHooks.push(hook);
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Execute the operation
|
|
43
|
+
* Template method that defines the skeleton of the operation.
|
|
44
|
+
*/
|
|
45
|
+
async execute(operation, cluster, isSwitchover) {
|
|
46
|
+
const addStep = this.createStepLogger(operation);
|
|
47
|
+
operation.startedAt = new Date();
|
|
48
|
+
operation.state = index_js_1.FailoverState.DETECTING;
|
|
49
|
+
try {
|
|
50
|
+
// 1. Pre-execution hooks
|
|
51
|
+
await this.runPreHooks(operation, cluster, addStep);
|
|
52
|
+
// 2. Select candidate
|
|
53
|
+
const newPrimary = await this.selectCandidate(operation, cluster, addStep);
|
|
54
|
+
// 3. Promote instance
|
|
55
|
+
await this.promoteInstance(operation, cluster, newPrimary, isSwitchover, addStep);
|
|
56
|
+
// 4. Reconfigure replicas
|
|
57
|
+
await this.reconfigureReplicas(operation, cluster, newPrimary, addStep);
|
|
58
|
+
// 5. Update routing
|
|
59
|
+
await this.updateRouting(operation, cluster, newPrimary, addStep);
|
|
60
|
+
// Success
|
|
61
|
+
operation.state = index_js_1.FailoverState.COMPLETED;
|
|
62
|
+
operation.completedAt = new Date();
|
|
63
|
+
addStep(this.getSuccessMessage(isSwitchover));
|
|
64
|
+
logger.info({ operationId: operation.operationId, clusterId: cluster.clusterId }, this.getSuccessMessage(isSwitchover));
|
|
65
|
+
}
|
|
66
|
+
catch (error) {
|
|
67
|
+
this.handleFailure(operation, error, addStep, isSwitchover);
|
|
68
|
+
}
|
|
69
|
+
finally {
|
|
70
|
+
await this.runPostHooks(operation, cluster);
|
|
71
|
+
}
|
|
72
|
+
return operation;
|
|
73
|
+
}
|
|
74
|
+
/**
|
|
75
|
+
* Create a step logging function
|
|
76
|
+
*/
|
|
77
|
+
createStepLogger(operation) {
|
|
78
|
+
return (step) => {
|
|
79
|
+
const timestamp = new Date().toISOString();
|
|
80
|
+
operation.steps.push(`[${timestamp}] ${step}`);
|
|
81
|
+
};
|
|
82
|
+
}
|
|
83
|
+
/**
|
|
84
|
+
* Run pre-execution hooks
|
|
85
|
+
*/
|
|
86
|
+
async runPreHooks(operation, cluster, addStep) {
|
|
87
|
+
addStep('Running pre-execution hooks');
|
|
88
|
+
for (const hook of this.preHooks) {
|
|
89
|
+
await hook(operation, cluster);
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
/**
|
|
93
|
+
* Select candidate for promotion
|
|
94
|
+
*/
|
|
95
|
+
async selectCandidate(operation, cluster, addStep) {
|
|
96
|
+
operation.state = index_js_1.FailoverState.CANDIDATE_SELECTION;
|
|
97
|
+
addStep('Selecting candidate for promotion');
|
|
98
|
+
// Auto-select if not specified
|
|
99
|
+
if (!operation.newPrimaryId) {
|
|
100
|
+
const selector = new candidate_selector_js_1.CandidateSelector();
|
|
101
|
+
const candidate = selector.select(cluster);
|
|
102
|
+
if (!candidate) {
|
|
103
|
+
throw new exceptions_js_1.FailoverError('No suitable candidate found for promotion');
|
|
104
|
+
}
|
|
105
|
+
operation.newPrimaryId = candidate_selector_js_1.CandidateSelector.getInstanceId(candidate);
|
|
106
|
+
}
|
|
107
|
+
// Find the instance
|
|
108
|
+
const newPrimary = candidate_selector_js_1.CandidateSelector.findReplica(cluster, operation.newPrimaryId);
|
|
109
|
+
if (!newPrimary) {
|
|
110
|
+
throw new exceptions_js_1.FailoverError(`Candidate ${operation.newPrimaryId} not found`);
|
|
111
|
+
}
|
|
112
|
+
return newPrimary;
|
|
113
|
+
}
|
|
114
|
+
/**
|
|
115
|
+
* Promote the instance
|
|
116
|
+
*/
|
|
117
|
+
async promoteInstance(operation, cluster, newPrimary, isSwitchover, addStep) {
|
|
118
|
+
operation.state = index_js_1.FailoverState.PROMOTING;
|
|
119
|
+
addStep(this.getPromotionMessage(operation.newPrimaryId, isSwitchover));
|
|
120
|
+
const result = await this.promoter.promote(newPrimary, cluster, isSwitchover);
|
|
121
|
+
if (!result.success) {
|
|
122
|
+
throw new exceptions_js_1.FailoverError(result.error || 'Promotion failed');
|
|
123
|
+
}
|
|
124
|
+
if (isSwitchover) {
|
|
125
|
+
addStep('Started replication on demoted primary');
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
/**
|
|
129
|
+
* Reconfigure replicas to follow new primary
|
|
130
|
+
*/
|
|
131
|
+
async reconfigureReplicas(operation, cluster, newPrimary, addStep) {
|
|
132
|
+
operation.state = index_js_1.FailoverState.RECONFIGURING;
|
|
133
|
+
addStep('Reconfiguring replicas');
|
|
134
|
+
const otherReplicas = cluster.replicas.filter(r => `${r.host}:${r.port}` !== operation.newPrimaryId);
|
|
135
|
+
for (const replica of otherReplicas) {
|
|
136
|
+
try {
|
|
137
|
+
await this.proxysql.relocateReplica(replica, newPrimary);
|
|
138
|
+
}
|
|
139
|
+
catch (error) {
|
|
140
|
+
logger.warn({ error, replica: `${replica.host}:${replica.port}` }, 'Failed to reconfigure replica');
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
/**
|
|
145
|
+
* Update routing rules
|
|
146
|
+
*/
|
|
147
|
+
async updateRouting(_operation, cluster, newPrimary, addStep) {
|
|
148
|
+
addStep('Updating routing rules');
|
|
149
|
+
await this.proxysql.syncCluster({ ...cluster, primary: newPrimary }, proxysql_manager_js_1.ProxySQLManager.DEFAULT_WRITER_HOSTGROUP, proxysql_manager_js_1.ProxySQLManager.DEFAULT_READER_HOSTGROUP);
|
|
150
|
+
}
|
|
151
|
+
/**
|
|
152
|
+
* Run post-execution hooks
|
|
153
|
+
*/
|
|
154
|
+
async runPostHooks(operation, cluster) {
|
|
155
|
+
for (const hook of this.postHooks) {
|
|
156
|
+
try {
|
|
157
|
+
await hook(operation, cluster);
|
|
158
|
+
}
|
|
159
|
+
catch (error) {
|
|
160
|
+
logger.error({ error }, 'Post-execution hook error');
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
/**
|
|
165
|
+
* Handle operation failure
|
|
166
|
+
*/
|
|
167
|
+
handleFailure(operation, error, addStep, isSwitchover) {
|
|
168
|
+
operation.state = index_js_1.FailoverState.FAILED;
|
|
169
|
+
operation.error = error instanceof Error ? error.message : String(error);
|
|
170
|
+
operation.completedAt = new Date();
|
|
171
|
+
const operationType = isSwitchover ? 'Switchover' : 'Failover';
|
|
172
|
+
addStep(`${operationType} failed: ${operation.error}`);
|
|
173
|
+
logger.error({ error, operationId: operation.operationId }, `${operationType} failed`);
|
|
174
|
+
}
|
|
175
|
+
/**
|
|
176
|
+
* Get promotion message
|
|
177
|
+
*/
|
|
178
|
+
getPromotionMessage(targetId, isSwitchover) {
|
|
179
|
+
return isSwitchover
|
|
180
|
+
? `Switching over to ${targetId}`
|
|
181
|
+
: `Promoting ${targetId} to primary (failover)`;
|
|
182
|
+
}
|
|
183
|
+
/**
|
|
184
|
+
* Get success message
|
|
185
|
+
*/
|
|
186
|
+
getSuccessMessage(isSwitchover) {
|
|
187
|
+
return isSwitchover ? 'Switchover completed successfully' : 'Failover completed successfully';
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
exports.OperationRunner = OperationRunner;
|
|
191
|
+
//# sourceMappingURL=operation-runner.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"operation-runner.js","sourceRoot":"","sources":["../../../src/core/failover/operation-runner.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ClawSQL - Instance Promoter
|
|
3
|
+
*
|
|
4
|
+
* Handles the promotion of instances to primary role.
|
|
5
|
+
* Coordinates with Orchestrator for the actual promotion.
|
|
6
|
+
*/
|
|
7
|
+
import { MySQLCluster, MySQLInstance } from '../../types/index.js';
|
|
8
|
+
import { OrchestratorClient } from '../discovery/topology.js';
|
|
9
|
+
import { PromotionResult } from './types.js';
|
|
10
|
+
/**
|
|
11
|
+
* Instance Promoter
|
|
12
|
+
* Handles promotion logic and post-promotion tasks.
|
|
13
|
+
*/
|
|
14
|
+
export declare class InstancePromoter {
|
|
15
|
+
private orchestrator;
|
|
16
|
+
constructor(orchestrator: OrchestratorClient);
|
|
17
|
+
/**
|
|
18
|
+
* Promote an instance to primary
|
|
19
|
+
* @param instance - The instance to promote
|
|
20
|
+
* @param cluster - The cluster context
|
|
21
|
+
* @param isSwitchover - True for switchover (primary healthy), false for failover
|
|
22
|
+
*/
|
|
23
|
+
promote(instance: MySQLInstance, cluster: MySQLCluster, isSwitchover: boolean): Promise<PromotionResult>;
|
|
24
|
+
/**
|
|
25
|
+
* Execute the promotion via Orchestrator
|
|
26
|
+
*/
|
|
27
|
+
private executePromotion;
|
|
28
|
+
/**
|
|
29
|
+
* Start replication on the demoted primary
|
|
30
|
+
*/
|
|
31
|
+
private startReplicationOnDemotedPrimary;
|
|
32
|
+
}
|
|
33
|
+
//# sourceMappingURL=promoter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"promoter.d.ts","sourceRoot":"","sources":["../../../src/core/failover/promoter.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACnE,OAAO,EAAE,kBAAkB,EAAE,MAAM,0BAA0B,CAAC;AAE9D,OAAO,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AA2B7C;;;GAGG;AACH,qBAAa,gBAAgB;IACf,OAAO,CAAC,YAAY;gBAAZ,YAAY,EAAE,kBAAkB;IAEpD;;;;;OAKG;IACG,OAAO,CACX,QAAQ,EAAE,aAAa,EACvB,OAAO,EAAE,YAAY,EACrB,YAAY,EAAE,OAAO,GACpB,OAAO,CAAC,eAAe,CAAC;IA0B3B;;OAEG;YACW,gBAAgB;IAqB9B;;OAEG;YACW,gCAAgC;CAgB/C"}
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* ClawSQL - Instance Promoter
|
|
4
|
+
*
|
|
5
|
+
* Handles the promotion of instances to primary role.
|
|
6
|
+
* Coordinates with Orchestrator for the actual promotion.
|
|
7
|
+
*/
|
|
8
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
9
|
+
exports.InstancePromoter = void 0;
|
|
10
|
+
const logger_js_1 = require("../../utils/logger.js");
|
|
11
|
+
const mysql_client_js_1 = require("../../utils/mysql-client.js");
|
|
12
|
+
const logger = (0, logger_js_1.getLogger)('failover');
|
|
13
|
+
/**
|
|
14
|
+
* Orchestrator response success indicators
|
|
15
|
+
*/
|
|
16
|
+
const SUCCESS_INDICATORS = ['Code', 'IsSuccessful', 'Success'];
|
|
17
|
+
/**
|
|
18
|
+
* Check if Orchestrator response indicates success
|
|
19
|
+
*/
|
|
20
|
+
function isSuccessfulResponse(result) {
|
|
21
|
+
if (!result)
|
|
22
|
+
return false;
|
|
23
|
+
return SUCCESS_INDICATORS.some(key => result[key] === 'OK' || result[key] === true);
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Extract error message from Orchestrator response
|
|
27
|
+
*/
|
|
28
|
+
function extractError(result) {
|
|
29
|
+
if (!result)
|
|
30
|
+
return 'Unknown error';
|
|
31
|
+
return result.Message || result.Error || JSON.stringify(result);
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Instance Promoter
|
|
35
|
+
* Handles promotion logic and post-promotion tasks.
|
|
36
|
+
*/
|
|
37
|
+
class InstancePromoter {
|
|
38
|
+
orchestrator;
|
|
39
|
+
constructor(orchestrator) {
|
|
40
|
+
this.orchestrator = orchestrator;
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Promote an instance to primary
|
|
44
|
+
* @param instance - The instance to promote
|
|
45
|
+
* @param cluster - The cluster context
|
|
46
|
+
* @param isSwitchover - True for switchover (primary healthy), false for failover
|
|
47
|
+
*/
|
|
48
|
+
async promote(instance, cluster, isSwitchover) {
|
|
49
|
+
const clusterAlias = cluster.clusterId;
|
|
50
|
+
const oldPrimary = cluster.primary;
|
|
51
|
+
try {
|
|
52
|
+
const result = await this.executePromotion(instance, clusterAlias, isSwitchover);
|
|
53
|
+
if (!isSuccessfulResponse(result)) {
|
|
54
|
+
const errorMsg = extractError(result);
|
|
55
|
+
logger.error({ cluster: clusterAlias, result }, 'Promotion returned failure');
|
|
56
|
+
return { success: false, error: errorMsg };
|
|
57
|
+
}
|
|
58
|
+
// For switchover, start replication on the old primary
|
|
59
|
+
if (isSwitchover && oldPrimary) {
|
|
60
|
+
await this.startReplicationOnDemotedPrimary(oldPrimary);
|
|
61
|
+
}
|
|
62
|
+
return { success: true };
|
|
63
|
+
}
|
|
64
|
+
catch (error) {
|
|
65
|
+
const errorMsg = error instanceof Error ? error.message : String(error);
|
|
66
|
+
logger.error({ error, instance: `${instance.host}:${instance.port}` }, 'Promotion failed');
|
|
67
|
+
return { success: false, error: errorMsg };
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* Execute the promotion via Orchestrator
|
|
72
|
+
*/
|
|
73
|
+
async executePromotion(instance, clusterAlias, isSwitchover) {
|
|
74
|
+
if (isSwitchover) {
|
|
75
|
+
logger.info({ cluster: clusterAlias, target: `${instance.host}:${instance.port}` }, 'Performing graceful master takeover');
|
|
76
|
+
return this.orchestrator.gracefulMasterTakeover(clusterAlias, instance.host, instance.port);
|
|
77
|
+
}
|
|
78
|
+
else {
|
|
79
|
+
logger.info({ cluster: clusterAlias }, 'Performing force master failover');
|
|
80
|
+
return this.orchestrator.forceMasterFailover(clusterAlias);
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
/**
|
|
84
|
+
* Start replication on the demoted primary
|
|
85
|
+
*/
|
|
86
|
+
async startReplicationOnDemotedPrimary(oldPrimary) {
|
|
87
|
+
const instanceId = `${oldPrimary.host}:${oldPrimary.port}`;
|
|
88
|
+
logger.info({ oldPrimary: instanceId }, 'Starting replication on demoted primary');
|
|
89
|
+
const mysqlClient = (0, mysql_client_js_1.getMySQLClient)();
|
|
90
|
+
const started = await mysqlClient.startReplication(oldPrimary.host, oldPrimary.port);
|
|
91
|
+
if (!started) {
|
|
92
|
+
logger.warn({ oldPrimary: instanceId }, 'Failed to start replication on demoted primary - manual intervention may be needed');
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
exports.InstancePromoter = InstancePromoter;
|
|
97
|
+
//# sourceMappingURL=promoter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"promoter.js","sourceRoot":"","sources":["../../../src/core/failover/promoter.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ClawSQL - Recovery Manager
|
|
3
|
+
*
|
|
4
|
+
* Manages the recovery of instances after failover.
|
|
5
|
+
* Tracks instances that need recovery and handles the recovery process.
|
|
6
|
+
*/
|
|
7
|
+
import { OrchestratorClient } from '../discovery/topology.js';
|
|
8
|
+
import { PendingRecovery, RecoveryResult, BatchRecoveryResult } from './types.js';
|
|
9
|
+
/**
|
|
10
|
+
* Recovery Manager
|
|
11
|
+
* Handles tracking and recovery of instances after failover.
|
|
12
|
+
*/
|
|
13
|
+
export declare class RecoveryManager {
|
|
14
|
+
private orchestrator;
|
|
15
|
+
private pendingRecoveries;
|
|
16
|
+
constructor(orchestrator: OrchestratorClient);
|
|
17
|
+
/**
|
|
18
|
+
* Queue an instance for recovery
|
|
19
|
+
*/
|
|
20
|
+
queueForRecovery(recovery: PendingRecovery): void;
|
|
21
|
+
/**
|
|
22
|
+
* Get all pending recoveries
|
|
23
|
+
*/
|
|
24
|
+
getPending(): PendingRecovery[];
|
|
25
|
+
/**
|
|
26
|
+
* Check if an instance is pending recovery
|
|
27
|
+
*/
|
|
28
|
+
isPending(instanceId: string): boolean;
|
|
29
|
+
/**
|
|
30
|
+
* Clear a pending recovery
|
|
31
|
+
*/
|
|
32
|
+
clear(instanceId: string): boolean;
|
|
33
|
+
/**
|
|
34
|
+
* Recover a specific instance
|
|
35
|
+
*/
|
|
36
|
+
recover(instanceId: string): Promise<RecoveryResult>;
|
|
37
|
+
/**
|
|
38
|
+
* Recover all pending instances
|
|
39
|
+
*/
|
|
40
|
+
recoverAll(): Promise<BatchRecoveryResult>;
|
|
41
|
+
/**
|
|
42
|
+
* Create a pending recovery record
|
|
43
|
+
*/
|
|
44
|
+
static createPendingRecovery(clusterId: string, host: string, port: number, newPrimaryId: string): PendingRecovery;
|
|
45
|
+
private delay;
|
|
46
|
+
}
|
|
47
|
+
//# sourceMappingURL=recovery-manager.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"recovery-manager.d.ts","sourceRoot":"","sources":["../../../src/core/failover/recovery-manager.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH,OAAO,EAAE,kBAAkB,EAAE,MAAM,0BAA0B,CAAC;AAE9D,OAAO,EAAE,eAAe,EAAE,cAAc,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC;AAIlF;;;GAGG;AACH,qBAAa,eAAe;IAGd,OAAO,CAAC,YAAY;IAFhC,OAAO,CAAC,iBAAiB,CAA2C;gBAEhD,YAAY,EAAE,kBAAkB;IAEpD;;OAEG;IACH,gBAAgB,CAAC,QAAQ,EAAE,eAAe,GAAG,IAAI;IAQjD;;OAEG;IACH,UAAU,IAAI,eAAe,EAAE;IAI/B;;OAEG;IACH,SAAS,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO;IAItC;;OAEG;IACH,KAAK,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO;IAIlC;;OAEG;IACG,OAAO,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,CAAC;IA6D1D;;OAEG;IACG,UAAU,IAAI,OAAO,CAAC,mBAAmB,CAAC;IA0BhD;;OAEG;IACH,MAAM,CAAC,qBAAqB,CAC1B,SAAS,EAAE,MAAM,EACjB,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,MAAM,EACZ,YAAY,EAAE,MAAM,GACnB,eAAe;IAWlB,OAAO,CAAC,KAAK;CAGd"}
|
|
@@ -0,0 +1,145 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* ClawSQL - Recovery Manager
|
|
4
|
+
*
|
|
5
|
+
* Manages the recovery of instances after failover.
|
|
6
|
+
* Tracks instances that need recovery and handles the recovery process.
|
|
7
|
+
*/
|
|
8
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
9
|
+
exports.RecoveryManager = void 0;
|
|
10
|
+
const logger_js_1 = require("../../utils/logger.js");
|
|
11
|
+
const index_js_1 = require("../../types/index.js");
|
|
12
|
+
const mysql_client_js_1 = require("../../utils/mysql-client.js");
|
|
13
|
+
const logger = (0, logger_js_1.getLogger)('failover');
|
|
14
|
+
/**
|
|
15
|
+
* Recovery Manager
|
|
16
|
+
* Handles tracking and recovery of instances after failover.
|
|
17
|
+
*/
|
|
18
|
+
class RecoveryManager {
|
|
19
|
+
orchestrator;
|
|
20
|
+
pendingRecoveries = new Map();
|
|
21
|
+
constructor(orchestrator) {
|
|
22
|
+
this.orchestrator = orchestrator;
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Queue an instance for recovery
|
|
26
|
+
*/
|
|
27
|
+
queueForRecovery(recovery) {
|
|
28
|
+
this.pendingRecoveries.set(recovery.instanceId, recovery);
|
|
29
|
+
logger.info({ instanceId: recovery.instanceId, newPrimaryId: recovery.newPrimaryId }, 'Instance queued for recovery');
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Get all pending recoveries
|
|
33
|
+
*/
|
|
34
|
+
getPending() {
|
|
35
|
+
return Array.from(this.pendingRecoveries.values());
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Check if an instance is pending recovery
|
|
39
|
+
*/
|
|
40
|
+
isPending(instanceId) {
|
|
41
|
+
return this.pendingRecoveries.has(instanceId);
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Clear a pending recovery
|
|
45
|
+
*/
|
|
46
|
+
clear(instanceId) {
|
|
47
|
+
return this.pendingRecoveries.delete(instanceId);
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* Recover a specific instance
|
|
51
|
+
*/
|
|
52
|
+
async recover(instanceId) {
|
|
53
|
+
const pending = this.pendingRecoveries.get(instanceId);
|
|
54
|
+
if (!pending) {
|
|
55
|
+
return { success: false, message: `Instance ${instanceId} is not pending recovery` };
|
|
56
|
+
}
|
|
57
|
+
try {
|
|
58
|
+
logger.info({ instanceId, newPrimaryId: pending.newPrimaryId }, 'Attempting to recover instance');
|
|
59
|
+
// Verify instance is online
|
|
60
|
+
const instance = await this.orchestrator.getInstance(pending.host, pending.port);
|
|
61
|
+
if (!instance) {
|
|
62
|
+
return { success: false, message: `Instance ${instanceId} not found in Orchestrator` };
|
|
63
|
+
}
|
|
64
|
+
if (instance.state !== index_js_1.InstanceState.ONLINE) {
|
|
65
|
+
return {
|
|
66
|
+
success: false,
|
|
67
|
+
message: `Instance ${instanceId} is not online (state: ${instance.state})`
|
|
68
|
+
};
|
|
69
|
+
}
|
|
70
|
+
// Start replication
|
|
71
|
+
const mysqlClient = (0, mysql_client_js_1.getMySQLClient)();
|
|
72
|
+
const started = await mysqlClient.startReplication(pending.host, pending.port);
|
|
73
|
+
if (!started) {
|
|
74
|
+
return { success: false, message: `Failed to start replication on ${instanceId}` };
|
|
75
|
+
}
|
|
76
|
+
// Verify replication is running
|
|
77
|
+
await this.delay(2000);
|
|
78
|
+
const status = await mysqlClient.getReplicationStatus(pending.host, pending.port);
|
|
79
|
+
if (!status || !status.ioRunning || !status.sqlRunning) {
|
|
80
|
+
const ioStatus = status?.ioRunning ? 'running' : 'stopped';
|
|
81
|
+
const sqlStatus = status?.sqlRunning ? 'running' : 'stopped';
|
|
82
|
+
return {
|
|
83
|
+
success: false,
|
|
84
|
+
message: `Replication not fully running on ${instanceId}: IO=${ioStatus}, SQL=${sqlStatus}`
|
|
85
|
+
};
|
|
86
|
+
}
|
|
87
|
+
// Mark as recovered
|
|
88
|
+
pending.recoveredAt = new Date();
|
|
89
|
+
this.pendingRecoveries.delete(instanceId);
|
|
90
|
+
logger.info({ instanceId, newPrimaryId: pending.newPrimaryId }, 'Instance recovered successfully');
|
|
91
|
+
return {
|
|
92
|
+
success: true,
|
|
93
|
+
message: `Instance ${instanceId} recovered and replicating from ${pending.newPrimaryId}`
|
|
94
|
+
};
|
|
95
|
+
}
|
|
96
|
+
catch (error) {
|
|
97
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
98
|
+
logger.error({ error, instanceId }, 'Recovery failed');
|
|
99
|
+
return { success: false, message: `Recovery failed: ${message}` };
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
/**
|
|
103
|
+
* Recover all pending instances
|
|
104
|
+
*/
|
|
105
|
+
async recoverAll() {
|
|
106
|
+
const result = {
|
|
107
|
+
recovered: [],
|
|
108
|
+
stillPending: [],
|
|
109
|
+
errors: []
|
|
110
|
+
};
|
|
111
|
+
for (const [instanceId] of this.pendingRecoveries) {
|
|
112
|
+
const recoveryResult = await this.recover(instanceId);
|
|
113
|
+
if (recoveryResult.success) {
|
|
114
|
+
result.recovered.push(instanceId);
|
|
115
|
+
}
|
|
116
|
+
else if (recoveryResult.message.includes('not online') ||
|
|
117
|
+
recoveryResult.message.includes('not found')) {
|
|
118
|
+
result.stillPending.push(instanceId);
|
|
119
|
+
}
|
|
120
|
+
else {
|
|
121
|
+
result.errors.push(`${instanceId}: ${recoveryResult.message}`);
|
|
122
|
+
result.stillPending.push(instanceId);
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
return result;
|
|
126
|
+
}
|
|
127
|
+
/**
|
|
128
|
+
* Create a pending recovery record
|
|
129
|
+
*/
|
|
130
|
+
static createPendingRecovery(clusterId, host, port, newPrimaryId) {
|
|
131
|
+
return {
|
|
132
|
+
clusterId,
|
|
133
|
+
instanceId: `${host}:${port}`,
|
|
134
|
+
host,
|
|
135
|
+
port,
|
|
136
|
+
newPrimaryId,
|
|
137
|
+
failedAt: new Date()
|
|
138
|
+
};
|
|
139
|
+
}
|
|
140
|
+
delay(ms) {
|
|
141
|
+
return new Promise(resolve => setTimeout(resolve, ms));
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
exports.RecoveryManager = RecoveryManager;
|
|
145
|
+
//# sourceMappingURL=recovery-manager.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"recovery-manager.js","sourceRoot":"","sources":["../../../src/core/failover/recovery-manager.ts"],"names":[],"mappings":"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"}
|