@powersync/service-module-postgres-storage 0.11.2 → 0.13.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/CHANGELOG.md +60 -0
- package/dist/.tsbuildinfo +1 -1
- package/dist/@types/migrations/scripts/1771232439485-storage-version.d.ts +3 -0
- package/dist/@types/migrations/scripts/1771424826685-current-data-pending-deletes.d.ts +3 -0
- package/dist/@types/migrations/scripts/1771491856000-sync-plan.d.ts +3 -0
- package/dist/@types/storage/PostgresBucketStorageFactory.d.ts +6 -10
- package/dist/@types/storage/PostgresCompactor.d.ts +10 -3
- package/dist/@types/storage/PostgresSyncRulesStorage.d.ts +5 -3
- package/dist/@types/storage/batch/OperationBatch.d.ts +2 -2
- package/dist/@types/storage/batch/PostgresBucketBatch.d.ts +12 -9
- package/dist/@types/storage/batch/PostgresPersistedBatch.d.ts +17 -5
- package/dist/@types/storage/current-data-store.d.ts +85 -0
- package/dist/@types/storage/current-data-table.d.ts +9 -0
- package/dist/@types/storage/sync-rules/PostgresPersistedSyncRulesContent.d.ts +1 -10
- package/dist/@types/storage/table-id.d.ts +2 -0
- package/dist/@types/types/models/CurrentData.d.ts +18 -3
- package/dist/@types/types/models/SyncRules.d.ts +12 -2
- package/dist/@types/types/models/json.d.ts +11 -0
- package/dist/@types/types/types.d.ts +2 -0
- package/dist/@types/utils/bson.d.ts +1 -1
- package/dist/@types/utils/db.d.ts +9 -0
- package/dist/@types/utils/test-utils.d.ts +1 -1
- package/dist/migrations/scripts/1771232439485-storage-version.js +111 -0
- package/dist/migrations/scripts/1771232439485-storage-version.js.map +1 -0
- package/dist/migrations/scripts/1771424826685-current-data-pending-deletes.js +8 -0
- package/dist/migrations/scripts/1771424826685-current-data-pending-deletes.js.map +1 -0
- package/dist/migrations/scripts/1771491856000-sync-plan.js +91 -0
- package/dist/migrations/scripts/1771491856000-sync-plan.js.map +1 -0
- package/dist/storage/PostgresBucketStorageFactory.js +56 -58
- package/dist/storage/PostgresBucketStorageFactory.js.map +1 -1
- package/dist/storage/PostgresCompactor.js +55 -66
- package/dist/storage/PostgresCompactor.js.map +1 -1
- package/dist/storage/PostgresSyncRulesStorage.js +23 -15
- package/dist/storage/PostgresSyncRulesStorage.js.map +1 -1
- package/dist/storage/batch/OperationBatch.js +2 -1
- package/dist/storage/batch/OperationBatch.js.map +1 -1
- package/dist/storage/batch/PostgresBucketBatch.js +286 -213
- package/dist/storage/batch/PostgresBucketBatch.js.map +1 -1
- package/dist/storage/batch/PostgresPersistedBatch.js +86 -81
- package/dist/storage/batch/PostgresPersistedBatch.js.map +1 -1
- package/dist/storage/current-data-store.js +270 -0
- package/dist/storage/current-data-store.js.map +1 -0
- package/dist/storage/current-data-table.js +22 -0
- package/dist/storage/current-data-table.js.map +1 -0
- package/dist/storage/sync-rules/PostgresPersistedSyncRulesContent.js +14 -30
- package/dist/storage/sync-rules/PostgresPersistedSyncRulesContent.js.map +1 -1
- package/dist/storage/table-id.js +8 -0
- package/dist/storage/table-id.js.map +1 -0
- package/dist/types/models/CurrentData.js +11 -2
- package/dist/types/models/CurrentData.js.map +1 -1
- package/dist/types/models/SyncRules.js +12 -1
- package/dist/types/models/SyncRules.js.map +1 -1
- package/dist/types/models/json.js +21 -0
- package/dist/types/models/json.js.map +1 -0
- package/dist/utils/bson.js.map +1 -1
- package/dist/utils/db.js +41 -0
- package/dist/utils/db.js.map +1 -1
- package/dist/utils/test-utils.js +50 -14
- package/dist/utils/test-utils.js.map +1 -1
- package/package.json +9 -9
- package/src/migrations/scripts/1771232439485-storage-version.ts +44 -0
- package/src/migrations/scripts/1771424826685-current-data-pending-deletes.ts +10 -0
- package/src/migrations/scripts/1771491856000-sync-plan.ts +21 -0
- package/src/storage/PostgresBucketStorageFactory.ts +69 -68
- package/src/storage/PostgresCompactor.ts +63 -72
- package/src/storage/PostgresSyncRulesStorage.ts +30 -17
- package/src/storage/batch/OperationBatch.ts +4 -3
- package/src/storage/batch/PostgresBucketBatch.ts +306 -238
- package/src/storage/batch/PostgresPersistedBatch.ts +92 -84
- package/src/storage/current-data-store.ts +326 -0
- package/src/storage/current-data-table.ts +26 -0
- package/src/storage/sync-rules/PostgresPersistedSyncRulesContent.ts +13 -33
- package/src/storage/table-id.ts +9 -0
- package/src/types/models/CurrentData.ts +17 -4
- package/src/types/models/SyncRules.ts +16 -1
- package/src/types/models/json.ts +26 -0
- package/src/utils/bson.ts +1 -1
- package/src/utils/db.ts +47 -0
- package/src/utils/test-utils.ts +42 -15
- package/test/src/__snapshots__/storage.test.ts.snap +148 -6
- package/test/src/__snapshots__/storage_compacting.test.ts.snap +17 -0
- package/test/src/__snapshots__/storage_sync.test.ts.snap +2211 -21
- package/test/src/migrations.test.ts +9 -2
- package/test/src/storage.test.ts +137 -131
- package/test/src/storage_compacting.test.ts +113 -2
- package/test/src/storage_sync.test.ts +148 -4
- package/test/src/util.ts +5 -2
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
var __addDisposableResource = (this && this.__addDisposableResource) || function (env, value, async) {
|
|
2
|
+
if (value !== null && value !== void 0) {
|
|
3
|
+
if (typeof value !== "object" && typeof value !== "function") throw new TypeError("Object expected.");
|
|
4
|
+
var dispose, inner;
|
|
5
|
+
if (async) {
|
|
6
|
+
if (!Symbol.asyncDispose) throw new TypeError("Symbol.asyncDispose is not defined.");
|
|
7
|
+
dispose = value[Symbol.asyncDispose];
|
|
8
|
+
}
|
|
9
|
+
if (dispose === void 0) {
|
|
10
|
+
if (!Symbol.dispose) throw new TypeError("Symbol.dispose is not defined.");
|
|
11
|
+
dispose = value[Symbol.dispose];
|
|
12
|
+
if (async) inner = dispose;
|
|
13
|
+
}
|
|
14
|
+
if (typeof dispose !== "function") throw new TypeError("Object not disposable.");
|
|
15
|
+
if (inner) dispose = function() { try { inner.call(this); } catch (e) { return Promise.reject(e); } };
|
|
16
|
+
env.stack.push({ value: value, dispose: dispose, async: async });
|
|
17
|
+
}
|
|
18
|
+
else if (async) {
|
|
19
|
+
env.stack.push({ async: true });
|
|
20
|
+
}
|
|
21
|
+
return value;
|
|
22
|
+
};
|
|
23
|
+
var __disposeResources = (this && this.__disposeResources) || (function (SuppressedError) {
|
|
24
|
+
return function (env) {
|
|
25
|
+
function fail(e) {
|
|
26
|
+
env.error = env.hasError ? new SuppressedError(e, env.error, "An error was suppressed during disposal.") : e;
|
|
27
|
+
env.hasError = true;
|
|
28
|
+
}
|
|
29
|
+
var r, s = 0;
|
|
30
|
+
function next() {
|
|
31
|
+
while (r = env.stack.pop()) {
|
|
32
|
+
try {
|
|
33
|
+
if (!r.async && s === 1) return s = 0, env.stack.push(r), Promise.resolve().then(next);
|
|
34
|
+
if (r.dispose) {
|
|
35
|
+
var result = r.dispose.call(r.value);
|
|
36
|
+
if (r.async) return s |= 2, Promise.resolve(result).then(next, function(e) { fail(e); return next(); });
|
|
37
|
+
}
|
|
38
|
+
else s |= 1;
|
|
39
|
+
}
|
|
40
|
+
catch (e) {
|
|
41
|
+
fail(e);
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
if (s === 1) return env.hasError ? Promise.reject(env.error) : Promise.resolve();
|
|
45
|
+
if (env.hasError) throw env.error;
|
|
46
|
+
}
|
|
47
|
+
return next();
|
|
48
|
+
};
|
|
49
|
+
})(typeof SuppressedError === "function" ? SuppressedError : function (error, suppressed, message) {
|
|
50
|
+
var e = new Error(message);
|
|
51
|
+
return e.name = "SuppressedError", e.error = error, e.suppressed = suppressed, e;
|
|
52
|
+
});
|
|
53
|
+
import { openMigrationDB } from '../migration-utils.js';
|
|
54
|
+
export const up = async (context) => {
|
|
55
|
+
const env_1 = { stack: [], error: void 0, hasError: false };
|
|
56
|
+
try {
|
|
57
|
+
const { service_context: { configuration } } = context;
|
|
58
|
+
const client = __addDisposableResource(env_1, openMigrationDB(configuration.storage), true);
|
|
59
|
+
await client.sql `
|
|
60
|
+
ALTER TABLE sync_rules
|
|
61
|
+
ADD COLUMN sync_plan JSON;
|
|
62
|
+
`.execute();
|
|
63
|
+
}
|
|
64
|
+
catch (e_1) {
|
|
65
|
+
env_1.error = e_1;
|
|
66
|
+
env_1.hasError = true;
|
|
67
|
+
}
|
|
68
|
+
finally {
|
|
69
|
+
const result_1 = __disposeResources(env_1);
|
|
70
|
+
if (result_1)
|
|
71
|
+
await result_1;
|
|
72
|
+
}
|
|
73
|
+
};
|
|
74
|
+
export const down = async (context) => {
|
|
75
|
+
const env_2 = { stack: [], error: void 0, hasError: false };
|
|
76
|
+
try {
|
|
77
|
+
const { service_context: { configuration } } = context;
|
|
78
|
+
const client = __addDisposableResource(env_2, openMigrationDB(configuration.storage), true);
|
|
79
|
+
await client.sql `ALTER TABLE sync_rules DROP COLUMN sync_plan`.execute();
|
|
80
|
+
}
|
|
81
|
+
catch (e_2) {
|
|
82
|
+
env_2.error = e_2;
|
|
83
|
+
env_2.hasError = true;
|
|
84
|
+
}
|
|
85
|
+
finally {
|
|
86
|
+
const result_2 = __disposeResources(env_2);
|
|
87
|
+
if (result_2)
|
|
88
|
+
await result_2;
|
|
89
|
+
}
|
|
90
|
+
};
|
|
91
|
+
//# sourceMappingURL=1771491856000-sync-plan.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"1771491856000-sync-plan.js","sourceRoot":"","sources":["../../../src/migrations/scripts/1771491856000-sync-plan.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AACA,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAExD,MAAM,CAAC,MAAM,EAAE,GAA0C,KAAK,EAAE,OAAO,EAAE,EAAE;;;QACzE,MAAM,EACJ,eAAe,EAAE,EAAE,aAAa,EAAE,EACnC,GAAG,OAAO,CAAC;QACZ,MAAY,MAAM,kCAAG,eAAe,CAAC,aAAa,CAAC,OAAO,CAAC,OAAA,CAAC;QAC5D,MAAM,MAAM,CAAC,GAAG,CAAA;;;GAGf,CAAC,OAAO,EAAE,CAAC;;;;;;;;;;;CACb,CAAC;AAEF,MAAM,CAAC,MAAM,IAAI,GAA0C,KAAK,EAAE,OAAO,EAAE,EAAE;;;QAC3E,MAAM,EACJ,eAAe,EAAE,EAAE,aAAa,EAAE,EACnC,GAAG,OAAO,CAAC;QACZ,MAAY,MAAM,kCAAG,eAAe,CAAC,aAAa,CAAC,OAAO,CAAC,OAAA,CAAC;QAC5D,MAAM,MAAM,CAAC,GAAG,CAAA,8CAA8C,CAAC,OAAO,EAAE,CAAC;;;;;;;;;;;CAC1E,CAAC"}
|
|
@@ -1,16 +1,14 @@
|
|
|
1
|
-
import
|
|
2
|
-
import { storage } from '@powersync/service-core';
|
|
3
|
-
import * as sync_rules from '@powersync/service-sync-rules';
|
|
1
|
+
import { framework, storage } from '@powersync/service-core';
|
|
4
2
|
import crypto from 'crypto';
|
|
5
3
|
import * as uuid from 'uuid';
|
|
6
4
|
import * as lib_postgres from '@powersync/lib-service-postgres';
|
|
7
5
|
import { models } from '../types/types.js';
|
|
6
|
+
import { getStorageApplicationName } from '../utils/application-name.js';
|
|
8
7
|
import { NOTIFICATION_CHANNEL, STORAGE_SCHEMA_NAME } from '../utils/db.js';
|
|
9
8
|
import { notifySyncRulesUpdate } from './batch/PostgresBucketBatch.js';
|
|
10
9
|
import { PostgresSyncRulesStorage } from './PostgresSyncRulesStorage.js';
|
|
11
10
|
import { PostgresPersistedSyncRulesContent } from './sync-rules/PostgresPersistedSyncRulesContent.js';
|
|
12
|
-
|
|
13
|
-
export class PostgresBucketStorageFactory extends framework.BaseObserver {
|
|
11
|
+
export class PostgresBucketStorageFactory extends storage.BucketStorageFactory {
|
|
14
12
|
options;
|
|
15
13
|
db;
|
|
16
14
|
slot_name_prefix;
|
|
@@ -66,14 +64,21 @@ export class PostgresBucketStorageFactory extends framework.BaseObserver {
|
|
|
66
64
|
}
|
|
67
65
|
const sizes = await this.db.sql `
|
|
68
66
|
SELECT
|
|
69
|
-
|
|
67
|
+
COALESCE(
|
|
68
|
+
pg_total_relation_size(to_regclass('current_data')),
|
|
69
|
+
0
|
|
70
|
+
) AS v1_current_size_bytes,
|
|
71
|
+
COALESCE(
|
|
72
|
+
pg_total_relation_size(to_regclass('v3_current_data')),
|
|
73
|
+
0
|
|
74
|
+
) AS v3_current_size_bytes,
|
|
70
75
|
pg_total_relation_size('bucket_parameters') AS parameter_size_bytes,
|
|
71
76
|
pg_total_relation_size('bucket_data') AS operations_size_bytes;
|
|
72
77
|
`.first();
|
|
73
78
|
return {
|
|
74
79
|
operations_size_bytes: Number(sizes.operations_size_bytes),
|
|
75
80
|
parameters_size_bytes: Number(sizes.parameter_size_bytes),
|
|
76
|
-
replication_size_bytes: Number(sizes.
|
|
81
|
+
replication_size_bytes: Number(sizes.v1_current_size_bytes) + Number(sizes.v3_current_size_bytes)
|
|
77
82
|
};
|
|
78
83
|
}
|
|
79
84
|
async getPowerSyncInstanceId() {
|
|
@@ -117,38 +122,13 @@ export class PostgresBucketStorageFactory extends framework.BaseObserver {
|
|
|
117
122
|
type: lib_postgres.POSTGRES_CONNECTION_TYPE
|
|
118
123
|
};
|
|
119
124
|
}
|
|
120
|
-
// TODO possibly share implementation in abstract class
|
|
121
|
-
async configureSyncRules(options) {
|
|
122
|
-
const next = await this.getNextSyncRulesContent();
|
|
123
|
-
const active = await this.getActiveSyncRulesContent();
|
|
124
|
-
if (next?.sync_rules_content == options.content) {
|
|
125
|
-
framework.logger.info('Sync rules from configuration unchanged');
|
|
126
|
-
return { updated: false };
|
|
127
|
-
}
|
|
128
|
-
else if (next == null && active?.sync_rules_content == options.content) {
|
|
129
|
-
framework.logger.info('Sync rules from configuration unchanged');
|
|
130
|
-
return { updated: false };
|
|
131
|
-
}
|
|
132
|
-
else {
|
|
133
|
-
framework.logger.info('Sync rules updated from configuration');
|
|
134
|
-
const persisted_sync_rules = await this.updateSyncRules(options);
|
|
135
|
-
return { updated: true, persisted_sync_rules, lock: persisted_sync_rules.current_lock ?? undefined };
|
|
136
|
-
}
|
|
137
|
-
}
|
|
138
125
|
async updateSyncRules(options) {
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
// No schema-based validation at this point
|
|
144
|
-
schema: undefined,
|
|
145
|
-
defaultSchema: 'not_applicable', // Not needed for validation
|
|
146
|
-
throwOnError: true
|
|
147
|
-
});
|
|
148
|
-
}
|
|
149
|
-
else {
|
|
150
|
-
// Apply unconditionally. Any errors will be reported via the diagnostics API.
|
|
126
|
+
const storageVersion = options.storageVersion ?? storage.CURRENT_STORAGE_VERSION;
|
|
127
|
+
const storageConfig = storage.STORAGE_VERSION_CONFIG[storageVersion];
|
|
128
|
+
if (storageConfig == null) {
|
|
129
|
+
throw new framework.ServiceError(framework.ErrorCode.PSYNC_S1005, `Unsupported storage version ${storageVersion}`);
|
|
151
130
|
}
|
|
131
|
+
await this.initializeStorageVersion(storageConfig);
|
|
152
132
|
return this.db.transaction(async (db) => {
|
|
153
133
|
await db.sql `
|
|
154
134
|
UPDATE sync_rules
|
|
@@ -164,7 +144,14 @@ export class PostgresBucketStorageFactory extends framework.BaseObserver {
|
|
|
164
144
|
nextval('sync_rules_id_sequence') AS id
|
|
165
145
|
)
|
|
166
146
|
INSERT INTO
|
|
167
|
-
sync_rules (
|
|
147
|
+
sync_rules (
|
|
148
|
+
id,
|
|
149
|
+
content,
|
|
150
|
+
sync_plan,
|
|
151
|
+
state,
|
|
152
|
+
slot_name,
|
|
153
|
+
storage_version
|
|
154
|
+
)
|
|
168
155
|
VALUES
|
|
169
156
|
(
|
|
170
157
|
(
|
|
@@ -173,7 +160,8 @@ export class PostgresBucketStorageFactory extends framework.BaseObserver {
|
|
|
173
160
|
FROM
|
|
174
161
|
next_id
|
|
175
162
|
),
|
|
176
|
-
${{ type: 'varchar', value: options.
|
|
163
|
+
${{ type: 'varchar', value: options.config.yaml }},
|
|
164
|
+
${{ type: 'json', value: options.config.plan }},
|
|
177
165
|
${{ type: 'varchar', value: storage.SyncRuleState.PROCESSING }},
|
|
178
166
|
CONCAT(
|
|
179
167
|
${{ type: 'varchar', value: this.slot_name_prefix }},
|
|
@@ -185,7 +173,8 @@ export class PostgresBucketStorageFactory extends framework.BaseObserver {
|
|
|
185
173
|
),
|
|
186
174
|
'_',
|
|
187
175
|
${{ type: 'varchar', value: crypto.randomBytes(2).toString('hex') }}
|
|
188
|
-
)
|
|
176
|
+
),
|
|
177
|
+
${{ type: 'int4', value: storageVersion }}
|
|
189
178
|
)
|
|
190
179
|
RETURNING
|
|
191
180
|
*
|
|
@@ -196,6 +185,31 @@ export class PostgresBucketStorageFactory extends framework.BaseObserver {
|
|
|
196
185
|
return new PostgresPersistedSyncRulesContent(this.db, newSyncRulesRow);
|
|
197
186
|
});
|
|
198
187
|
}
|
|
188
|
+
/**
|
|
189
|
+
* Lazy-initializes storage-version-specific structures, if needed.
|
|
190
|
+
*/
|
|
191
|
+
async initializeStorageVersion(storageConfig) {
|
|
192
|
+
if (!storageConfig.softDeleteCurrentData) {
|
|
193
|
+
return;
|
|
194
|
+
}
|
|
195
|
+
await this.db.sql `
|
|
196
|
+
CREATE TABLE IF NOT EXISTS v3_current_data (
|
|
197
|
+
group_id integer NOT NULL,
|
|
198
|
+
source_table TEXT NOT NULL,
|
|
199
|
+
source_key bytea NOT NULL,
|
|
200
|
+
CONSTRAINT unique_v3_current_data_id PRIMARY KEY (group_id, source_table, source_key),
|
|
201
|
+
buckets jsonb NOT NULL,
|
|
202
|
+
data bytea NOT NULL,
|
|
203
|
+
lookups bytea[] NOT NULL,
|
|
204
|
+
pending_delete BIGINT NULL
|
|
205
|
+
)
|
|
206
|
+
`.execute();
|
|
207
|
+
await this.db.sql `
|
|
208
|
+
CREATE INDEX IF NOT EXISTS v3_current_data_pending_deletes ON v3_current_data (group_id, pending_delete)
|
|
209
|
+
WHERE
|
|
210
|
+
pending_delete IS NOT NULL
|
|
211
|
+
`.execute();
|
|
212
|
+
}
|
|
199
213
|
async restartReplication(sync_rules_group_id) {
|
|
200
214
|
const next = await this.getNextSyncRulesContent();
|
|
201
215
|
const active = await this.getActiveSyncRulesContent();
|
|
@@ -203,10 +217,7 @@ export class PostgresBucketStorageFactory extends framework.BaseObserver {
|
|
|
203
217
|
// The current one will continue serving sync requests until the next one has finished processing.
|
|
204
218
|
if (next != null && next.id == sync_rules_group_id) {
|
|
205
219
|
// We need to redo the "next" sync rules
|
|
206
|
-
await this.updateSyncRules(
|
|
207
|
-
content: next.sync_rules_content,
|
|
208
|
-
validate: false
|
|
209
|
-
});
|
|
220
|
+
await this.updateSyncRules(next.asUpdateOptions());
|
|
210
221
|
// Pro-actively stop replicating
|
|
211
222
|
await this.db.sql `
|
|
212
223
|
UPDATE sync_rules
|
|
@@ -219,10 +230,7 @@ export class PostgresBucketStorageFactory extends framework.BaseObserver {
|
|
|
219
230
|
}
|
|
220
231
|
else if (next == null && active?.id == sync_rules_group_id) {
|
|
221
232
|
// Slot removed for "active" sync rules, while there is no "next" one.
|
|
222
|
-
await this.updateSyncRules(
|
|
223
|
-
content: active.sync_rules_content,
|
|
224
|
-
validate: false
|
|
225
|
-
});
|
|
233
|
+
await this.updateSyncRules(active.asUpdateOptions());
|
|
226
234
|
// Pro-actively stop replicating, but still serve clients with existing data
|
|
227
235
|
await this.db.sql `
|
|
228
236
|
UPDATE sync_rules
|
|
@@ -246,11 +254,6 @@ export class PostgresBucketStorageFactory extends framework.BaseObserver {
|
|
|
246
254
|
`.execute();
|
|
247
255
|
}
|
|
248
256
|
}
|
|
249
|
-
// TODO possibly share via abstract class
|
|
250
|
-
async getActiveSyncRules(options) {
|
|
251
|
-
const content = await this.getActiveSyncRulesContent();
|
|
252
|
-
return content?.parsed(options) ?? null;
|
|
253
|
-
}
|
|
254
257
|
async getActiveSyncRulesContent() {
|
|
255
258
|
const activeRow = await this.db.sql `
|
|
256
259
|
SELECT
|
|
@@ -272,11 +275,6 @@ export class PostgresBucketStorageFactory extends framework.BaseObserver {
|
|
|
272
275
|
}
|
|
273
276
|
return new PostgresPersistedSyncRulesContent(this.db, activeRow);
|
|
274
277
|
}
|
|
275
|
-
// TODO possibly share via abstract class
|
|
276
|
-
async getNextSyncRules(options) {
|
|
277
|
-
const content = await this.getNextSyncRulesContent();
|
|
278
|
-
return content?.parsed(options) ?? null;
|
|
279
|
-
}
|
|
280
278
|
async getNextSyncRulesContent() {
|
|
281
279
|
const nextRow = await this.db.sql `
|
|
282
280
|
SELECT
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PostgresBucketStorageFactory.js","sourceRoot":"","sources":["../../src/storage/PostgresBucketStorageFactory.ts"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"PostgresBucketStorageFactory.js","sourceRoot":"","sources":["../../src/storage/PostgresBucketStorageFactory.ts"],"names":[],"mappings":"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"}
|
|
@@ -23,12 +23,12 @@ export class PostgresCompactor {
|
|
|
23
23
|
constructor(db, group_id, options) {
|
|
24
24
|
this.db = db;
|
|
25
25
|
this.group_id = group_id;
|
|
26
|
-
this.idLimitBytes = (options
|
|
27
|
-
this.moveBatchLimit = options
|
|
28
|
-
this.moveBatchQueryLimit = options
|
|
29
|
-
this.clearBatchLimit = options
|
|
30
|
-
this.maxOpId = options
|
|
31
|
-
this.buckets = options
|
|
26
|
+
this.idLimitBytes = (options.memoryLimitMB ?? DEFAULT_MEMORY_LIMIT_MB) * 1024 * 1024;
|
|
27
|
+
this.moveBatchLimit = options.moveBatchLimit ?? DEFAULT_MOVE_BATCH_LIMIT;
|
|
28
|
+
this.moveBatchQueryLimit = options.moveBatchQueryLimit ?? DEFAULT_MOVE_BATCH_QUERY_LIMIT;
|
|
29
|
+
this.clearBatchLimit = options.clearBatchLimit ?? DEFAULT_CLEAR_BATCH_LIMIT;
|
|
30
|
+
this.maxOpId = options.maxOpId ?? 0n;
|
|
31
|
+
this.buckets = options.compactBuckets;
|
|
32
32
|
}
|
|
33
33
|
/**
|
|
34
34
|
* Compact buckets by converting operations into MOVE and/or CLEAR operations.
|
|
@@ -38,36 +38,48 @@ export class PostgresCompactor {
|
|
|
38
38
|
async compact() {
|
|
39
39
|
if (this.buckets) {
|
|
40
40
|
for (let bucket of this.buckets) {
|
|
41
|
-
|
|
42
|
-
// through the buckets in a single query.
|
|
43
|
-
// That makes batching more tricky, so we leave for later.
|
|
44
|
-
await this.compactInternal(bucket);
|
|
41
|
+
await this.compactSingleBucket(bucket);
|
|
45
42
|
}
|
|
46
43
|
}
|
|
47
44
|
else {
|
|
48
|
-
await this.
|
|
45
|
+
await this.compactAllBuckets();
|
|
49
46
|
}
|
|
50
47
|
}
|
|
51
|
-
async
|
|
52
|
-
const
|
|
53
|
-
let
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
48
|
+
async compactAllBuckets() {
|
|
49
|
+
const DISCOVERY_BATCH_SIZE = 200;
|
|
50
|
+
let lastBucket = '';
|
|
51
|
+
while (true) {
|
|
52
|
+
const bucketRows = (await this.db.sql `
|
|
53
|
+
SELECT DISTINCT
|
|
54
|
+
bucket_name
|
|
55
|
+
FROM
|
|
56
|
+
bucket_data
|
|
57
|
+
WHERE
|
|
58
|
+
group_id = ${{ type: 'int4', value: this.group_id }}
|
|
59
|
+
AND bucket_name > ${{ type: 'varchar', value: lastBucket }}
|
|
60
|
+
ORDER BY
|
|
61
|
+
bucket_name ASC
|
|
62
|
+
LIMIT
|
|
63
|
+
${{ type: 'int4', value: DISCOVERY_BATCH_SIZE }}
|
|
64
|
+
`.rows());
|
|
65
|
+
if (bucketRows.length === 0) {
|
|
66
|
+
break;
|
|
67
|
+
}
|
|
68
|
+
for (const row of bucketRows) {
|
|
69
|
+
await this.compactSingleBucket(row.bucket_name);
|
|
70
|
+
}
|
|
71
|
+
lastBucket = bucketRows[bucketRows.length - 1].bucket_name;
|
|
70
72
|
}
|
|
73
|
+
}
|
|
74
|
+
async compactSingleBucket(bucket) {
|
|
75
|
+
const idLimitBytes = this.idLimitBytes;
|
|
76
|
+
let currentState = {
|
|
77
|
+
bucket: bucket,
|
|
78
|
+
seen: new Map(),
|
|
79
|
+
trackingSize: 0,
|
|
80
|
+
lastNotPut: null,
|
|
81
|
+
opsSincePut: 0
|
|
82
|
+
};
|
|
71
83
|
let upperOpIdLimit = BIGINT_MAX;
|
|
72
84
|
while (true) {
|
|
73
85
|
const batch = await this.db.sql `
|
|
@@ -83,16 +95,9 @@ export class PostgresCompactor {
|
|
|
83
95
|
bucket_data
|
|
84
96
|
WHERE
|
|
85
97
|
group_id = ${{ type: 'int4', value: this.group_id }}
|
|
86
|
-
AND bucket_name
|
|
87
|
-
AND
|
|
88
|
-
(
|
|
89
|
-
bucket_name = ${{ type: 'varchar', value: bucketUpper }}
|
|
90
|
-
AND op_id < ${{ type: 'int8', value: upperOpIdLimit }}
|
|
91
|
-
)
|
|
92
|
-
OR bucket_name < ${{ type: 'varchar', value: bucketUpper }} COLLATE "C" -- Use binary comparison
|
|
93
|
-
)
|
|
98
|
+
AND bucket_name = ${{ type: 'varchar', value: bucket }}
|
|
99
|
+
AND op_id < ${{ type: 'int8', value: upperOpIdLimit }}
|
|
94
100
|
ORDER BY
|
|
95
|
-
bucket_name DESC,
|
|
96
101
|
op_id DESC
|
|
97
102
|
LIMIT
|
|
98
103
|
${{ type: 'int4', value: this.moveBatchQueryLimit }}
|
|
@@ -106,27 +111,7 @@ export class PostgresCompactor {
|
|
|
106
111
|
// Set upperBound for the next batch
|
|
107
112
|
const lastBatchItem = batch[batch.length - 1];
|
|
108
113
|
upperOpIdLimit = lastBatchItem.op_id;
|
|
109
|
-
bucketUpper = lastBatchItem.bucket_name;
|
|
110
114
|
for (const doc of batch) {
|
|
111
|
-
if (currentState == null || doc.bucket_name != currentState.bucket) {
|
|
112
|
-
if (currentState != null && currentState.lastNotPut != null && currentState.opsSincePut >= 1) {
|
|
113
|
-
// Important to flush before clearBucket()
|
|
114
|
-
await this.flush();
|
|
115
|
-
logger.info(`Inserting CLEAR at ${this.group_id}:${currentState.bucket}:${currentState.lastNotPut} to remove ${currentState.opsSincePut} operations`);
|
|
116
|
-
const bucket = currentState.bucket;
|
|
117
|
-
const clearOp = currentState.lastNotPut;
|
|
118
|
-
// Free memory before clearing bucket
|
|
119
|
-
currentState = null;
|
|
120
|
-
await this.clearBucket(bucket, clearOp);
|
|
121
|
-
}
|
|
122
|
-
currentState = {
|
|
123
|
-
bucket: doc.bucket_name,
|
|
124
|
-
seen: new Map(),
|
|
125
|
-
trackingSize: 0,
|
|
126
|
-
lastNotPut: null,
|
|
127
|
-
opsSincePut: 0
|
|
128
|
-
};
|
|
129
|
-
}
|
|
130
115
|
if (this.maxOpId != null && doc.op_id > this.maxOpId) {
|
|
131
116
|
continue;
|
|
132
117
|
}
|
|
@@ -185,14 +170,10 @@ export class PostgresCompactor {
|
|
|
185
170
|
}
|
|
186
171
|
}
|
|
187
172
|
await this.flush();
|
|
188
|
-
currentState
|
|
189
|
-
if (currentState
|
|
173
|
+
currentState.seen.clear();
|
|
174
|
+
if (currentState.lastNotPut != null && currentState.opsSincePut > 1) {
|
|
190
175
|
logger.info(`Inserting CLEAR at ${this.group_id}:${currentState.bucket}:${currentState.lastNotPut} to remove ${currentState.opsSincePut} operations`);
|
|
191
|
-
|
|
192
|
-
const clearOp = currentState.lastNotPut;
|
|
193
|
-
// Free memory before clearing bucket
|
|
194
|
-
currentState = null;
|
|
195
|
-
await this.clearBucket(bucket, clearOp);
|
|
176
|
+
await this.clearBucket(currentState.bucket, currentState.lastNotPut);
|
|
196
177
|
}
|
|
197
178
|
}
|
|
198
179
|
async flush() {
|
|
@@ -202,6 +183,14 @@ export class PostgresCompactor {
|
|
|
202
183
|
this.updates = [];
|
|
203
184
|
}
|
|
204
185
|
}
|
|
186
|
+
/**
|
|
187
|
+
* Expose the internal clearBucket() method to tests.
|
|
188
|
+
*
|
|
189
|
+
* @deprecated Only for tests
|
|
190
|
+
*/
|
|
191
|
+
clearBucketForTests(bucket, op) {
|
|
192
|
+
return this.clearBucket(bucket, op);
|
|
193
|
+
}
|
|
205
194
|
/**
|
|
206
195
|
* Perform a CLEAR compact for a bucket.
|
|
207
196
|
*
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PostgresCompactor.js","sourceRoot":"","sources":["../../src/storage/PostgresCompactor.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,MAAM,EAAE,yBAAyB,EAAE,MAAM,mCAAmC,CAAC;AACtF,OAAO,EAAyB,KAAK,EAAE,MAAM,yBAAyB,CAAC;AAGvE,OAAO,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAChD,OAAO,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAC3C,OAAO,EAAE,GAAG,EAAE,MAAM,gBAAgB,CAAC;AACrC,OAAO,EAAE,IAAI,EAAE,MAAM,sBAAsB,CAAC;AAC5C,OAAO,EAAE,eAAe,EAAE,MAAM,2BAA2B,CAAC;AA8B5D,MAAM,yBAAyB,GAAG,IAAI,CAAC;AACvC,MAAM,wBAAwB,GAAG,IAAI,CAAC;AACtC,MAAM,8BAA8B,GAAG,MAAM,CAAC;AAE9C,2CAA2C;AAC3C,MAAM,uBAAuB,GAAG,EAAE,CAAC;AAEnC,MAAM,OAAO,iBAAiB;IAWlB;IACA;IAXF,OAAO,GAAuB,EAAE,CAAC;IAEjC,YAAY,CAAS;IACrB,cAAc,CAAS;IACvB,mBAAmB,CAAS;IAC5B,eAAe,CAAS;IACxB,OAAO,
|
|
1
|
+
{"version":3,"file":"PostgresCompactor.js","sourceRoot":"","sources":["../../src/storage/PostgresCompactor.ts"],"names":[],"mappings":"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"}
|