@powersync/service-module-postgres-storage 0.0.0-dev-20250122110924 → 0.0.0-dev-20250227082606

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.
Files changed (36) hide show
  1. package/CHANGELOG.md +120 -12
  2. package/README.md +7 -1
  3. package/dist/.tsbuildinfo +1 -1
  4. package/dist/@types/storage/PostgresBucketStorageFactory.d.ts +8 -13
  5. package/dist/@types/storage/PostgresCompactor.d.ts +0 -6
  6. package/dist/@types/storage/PostgresSyncRulesStorage.d.ts +9 -3
  7. package/dist/@types/storage/batch/PostgresBucketBatch.d.ts +7 -6
  8. package/dist/@types/types/codecs.d.ts +2 -2
  9. package/dist/@types/types/models/BucketData.d.ts +1 -1
  10. package/dist/@types/types/models/BucketParameters.d.ts +2 -2
  11. package/dist/@types/types/models/CurrentData.d.ts +3 -3
  12. package/dist/@types/types/models/SourceTable.d.ts +1 -1
  13. package/dist/@types/types/types.d.ts +5 -0
  14. package/dist/storage/PostgresBucketStorageFactory.js +68 -158
  15. package/dist/storage/PostgresBucketStorageFactory.js.map +1 -1
  16. package/dist/storage/PostgresCompactor.js +19 -6
  17. package/dist/storage/PostgresCompactor.js.map +1 -1
  18. package/dist/storage/PostgresSyncRulesStorage.js +221 -123
  19. package/dist/storage/PostgresSyncRulesStorage.js.map +1 -1
  20. package/dist/storage/batch/PostgresBucketBatch.js +31 -19
  21. package/dist/storage/batch/PostgresBucketBatch.js.map +1 -1
  22. package/dist/storage/batch/PostgresPersistedBatch.js +39 -81
  23. package/dist/storage/batch/PostgresPersistedBatch.js.map +1 -1
  24. package/dist/types/types.js.map +1 -1
  25. package/package.json +9 -9
  26. package/src/storage/PostgresBucketStorageFactory.ts +73 -179
  27. package/src/storage/PostgresCompactor.ts +19 -14
  28. package/src/storage/PostgresSyncRulesStorage.ts +231 -38
  29. package/src/storage/batch/PostgresBucketBatch.ts +39 -22
  30. package/src/storage/batch/PostgresPersistedBatch.ts +39 -81
  31. package/src/types/models/SourceTable.ts +1 -1
  32. package/src/types/types.ts +1 -0
  33. package/test/src/__snapshots__/storage_sync.test.ts.snap +138 -0
  34. package/test/src/storage.test.ts +1 -1
  35. package/test/src/storage_compacting.test.ts +1 -1
  36. package/tsconfig.json +0 -2
@@ -1,5 +1,5 @@
1
1
  import * as framework from '@powersync/lib-services-framework';
2
- import { storage } from '@powersync/service-core';
2
+ import { GetIntanceOptions, storage, SyncRulesBucketStorage, UpdateSyncRulesOptions } from '@powersync/service-core';
3
3
  import * as pg_wire from '@powersync/service-jpgwire';
4
4
  import * as lib_postgres from '@powersync/lib-service-postgres';
5
5
  import { NormalizedPostgresStorageConfig } from '../types/types.js';
@@ -8,35 +8,30 @@ export type PostgresBucketStorageOptions = {
8
8
  config: NormalizedPostgresStorageConfig;
9
9
  slot_name_prefix: string;
10
10
  };
11
- export declare class PostgresBucketStorageFactory extends framework.DisposableObserver<storage.BucketStorageFactoryListener> implements storage.BucketStorageFactory {
11
+ export declare class PostgresBucketStorageFactory extends framework.BaseObserver<storage.BucketStorageFactoryListener> implements storage.BucketStorageFactory {
12
12
  protected options: PostgresBucketStorageOptions;
13
13
  readonly db: lib_postgres.DatabaseClient;
14
14
  readonly slot_name_prefix: string;
15
- private sharedIterator;
16
- private readonly storageCache;
15
+ private activeStorageCache;
17
16
  constructor(options: PostgresBucketStorageOptions);
18
17
  [Symbol.asyncDispose](): Promise<void>;
19
18
  prepareStatements(connection: pg_wire.PgConnection): Promise<void>;
20
- getInstance(syncRules: storage.PersistedSyncRulesContent): storage.SyncRulesBucketStorage;
19
+ getInstance(syncRules: storage.PersistedSyncRulesContent, options?: GetIntanceOptions): storage.SyncRulesBucketStorage;
21
20
  getStorageMetrics(): Promise<storage.StorageMetrics>;
22
21
  getPowerSyncInstanceId(): Promise<string>;
23
- configureSyncRules(sync_rules: string, options?: {
24
- lock?: boolean;
25
- }): Promise<{
22
+ getSystemIdentifier(): Promise<storage.BucketStorageSystemIdentifier>;
23
+ configureSyncRules(options: UpdateSyncRulesOptions): Promise<{
26
24
  updated: boolean;
27
25
  persisted_sync_rules?: storage.PersistedSyncRulesContent;
28
26
  lock?: storage.ReplicationLock;
29
27
  }>;
30
28
  updateSyncRules(options: storage.UpdateSyncRulesOptions): Promise<PostgresPersistedSyncRulesContent>;
31
- slotRemoved(slot_name: string): Promise<void>;
29
+ restartReplication(sync_rules_group_id: number): Promise<void>;
32
30
  getActiveSyncRules(options: storage.ParseSyncRulesOptions): Promise<storage.PersistedSyncRules | null>;
33
31
  getActiveSyncRulesContent(): Promise<storage.PersistedSyncRulesContent | null>;
34
32
  getNextSyncRules(options: storage.ParseSyncRulesOptions): Promise<storage.PersistedSyncRules | null>;
35
33
  getNextSyncRulesContent(): Promise<storage.PersistedSyncRulesContent | null>;
36
34
  getReplicatingSyncRules(): Promise<storage.PersistedSyncRulesContent[]>;
37
35
  getStoppedSyncRules(): Promise<storage.PersistedSyncRulesContent[]>;
38
- getActiveCheckpoint(): Promise<storage.ActiveCheckpoint>;
39
- watchWriteCheckpoint(user_id: string, signal: AbortSignal): AsyncIterable<storage.WriteCheckpoint>;
40
- protected watchActiveCheckpoint(signal: AbortSignal): AsyncIterable<storage.ActiveCheckpoint>;
41
- private makeActiveCheckpoint;
36
+ getActiveStorage(): Promise<SyncRulesBucketStorage | null>;
42
37
  }
@@ -4,12 +4,6 @@ import { storage } from '@powersync/service-core';
4
4
  * Additional options, primarily for testing.
5
5
  */
6
6
  export interface PostgresCompactOptions extends storage.CompactOptions {
7
- /** Minimum of 2 */
8
- clearBatchLimit?: number;
9
- /** Minimum of 1 */
10
- moveBatchLimit?: number;
11
- /** Minimum of 1 */
12
- moveBatchQueryLimit?: number;
13
7
  }
14
8
  export declare class PostgresCompactor {
15
9
  private db;
@@ -1,8 +1,8 @@
1
1
  import * as lib_postgres from '@powersync/lib-service-postgres';
2
- import { DisposableObserver } from '@powersync/lib-services-framework';
3
- import { storage, utils } from '@powersync/service-core';
2
+ import { CheckpointChanges, GetCheckpointChangesOptions, storage, utils, WatchWriteCheckpointOptions } from '@powersync/service-core';
4
3
  import * as sync_rules from '@powersync/service-sync-rules';
5
4
  import { RequiredOperationBatchLimits } from '../types/types.js';
5
+ import * as framework from '@powersync/lib-services-framework';
6
6
  import { PostgresWriteCheckpointAPI } from './checkpoints/PostgresWriteCheckpointAPI.js';
7
7
  import { PostgresBucketStorageFactory } from './PostgresBucketStorageFactory.js';
8
8
  export type PostgresSyncRulesStorageOptions = {
@@ -12,12 +12,13 @@ export type PostgresSyncRulesStorageOptions = {
12
12
  write_checkpoint_mode?: storage.WriteCheckpointMode;
13
13
  batchLimits: RequiredOperationBatchLimits;
14
14
  };
15
- export declare class PostgresSyncRulesStorage extends DisposableObserver<storage.SyncRulesBucketStorageListener> implements storage.SyncRulesBucketStorage {
15
+ export declare class PostgresSyncRulesStorage extends framework.BaseObserver<storage.SyncRulesBucketStorageListener> implements storage.SyncRulesBucketStorage {
16
16
  protected options: PostgresSyncRulesStorageOptions;
17
17
  readonly group_id: number;
18
18
  readonly sync_rules: storage.PersistedSyncRulesContent;
19
19
  readonly slot_name: string;
20
20
  readonly factory: PostgresBucketStorageFactory;
21
+ private sharedIterator;
21
22
  protected db: lib_postgres.DatabaseClient;
22
23
  protected writeCheckpointAPI: PostgresWriteCheckpointAPI;
23
24
  private parsedSyncRulesCache;
@@ -43,4 +44,9 @@ export declare class PostgresSyncRulesStorage extends DisposableObserver<storage
43
44
  clear(): Promise<void>;
44
45
  autoActivate(): Promise<void>;
45
46
  private getChecksumsInternal;
47
+ getActiveCheckpoint(): Promise<storage.ReplicationCheckpoint>;
48
+ watchWriteCheckpoint(options: WatchWriteCheckpointOptions): AsyncIterable<storage.StorageCheckpointUpdate>;
49
+ protected watchActiveCheckpoint(signal: AbortSignal): AsyncIterable<storage.ReplicationCheckpoint>;
50
+ getCheckpointChanges(options: GetCheckpointChangesOptions): Promise<CheckpointChanges>;
51
+ private makeActiveCheckpoint;
46
52
  }
@@ -1,5 +1,5 @@
1
1
  import * as lib_postgres from '@powersync/lib-service-postgres';
2
- import { DisposableObserver } from '@powersync/lib-services-framework';
2
+ import { BaseObserver } from '@powersync/lib-services-framework';
3
3
  import { storage } from '@powersync/service-core';
4
4
  import * as sync_rules from '@powersync/service-sync-rules';
5
5
  import * as t from 'ts-codec';
@@ -38,7 +38,7 @@ declare const StatefulCheckpoint: t.Intersection<t.Codec<{
38
38
  state: t.EnumCodec<typeof storage.SyncRuleState>;
39
39
  }>>;
40
40
  type StatefulCheckpointDecoded = t.Decoded<typeof StatefulCheckpoint>;
41
- export declare class PostgresBucketBatch extends DisposableObserver<storage.BucketBatchStorageListener> implements storage.BucketStorageBatch {
41
+ export declare class PostgresBucketBatch extends BaseObserver<storage.BucketBatchStorageListener> implements storage.BucketStorageBatch {
42
42
  protected options: PostgresBucketBatchOptions;
43
43
  last_flushed_op: bigint | null;
44
44
  protected db: lib_postgres.DatabaseClient;
@@ -52,13 +52,14 @@ export declare class PostgresBucketBatch extends DisposableObserver<storage.Buck
52
52
  private lastWaitingLogThrottled;
53
53
  constructor(options: PostgresBucketBatchOptions);
54
54
  get lastCheckpointLsn(): string | null;
55
+ [Symbol.asyncDispose](): Promise<void>;
55
56
  save(record: storage.SaveOptions): Promise<storage.FlushedResult | null>;
56
57
  truncate(sourceTables: storage.SourceTable[]): Promise<storage.FlushedResult | null>;
57
58
  protected truncateSingle(sourceTable: storage.SourceTable): Promise<bigint | null>;
58
59
  drop(sourceTables: storage.SourceTable[]): Promise<storage.FlushedResult | null>;
59
60
  flush(): Promise<storage.FlushedResult | null>;
60
61
  private flushInner;
61
- commit(lsn: string): Promise<boolean>;
62
+ commit(lsn: string, options?: storage.BucketBatchCommitOptions): Promise<boolean>;
62
63
  keepalive(lsn: string): Promise<boolean>;
63
64
  markSnapshotDone(tables: storage.SourceTable[], no_checkpoint_before_lsn: string): Promise<storage.SourceTable[]>;
64
65
  addCustomWriteCheckpoint(checkpoint: storage.BatchedCustomWriteCheckpointOptions): void;
@@ -66,14 +67,14 @@ export declare class PostgresBucketBatch extends DisposableObserver<storage.Buck
66
67
  protected saveOperation(persistedBatch: PostgresPersistedBatch, operation: RecordOperation, currentData?: CurrentDataDecoded | null): Promise<{
67
68
  group_id: number;
68
69
  source_table: string;
69
- source_key: Buffer;
70
- data: Buffer;
70
+ source_key: Buffer<ArrayBuffer>;
71
+ data: Buffer<ArrayBuffer>;
71
72
  buckets: {
72
73
  id: string;
73
74
  bucket: string;
74
75
  table: string;
75
76
  }[];
76
- lookups: Buffer[];
77
+ lookups: Buffer<ArrayBuffer>[];
77
78
  } | null>;
78
79
  /**
79
80
  * Gets relevant {@link SqlEventDescriptor}s for the given {@link SourceTable}
@@ -44,12 +44,12 @@ export declare const jsonb: <Decoded>(subCodec: t.Codec<Decoded, any>) => t.Code
44
44
  */
45
45
  export declare const jsonb_raw: <Decoded>() => t.Codec<Decoded, string, string, t.CodecProps>;
46
46
  export declare const bigint: t.Codec<bigint, string | number, string, t.CodecProps>;
47
- export declare const uint8array: t.Codec<Uint8Array, Uint8Array, string, t.CodecProps>;
47
+ export declare const uint8array: t.Codec<Uint8Array<ArrayBufferLike>, Uint8Array<ArrayBufferLike>, string, t.CodecProps>;
48
48
  /**
49
49
  * PGWire returns BYTEA values as Uint8Array instances.
50
50
  * We also serialize to a hex string for bulk inserts.
51
51
  */
52
- export declare const hexBuffer: t.Codec<Buffer, string, "hexBuffer", t.CodecProps>;
52
+ export declare const hexBuffer: t.Codec<Buffer<ArrayBuffer>, string, "hexBuffer", t.CodecProps>;
53
53
  /**
54
54
  * PGWire returns INTEGER columns as a `bigint`.
55
55
  * This does a decode operation to `number`.
@@ -11,7 +11,7 @@ export declare const BucketData: t.ObjectCodec<{
11
11
  op_id: t.Codec<bigint, string | number, string, t.CodecProps>;
12
12
  op: t.EnumCodec<typeof OpType>;
13
13
  source_table: t.Union<t.Codec<null, null, string, t.CodecProps>, t.IdentityCodec<t.CodecType.String>>;
14
- source_key: t.Union<t.Codec<null, null, string, t.CodecProps>, t.Codec<Buffer, string, "hexBuffer", t.CodecProps>>;
14
+ source_key: t.Union<t.Codec<null, null, string, t.CodecProps>, t.Codec<Buffer<ArrayBuffer>, string, "hexBuffer", t.CodecProps>>;
15
15
  table_name: t.Union<t.Codec<string, string, string, t.CodecProps>, t.Codec<null, null, t.CodecType.Null, t.CodecProps>>;
16
16
  row_id: t.Union<t.Codec<string, string, string, t.CodecProps>, t.Codec<null, null, t.CodecType.Null, t.CodecProps>>;
17
17
  checksum: t.Codec<bigint, string | number, string, t.CodecProps>;
@@ -3,8 +3,8 @@ export declare const BucketParameters: t.ObjectCodec<{
3
3
  id: t.Codec<bigint, string | number, string, t.CodecProps>;
4
4
  group_id: t.Codec<number, number, "pg_number", t.CodecProps>;
5
5
  source_table: t.IdentityCodec<t.CodecType.String>;
6
- source_key: t.Codec<Buffer, string, "hexBuffer", t.CodecProps>;
7
- lookup: t.Codec<Buffer, string, "hexBuffer", t.CodecProps>;
6
+ source_key: t.Codec<Buffer<ArrayBuffer>, string, "hexBuffer", t.CodecProps>;
7
+ lookup: t.Codec<Buffer<ArrayBuffer>, string, "hexBuffer", t.CodecProps>;
8
8
  bucket_parameters: t.IdentityCodec<t.CodecType.String>;
9
9
  }>;
10
10
  export type BucketParameters = t.Encoded<typeof BucketParameters>;
@@ -12,10 +12,10 @@ export declare const CurrentData: t.ObjectCodec<{
12
12
  bucket: string;
13
13
  table: string;
14
14
  }[], string, string, t.CodecProps>;
15
- data: t.Codec<Buffer, string, "hexBuffer", t.CodecProps>;
15
+ data: t.Codec<Buffer<ArrayBuffer>, string, "hexBuffer", t.CodecProps>;
16
16
  group_id: t.Codec<number, number, "pg_number", t.CodecProps>;
17
- lookups: t.ArrayCodec<t.Codec<Buffer, string, "hexBuffer", t.CodecProps>>;
18
- source_key: t.Codec<Buffer, string, "hexBuffer", t.CodecProps>;
17
+ lookups: t.ArrayCodec<t.Codec<Buffer<ArrayBuffer>, string, "hexBuffer", t.CodecProps>>;
18
+ source_key: t.Codec<Buffer<ArrayBuffer>, string, "hexBuffer", t.CodecProps>;
19
19
  source_table: t.IdentityCodec<t.CodecType.String>;
20
20
  }>;
21
21
  export type CurrentData = t.Encoded<typeof CurrentData>;
@@ -1,6 +1,6 @@
1
1
  import * as t from 'ts-codec';
2
2
  export type StoredRelationId = {
3
- object_id: string | number;
3
+ object_id: string | number | undefined;
4
4
  };
5
5
  export declare const ColumnDescriptor: t.ObjectCodec<{
6
6
  name: t.IdentityCodec<t.CodecType.String>;
@@ -31,9 +31,11 @@ export declare const OperationBatchLimits: t.Intersection<t.Codec<{
31
31
  export type OperationBatchLimits = t.Encoded<typeof OperationBatchLimits>;
32
32
  export declare const PostgresStorageConfig: t.Intersection<t.Codec<{
33
33
  type: string;
34
+ max_pool_size?: number | undefined;
34
35
  } & {
35
36
  type: "postgresql";
36
37
  id?: string | undefined;
38
+ max_pool_size?: number | undefined;
37
39
  tag?: string | undefined;
38
40
  uri?: string | undefined;
39
41
  hostname?: string | undefined;
@@ -50,9 +52,11 @@ export declare const PostgresStorageConfig: t.Intersection<t.Codec<{
50
52
  slot_name_prefix?: string | undefined;
51
53
  }, {
52
54
  type: string;
55
+ max_pool_size?: number | undefined;
53
56
  } & {
54
57
  type: "postgresql";
55
58
  id?: string | undefined;
59
+ max_pool_size?: number | undefined;
56
60
  tag?: string | undefined;
57
61
  uri?: string | undefined;
58
62
  hostname?: string | undefined;
@@ -91,6 +95,7 @@ export type PostgresStorageConfigDecoded = t.Decoded<typeof PostgresStorageConfi
91
95
  export type RequiredOperationBatchLimits = Required<OperationBatchLimits>;
92
96
  export type NormalizedPostgresStorageConfig = pg_wire.NormalizedConnectionConfig & {
93
97
  batch_limits: RequiredOperationBatchLimits;
98
+ max_pool_size: number;
94
99
  };
95
100
  export declare const normalizePostgresStorageConfig: (baseConfig: PostgresStorageConfigDecoded) => NormalizedPostgresStorageConfig;
96
101
  export declare const isPostgresStorageConfig: (config: configFile.BaseStorageConfig) => config is PostgresStorageConfig;
@@ -1,10 +1,7 @@
1
1
  import * as framework from '@powersync/lib-services-framework';
2
- import { storage, sync, utils } from '@powersync/service-core';
2
+ import { storage } from '@powersync/service-core';
3
3
  import * as sync_rules from '@powersync/service-sync-rules';
4
4
  import crypto from 'crypto';
5
- import { wrapWithAbort } from 'ix/asynciterable/operators/withabort.js';
6
- import { LRUCache } from 'lru-cache/min';
7
- import * as timers from 'timers/promises';
8
5
  import * as uuid from 'uuid';
9
6
  import * as lib_postgres from '@powersync/lib-service-postgres';
10
7
  import { models } from '../types/types.js';
@@ -12,35 +9,11 @@ import { NOTIFICATION_CHANNEL, STORAGE_SCHEMA_NAME } from '../utils/db.js';
12
9
  import { notifySyncRulesUpdate } from './batch/PostgresBucketBatch.js';
13
10
  import { PostgresSyncRulesStorage } from './PostgresSyncRulesStorage.js';
14
11
  import { PostgresPersistedSyncRulesContent } from './sync-rules/PostgresPersistedSyncRulesContent.js';
15
- export class PostgresBucketStorageFactory extends framework.DisposableObserver {
12
+ export class PostgresBucketStorageFactory extends framework.BaseObserver {
16
13
  options;
17
14
  db;
18
15
  slot_name_prefix;
19
- sharedIterator = new sync.BroadcastIterable((signal) => this.watchActiveCheckpoint(signal));
20
- storageCache = new LRUCache({
21
- max: 3,
22
- fetchMethod: async (id) => {
23
- const syncRulesRow = await this.db.sql `
24
- SELECT
25
- *
26
- FROM
27
- sync_rules
28
- WHERE
29
- id = ${{ value: id, type: 'int4' }}
30
- `
31
- .decoded(models.SyncRules)
32
- .first();
33
- if (syncRulesRow == null) {
34
- // Deleted in the meantime?
35
- return undefined;
36
- }
37
- const rules = new PostgresPersistedSyncRulesContent(this.db, syncRulesRow);
38
- return this.getInstance(rules);
39
- },
40
- dispose: (storage) => {
41
- storage[Symbol.dispose]();
42
- }
43
- });
16
+ activeStorageCache;
44
17
  constructor(options) {
45
18
  super();
46
19
  this.options = options;
@@ -55,25 +28,25 @@ export class PostgresBucketStorageFactory extends framework.DisposableObserver {
55
28
  });
56
29
  }
57
30
  async [Symbol.asyncDispose]() {
58
- super[Symbol.dispose]();
59
31
  await this.db[Symbol.asyncDispose]();
60
32
  }
61
33
  async prepareStatements(connection) {
62
34
  // It should be possible to prepare statements for some common operations here.
63
35
  // This has not been implemented yet.
64
36
  }
65
- getInstance(syncRules) {
37
+ getInstance(syncRules, options) {
66
38
  const storage = new PostgresSyncRulesStorage({
67
39
  factory: this,
68
40
  db: this.db,
69
41
  sync_rules: syncRules,
70
42
  batchLimits: this.options.config.batch_limits
71
43
  });
72
- this.iterateListeners((cb) => cb.syncStorageCreated?.(storage));
44
+ if (!options?.skipLifecycleHooks) {
45
+ this.iterateListeners((cb) => cb.syncStorageCreated?.(storage));
46
+ }
73
47
  storage.registerListener({
74
48
  batchStarted: (batch) => {
75
- // This nested listener will be automatically disposed when the storage is disposed
76
- batch.registerManagedListener(storage, {
49
+ batch.registerListener({
77
50
  replicationEvent: (payload) => this.iterateListeners((cb) => cb.replicationEvent?.(payload))
78
51
  });
79
52
  }
@@ -135,36 +108,45 @@ export class PostgresBucketStorageFactory extends framework.DisposableObserver {
135
108
  .first();
136
109
  return newInstanceRow.id;
137
110
  }
111
+ async getSystemIdentifier() {
112
+ const id = lib_postgres.utils.encodePostgresSystemIdentifier(await lib_postgres.utils.queryPostgresSystemIdentifier(this.db.pool));
113
+ return {
114
+ id,
115
+ type: lib_postgres.POSTGRES_CONNECTION_TYPE
116
+ };
117
+ }
138
118
  // TODO possibly share implementation in abstract class
139
- async configureSyncRules(sync_rules, options) {
119
+ async configureSyncRules(options) {
140
120
  const next = await this.getNextSyncRulesContent();
141
121
  const active = await this.getActiveSyncRulesContent();
142
- if (next?.sync_rules_content == sync_rules) {
122
+ if (next?.sync_rules_content == options.content) {
143
123
  framework.logger.info('Sync rules from configuration unchanged');
144
124
  return { updated: false };
145
125
  }
146
- else if (next == null && active?.sync_rules_content == sync_rules) {
126
+ else if (next == null && active?.sync_rules_content == options.content) {
147
127
  framework.logger.info('Sync rules from configuration unchanged');
148
128
  return { updated: false };
149
129
  }
150
130
  else {
151
131
  framework.logger.info('Sync rules updated from configuration');
152
- const persisted_sync_rules = await this.updateSyncRules({
153
- content: sync_rules,
154
- lock: options?.lock
155
- });
132
+ const persisted_sync_rules = await this.updateSyncRules(options);
156
133
  return { updated: true, persisted_sync_rules, lock: persisted_sync_rules.current_lock ?? undefined };
157
134
  }
158
135
  }
159
136
  async updateSyncRules(options) {
160
137
  // TODO some shared implementation for this might be nice
161
- // Parse and validate before applying any changes
162
- sync_rules.SqlSyncRules.fromYaml(options.content, {
163
- // No schema-based validation at this point
164
- schema: undefined,
165
- defaultSchema: 'not_applicable', // Not needed for validation
166
- throwOnError: true
167
- });
138
+ if (options.validate) {
139
+ // Parse and validate before applying any changes
140
+ sync_rules.SqlSyncRules.fromYaml(options.content, {
141
+ // No schema-based validation at this point
142
+ schema: undefined,
143
+ defaultSchema: 'not_applicable', // Not needed for validation
144
+ throwOnError: true
145
+ });
146
+ }
147
+ else {
148
+ // Apply unconditionally. Any errors will be reported via the diagnostics API.
149
+ }
168
150
  return this.db.transaction(async (db) => {
169
151
  await db.sql `
170
152
  UPDATE sync_rules
@@ -212,15 +194,16 @@ export class PostgresBucketStorageFactory extends framework.DisposableObserver {
212
194
  return new PostgresPersistedSyncRulesContent(this.db, newSyncRulesRow);
213
195
  });
214
196
  }
215
- async slotRemoved(slot_name) {
197
+ async restartReplication(sync_rules_group_id) {
216
198
  const next = await this.getNextSyncRulesContent();
217
199
  const active = await this.getActiveSyncRulesContent();
218
200
  // In both the below cases, we create a new sync rules instance.
219
- // The current one will continue erroring until the next one has finished processing.
220
- if (next != null && next.slot_name == slot_name) {
201
+ // The current one will continue serving sync requests until the next one has finished processing.
202
+ if (next != null && next.id == sync_rules_group_id) {
221
203
  // We need to redo the "next" sync rules
222
204
  await this.updateSyncRules({
223
- content: next.sync_rules_content
205
+ content: next.sync_rules_content,
206
+ validate: false
224
207
  });
225
208
  // Pro-actively stop replicating
226
209
  await this.db.sql `
@@ -232,16 +215,29 @@ export class PostgresBucketStorageFactory extends framework.DisposableObserver {
232
215
  AND state = ${{ value: storage.SyncRuleState.PROCESSING, type: 'varchar' }}
233
216
  `.execute();
234
217
  }
235
- else if (next == null && active?.slot_name == slot_name) {
218
+ else if (next == null && active?.id == sync_rules_group_id) {
236
219
  // Slot removed for "active" sync rules, while there is no "next" one.
237
220
  await this.updateSyncRules({
238
- content: active.sync_rules_content
221
+ content: active.sync_rules_content,
222
+ validate: false
239
223
  });
240
- // Pro-actively stop replicating
224
+ // Pro-actively stop replicating, but still serve clients with existing data
241
225
  await this.db.sql `
242
226
  UPDATE sync_rules
243
227
  SET
244
- state = ${{ value: storage.SyncRuleState.STOP, type: 'varchar' }}
228
+ state = ${{ value: storage.SyncRuleState.ERRORED, type: 'varchar' }}
229
+ WHERE
230
+ id = ${{ value: active.id, type: 'int4' }}
231
+ AND state = ${{ value: storage.SyncRuleState.ACTIVE, type: 'varchar' }}
232
+ `.execute();
233
+ }
234
+ else if (next != null && active?.id == sync_rules_group_id) {
235
+ // Already have "next" sync rules - don't update any.
236
+ // Pro-actively stop replicating, but still serve clients with existing data
237
+ await this.db.sql `
238
+ UPDATE sync_rules
239
+ SET
240
+ state = ${{ value: storage.SyncRuleState.ERRORED, type: 'varchar' }}
245
241
  WHERE
246
242
  id = ${{ value: active.id, type: 'int4' }}
247
243
  AND state = ${{ value: storage.SyncRuleState.ACTIVE, type: 'varchar' }}
@@ -261,6 +257,7 @@ export class PostgresBucketStorageFactory extends framework.DisposableObserver {
261
257
  sync_rules
262
258
  WHERE
263
259
  state = ${{ value: storage.SyncRuleState.ACTIVE, type: 'varchar' }}
260
+ OR state = ${{ value: storage.SyncRuleState.ERRORED, type: 'varchar' }}
264
261
  ORDER BY
265
262
  id DESC
266
263
  LIMIT
@@ -325,109 +322,22 @@ export class PostgresBucketStorageFactory extends framework.DisposableObserver {
325
322
  .rows();
326
323
  return rows.map((row) => new PostgresPersistedSyncRulesContent(this.db, row));
327
324
  }
328
- async getActiveCheckpoint() {
329
- const activeCheckpoint = await this.db.sql `
330
- SELECT
331
- id,
332
- last_checkpoint,
333
- last_checkpoint_lsn
334
- FROM
335
- sync_rules
336
- WHERE
337
- state = ${{ value: storage.SyncRuleState.ACTIVE, type: 'varchar' }}
338
- ORDER BY
339
- id DESC
340
- LIMIT
341
- 1
342
- `
343
- .decoded(models.ActiveCheckpoint)
344
- .first();
345
- return this.makeActiveCheckpoint(activeCheckpoint);
346
- }
347
- async *watchWriteCheckpoint(user_id, signal) {
348
- let lastCheckpoint = null;
349
- let lastWriteCheckpoint = null;
350
- const iter = wrapWithAbort(this.sharedIterator, signal);
351
- for await (const cp of iter) {
352
- const { checkpoint, lsn } = cp;
353
- // lsn changes are not important by itself.
354
- // What is important is:
355
- // 1. checkpoint (op_id) changes.
356
- // 2. write checkpoint changes for the specific user
357
- const bucketStorage = await cp.getBucketStorage();
358
- if (!bucketStorage) {
359
- continue;
360
- }
361
- const lsnFilters = lsn ? { 1: lsn } : {};
362
- const currentWriteCheckpoint = await bucketStorage.lastWriteCheckpoint({
363
- user_id,
364
- heads: {
365
- ...lsnFilters
366
- }
367
- });
368
- if (currentWriteCheckpoint == lastWriteCheckpoint && checkpoint == lastCheckpoint) {
369
- // No change - wait for next one
370
- // In some cases, many LSNs may be produced in a short time.
371
- // Add a delay to throttle the write checkpoint lookup a bit.
372
- await timers.setTimeout(20 + 10 * Math.random());
373
- continue;
374
- }
375
- lastWriteCheckpoint = currentWriteCheckpoint;
376
- lastCheckpoint = checkpoint;
377
- yield { base: cp, writeCheckpoint: currentWriteCheckpoint };
325
+ async getActiveStorage() {
326
+ const content = await this.getActiveSyncRulesContent();
327
+ if (content == null) {
328
+ return null;
378
329
  }
379
- }
380
- async *watchActiveCheckpoint(signal) {
381
- const doc = await this.db.sql `
382
- SELECT
383
- id,
384
- last_checkpoint,
385
- last_checkpoint_lsn
386
- FROM
387
- sync_rules
388
- WHERE
389
- state = ${{ type: 'varchar', value: storage.SyncRuleState.ACTIVE }}
390
- LIMIT
391
- 1
392
- `
393
- .decoded(models.ActiveCheckpoint)
394
- .first();
395
- const sink = new sync.LastValueSink(undefined);
396
- const disposeListener = this.db.registerListener({
397
- notification: (notification) => sink.next(notification.payload)
398
- });
399
- signal.addEventListener('aborted', async () => {
400
- disposeListener();
401
- sink.complete();
402
- });
403
- yield this.makeActiveCheckpoint(doc);
404
- let lastOp = null;
405
- for await (const payload of sink.withSignal(signal)) {
406
- if (signal.aborted) {
407
- return;
408
- }
409
- const notification = models.ActiveCheckpointNotification.decode(payload);
410
- const activeCheckpoint = this.makeActiveCheckpoint(notification.active_checkpoint);
411
- if (lastOp == null || activeCheckpoint.lsn != lastOp.lsn || activeCheckpoint.checkpoint != lastOp.checkpoint) {
412
- lastOp = activeCheckpoint;
413
- yield activeCheckpoint;
414
- }
330
+ // It is important that this instance is cached.
331
+ // Not for the instance construction itself, but to ensure that internal caches on the instance
332
+ // are re-used properly.
333
+ if (this.activeStorageCache?.group_id == content.id) {
334
+ return this.activeStorageCache;
335
+ }
336
+ else {
337
+ const instance = this.getInstance(content);
338
+ this.activeStorageCache = instance;
339
+ return instance;
415
340
  }
416
- }
417
- makeActiveCheckpoint(row) {
418
- return {
419
- checkpoint: utils.timestampToOpId(row?.last_checkpoint ?? 0n),
420
- lsn: row?.last_checkpoint_lsn ?? null,
421
- hasSyncRules() {
422
- return row != null;
423
- },
424
- getBucketStorage: async () => {
425
- if (row == null) {
426
- return null;
427
- }
428
- return (await this.storageCache.fetch(Number(row.id))) ?? null;
429
- }
430
- };
431
341
  }
432
342
  }
433
343
  //# sourceMappingURL=PostgresBucketStorageFactory.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"PostgresBucketStorageFactory.js","sourceRoot":"","sources":["../../src/storage/PostgresBucketStorageFactory.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"PostgresBucketStorageFactory.js","sourceRoot":"","sources":["../../src/storage/PostgresBucketStorageFactory.ts"],"names":[],"mappings":"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"}