@nahisaho/yata-scale 1.8.5
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/README.md +66 -0
- package/dist/CacheManager.d.ts +107 -0
- package/dist/CacheManager.d.ts.map +1 -0
- package/dist/CacheManager.js +343 -0
- package/dist/CacheManager.js.map +1 -0
- package/dist/IndexManager.d.ts +103 -0
- package/dist/IndexManager.d.ts.map +1 -0
- package/dist/IndexManager.js +385 -0
- package/dist/IndexManager.js.map +1 -0
- package/dist/MigrationHelper.d.ts +91 -0
- package/dist/MigrationHelper.d.ts.map +1 -0
- package/dist/MigrationHelper.js +220 -0
- package/dist/MigrationHelper.js.map +1 -0
- package/dist/QueryCoordinator.d.ts +76 -0
- package/dist/QueryCoordinator.d.ts.map +1 -0
- package/dist/QueryCoordinator.js +298 -0
- package/dist/QueryCoordinator.js.map +1 -0
- package/dist/ShardManager.d.ts +48 -0
- package/dist/ShardManager.d.ts.map +1 -0
- package/dist/ShardManager.js +193 -0
- package/dist/ShardManager.js.map +1 -0
- package/dist/SyncController.d.ts +102 -0
- package/dist/SyncController.d.ts.map +1 -0
- package/dist/SyncController.js +286 -0
- package/dist/SyncController.js.map +1 -0
- package/dist/YataScaleManager.d.ts +75 -0
- package/dist/YataScaleManager.d.ts.map +1 -0
- package/dist/YataScaleManager.js +265 -0
- package/dist/YataScaleManager.js.map +1 -0
- package/dist/cache/CacheManager.d.ts +116 -0
- package/dist/cache/CacheManager.d.ts.map +1 -0
- package/dist/cache/CacheManager.js +286 -0
- package/dist/cache/CacheManager.js.map +1 -0
- package/dist/cache/InvalidationManager.d.ts +91 -0
- package/dist/cache/InvalidationManager.d.ts.map +1 -0
- package/dist/cache/InvalidationManager.js +155 -0
- package/dist/cache/InvalidationManager.js.map +1 -0
- package/dist/cache/L1Cache.d.ts +97 -0
- package/dist/cache/L1Cache.d.ts.map +1 -0
- package/dist/cache/L1Cache.js +225 -0
- package/dist/cache/L1Cache.js.map +1 -0
- package/dist/cache/L2Cache.d.ts +93 -0
- package/dist/cache/L2Cache.d.ts.map +1 -0
- package/dist/cache/L2Cache.js +248 -0
- package/dist/cache/L2Cache.js.map +1 -0
- package/dist/cache/L3Cache.d.ts +101 -0
- package/dist/cache/L3Cache.d.ts.map +1 -0
- package/dist/cache/L3Cache.js +229 -0
- package/dist/cache/L3Cache.js.map +1 -0
- package/dist/cache/index.d.ts +12 -0
- package/dist/cache/index.d.ts.map +1 -0
- package/dist/cache/index.js +11 -0
- package/dist/cache/index.js.map +1 -0
- package/dist/errors.d.ts +255 -0
- package/dist/errors.d.ts.map +1 -0
- package/dist/errors.js +515 -0
- package/dist/errors.js.map +1 -0
- package/dist/index/BPlusTreeIndex.d.ts +101 -0
- package/dist/index/BPlusTreeIndex.d.ts.map +1 -0
- package/dist/index/BPlusTreeIndex.js +310 -0
- package/dist/index/BPlusTreeIndex.js.map +1 -0
- package/dist/index/BloomFilter.d.ts +85 -0
- package/dist/index/BloomFilter.d.ts.map +1 -0
- package/dist/index/BloomFilter.js +215 -0
- package/dist/index/BloomFilter.js.map +1 -0
- package/dist/index/FullTextIndex.d.ts +87 -0
- package/dist/index/FullTextIndex.d.ts.map +1 -0
- package/dist/index/FullTextIndex.js +213 -0
- package/dist/index/FullTextIndex.js.map +1 -0
- package/dist/index/GraphIndex.d.ts +116 -0
- package/dist/index/GraphIndex.d.ts.map +1 -0
- package/dist/index/GraphIndex.js +308 -0
- package/dist/index/GraphIndex.js.map +1 -0
- package/dist/index/IndexManager.d.ts +105 -0
- package/dist/index/IndexManager.d.ts.map +1 -0
- package/dist/index/IndexManager.js +287 -0
- package/dist/index/IndexManager.js.map +1 -0
- package/dist/index/index.d.ts +12 -0
- package/dist/index/index.d.ts.map +1 -0
- package/dist/index/index.js +11 -0
- package/dist/index/index.js.map +1 -0
- package/dist/index.d.ts +12 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +12 -0
- package/dist/index.js.map +1 -0
- package/dist/query/DistributedExecutor.d.ts +78 -0
- package/dist/query/DistributedExecutor.d.ts.map +1 -0
- package/dist/query/DistributedExecutor.js +232 -0
- package/dist/query/DistributedExecutor.js.map +1 -0
- package/dist/query/QueryCoordinator.d.ts +98 -0
- package/dist/query/QueryCoordinator.d.ts.map +1 -0
- package/dist/query/QueryCoordinator.js +246 -0
- package/dist/query/QueryCoordinator.js.map +1 -0
- package/dist/query/QueryPlanner.d.ts +88 -0
- package/dist/query/QueryPlanner.d.ts.map +1 -0
- package/dist/query/QueryPlanner.js +235 -0
- package/dist/query/QueryPlanner.js.map +1 -0
- package/dist/query/WorkerPool.d.ts +108 -0
- package/dist/query/WorkerPool.d.ts.map +1 -0
- package/dist/query/WorkerPool.js +195 -0
- package/dist/query/WorkerPool.js.map +1 -0
- package/dist/query/index.d.ts +11 -0
- package/dist/query/index.d.ts.map +1 -0
- package/dist/query/index.js +10 -0
- package/dist/query/index.js.map +1 -0
- package/dist/shard/GraphPartitionStrategy.d.ts +65 -0
- package/dist/shard/GraphPartitionStrategy.d.ts.map +1 -0
- package/dist/shard/GraphPartitionStrategy.js +208 -0
- package/dist/shard/GraphPartitionStrategy.js.map +1 -0
- package/dist/shard/HashPartitionStrategy.d.ts +56 -0
- package/dist/shard/HashPartitionStrategy.d.ts.map +1 -0
- package/dist/shard/HashPartitionStrategy.js +169 -0
- package/dist/shard/HashPartitionStrategy.js.map +1 -0
- package/dist/shard/RangePartitionStrategy.d.ts +63 -0
- package/dist/shard/RangePartitionStrategy.d.ts.map +1 -0
- package/dist/shard/RangePartitionStrategy.js +157 -0
- package/dist/shard/RangePartitionStrategy.js.map +1 -0
- package/dist/shard/Rebalancer.d.ts +70 -0
- package/dist/shard/Rebalancer.d.ts.map +1 -0
- package/dist/shard/Rebalancer.js +184 -0
- package/dist/shard/Rebalancer.js.map +1 -0
- package/dist/shard/ShardManager.d.ts +123 -0
- package/dist/shard/ShardManager.d.ts.map +1 -0
- package/dist/shard/ShardManager.js +353 -0
- package/dist/shard/ShardManager.js.map +1 -0
- package/dist/shard/ShardRouter.d.ts +102 -0
- package/dist/shard/ShardRouter.d.ts.map +1 -0
- package/dist/shard/ShardRouter.js +181 -0
- package/dist/shard/ShardRouter.js.map +1 -0
- package/dist/shard/index.d.ts +13 -0
- package/dist/shard/index.d.ts.map +1 -0
- package/dist/shard/index.js +12 -0
- package/dist/shard/index.js.map +1 -0
- package/dist/sync/ConflictResolver.d.ts +71 -0
- package/dist/sync/ConflictResolver.d.ts.map +1 -0
- package/dist/sync/ConflictResolver.js +214 -0
- package/dist/sync/ConflictResolver.js.map +1 -0
- package/dist/sync/SyncController.d.ts +150 -0
- package/dist/sync/SyncController.d.ts.map +1 -0
- package/dist/sync/SyncController.js +304 -0
- package/dist/sync/SyncController.js.map +1 -0
- package/dist/sync/VectorClock.d.ts +102 -0
- package/dist/sync/VectorClock.d.ts.map +1 -0
- package/dist/sync/VectorClock.js +189 -0
- package/dist/sync/VectorClock.js.map +1 -0
- package/dist/sync/WALManager.d.ts +120 -0
- package/dist/sync/WALManager.d.ts.map +1 -0
- package/dist/sync/WALManager.js +240 -0
- package/dist/sync/WALManager.js.map +1 -0
- package/dist/sync/index.d.ts +11 -0
- package/dist/sync/index.d.ts.map +1 -0
- package/dist/sync/index.js +10 -0
- package/dist/sync/index.js.map +1 -0
- package/dist/types.d.ts +323 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +7 -0
- package/dist/types.js.map +1 -0
- package/package.json +86 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"RangePartitionStrategy.js","sourceRoot":"","sources":["../../src/shard/RangePartitionStrategy.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @nahisaho/yata-scale - Rebalancer
|
|
3
|
+
*
|
|
4
|
+
* Handles shard rebalancing operations
|
|
5
|
+
*/
|
|
6
|
+
import { type Result } from 'neverthrow';
|
|
7
|
+
import type { RebalanceOptions, RebalanceJob, PartitionStrategy } from '../types.js';
|
|
8
|
+
import { RebalanceError } from '../errors.js';
|
|
9
|
+
import type { ShardStorage } from './ShardManager.js';
|
|
10
|
+
/**
|
|
11
|
+
* Rebalance plan
|
|
12
|
+
*/
|
|
13
|
+
export interface RebalancePlan {
|
|
14
|
+
readonly moves: EntityMove[];
|
|
15
|
+
readonly estimatedDuration: number;
|
|
16
|
+
readonly affectedShards: string[];
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Entity move operation
|
|
20
|
+
*/
|
|
21
|
+
export interface EntityMove {
|
|
22
|
+
readonly entityId: string;
|
|
23
|
+
readonly fromShard: string;
|
|
24
|
+
readonly toShard: string;
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Rebalance progress
|
|
28
|
+
*/
|
|
29
|
+
export interface RebalanceProgress {
|
|
30
|
+
readonly jobId: string;
|
|
31
|
+
readonly totalMoves: number;
|
|
32
|
+
readonly completedMoves: number;
|
|
33
|
+
readonly failedMoves: number;
|
|
34
|
+
readonly currentMove?: EntityMove;
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Rebalancer for moving entities between shards
|
|
38
|
+
*/
|
|
39
|
+
export declare class Rebalancer {
|
|
40
|
+
private readonly strategy;
|
|
41
|
+
private readonly getStorage;
|
|
42
|
+
private activeJobs;
|
|
43
|
+
private cancelled;
|
|
44
|
+
constructor(strategy: PartitionStrategy, getStorage: (shardId: string) => ShardStorage | undefined);
|
|
45
|
+
/**
|
|
46
|
+
* Plan a rebalance operation
|
|
47
|
+
*/
|
|
48
|
+
planRebalance(currentDistribution: Map<string, string[]>, options?: RebalanceOptions): Promise<Result<RebalancePlan, RebalanceError>>;
|
|
49
|
+
/**
|
|
50
|
+
* Execute a rebalance plan
|
|
51
|
+
*/
|
|
52
|
+
executeRebalance(plan: RebalancePlan, options?: RebalanceOptions): Promise<Result<RebalanceJob, RebalanceError>>;
|
|
53
|
+
/**
|
|
54
|
+
* Execute a single move
|
|
55
|
+
*/
|
|
56
|
+
private executeMove;
|
|
57
|
+
/**
|
|
58
|
+
* Cancel an active rebalance
|
|
59
|
+
*/
|
|
60
|
+
cancel(jobId: string): boolean;
|
|
61
|
+
/**
|
|
62
|
+
* Get progress of an active rebalance
|
|
63
|
+
*/
|
|
64
|
+
getProgress(jobId: string): RebalanceProgress | undefined;
|
|
65
|
+
/**
|
|
66
|
+
* Check if a rebalance is active
|
|
67
|
+
*/
|
|
68
|
+
isActive(jobId: string): boolean;
|
|
69
|
+
}
|
|
70
|
+
//# sourceMappingURL=Rebalancer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Rebalancer.d.ts","sourceRoot":"","sources":["../../src/shard/Rebalancer.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAW,KAAK,MAAM,EAAE,MAAM,YAAY,CAAC;AAClD,OAAO,KAAK,EAEV,gBAAgB,EAChB,YAAY,EACZ,iBAAiB,EAClB,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAC9C,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAEtD;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,KAAK,EAAE,UAAU,EAAE,CAAC;IAC7B,QAAQ,CAAC,iBAAiB,EAAE,MAAM,CAAC;IACnC,QAAQ,CAAC,cAAc,EAAE,MAAM,EAAE,CAAC;CACnC;AAED;;GAEG;AACH,MAAM,WAAW,UAAU;IACzB,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;CAC1B;AAED;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;IAChC,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,WAAW,CAAC,EAAE,UAAU,CAAC;CACnC;AAED;;GAEG;AACH,qBAAa,UAAU;IAKnB,OAAO,CAAC,QAAQ,CAAC,QAAQ;IACzB,OAAO,CAAC,QAAQ,CAAC,UAAU;IAL7B,OAAO,CAAC,UAAU,CAA6C;IAC/D,OAAO,CAAC,SAAS,CAA0B;gBAGxB,QAAQ,EAAE,iBAAiB,EAC3B,UAAU,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,YAAY,GAAG,SAAS;IAG5E;;OAEG;IACG,aAAa,CACjB,mBAAmB,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,EAC1C,OAAO,CAAC,EAAE,gBAAgB,GACzB,OAAO,CAAC,MAAM,CAAC,aAAa,EAAE,cAAc,CAAC,CAAC;IAyDjD;;OAEG;IACG,gBAAgB,CACpB,IAAI,EAAE,aAAa,EACnB,OAAO,CAAC,EAAE,gBAAgB,GACzB,OAAO,CAAC,MAAM,CAAC,YAAY,EAAE,cAAc,CAAC,CAAC;IA4EhD;;OAEG;YACW,WAAW;IAyCzB;;OAEG;IACH,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO;IAQ9B;;OAEG;IACH,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,iBAAiB,GAAG,SAAS;IAIzD;;OAEG;IACH,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO;CAGjC"}
|
|
@@ -0,0 +1,184 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @nahisaho/yata-scale - Rebalancer
|
|
3
|
+
*
|
|
4
|
+
* Handles shard rebalancing operations
|
|
5
|
+
*/
|
|
6
|
+
import { ok, err } from 'neverthrow';
|
|
7
|
+
import { RebalanceError } from '../errors.js';
|
|
8
|
+
/**
|
|
9
|
+
* Rebalancer for moving entities between shards
|
|
10
|
+
*/
|
|
11
|
+
export class Rebalancer {
|
|
12
|
+
strategy;
|
|
13
|
+
getStorage;
|
|
14
|
+
activeJobs = new Map();
|
|
15
|
+
cancelled = new Set();
|
|
16
|
+
constructor(strategy, getStorage) {
|
|
17
|
+
this.strategy = strategy;
|
|
18
|
+
this.getStorage = getStorage;
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Plan a rebalance operation
|
|
22
|
+
*/
|
|
23
|
+
async planRebalance(currentDistribution, options) {
|
|
24
|
+
const moves = [];
|
|
25
|
+
const affectedShards = new Set();
|
|
26
|
+
// Get target shards
|
|
27
|
+
const targetShards = options?.targetShards ?? [...currentDistribution.keys()];
|
|
28
|
+
// Calculate ideal distribution
|
|
29
|
+
const totalEntities = [...currentDistribution.values()].reduce((sum, entities) => sum + entities.length, 0);
|
|
30
|
+
const idealPerShard = Math.ceil(totalEntities / targetShards.length);
|
|
31
|
+
// Find overloaded and underloaded shards
|
|
32
|
+
const overloaded = new Map();
|
|
33
|
+
const underloaded = new Map();
|
|
34
|
+
for (const shardId of targetShards) {
|
|
35
|
+
const entities = currentDistribution.get(shardId) ?? [];
|
|
36
|
+
const excess = entities.length - idealPerShard;
|
|
37
|
+
if (excess > 0) {
|
|
38
|
+
// This shard has too many entities
|
|
39
|
+
overloaded.set(shardId, entities.slice(0, excess));
|
|
40
|
+
affectedShards.add(shardId);
|
|
41
|
+
}
|
|
42
|
+
else if (excess < 0) {
|
|
43
|
+
// This shard can accept more entities
|
|
44
|
+
underloaded.set(shardId, -excess);
|
|
45
|
+
affectedShards.add(shardId);
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
// Create move plan
|
|
49
|
+
for (const [fromShard, excessEntities] of overloaded) {
|
|
50
|
+
for (const entityId of excessEntities) {
|
|
51
|
+
// Find shard with capacity
|
|
52
|
+
for (const [toShard, capacity] of underloaded) {
|
|
53
|
+
if (capacity > 0) {
|
|
54
|
+
moves.push({ entityId, fromShard, toShard });
|
|
55
|
+
underloaded.set(toShard, capacity - 1);
|
|
56
|
+
break;
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
// Estimate duration (1ms per move as baseline)
|
|
62
|
+
const estimatedDuration = moves.length * 10;
|
|
63
|
+
return ok({
|
|
64
|
+
moves,
|
|
65
|
+
estimatedDuration,
|
|
66
|
+
affectedShards: [...affectedShards],
|
|
67
|
+
});
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* Execute a rebalance plan
|
|
71
|
+
*/
|
|
72
|
+
async executeRebalance(plan, options) {
|
|
73
|
+
const jobId = `rebalance-${Date.now()}`;
|
|
74
|
+
const maxConcurrency = options?.maxConcurrency ?? 10;
|
|
75
|
+
const progress = {
|
|
76
|
+
jobId,
|
|
77
|
+
totalMoves: plan.moves.length,
|
|
78
|
+
completedMoves: 0,
|
|
79
|
+
failedMoves: 0,
|
|
80
|
+
};
|
|
81
|
+
this.activeJobs.set(jobId, progress);
|
|
82
|
+
// Dry run just returns the plan
|
|
83
|
+
if (options?.dryRun) {
|
|
84
|
+
const job = {
|
|
85
|
+
jobId,
|
|
86
|
+
status: 'completed',
|
|
87
|
+
progress: 100,
|
|
88
|
+
entitiesMoved: 0,
|
|
89
|
+
startedAt: new Date(),
|
|
90
|
+
completedAt: new Date(),
|
|
91
|
+
};
|
|
92
|
+
return ok(job);
|
|
93
|
+
}
|
|
94
|
+
// Execute moves in batches
|
|
95
|
+
const startedAt = new Date();
|
|
96
|
+
let completedMoves = 0;
|
|
97
|
+
let failedMoves = 0;
|
|
98
|
+
for (let i = 0; i < plan.moves.length; i += maxConcurrency) {
|
|
99
|
+
// Check for cancellation
|
|
100
|
+
if (this.cancelled.has(jobId)) {
|
|
101
|
+
this.activeJobs.delete(jobId);
|
|
102
|
+
this.cancelled.delete(jobId);
|
|
103
|
+
return err(new RebalanceError('Rebalance cancelled', jobId));
|
|
104
|
+
}
|
|
105
|
+
const batch = plan.moves.slice(i, i + maxConcurrency);
|
|
106
|
+
const results = await Promise.allSettled(batch.map((move) => this.executeMove(move)));
|
|
107
|
+
for (const result of results) {
|
|
108
|
+
if (result.status === 'fulfilled' && result.value.isOk()) {
|
|
109
|
+
completedMoves++;
|
|
110
|
+
}
|
|
111
|
+
else {
|
|
112
|
+
failedMoves++;
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
// Update progress
|
|
116
|
+
this.activeJobs.set(jobId, {
|
|
117
|
+
...progress,
|
|
118
|
+
completedMoves,
|
|
119
|
+
failedMoves,
|
|
120
|
+
currentMove: batch[batch.length - 1],
|
|
121
|
+
});
|
|
122
|
+
}
|
|
123
|
+
this.activeJobs.delete(jobId);
|
|
124
|
+
const job = {
|
|
125
|
+
jobId,
|
|
126
|
+
status: failedMoves === 0 ? 'completed' : 'completed',
|
|
127
|
+
progress: 100,
|
|
128
|
+
entitiesMoved: completedMoves,
|
|
129
|
+
startedAt,
|
|
130
|
+
completedAt: new Date(),
|
|
131
|
+
error: failedMoves > 0 ? `${failedMoves} moves failed` : undefined,
|
|
132
|
+
};
|
|
133
|
+
return ok(job);
|
|
134
|
+
}
|
|
135
|
+
/**
|
|
136
|
+
* Execute a single move
|
|
137
|
+
*/
|
|
138
|
+
async executeMove(move) {
|
|
139
|
+
const fromStorage = this.getStorage(move.fromShard);
|
|
140
|
+
const toStorage = this.getStorage(move.toShard);
|
|
141
|
+
if (!fromStorage || !toStorage) {
|
|
142
|
+
return err(new RebalanceError(`Storage not found for shard: ${!fromStorage ? move.fromShard : move.toShard}`, 'move'));
|
|
143
|
+
}
|
|
144
|
+
try {
|
|
145
|
+
// Read entity from source
|
|
146
|
+
const entity = await fromStorage.getEntity(move.entityId);
|
|
147
|
+
if (!entity) {
|
|
148
|
+
// Entity doesn't exist, skip
|
|
149
|
+
return ok(undefined);
|
|
150
|
+
}
|
|
151
|
+
// Write to destination
|
|
152
|
+
await toStorage.putEntity(entity);
|
|
153
|
+
// Delete from source
|
|
154
|
+
await fromStorage.deleteEntity(move.entityId);
|
|
155
|
+
return ok(undefined);
|
|
156
|
+
}
|
|
157
|
+
catch (error) {
|
|
158
|
+
return err(new RebalanceError(`Failed to move entity ${move.entityId}: ${error instanceof Error ? error.message : String(error)}`, 'move', error instanceof Error ? error : undefined));
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
/**
|
|
162
|
+
* Cancel an active rebalance
|
|
163
|
+
*/
|
|
164
|
+
cancel(jobId) {
|
|
165
|
+
if (this.activeJobs.has(jobId)) {
|
|
166
|
+
this.cancelled.add(jobId);
|
|
167
|
+
return true;
|
|
168
|
+
}
|
|
169
|
+
return false;
|
|
170
|
+
}
|
|
171
|
+
/**
|
|
172
|
+
* Get progress of an active rebalance
|
|
173
|
+
*/
|
|
174
|
+
getProgress(jobId) {
|
|
175
|
+
return this.activeJobs.get(jobId);
|
|
176
|
+
}
|
|
177
|
+
/**
|
|
178
|
+
* Check if a rebalance is active
|
|
179
|
+
*/
|
|
180
|
+
isActive(jobId) {
|
|
181
|
+
return this.activeJobs.has(jobId);
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
//# sourceMappingURL=Rebalancer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Rebalancer.js","sourceRoot":"","sources":["../../src/shard/Rebalancer.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @nahisaho/yata-scale - Shard Manager
|
|
3
|
+
*
|
|
4
|
+
* Manages shard lifecycle, health, and operations
|
|
5
|
+
*/
|
|
6
|
+
import { type Result } from 'neverthrow';
|
|
7
|
+
import type { ShardConfig, ShardInfo, ShardHealth, RebalanceOptions, RebalanceJob, PartitionStrategyType, Entity, Relationship } from '../types.js';
|
|
8
|
+
import { ShardError, ShardNotFoundError, ShardUnavailableError, RebalanceError } from '../errors.js';
|
|
9
|
+
import { ShardRouter } from './ShardRouter.js';
|
|
10
|
+
/**
|
|
11
|
+
* Shard storage interface
|
|
12
|
+
*/
|
|
13
|
+
export interface ShardStorage {
|
|
14
|
+
readonly shardId: string;
|
|
15
|
+
getEntity(id: string): Promise<Entity | undefined>;
|
|
16
|
+
putEntity(entity: Entity): Promise<void>;
|
|
17
|
+
deleteEntity(id: string): Promise<boolean>;
|
|
18
|
+
getRelationship(id: string): Promise<Relationship | undefined>;
|
|
19
|
+
putRelationship(relationship: Relationship): Promise<void>;
|
|
20
|
+
deleteRelationship(id: string): Promise<boolean>;
|
|
21
|
+
getEntities(ids: string[]): Promise<Map<string, Entity>>;
|
|
22
|
+
putEntities(entities: Entity[]): Promise<void>;
|
|
23
|
+
getEntityCount(): Promise<number>;
|
|
24
|
+
getRelationshipCount(): Promise<number>;
|
|
25
|
+
getSizeBytes(): Promise<number>;
|
|
26
|
+
open(): Promise<void>;
|
|
27
|
+
close(): Promise<void>;
|
|
28
|
+
clear(): Promise<void>;
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Shard manager for lifecycle and operations
|
|
32
|
+
*/
|
|
33
|
+
export declare class ShardManager {
|
|
34
|
+
private readonly strategyType;
|
|
35
|
+
private readonly storageFactory;
|
|
36
|
+
private shards;
|
|
37
|
+
private storage;
|
|
38
|
+
private router;
|
|
39
|
+
private rebalanceJobs;
|
|
40
|
+
private healthCheckInterval?;
|
|
41
|
+
constructor(strategyType: PartitionStrategyType, storageFactory: (config: ShardConfig) => ShardStorage);
|
|
42
|
+
/**
|
|
43
|
+
* Initialize with shard configurations
|
|
44
|
+
*/
|
|
45
|
+
initialize(configs: ShardConfig[]): Promise<void>;
|
|
46
|
+
/**
|
|
47
|
+
* Create a new shard
|
|
48
|
+
*/
|
|
49
|
+
createShard(config: ShardConfig): Promise<Result<ShardInfo, ShardError>>;
|
|
50
|
+
/**
|
|
51
|
+
* Remove a shard
|
|
52
|
+
*/
|
|
53
|
+
removeShard(shardId: string, graceful?: boolean): Promise<Result<void, ShardError>>;
|
|
54
|
+
/**
|
|
55
|
+
* Get shard info
|
|
56
|
+
*/
|
|
57
|
+
getShardInfo(shardId: string): Result<ShardInfo, ShardNotFoundError>;
|
|
58
|
+
/**
|
|
59
|
+
* List all shards
|
|
60
|
+
*/
|
|
61
|
+
listShards(): ShardInfo[];
|
|
62
|
+
/**
|
|
63
|
+
* Get shard for an entity
|
|
64
|
+
*/
|
|
65
|
+
getShardForEntity(entityId: string): Result<ShardInfo, ShardNotFoundError | ShardUnavailableError>;
|
|
66
|
+
/**
|
|
67
|
+
* Get storage for an entity
|
|
68
|
+
*/
|
|
69
|
+
getStorageForEntity(entityId: string): Result<ShardStorage, ShardNotFoundError | ShardUnavailableError>;
|
|
70
|
+
/**
|
|
71
|
+
* Start rebalancing
|
|
72
|
+
*/
|
|
73
|
+
startRebalance(options?: RebalanceOptions): Promise<Result<RebalanceJob, RebalanceError>>;
|
|
74
|
+
/**
|
|
75
|
+
* Execute rebalance operation
|
|
76
|
+
*/
|
|
77
|
+
private executeRebalance;
|
|
78
|
+
/**
|
|
79
|
+
* Get rebalance status
|
|
80
|
+
*/
|
|
81
|
+
getRebalanceStatus(jobId: string): Result<RebalanceJob, RebalanceError>;
|
|
82
|
+
/**
|
|
83
|
+
* Cancel rebalance
|
|
84
|
+
*/
|
|
85
|
+
cancelRebalance(jobId: string): Promise<Result<void, RebalanceError>>;
|
|
86
|
+
/**
|
|
87
|
+
* Check health of all shards
|
|
88
|
+
*/
|
|
89
|
+
checkHealth(): Promise<Map<string, ShardHealth>>;
|
|
90
|
+
/**
|
|
91
|
+
* Repair a shard
|
|
92
|
+
*/
|
|
93
|
+
repairShard(shardId: string): Promise<Result<void, ShardError>>;
|
|
94
|
+
/**
|
|
95
|
+
* Get the router
|
|
96
|
+
*/
|
|
97
|
+
getRouter(): ShardRouter;
|
|
98
|
+
/**
|
|
99
|
+
* Get storage for a shard
|
|
100
|
+
*/
|
|
101
|
+
getStorage(shardId: string): ShardStorage | undefined;
|
|
102
|
+
/**
|
|
103
|
+
* Close all shards
|
|
104
|
+
*/
|
|
105
|
+
close(): Promise<void>;
|
|
106
|
+
/**
|
|
107
|
+
* Update shard status
|
|
108
|
+
*/
|
|
109
|
+
private updateShardStatus;
|
|
110
|
+
/**
|
|
111
|
+
* Create a connection object for router
|
|
112
|
+
*/
|
|
113
|
+
private createConnection;
|
|
114
|
+
/**
|
|
115
|
+
* Start health check interval
|
|
116
|
+
*/
|
|
117
|
+
private startHealthCheck;
|
|
118
|
+
/**
|
|
119
|
+
* Stop health check interval
|
|
120
|
+
*/
|
|
121
|
+
private stopHealthCheck;
|
|
122
|
+
}
|
|
123
|
+
//# sourceMappingURL=ShardManager.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ShardManager.d.ts","sourceRoot":"","sources":["../../src/shard/ShardManager.ts"],"names":[],"mappings":"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"}
|