@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,353 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @nahisaho/yata-scale - Shard Manager
|
|
3
|
+
*
|
|
4
|
+
* Manages shard lifecycle, health, and operations
|
|
5
|
+
*/
|
|
6
|
+
import { ok, err } from 'neverthrow';
|
|
7
|
+
import { ShardError, ShardNotFoundError, RebalanceError, } from '../errors.js';
|
|
8
|
+
import { ShardRouter } from './ShardRouter.js';
|
|
9
|
+
/**
|
|
10
|
+
* Shard manager for lifecycle and operations
|
|
11
|
+
*/
|
|
12
|
+
export class ShardManager {
|
|
13
|
+
strategyType;
|
|
14
|
+
storageFactory;
|
|
15
|
+
shards = new Map();
|
|
16
|
+
storage = new Map();
|
|
17
|
+
router;
|
|
18
|
+
rebalanceJobs = new Map();
|
|
19
|
+
healthCheckInterval;
|
|
20
|
+
constructor(strategyType, storageFactory) {
|
|
21
|
+
this.strategyType = strategyType;
|
|
22
|
+
this.storageFactory = storageFactory;
|
|
23
|
+
this.router = new ShardRouter(strategyType, []);
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Initialize with shard configurations
|
|
27
|
+
*/
|
|
28
|
+
async initialize(configs) {
|
|
29
|
+
for (const config of configs) {
|
|
30
|
+
await this.createShard(config);
|
|
31
|
+
}
|
|
32
|
+
// Start health check
|
|
33
|
+
this.startHealthCheck();
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Create a new shard
|
|
37
|
+
*/
|
|
38
|
+
async createShard(config) {
|
|
39
|
+
if (this.shards.has(config.shardId)) {
|
|
40
|
+
return err(new ShardError(`Shard already exists: ${config.shardId}`, config.shardId));
|
|
41
|
+
}
|
|
42
|
+
try {
|
|
43
|
+
// Create storage
|
|
44
|
+
const shardStorage = this.storageFactory(config);
|
|
45
|
+
await shardStorage.open();
|
|
46
|
+
this.storage.set(config.shardId, shardStorage);
|
|
47
|
+
// Create shard info
|
|
48
|
+
const info = {
|
|
49
|
+
shardId: config.shardId,
|
|
50
|
+
status: 'active',
|
|
51
|
+
entityCount: 0,
|
|
52
|
+
relationshipCount: 0,
|
|
53
|
+
sizeBytes: 0,
|
|
54
|
+
location: config.location,
|
|
55
|
+
endpoint: config.endpoint,
|
|
56
|
+
replicas: [],
|
|
57
|
+
lastModified: new Date(),
|
|
58
|
+
health: {
|
|
59
|
+
healthy: true,
|
|
60
|
+
latencyMs: 0,
|
|
61
|
+
errorRate: 0,
|
|
62
|
+
lastChecked: new Date(),
|
|
63
|
+
},
|
|
64
|
+
};
|
|
65
|
+
this.shards.set(config.shardId, info);
|
|
66
|
+
// Register with router
|
|
67
|
+
const connection = this.createConnection(info);
|
|
68
|
+
this.router.registerConnection(connection);
|
|
69
|
+
return ok(info);
|
|
70
|
+
}
|
|
71
|
+
catch (error) {
|
|
72
|
+
return err(new ShardError(`Failed to create shard: ${error instanceof Error ? error.message : String(error)}`, config.shardId, error instanceof Error ? error : undefined));
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
/**
|
|
76
|
+
* Remove a shard
|
|
77
|
+
*/
|
|
78
|
+
async removeShard(shardId, graceful = true) {
|
|
79
|
+
const info = this.shards.get(shardId);
|
|
80
|
+
if (!info) {
|
|
81
|
+
return err(new ShardNotFoundError(shardId));
|
|
82
|
+
}
|
|
83
|
+
if (graceful && info.entityCount > 0) {
|
|
84
|
+
// Mark as draining and wait for rebalance
|
|
85
|
+
this.updateShardStatus(shardId, 'draining');
|
|
86
|
+
// Start rebalance to move data away
|
|
87
|
+
const rebalanceResult = await this.startRebalance({
|
|
88
|
+
targetShards: [...this.shards.keys()].filter((id) => id !== shardId),
|
|
89
|
+
});
|
|
90
|
+
if (rebalanceResult.isErr()) {
|
|
91
|
+
return err(new ShardError(`Failed to drain shard: ${rebalanceResult.error.message}`, shardId, rebalanceResult.error));
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
try {
|
|
95
|
+
// Close and remove storage
|
|
96
|
+
const shardStorage = this.storage.get(shardId);
|
|
97
|
+
if (shardStorage) {
|
|
98
|
+
await shardStorage.close();
|
|
99
|
+
this.storage.delete(shardId);
|
|
100
|
+
}
|
|
101
|
+
// Remove from router
|
|
102
|
+
this.router.unregisterConnection(shardId);
|
|
103
|
+
// Remove from shards map
|
|
104
|
+
this.shards.delete(shardId);
|
|
105
|
+
return ok(undefined);
|
|
106
|
+
}
|
|
107
|
+
catch (error) {
|
|
108
|
+
return err(new ShardError(`Failed to remove shard: ${error instanceof Error ? error.message : String(error)}`, shardId, error instanceof Error ? error : undefined));
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
/**
|
|
112
|
+
* Get shard info
|
|
113
|
+
*/
|
|
114
|
+
getShardInfo(shardId) {
|
|
115
|
+
const info = this.shards.get(shardId);
|
|
116
|
+
if (!info) {
|
|
117
|
+
return err(new ShardNotFoundError(shardId));
|
|
118
|
+
}
|
|
119
|
+
return ok(info);
|
|
120
|
+
}
|
|
121
|
+
/**
|
|
122
|
+
* List all shards
|
|
123
|
+
*/
|
|
124
|
+
listShards() {
|
|
125
|
+
return [...this.shards.values()];
|
|
126
|
+
}
|
|
127
|
+
/**
|
|
128
|
+
* Get shard for an entity
|
|
129
|
+
*/
|
|
130
|
+
getShardForEntity(entityId) {
|
|
131
|
+
const routingResult = this.router.routeEntityId(entityId);
|
|
132
|
+
if (routingResult.isErr()) {
|
|
133
|
+
return err(routingResult.error);
|
|
134
|
+
}
|
|
135
|
+
return ok(routingResult.value.connection.info);
|
|
136
|
+
}
|
|
137
|
+
/**
|
|
138
|
+
* Get storage for an entity
|
|
139
|
+
*/
|
|
140
|
+
getStorageForEntity(entityId) {
|
|
141
|
+
const routingResult = this.router.routeEntityId(entityId);
|
|
142
|
+
if (routingResult.isErr()) {
|
|
143
|
+
return err(routingResult.error);
|
|
144
|
+
}
|
|
145
|
+
const storage = this.storage.get(routingResult.value.shardId);
|
|
146
|
+
if (!storage) {
|
|
147
|
+
return err(new ShardNotFoundError(routingResult.value.shardId));
|
|
148
|
+
}
|
|
149
|
+
return ok(storage);
|
|
150
|
+
}
|
|
151
|
+
/**
|
|
152
|
+
* Start rebalancing
|
|
153
|
+
*/
|
|
154
|
+
async startRebalance(options) {
|
|
155
|
+
const jobId = `rebalance-${Date.now()}`;
|
|
156
|
+
const job = {
|
|
157
|
+
jobId,
|
|
158
|
+
status: 'pending',
|
|
159
|
+
progress: 0,
|
|
160
|
+
entitiesMoved: 0,
|
|
161
|
+
startedAt: new Date(),
|
|
162
|
+
};
|
|
163
|
+
this.rebalanceJobs.set(jobId, job);
|
|
164
|
+
// Mark involved shards as rebalancing
|
|
165
|
+
const targetShards = options?.targetShards ?? [...this.shards.keys()];
|
|
166
|
+
for (const shardId of targetShards) {
|
|
167
|
+
this.updateShardStatus(shardId, 'rebalancing');
|
|
168
|
+
}
|
|
169
|
+
// Start rebalance in background
|
|
170
|
+
this.executeRebalance(jobId, options).catch((error) => {
|
|
171
|
+
const failedJob = {
|
|
172
|
+
...job,
|
|
173
|
+
status: 'failed',
|
|
174
|
+
error: error instanceof Error ? error.message : String(error),
|
|
175
|
+
completedAt: new Date(),
|
|
176
|
+
};
|
|
177
|
+
this.rebalanceJobs.set(jobId, failedJob);
|
|
178
|
+
});
|
|
179
|
+
return ok(job);
|
|
180
|
+
}
|
|
181
|
+
/**
|
|
182
|
+
* Execute rebalance operation
|
|
183
|
+
*/
|
|
184
|
+
async executeRebalance(jobId, _options) {
|
|
185
|
+
const job = this.rebalanceJobs.get(jobId);
|
|
186
|
+
// Update status
|
|
187
|
+
const runningJob = {
|
|
188
|
+
...job,
|
|
189
|
+
status: 'running',
|
|
190
|
+
};
|
|
191
|
+
this.rebalanceJobs.set(jobId, runningJob);
|
|
192
|
+
// TODO: Implement actual rebalancing logic
|
|
193
|
+
// 1. Calculate target distribution
|
|
194
|
+
// 2. Identify entities to move
|
|
195
|
+
// 3. Move entities in batches
|
|
196
|
+
// 4. Update routing
|
|
197
|
+
// Mark as completed
|
|
198
|
+
const completedJob = {
|
|
199
|
+
...runningJob,
|
|
200
|
+
status: 'completed',
|
|
201
|
+
progress: 100,
|
|
202
|
+
completedAt: new Date(),
|
|
203
|
+
};
|
|
204
|
+
this.rebalanceJobs.set(jobId, completedJob);
|
|
205
|
+
// Reset shard status
|
|
206
|
+
for (const shardId of this.shards.keys()) {
|
|
207
|
+
const info = this.shards.get(shardId);
|
|
208
|
+
if (info.status === 'rebalancing') {
|
|
209
|
+
this.updateShardStatus(shardId, 'active');
|
|
210
|
+
}
|
|
211
|
+
}
|
|
212
|
+
}
|
|
213
|
+
/**
|
|
214
|
+
* Get rebalance status
|
|
215
|
+
*/
|
|
216
|
+
getRebalanceStatus(jobId) {
|
|
217
|
+
const job = this.rebalanceJobs.get(jobId);
|
|
218
|
+
if (!job) {
|
|
219
|
+
return err(new RebalanceError(`Rebalance job not found: ${jobId}`, jobId));
|
|
220
|
+
}
|
|
221
|
+
return ok(job);
|
|
222
|
+
}
|
|
223
|
+
/**
|
|
224
|
+
* Cancel rebalance
|
|
225
|
+
*/
|
|
226
|
+
async cancelRebalance(jobId) {
|
|
227
|
+
const job = this.rebalanceJobs.get(jobId);
|
|
228
|
+
if (!job) {
|
|
229
|
+
return err(new RebalanceError(`Rebalance job not found: ${jobId}`, jobId));
|
|
230
|
+
}
|
|
231
|
+
if (job.status !== 'running' && job.status !== 'pending') {
|
|
232
|
+
return err(new RebalanceError(`Cannot cancel job in status: ${job.status}`, jobId));
|
|
233
|
+
}
|
|
234
|
+
const cancelledJob = {
|
|
235
|
+
...job,
|
|
236
|
+
status: 'cancelled',
|
|
237
|
+
completedAt: new Date(),
|
|
238
|
+
};
|
|
239
|
+
this.rebalanceJobs.set(jobId, cancelledJob);
|
|
240
|
+
return ok(undefined);
|
|
241
|
+
}
|
|
242
|
+
/**
|
|
243
|
+
* Check health of all shards
|
|
244
|
+
*/
|
|
245
|
+
async checkHealth() {
|
|
246
|
+
const results = new Map();
|
|
247
|
+
for (const [shardId, storage] of this.storage) {
|
|
248
|
+
const startTime = Date.now();
|
|
249
|
+
let healthy = true;
|
|
250
|
+
let errorRate = 0;
|
|
251
|
+
try {
|
|
252
|
+
// Simple health check - get entity count
|
|
253
|
+
await storage.getEntityCount();
|
|
254
|
+
}
|
|
255
|
+
catch {
|
|
256
|
+
healthy = false;
|
|
257
|
+
errorRate = 1;
|
|
258
|
+
}
|
|
259
|
+
const latencyMs = Date.now() - startTime;
|
|
260
|
+
const health = {
|
|
261
|
+
healthy,
|
|
262
|
+
latencyMs,
|
|
263
|
+
errorRate,
|
|
264
|
+
lastChecked: new Date(),
|
|
265
|
+
};
|
|
266
|
+
results.set(shardId, health);
|
|
267
|
+
// Update shard info
|
|
268
|
+
const info = this.shards.get(shardId);
|
|
269
|
+
if (info) {
|
|
270
|
+
this.shards.set(shardId, { ...info, health });
|
|
271
|
+
}
|
|
272
|
+
}
|
|
273
|
+
return results;
|
|
274
|
+
}
|
|
275
|
+
/**
|
|
276
|
+
* Repair a shard
|
|
277
|
+
*/
|
|
278
|
+
async repairShard(shardId) {
|
|
279
|
+
const storage = this.storage.get(shardId);
|
|
280
|
+
if (!storage) {
|
|
281
|
+
return err(new ShardNotFoundError(shardId));
|
|
282
|
+
}
|
|
283
|
+
// TODO: Implement repair logic
|
|
284
|
+
// 1. Validate data integrity
|
|
285
|
+
// 2. Rebuild indexes if needed
|
|
286
|
+
// 3. Recover from WAL if available
|
|
287
|
+
return ok(undefined);
|
|
288
|
+
}
|
|
289
|
+
/**
|
|
290
|
+
* Get the router
|
|
291
|
+
*/
|
|
292
|
+
getRouter() {
|
|
293
|
+
return this.router;
|
|
294
|
+
}
|
|
295
|
+
/**
|
|
296
|
+
* Get storage for a shard
|
|
297
|
+
*/
|
|
298
|
+
getStorage(shardId) {
|
|
299
|
+
return this.storage.get(shardId);
|
|
300
|
+
}
|
|
301
|
+
/**
|
|
302
|
+
* Close all shards
|
|
303
|
+
*/
|
|
304
|
+
async close() {
|
|
305
|
+
this.stopHealthCheck();
|
|
306
|
+
for (const storage of this.storage.values()) {
|
|
307
|
+
await storage.close();
|
|
308
|
+
}
|
|
309
|
+
this.storage.clear();
|
|
310
|
+
this.shards.clear();
|
|
311
|
+
}
|
|
312
|
+
/**
|
|
313
|
+
* Update shard status
|
|
314
|
+
*/
|
|
315
|
+
updateShardStatus(shardId, status) {
|
|
316
|
+
const info = this.shards.get(shardId);
|
|
317
|
+
if (info) {
|
|
318
|
+
this.shards.set(shardId, { ...info, status, lastModified: new Date() });
|
|
319
|
+
}
|
|
320
|
+
}
|
|
321
|
+
/**
|
|
322
|
+
* Create a connection object for router
|
|
323
|
+
*/
|
|
324
|
+
createConnection(info) {
|
|
325
|
+
const self = this;
|
|
326
|
+
return {
|
|
327
|
+
shardId: info.shardId,
|
|
328
|
+
info,
|
|
329
|
+
isHealthy() {
|
|
330
|
+
const current = self.shards.get(info.shardId);
|
|
331
|
+
return current?.health.healthy ?? false;
|
|
332
|
+
},
|
|
333
|
+
};
|
|
334
|
+
}
|
|
335
|
+
/**
|
|
336
|
+
* Start health check interval
|
|
337
|
+
*/
|
|
338
|
+
startHealthCheck() {
|
|
339
|
+
this.healthCheckInterval = setInterval(async () => {
|
|
340
|
+
await this.checkHealth();
|
|
341
|
+
}, 30000); // Check every 30 seconds
|
|
342
|
+
}
|
|
343
|
+
/**
|
|
344
|
+
* Stop health check interval
|
|
345
|
+
*/
|
|
346
|
+
stopHealthCheck() {
|
|
347
|
+
if (this.healthCheckInterval) {
|
|
348
|
+
clearInterval(this.healthCheckInterval);
|
|
349
|
+
this.healthCheckInterval = undefined;
|
|
350
|
+
}
|
|
351
|
+
}
|
|
352
|
+
}
|
|
353
|
+
//# sourceMappingURL=ShardManager.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ShardManager.js","sourceRoot":"","sources":["../../src/shard/ShardManager.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @nahisaho/yata-scale - Shard Router
|
|
3
|
+
*
|
|
4
|
+
* Routes operations to appropriate shards based on partition strategy
|
|
5
|
+
*/
|
|
6
|
+
import { type Result } from 'neverthrow';
|
|
7
|
+
import type { PartitionStrategy, PartitionStrategyType, ShardInfo, Entity, Relationship, GraphQuery } from '../types.js';
|
|
8
|
+
import { ShardNotFoundError, ShardUnavailableError } from '../errors.js';
|
|
9
|
+
import { type RangeConfig } from './RangePartitionStrategy.js';
|
|
10
|
+
/**
|
|
11
|
+
* Shard connection interface
|
|
12
|
+
*/
|
|
13
|
+
export interface ShardConnection {
|
|
14
|
+
readonly shardId: string;
|
|
15
|
+
readonly info: ShardInfo;
|
|
16
|
+
isHealthy(): boolean;
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Routing result
|
|
20
|
+
*/
|
|
21
|
+
export interface RoutingResult {
|
|
22
|
+
readonly shardId: string;
|
|
23
|
+
readonly connection: ShardConnection;
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Multi-shard routing result
|
|
27
|
+
*/
|
|
28
|
+
export interface MultiRoutingResult {
|
|
29
|
+
readonly routings: Map<string, RoutingResult>;
|
|
30
|
+
readonly unroutable: string[];
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Shard router for directing operations to appropriate shards
|
|
34
|
+
*/
|
|
35
|
+
export declare class ShardRouter {
|
|
36
|
+
private strategy;
|
|
37
|
+
private connections;
|
|
38
|
+
constructor(strategyType: PartitionStrategyType, shardIds: string[], options?: {
|
|
39
|
+
rangeConfigs?: RangeConfig[];
|
|
40
|
+
});
|
|
41
|
+
/**
|
|
42
|
+
* Create partition strategy
|
|
43
|
+
*/
|
|
44
|
+
private createStrategy;
|
|
45
|
+
/**
|
|
46
|
+
* Register a shard connection
|
|
47
|
+
*/
|
|
48
|
+
registerConnection(connection: ShardConnection): void;
|
|
49
|
+
/**
|
|
50
|
+
* Unregister a shard connection
|
|
51
|
+
*/
|
|
52
|
+
unregisterConnection(shardId: string): void;
|
|
53
|
+
/**
|
|
54
|
+
* Route a single entity to its shard
|
|
55
|
+
*/
|
|
56
|
+
routeEntity(entity: Entity): Result<RoutingResult, ShardNotFoundError | ShardUnavailableError>;
|
|
57
|
+
/**
|
|
58
|
+
* Route an entity ID to its shard
|
|
59
|
+
*/
|
|
60
|
+
routeEntityId(entityId: string): Result<RoutingResult, ShardNotFoundError | ShardUnavailableError>;
|
|
61
|
+
/**
|
|
62
|
+
* Route multiple entities to their shards
|
|
63
|
+
*/
|
|
64
|
+
routeEntities(entities: Entity[]): MultiRoutingResult;
|
|
65
|
+
/**
|
|
66
|
+
* Route a relationship to its shard (based on source entity)
|
|
67
|
+
*/
|
|
68
|
+
routeRelationship(relationship: Relationship): Result<RoutingResult, ShardNotFoundError | ShardUnavailableError>;
|
|
69
|
+
/**
|
|
70
|
+
* Get shards for a query
|
|
71
|
+
*/
|
|
72
|
+
getShardsForQuery(query: GraphQuery): string[];
|
|
73
|
+
/**
|
|
74
|
+
* Get routing for a shard ID
|
|
75
|
+
*/
|
|
76
|
+
private getRouting;
|
|
77
|
+
/**
|
|
78
|
+
* Check if a shard is available
|
|
79
|
+
*/
|
|
80
|
+
private isShardAvailable;
|
|
81
|
+
/**
|
|
82
|
+
* Get all available shards
|
|
83
|
+
*/
|
|
84
|
+
private getAllAvailableShards;
|
|
85
|
+
/**
|
|
86
|
+
* Get the partition strategy
|
|
87
|
+
*/
|
|
88
|
+
getStrategy(): PartitionStrategy;
|
|
89
|
+
/**
|
|
90
|
+
* Get all registered connections
|
|
91
|
+
*/
|
|
92
|
+
getConnections(): Map<string, ShardConnection>;
|
|
93
|
+
/**
|
|
94
|
+
* Get healthy shard count
|
|
95
|
+
*/
|
|
96
|
+
getHealthyShardCount(): number;
|
|
97
|
+
/**
|
|
98
|
+
* Get total shard count
|
|
99
|
+
*/
|
|
100
|
+
getTotalShardCount(): number;
|
|
101
|
+
}
|
|
102
|
+
//# sourceMappingURL=ShardRouter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ShardRouter.d.ts","sourceRoot":"","sources":["../../src/shard/ShardRouter.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAW,KAAK,MAAM,EAAE,MAAM,YAAY,CAAC;AAClD,OAAO,KAAK,EACV,iBAAiB,EACjB,qBAAqB,EACrB,SAAS,EACT,MAAM,EACN,YAAY,EACZ,UAAU,EACX,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,kBAAkB,EAAE,qBAAqB,EAAE,MAAM,cAAc,CAAC;AAEzE,OAAO,EAA0B,KAAK,WAAW,EAAE,MAAM,6BAA6B,CAAC;AAGvF;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,IAAI,EAAE,SAAS,CAAC;IACzB,SAAS,IAAI,OAAO,CAAC;CACtB;AAED;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,UAAU,EAAE,eAAe,CAAC;CACtC;AAED;;GAEG;AACH,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,QAAQ,EAAE,GAAG,CAAC,MAAM,EAAE,aAAa,CAAC,CAAC;IAC9C,QAAQ,CAAC,UAAU,EAAE,MAAM,EAAE,CAAC;CAC/B;AAED;;GAEG;AACH,qBAAa,WAAW;IACtB,OAAO,CAAC,QAAQ,CAAoB;IACpC,OAAO,CAAC,WAAW,CAA2C;gBAG5D,YAAY,EAAE,qBAAqB,EACnC,QAAQ,EAAE,MAAM,EAAE,EAClB,OAAO,CAAC,EAAE;QAAE,YAAY,CAAC,EAAE,WAAW,EAAE,CAAA;KAAE;IAK5C;;OAEG;IACH,OAAO,CAAC,cAAc;IAoBtB;;OAEG;IACH,kBAAkB,CAAC,UAAU,EAAE,eAAe,GAAG,IAAI;IAIrD;;OAEG;IACH,oBAAoB,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI;IAI3C;;OAEG;IACH,WAAW,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAAC,aAAa,EAAE,kBAAkB,GAAG,qBAAqB,CAAC;IAK9F;;OAEG;IACH,aAAa,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAAC,aAAa,EAAE,kBAAkB,GAAG,qBAAqB,CAAC;IAKlG;;OAEG;IACH,aAAa,CAAC,QAAQ,EAAE,MAAM,EAAE,GAAG,kBAAkB;IAqBrD;;OAEG;IACH,iBAAiB,CACf,YAAY,EAAE,YAAY,GACzB,MAAM,CAAC,aAAa,EAAE,kBAAkB,GAAG,qBAAqB,CAAC;IAMpE;;OAEG;IACH,iBAAiB,CAAC,KAAK,EAAE,UAAU,GAAG,MAAM,EAAE;IA0B9C;;OAEG;IACH,OAAO,CAAC,UAAU;IAgBlB;;OAEG;IACH,OAAO,CAAC,gBAAgB;IAKxB;;OAEG;IACH,OAAO,CAAC,qBAAqB;IAU7B;;OAEG;IACH,WAAW,IAAI,iBAAiB;IAIhC;;OAEG;IACH,cAAc,IAAI,GAAG,CAAC,MAAM,EAAE,eAAe,CAAC;IAI9C;;OAEG;IACH,oBAAoB,IAAI,MAAM;IAU9B;;OAEG;IACH,kBAAkB,IAAI,MAAM;CAG7B"}
|
|
@@ -0,0 +1,181 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @nahisaho/yata-scale - Shard Router
|
|
3
|
+
*
|
|
4
|
+
* Routes operations to appropriate shards based on partition strategy
|
|
5
|
+
*/
|
|
6
|
+
import { ok, err } from 'neverthrow';
|
|
7
|
+
import { ShardNotFoundError, ShardUnavailableError } from '../errors.js';
|
|
8
|
+
import { HashPartitionStrategy } from './HashPartitionStrategy.js';
|
|
9
|
+
import { RangePartitionStrategy } from './RangePartitionStrategy.js';
|
|
10
|
+
import { GraphPartitionStrategy } from './GraphPartitionStrategy.js';
|
|
11
|
+
/**
|
|
12
|
+
* Shard router for directing operations to appropriate shards
|
|
13
|
+
*/
|
|
14
|
+
export class ShardRouter {
|
|
15
|
+
strategy;
|
|
16
|
+
connections = new Map();
|
|
17
|
+
constructor(strategyType, shardIds, options) {
|
|
18
|
+
this.strategy = this.createStrategy(strategyType, shardIds, options);
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Create partition strategy
|
|
22
|
+
*/
|
|
23
|
+
createStrategy(type, shardIds, options) {
|
|
24
|
+
switch (type) {
|
|
25
|
+
case 'hash':
|
|
26
|
+
return new HashPartitionStrategy(shardIds);
|
|
27
|
+
case 'range':
|
|
28
|
+
if (!options?.rangeConfigs) {
|
|
29
|
+
throw new Error('Range configs required for range partition strategy');
|
|
30
|
+
}
|
|
31
|
+
return new RangePartitionStrategy(options.rangeConfigs);
|
|
32
|
+
case 'graph':
|
|
33
|
+
return new GraphPartitionStrategy(shardIds);
|
|
34
|
+
default:
|
|
35
|
+
throw new Error(`Unknown partition strategy: ${type}`);
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Register a shard connection
|
|
40
|
+
*/
|
|
41
|
+
registerConnection(connection) {
|
|
42
|
+
this.connections.set(connection.shardId, connection);
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* Unregister a shard connection
|
|
46
|
+
*/
|
|
47
|
+
unregisterConnection(shardId) {
|
|
48
|
+
this.connections.delete(shardId);
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* Route a single entity to its shard
|
|
52
|
+
*/
|
|
53
|
+
routeEntity(entity) {
|
|
54
|
+
const shardId = this.strategy.getShardId(entity.id, entity.metadata);
|
|
55
|
+
return this.getRouting(shardId);
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* Route an entity ID to its shard
|
|
59
|
+
*/
|
|
60
|
+
routeEntityId(entityId) {
|
|
61
|
+
const shardId = this.strategy.getShardId(entityId);
|
|
62
|
+
return this.getRouting(shardId);
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* Route multiple entities to their shards
|
|
66
|
+
*/
|
|
67
|
+
routeEntities(entities) {
|
|
68
|
+
const routings = new Map();
|
|
69
|
+
const unroutable = [];
|
|
70
|
+
const entityIds = entities.map((e) => e.id);
|
|
71
|
+
const shardMap = this.strategy.getShardIds(entityIds);
|
|
72
|
+
for (const entity of entities) {
|
|
73
|
+
const shardId = shardMap.get(entity.id);
|
|
74
|
+
const result = this.getRouting(shardId);
|
|
75
|
+
if (result.isOk()) {
|
|
76
|
+
routings.set(entity.id, result.value);
|
|
77
|
+
}
|
|
78
|
+
else {
|
|
79
|
+
unroutable.push(entity.id);
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
return { routings, unroutable };
|
|
83
|
+
}
|
|
84
|
+
/**
|
|
85
|
+
* Route a relationship to its shard (based on source entity)
|
|
86
|
+
*/
|
|
87
|
+
routeRelationship(relationship) {
|
|
88
|
+
// Route based on source entity for consistency
|
|
89
|
+
const shardId = this.strategy.getShardId(relationship.sourceId);
|
|
90
|
+
return this.getRouting(shardId);
|
|
91
|
+
}
|
|
92
|
+
/**
|
|
93
|
+
* Get shards for a query
|
|
94
|
+
*/
|
|
95
|
+
getShardsForQuery(query) {
|
|
96
|
+
// If specific entity IDs are requested, route to those shards
|
|
97
|
+
if (query.entityFilters?.ids && query.entityFilters.ids.length > 0) {
|
|
98
|
+
const shardSet = new Set();
|
|
99
|
+
const shardMap = this.strategy.getShardIds(query.entityFilters.ids);
|
|
100
|
+
for (const shardId of shardMap.values()) {
|
|
101
|
+
if (this.isShardAvailable(shardId)) {
|
|
102
|
+
shardSet.add(shardId);
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
return [...shardSet];
|
|
106
|
+
}
|
|
107
|
+
// If traversal starts from a specific node, start there
|
|
108
|
+
if (query.traversal?.startId) {
|
|
109
|
+
const shardId = this.strategy.getShardId(query.traversal.startId);
|
|
110
|
+
if (this.isShardAvailable(shardId)) {
|
|
111
|
+
// For traversals, we may need to query all shards as edges cross boundaries
|
|
112
|
+
return this.getAllAvailableShards();
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
// Otherwise, query all available shards
|
|
116
|
+
return this.getAllAvailableShards();
|
|
117
|
+
}
|
|
118
|
+
/**
|
|
119
|
+
* Get routing for a shard ID
|
|
120
|
+
*/
|
|
121
|
+
getRouting(shardId) {
|
|
122
|
+
const connection = this.connections.get(shardId);
|
|
123
|
+
if (!connection) {
|
|
124
|
+
return err(new ShardNotFoundError(shardId));
|
|
125
|
+
}
|
|
126
|
+
if (!connection.isHealthy()) {
|
|
127
|
+
return err(new ShardUnavailableError(shardId));
|
|
128
|
+
}
|
|
129
|
+
return ok({ shardId, connection });
|
|
130
|
+
}
|
|
131
|
+
/**
|
|
132
|
+
* Check if a shard is available
|
|
133
|
+
*/
|
|
134
|
+
isShardAvailable(shardId) {
|
|
135
|
+
const connection = this.connections.get(shardId);
|
|
136
|
+
return connection !== undefined && connection.isHealthy();
|
|
137
|
+
}
|
|
138
|
+
/**
|
|
139
|
+
* Get all available shards
|
|
140
|
+
*/
|
|
141
|
+
getAllAvailableShards() {
|
|
142
|
+
const available = [];
|
|
143
|
+
for (const [shardId, connection] of this.connections) {
|
|
144
|
+
if (connection.isHealthy()) {
|
|
145
|
+
available.push(shardId);
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
return available;
|
|
149
|
+
}
|
|
150
|
+
/**
|
|
151
|
+
* Get the partition strategy
|
|
152
|
+
*/
|
|
153
|
+
getStrategy() {
|
|
154
|
+
return this.strategy;
|
|
155
|
+
}
|
|
156
|
+
/**
|
|
157
|
+
* Get all registered connections
|
|
158
|
+
*/
|
|
159
|
+
getConnections() {
|
|
160
|
+
return new Map(this.connections);
|
|
161
|
+
}
|
|
162
|
+
/**
|
|
163
|
+
* Get healthy shard count
|
|
164
|
+
*/
|
|
165
|
+
getHealthyShardCount() {
|
|
166
|
+
let count = 0;
|
|
167
|
+
for (const connection of this.connections.values()) {
|
|
168
|
+
if (connection.isHealthy()) {
|
|
169
|
+
count++;
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
return count;
|
|
173
|
+
}
|
|
174
|
+
/**
|
|
175
|
+
* Get total shard count
|
|
176
|
+
*/
|
|
177
|
+
getTotalShardCount() {
|
|
178
|
+
return this.connections.size;
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
//# sourceMappingURL=ShardRouter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ShardRouter.js","sourceRoot":"","sources":["../../src/shard/ShardRouter.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,EAAE,EAAE,GAAG,EAAe,MAAM,YAAY,CAAC;AASlD,OAAO,EAAE,kBAAkB,EAAE,qBAAqB,EAAE,MAAM,cAAc,CAAC;AACzE,OAAO,EAAE,qBAAqB,EAAE,MAAM,4BAA4B,CAAC;AACnE,OAAO,EAAE,sBAAsB,EAAoB,MAAM,6BAA6B,CAAC;AACvF,OAAO,EAAE,sBAAsB,EAAE,MAAM,6BAA6B,CAAC;AA2BrE;;GAEG;AACH,MAAM,OAAO,WAAW;IACd,QAAQ,CAAoB;IAC5B,WAAW,GAAiC,IAAI,GAAG,EAAE,CAAC;IAE9D,YACE,YAAmC,EACnC,QAAkB,EAClB,OAA0C;QAE1C,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,cAAc,CAAC,YAAY,EAAE,QAAQ,EAAE,OAAO,CAAC,CAAC;IACvE,CAAC;IAED;;OAEG;IACK,cAAc,CACpB,IAA2B,EAC3B,QAAkB,EAClB,OAA0C;QAE1C,QAAQ,IAAI,EAAE,CAAC;YACb,KAAK,MAAM;gBACT,OAAO,IAAI,qBAAqB,CAAC,QAAQ,CAAC,CAAC;YAC7C,KAAK,OAAO;gBACV,IAAI,CAAC,OAAO,EAAE,YAAY,EAAE,CAAC;oBAC3B,MAAM,IAAI,KAAK,CAAC,qDAAqD,CAAC,CAAC;gBACzE,CAAC;gBACD,OAAO,IAAI,sBAAsB,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC;YAC1D,KAAK,OAAO;gBACV,OAAO,IAAI,sBAAsB,CAAC,QAAQ,CAAC,CAAC;YAC9C;gBACE,MAAM,IAAI,KAAK,CAAC,+BAA+B,IAAI,EAAE,CAAC,CAAC;QAC3D,CAAC;IACH,CAAC;IAED;;OAEG;IACH,kBAAkB,CAAC,UAA2B;QAC5C,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,UAAU,CAAC,OAAO,EAAE,UAAU,CAAC,CAAC;IACvD,CAAC;IAED;;OAEG;IACH,oBAAoB,CAAC,OAAe;QAClC,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IACnC,CAAC;IAED;;OAEG;IACH,WAAW,CAAC,MAAc;QACxB,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE,EAAE,MAAM,CAAC,QAAQ,CAAC,CAAC;QACrE,OAAO,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC;IAClC,CAAC;IAED;;OAEG;IACH,aAAa,CAAC,QAAgB;QAC5B,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC;QACnD,OAAO,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC;IAClC,CAAC;IAED;;OAEG;IACH,aAAa,CAAC,QAAkB;QAC9B,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAyB,CAAC;QAClD,MAAM,UAAU,GAAa,EAAE,CAAC;QAEhC,MAAM,SAAS,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;QAC5C,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,SAAS,CAAC,CAAC;QAEtD,KAAK,MAAM,MAAM,IAAI,QAAQ,EAAE,CAAC;YAC9B,MAAM,OAAO,GAAG,QAAQ,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAE,CAAC;YACzC,MAAM,MAAM,GAAG,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC;YAExC,IAAI,MAAM,CAAC,IAAI,EAAE,EAAE,CAAC;gBAClB,QAAQ,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC;YACxC,CAAC;iBAAM,CAAC;gBACN,UAAU,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;YAC7B,CAAC;QACH,CAAC;QAED,OAAO,EAAE,QAAQ,EAAE,UAAU,EAAE,CAAC;IAClC,CAAC;IAED;;OAEG;IACH,iBAAiB,CACf,YAA0B;QAE1B,+CAA+C;QAC/C,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAC;QAChE,OAAO,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC;IAClC,CAAC;IAED;;OAEG;IACH,iBAAiB,CAAC,KAAiB;QACjC,8DAA8D;QAC9D,IAAI,KAAK,CAAC,aAAa,EAAE,GAAG,IAAI,KAAK,CAAC,aAAa,CAAC,GAAG,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACnE,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAU,CAAC;YACnC,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,KAAK,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC;YACpE,KAAK,MAAM,OAAO,IAAI,QAAQ,CAAC,MAAM,EAAE,EAAE,CAAC;gBACxC,IAAI,IAAI,CAAC,gBAAgB,CAAC,OAAO,CAAC,EAAE,CAAC;oBACnC,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;gBACxB,CAAC;YACH,CAAC;YACD,OAAO,CAAC,GAAG,QAAQ,CAAC,CAAC;QACvB,CAAC;QAED,wDAAwD;QACxD,IAAI,KAAK,CAAC,SAAS,EAAE,OAAO,EAAE,CAAC;YAC7B,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,KAAK,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;YAClE,IAAI,IAAI,CAAC,gBAAgB,CAAC,OAAO,CAAC,EAAE,CAAC;gBACnC,4EAA4E;gBAC5E,OAAO,IAAI,CAAC,qBAAqB,EAAE,CAAC;YACtC,CAAC;QACH,CAAC;QAED,wCAAwC;QACxC,OAAO,IAAI,CAAC,qBAAqB,EAAE,CAAC;IACtC,CAAC;IAED;;OAEG;IACK,UAAU,CAChB,OAAe;QAEf,MAAM,UAAU,GAAG,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QAEjD,IAAI,CAAC,UAAU,EAAE,CAAC;YAChB,OAAO,GAAG,CAAC,IAAI,kBAAkB,CAAC,OAAO,CAAC,CAAC,CAAC;QAC9C,CAAC;QAED,IAAI,CAAC,UAAU,CAAC,SAAS,EAAE,EAAE,CAAC;YAC5B,OAAO,GAAG,CAAC,IAAI,qBAAqB,CAAC,OAAO,CAAC,CAAC,CAAC;QACjD,CAAC;QAED,OAAO,EAAE,CAAC,EAAE,OAAO,EAAE,UAAU,EAAE,CAAC,CAAC;IACrC,CAAC;IAED;;OAEG;IACK,gBAAgB,CAAC,OAAe;QACtC,MAAM,UAAU,GAAG,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QACjD,OAAO,UAAU,KAAK,SAAS,IAAI,UAAU,CAAC,SAAS,EAAE,CAAC;IAC5D,CAAC;IAED;;OAEG;IACK,qBAAqB;QAC3B,MAAM,SAAS,GAAa,EAAE,CAAC;QAC/B,KAAK,MAAM,CAAC,OAAO,EAAE,UAAU,CAAC,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC;YACrD,IAAI,UAAU,CAAC,SAAS,EAAE,EAAE,CAAC;gBAC3B,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YAC1B,CAAC;QACH,CAAC;QACD,OAAO,SAAS,CAAC;IACnB,CAAC;IAED;;OAEG;IACH,WAAW;QACT,OAAO,IAAI,CAAC,QAAQ,CAAC;IACvB,CAAC;IAED;;OAEG;IACH,cAAc;QACZ,OAAO,IAAI,GAAG,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;IACnC,CAAC;IAED;;OAEG;IACH,oBAAoB;QAClB,IAAI,KAAK,GAAG,CAAC,CAAC;QACd,KAAK,MAAM,UAAU,IAAI,IAAI,CAAC,WAAW,CAAC,MAAM,EAAE,EAAE,CAAC;YACnD,IAAI,UAAU,CAAC,SAAS,EAAE,EAAE,CAAC;gBAC3B,KAAK,EAAE,CAAC;YACV,CAAC;QACH,CAAC;QACD,OAAO,KAAK,CAAC;IACf,CAAC;IAED;;OAEG;IACH,kBAAkB;QAChB,OAAO,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC;IAC/B,CAAC;CACF"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @nahisaho/yata-scale - Shard Module
|
|
3
|
+
*
|
|
4
|
+
* Exports for shard management functionality
|
|
5
|
+
*/
|
|
6
|
+
export { ShardManager } from './ShardManager.js';
|
|
7
|
+
export { HashPartitionStrategy } from './HashPartitionStrategy.js';
|
|
8
|
+
export { RangePartitionStrategy } from './RangePartitionStrategy.js';
|
|
9
|
+
export { GraphPartitionStrategy } from './GraphPartitionStrategy.js';
|
|
10
|
+
export { ShardRouter } from './ShardRouter.js';
|
|
11
|
+
export { Rebalancer } from './Rebalancer.js';
|
|
12
|
+
export type { ShardConfig, ShardInfo, ShardStatus, ShardHealth, ShardLocation, PartitionStrategy, PartitionStrategyType, RebalanceOptions, RebalanceJob, } from '../types.js';
|
|
13
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/shard/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACjD,OAAO,EAAE,qBAAqB,EAAE,MAAM,4BAA4B,CAAC;AACnE,OAAO,EAAE,sBAAsB,EAAE,MAAM,6BAA6B,CAAC;AACrE,OAAO,EAAE,sBAAsB,EAAE,MAAM,6BAA6B,CAAC;AACrE,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAC/C,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAE7C,YAAY,EACV,WAAW,EACX,SAAS,EACT,WAAW,EACX,WAAW,EACX,aAAa,EACb,iBAAiB,EACjB,qBAAqB,EACrB,gBAAgB,EAChB,YAAY,GACb,MAAM,aAAa,CAAC"}
|