@harperfast/harper 5.2.9 → 5.3.0-alpha.1
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/agent/mcpTools.ts +1 -1
- package/agent/session.ts +25 -14
- package/bin/cliOperations.ts +46 -9
- package/bin/copyDb.ts +282 -59
- package/bin/deploySetup.ts +16 -5
- package/bin/harper.ts +1 -1
- package/bin/help.ts +4 -1
- package/bin/lite.ts +4 -1
- package/bin/restart.ts +59 -3
- package/bin/run.ts +6 -11
- package/bin/upgrade.js +7 -3
- package/bin/workloadIdentity.ts +119 -0
- package/components/Application.ts +2414 -242
- package/components/ApplicationScope.ts +8 -0
- package/components/EntryHandler.ts +59 -39
- package/components/OptionsWatcher.ts +150 -74
- package/components/RuntimeModuleTracker.ts +38 -7
- package/components/Scope.ts +37 -15
- package/components/awaitRestart.ts +84 -0
- package/components/componentLoader.ts +340 -30
- package/components/componentPreparationLock.ts +16 -5
- package/components/mcp/adapters/harperHttp.ts +4 -0
- package/components/mcp/listChanged.ts +4 -0
- package/components/mcp/toolRegistry.ts +2 -0
- package/components/mcp/tools/operations.ts +9 -0
- package/components/mcp/tools/schemas/operationDescriptions.ts +2 -2
- package/components/operations.js +270 -78
- package/components/operationsValidation.js +49 -1
- package/components/status/ComponentStatusRegistry.ts +59 -0
- package/config/RootConfigWatcher.ts +80 -34
- package/config/configUtils.ts +291 -34
- package/config/harperConfigEnvVars.ts +170 -27
- package/config-root.schema.json +29 -0
- package/dataLayer/blobBackup.ts +160 -50
- package/dataLayer/delete.ts +6 -1
- package/dataLayer/harperBridge/ResourceBridge.ts +52 -8
- package/dataLayer/harperBridge/lmdbBridge/lmdbMethods/DeleteAuditLogsBeforeResults.js +3 -1
- package/dataLayer/hdbInfoController.ts +34 -1
- package/dataLayer/insert.ts +44 -1
- package/dataLayer/rocksdbBackup.ts +53 -10
- package/dataLayer/schema.ts +11 -1
- package/dataLayer/schemaDescribe.ts +8 -1
- package/dist/agent/mcpTools.js +1 -1
- package/dist/agent/mcpTools.js.map +1 -1
- package/dist/agent/session.d.ts +22 -0
- package/dist/agent/session.js +26 -15
- package/dist/agent/session.js.map +1 -1
- package/dist/bin/cliOperations.js +48 -9
- package/dist/bin/cliOperations.js.map +1 -1
- package/dist/bin/copyDb.d.ts +12 -1
- package/dist/bin/copyDb.js +248 -60
- package/dist/bin/copyDb.js.map +1 -1
- package/dist/bin/deploySetup.d.ts +2 -0
- package/dist/bin/deploySetup.js +11 -3
- package/dist/bin/deploySetup.js.map +1 -1
- package/dist/bin/harper.js +1 -1
- package/dist/bin/harper.js.map +1 -1
- package/dist/bin/help.js +4 -1
- package/dist/bin/help.js.map +1 -1
- package/dist/bin/lite.js +4 -1
- package/dist/bin/lite.js.map +1 -1
- package/dist/bin/restart.js +54 -5
- package/dist/bin/restart.js.map +1 -1
- package/dist/bin/run.js +4 -10
- package/dist/bin/run.js.map +1 -1
- package/dist/bin/upgrade.js +4 -3
- package/dist/bin/upgrade.js.map +1 -1
- package/dist/bin/workloadIdentity.d.ts +18 -0
- package/dist/bin/workloadIdentity.js +100 -0
- package/dist/bin/workloadIdentity.js.map +1 -0
- package/dist/components/Application.d.ts +139 -16
- package/dist/components/Application.js +2215 -267
- package/dist/components/Application.js.map +1 -1
- package/dist/components/ApplicationScope.d.ts +8 -0
- package/dist/components/ApplicationScope.js +7 -0
- package/dist/components/ApplicationScope.js.map +1 -1
- package/dist/components/EntryHandler.js +26 -10
- package/dist/components/EntryHandler.js.map +1 -1
- package/dist/components/OptionsWatcher.d.ts +1 -0
- package/dist/components/OptionsWatcher.js +141 -74
- package/dist/components/OptionsWatcher.js.map +1 -1
- package/dist/components/RuntimeModuleTracker.js +40 -6
- package/dist/components/RuntimeModuleTracker.js.map +1 -1
- package/dist/components/Scope.js +38 -13
- package/dist/components/Scope.js.map +1 -1
- package/dist/components/awaitRestart.d.ts +33 -0
- package/dist/components/awaitRestart.js +61 -0
- package/dist/components/awaitRestart.js.map +1 -0
- package/dist/components/componentLoader.d.ts +38 -1
- package/dist/components/componentLoader.js +279 -22
- package/dist/components/componentLoader.js.map +1 -1
- package/dist/components/componentPreparationLock.d.ts +5 -0
- package/dist/components/componentPreparationLock.js +14 -6
- package/dist/components/componentPreparationLock.js.map +1 -1
- package/dist/components/mcp/adapters/harperHttp.js +4 -0
- package/dist/components/mcp/adapters/harperHttp.js.map +1 -1
- package/dist/components/mcp/listChanged.js +5 -0
- package/dist/components/mcp/listChanged.js.map +1 -1
- package/dist/components/mcp/toolRegistry.d.ts +1 -0
- package/dist/components/mcp/toolRegistry.js.map +1 -1
- package/dist/components/mcp/tools/operations.d.ts +5 -0
- package/dist/components/mcp/tools/operations.js +9 -0
- package/dist/components/mcp/tools/operations.js.map +1 -1
- package/dist/components/mcp/tools/schemas/operationDescriptions.js +2 -2
- package/dist/components/mcp/tools/schemas/operationDescriptions.js.map +1 -1
- package/dist/components/operations.js +231 -77
- package/dist/components/operations.js.map +1 -1
- package/dist/components/operationsValidation.js +49 -1
- package/dist/components/operationsValidation.js.map +1 -1
- package/dist/components/status/ComponentStatusRegistry.d.ts +0 -4
- package/dist/components/status/ComponentStatusRegistry.js +63 -0
- package/dist/components/status/ComponentStatusRegistry.js.map +1 -1
- package/dist/config/RootConfigWatcher.d.ts +7 -1
- package/dist/config/RootConfigWatcher.js +64 -27
- package/dist/config/RootConfigWatcher.js.map +1 -1
- package/dist/config/configUtils.d.ts +9 -1
- package/dist/config/configUtils.js +254 -33
- package/dist/config/configUtils.js.map +1 -1
- package/dist/config/harperConfigEnvVars.d.ts +16 -0
- package/dist/config/harperConfigEnvVars.js +162 -25
- package/dist/config/harperConfigEnvVars.js.map +1 -1
- package/dist/dataLayer/blobBackup.d.ts +49 -20
- package/dist/dataLayer/blobBackup.js +139 -50
- package/dist/dataLayer/blobBackup.js.map +1 -1
- package/dist/dataLayer/delete.js +1 -1
- package/dist/dataLayer/delete.js.map +1 -1
- package/dist/dataLayer/harperBridge/ResourceBridge.d.ts +14 -1
- package/dist/dataLayer/harperBridge/ResourceBridge.js +51 -10
- package/dist/dataLayer/harperBridge/ResourceBridge.js.map +1 -1
- package/dist/dataLayer/harperBridge/lmdbBridge/lmdbMethods/DeleteAuditLogsBeforeResults.d.ts +3 -1
- package/dist/dataLayer/harperBridge/lmdbBridge/lmdbMethods/DeleteAuditLogsBeforeResults.js +3 -1
- package/dist/dataLayer/harperBridge/lmdbBridge/lmdbMethods/DeleteAuditLogsBeforeResults.js.map +1 -1
- package/dist/dataLayer/hdbInfoController.d.ts +10 -0
- package/dist/dataLayer/hdbInfoController.js +30 -1
- package/dist/dataLayer/hdbInfoController.js.map +1 -1
- package/dist/dataLayer/insert.d.ts +9 -1
- package/dist/dataLayer/insert.js +30 -0
- package/dist/dataLayer/insert.js.map +1 -1
- package/dist/dataLayer/rocksdbBackup.d.ts +2 -2
- package/dist/dataLayer/rocksdbBackup.js +45 -8
- package/dist/dataLayer/rocksdbBackup.js.map +1 -1
- package/dist/dataLayer/schema.js +8 -0
- package/dist/dataLayer/schema.js.map +1 -1
- package/dist/dataLayer/schemaDescribe.js +8 -1
- package/dist/dataLayer/schemaDescribe.js.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.js.map +1 -1
- package/dist/json/systemSchema.json +52 -0
- package/dist/resources/DatabaseTransaction.d.ts +55 -0
- package/dist/resources/DatabaseTransaction.js +459 -45
- package/dist/resources/DatabaseTransaction.js.map +1 -1
- package/dist/resources/LMDBTransaction.js +22 -4
- package/dist/resources/LMDBTransaction.js.map +1 -1
- package/dist/resources/PrimaryRocksDatabase.d.ts +1 -0
- package/dist/resources/PrimaryRocksDatabase.js +29 -0
- package/dist/resources/PrimaryRocksDatabase.js.map +1 -1
- package/dist/resources/RecordEncoder.d.ts +20 -0
- package/dist/resources/RecordEncoder.js +94 -9
- package/dist/resources/RecordEncoder.js.map +1 -1
- package/dist/resources/RequestTarget.d.ts +2 -0
- package/dist/resources/RequestTarget.js.map +1 -1
- package/dist/resources/Resource.js +20 -11
- package/dist/resources/Resource.js.map +1 -1
- package/dist/resources/ResourceInterface.d.ts +20 -1
- package/dist/resources/ResourceInterface.js.map +1 -1
- package/dist/resources/RocksIndexStore.d.ts +6 -1
- package/dist/resources/RocksIndexStore.js +24 -9
- package/dist/resources/RocksIndexStore.js.map +1 -1
- package/dist/resources/RocksTransactionLogStore.d.ts +14 -1
- package/dist/resources/RocksTransactionLogStore.js +57 -17
- package/dist/resources/RocksTransactionLogStore.js.map +1 -1
- package/dist/resources/Table.d.ts +112 -8
- package/dist/resources/Table.js +1073 -191
- package/dist/resources/Table.js.map +1 -1
- package/dist/resources/auditStore.d.ts +11 -2
- package/dist/resources/auditStore.js +325 -71
- package/dist/resources/auditStore.js.map +1 -1
- package/dist/resources/blob.d.ts +129 -9
- package/dist/resources/blob.js +992 -114
- package/dist/resources/blob.js.map +1 -1
- package/dist/resources/branchDatabase.d.ts +48 -0
- package/dist/resources/branchDatabase.js +892 -0
- package/dist/resources/branchDatabase.js.map +1 -0
- package/dist/resources/crdt.js +50 -12
- package/dist/resources/crdt.js.map +1 -1
- package/dist/resources/databases.d.ts +150 -0
- package/dist/resources/databases.js +1200 -239
- package/dist/resources/databases.js.map +1 -1
- package/dist/resources/defineTable.d.ts +10 -2
- package/dist/resources/defineTable.js +9 -1
- package/dist/resources/defineTable.js.map +1 -1
- package/dist/resources/graphql.d.ts +1 -1
- package/dist/resources/graphql.js +50 -15
- package/dist/resources/graphql.js.map +1 -1
- package/dist/resources/indexes/HierarchicalNavigableSmallWorld.d.ts +1 -0
- package/dist/resources/indexes/HierarchicalNavigableSmallWorld.js +6 -2
- package/dist/resources/indexes/HierarchicalNavigableSmallWorld.js.map +1 -1
- package/dist/resources/longLivedTransactions.d.ts +71 -0
- package/dist/resources/longLivedTransactions.js +358 -0
- package/dist/resources/longLivedTransactions.js.map +1 -0
- package/dist/resources/models/backendRegistry.d.ts +26 -0
- package/dist/resources/models/backendRegistry.js +60 -2
- package/dist/resources/models/backendRegistry.js.map +1 -1
- package/dist/resources/models/bootstrap.d.ts +33 -1
- package/dist/resources/models/bootstrap.js +416 -31
- package/dist/resources/models/bootstrap.js.map +1 -1
- package/dist/resources/recordLock.d.ts +80 -0
- package/dist/resources/recordLock.js +184 -0
- package/dist/resources/recordLock.js.map +1 -0
- package/dist/resources/replayLogs.d.ts +14 -1
- package/dist/resources/replayLogs.js +152 -24
- package/dist/resources/replayLogs.js.map +1 -1
- package/dist/resources/replayLogsGuards.d.ts +94 -7
- package/dist/resources/replayLogsGuards.js +111 -7
- package/dist/resources/replayLogsGuards.js.map +1 -1
- package/dist/resources/search.js +158 -6
- package/dist/resources/search.js.map +1 -1
- package/dist/resources/transactionBroadcast.d.ts +1 -1
- package/dist/resources/transactionBroadcast.js +2 -2
- package/dist/resources/transactionBroadcast.js.map +1 -1
- package/dist/security/auth.js +61 -30
- package/dist/security/auth.js.map +1 -1
- package/dist/security/authn/oidc/claims.d.ts +22 -0
- package/dist/security/authn/oidc/claims.js +71 -0
- package/dist/security/authn/oidc/claims.js.map +1 -0
- package/dist/security/authn/oidc/identityToken.d.ts +27 -0
- package/dist/security/authn/oidc/identityToken.js +111 -0
- package/dist/security/authn/oidc/identityToken.js.map +1 -0
- package/dist/security/authn/oidc/jwks.d.ts +25 -0
- package/dist/security/authn/oidc/jwks.js +261 -0
- package/dist/security/authn/oidc/jwks.js.map +1 -0
- package/dist/security/authn/oidc/providers/generic.d.ts +13 -0
- package/dist/security/authn/oidc/providers/generic.js +34 -0
- package/dist/security/authn/oidc/providers/generic.js.map +1 -0
- package/dist/security/authn/oidc/providers/githubActions.d.ts +11 -0
- package/dist/security/authn/oidc/providers/githubActions.js +129 -0
- package/dist/security/authn/oidc/providers/githubActions.js.map +1 -0
- package/dist/security/authn/oidc/providers/index.d.ts +37 -0
- package/dist/security/authn/oidc/providers/index.js +24 -0
- package/dist/security/authn/oidc/providers/index.js.map +1 -0
- package/dist/security/authn/oidc/tokenExchange.d.ts +12 -0
- package/dist/security/authn/oidc/tokenExchange.js +306 -0
- package/dist/security/authn/oidc/tokenExchange.js.map +1 -0
- package/dist/security/authn/oidc/trustPolicyOperations.d.ts +49 -0
- package/dist/security/authn/oidc/trustPolicyOperations.js +358 -0
- package/dist/security/authn/oidc/trustPolicyOperations.js.map +1 -0
- package/dist/security/authn/oidc/types.d.ts +38 -0
- package/dist/security/authn/oidc/types.js +6 -0
- package/dist/security/authn/oidc/types.js.map +1 -0
- package/dist/security/certificateVerification/index.js +40 -11
- package/dist/security/certificateVerification/index.js.map +1 -1
- package/dist/security/certificateVerification/trustedIssuers.d.ts +24 -0
- package/dist/security/certificateVerification/trustedIssuers.js +79 -0
- package/dist/security/certificateVerification/trustedIssuers.js.map +1 -0
- package/dist/security/certificateVerification/types.d.ts +1 -0
- package/dist/security/credentialProvenance.d.ts +35 -0
- package/dist/security/credentialProvenance.js +51 -0
- package/dist/security/credentialProvenance.js.map +1 -0
- package/dist/security/credentialRejection.d.ts +4 -0
- package/dist/security/credentialRejection.js +24 -0
- package/dist/security/credentialRejection.js.map +1 -0
- package/dist/security/deferredAuthentication.d.ts +36 -0
- package/dist/security/deferredAuthentication.js +70 -0
- package/dist/security/deferredAuthentication.js.map +1 -0
- package/dist/security/impersonation.d.ts +21 -0
- package/dist/security/impersonation.js +108 -9
- package/dist/security/impersonation.js.map +1 -1
- package/dist/security/jsLoader.d.ts +6 -0
- package/dist/security/jsLoader.js +75 -15
- package/dist/security/jsLoader.js.map +1 -1
- package/dist/security/keys.js +301 -71
- package/dist/security/keys.js.map +1 -1
- package/dist/security/operationScope.d.ts +21 -0
- package/dist/security/operationScope.js +36 -0
- package/dist/security/operationScope.js.map +1 -0
- package/dist/security/permissionsTranslator.js +21 -0
- package/dist/security/permissionsTranslator.js.map +1 -1
- package/dist/security/tokenAuthentication.d.ts +19 -1
- package/dist/security/tokenAuthentication.js +191 -10
- package/dist/security/tokenAuthentication.js.map +1 -1
- package/dist/security/user.js +4 -3
- package/dist/security/user.js.map +1 -1
- package/dist/server/DurableSubscriptionsSession.d.ts +2 -2
- package/dist/server/DurableSubscriptionsSession.js +67 -10
- package/dist/server/DurableSubscriptionsSession.js.map +1 -1
- package/dist/server/REST.js +73 -0
- package/dist/server/REST.js.map +1 -1
- package/dist/server/graphqlQuerying.js +4 -0
- package/dist/server/graphqlQuerying.js.map +1 -1
- package/dist/server/http.d.ts +11 -0
- package/dist/server/http.js +88 -15
- package/dist/server/http.js.map +1 -1
- package/dist/server/itc/serverHandlers.js +8 -1
- package/dist/server/itc/serverHandlers.js.map +1 -1
- package/dist/server/jobs/jobProcess.js +6 -2
- package/dist/server/jobs/jobProcess.js.map +1 -1
- package/dist/server/jobs/jobs.js +4 -1
- package/dist/server/jobs/jobs.js.map +1 -1
- package/dist/server/liveSubscriptionAuth.d.ts +26 -4
- package/dist/server/liveSubscriptionAuth.js +105 -39
- package/dist/server/liveSubscriptionAuth.js.map +1 -1
- package/dist/server/loadRootComponents.js +49 -10
- package/dist/server/loadRootComponents.js.map +1 -1
- package/dist/server/mqtt.d.ts +2 -0
- package/dist/server/mqtt.js +165 -30
- package/dist/server/mqtt.js.map +1 -1
- package/dist/server/nodeName.d.ts +2 -0
- package/dist/server/nodeName.js +107 -23
- package/dist/server/nodeName.js.map +1 -1
- package/dist/server/serverHelpers/Headers.d.ts +25 -0
- package/dist/server/serverHelpers/Headers.js +139 -1
- package/dist/server/serverHelpers/Headers.js.map +1 -1
- package/dist/server/serverHelpers/contentTypes.d.ts +9 -0
- package/dist/server/serverHelpers/contentTypes.js +32 -25
- package/dist/server/serverHelpers/contentTypes.js.map +1 -1
- package/dist/server/serverHelpers/deployValidationState.d.ts +3 -0
- package/dist/server/serverHelpers/deployValidationState.js +9 -19
- package/dist/server/serverHelpers/deployValidationState.js.map +1 -1
- package/dist/server/serverHelpers/operationAuthorizationState.d.ts +12 -0
- package/dist/server/serverHelpers/operationAuthorizationState.js +24 -2
- package/dist/server/serverHelpers/operationAuthorizationState.js.map +1 -1
- package/dist/server/serverHelpers/registeredOperations.d.ts +5 -4
- package/dist/server/serverHelpers/registeredOperations.js +74 -21
- package/dist/server/serverHelpers/registeredOperations.js.map +1 -1
- package/dist/server/serverHelpers/requestSanitization.d.ts +11 -0
- package/dist/server/serverHelpers/requestSanitization.js +20 -0
- package/dist/server/serverHelpers/requestSanitization.js.map +1 -0
- package/dist/server/serverHelpers/serverHandlers.js +6 -3
- package/dist/server/serverHelpers/serverHandlers.js.map +1 -1
- package/dist/server/serverHelpers/serverUtilities.d.ts +18 -0
- package/dist/server/serverHelpers/serverUtilities.js +90 -20
- package/dist/server/serverHelpers/serverUtilities.js.map +1 -1
- package/dist/server/serverHelpers/sharedMessageEncoding.d.ts +67 -0
- package/dist/server/serverHelpers/sharedMessageEncoding.js +280 -0
- package/dist/server/serverHelpers/sharedMessageEncoding.js.map +1 -0
- package/dist/server/serverHelpers/uwsServer.js +19 -1
- package/dist/server/serverHelpers/uwsServer.js.map +1 -1
- package/dist/server/static.js +24 -28
- package/dist/server/static.js.map +1 -1
- package/dist/server/storageReclamation.d.ts +12 -0
- package/dist/server/storageReclamation.js +26 -0
- package/dist/server/storageReclamation.js.map +1 -1
- package/dist/server/threads/itc.d.ts +7 -2
- package/dist/server/threads/itc.js +5 -1
- package/dist/server/threads/itc.js.map +1 -1
- package/dist/server/threads/manageThreads.d.ts +26 -3
- package/dist/server/threads/manageThreads.js +517 -65
- package/dist/server/threads/manageThreads.js.map +1 -1
- package/dist/server/threads/socketRouter.js +89 -26
- package/dist/server/threads/socketRouter.js.map +1 -1
- package/dist/server/threads/threadHeapMemory.d.ts +2 -0
- package/dist/server/threads/threadHeapMemory.js +31 -0
- package/dist/server/threads/threadHeapMemory.js.map +1 -0
- package/dist/server/threads/threadServer.js +46 -15
- package/dist/server/threads/threadServer.js.map +1 -1
- package/dist/sqlEngine/config.d.ts +1 -3
- package/dist/sqlEngine/config.js +19 -16
- package/dist/sqlEngine/config.js.map +1 -1
- package/dist/sqlTranslator/index.d.ts +1 -1
- package/dist/sqlTranslator/index.js +30 -7
- package/dist/sqlTranslator/index.js.map +1 -1
- package/dist/upgrade/directives/5-3-0.d.ts +7 -0
- package/dist/upgrade/directives/5-3-0.js +148 -0
- package/dist/upgrade/directives/5-3-0.js.map +1 -0
- package/dist/upgrade/directives/directivesController.js +2 -1
- package/dist/upgrade/directives/directivesController.js.map +1 -1
- package/dist/utility/OperationFunctionCaller.js +2 -1
- package/dist/utility/OperationFunctionCaller.js.map +1 -1
- package/dist/utility/common_utils.d.ts +16 -0
- package/dist/utility/common_utils.js +32 -6
- package/dist/utility/common_utils.js.map +1 -1
- package/dist/utility/componentNames.d.ts +8 -0
- package/dist/utility/componentNames.js +12 -1
- package/dist/utility/componentNames.js.map +1 -1
- package/dist/utility/environment/environmentManager.js +3 -6
- package/dist/utility/environment/environmentManager.js.map +1 -1
- package/dist/utility/environment/systemInformation.d.ts +1 -0
- package/dist/utility/environment/systemInformation.js +1 -0
- package/dist/utility/environment/systemInformation.js.map +1 -1
- package/dist/utility/errors/commonErrors.d.ts +2 -0
- package/dist/utility/errors/commonErrors.js +2 -0
- package/dist/utility/errors/commonErrors.js.map +1 -1
- package/dist/utility/errors/hdbError.d.ts +17 -0
- package/dist/utility/errors/hdbError.js +30 -1
- package/dist/utility/errors/hdbError.js.map +1 -1
- package/dist/utility/globalSchema.d.ts +18 -0
- package/dist/utility/hdbTerms.d.ts +16 -0
- package/dist/utility/hdbTerms.js +18 -2
- package/dist/utility/hdbTerms.js.map +1 -1
- package/dist/utility/logging/harper_logger.d.ts +2 -0
- package/dist/utility/logging/harper_logger.js +91 -14
- package/dist/utility/logging/harper_logger.js.map +1 -1
- package/dist/utility/logging/logRotator.js +76 -49
- package/dist/utility/logging/logRotator.js.map +1 -1
- package/dist/utility/nodeIdentity.d.ts +9 -0
- package/dist/utility/nodeIdentity.js +58 -0
- package/dist/utility/nodeIdentity.js.map +1 -0
- package/dist/utility/npmUtilities.js +9 -7
- package/dist/utility/npmUtilities.js.map +1 -1
- package/dist/utility/operationPermissions.d.ts +3 -1
- package/dist/utility/operationPermissions.js +16 -1
- package/dist/utility/operationPermissions.js.map +1 -1
- package/dist/utility/operation_authorization.d.ts +10 -7
- package/dist/utility/operation_authorization.js +212 -41
- package/dist/utility/operation_authorization.js.map +1 -1
- package/dist/utility/watchPath.d.ts +29 -0
- package/dist/utility/watchPath.js +68 -0
- package/dist/utility/watchPath.js.map +1 -0
- package/dist/utility/watcherFallback.d.ts +86 -0
- package/dist/utility/watcherFallback.js +278 -1
- package/dist/utility/watcherFallback.js.map +1 -1
- package/dist/validation/configValidator.d.ts +12 -0
- package/dist/validation/configValidator.js +199 -72
- package/dist/validation/configValidator.js.map +1 -1
- package/dist/validation/installValidator.js +12 -0
- package/dist/validation/installValidator.js.map +1 -1
- package/dist/validation/validationWrapper.d.ts +11 -0
- package/dist/validation/validationWrapper.js +16 -3
- package/dist/validation/validationWrapper.js.map +1 -1
- package/index.ts +2 -0
- package/json/systemSchema.json +52 -0
- package/npm-shrinkwrap.json +196 -194
- package/package.json +7 -6
- package/resources/DESIGN.md +114 -52
- package/resources/DatabaseTransaction.ts +521 -43
- package/resources/LMDBTransaction.ts +26 -4
- package/resources/PrimaryRocksDatabase.ts +28 -1
- package/resources/RecordEncoder.ts +103 -8
- package/resources/RequestTarget.ts +2 -0
- package/resources/Resource.ts +17 -9
- package/resources/ResourceInterface.ts +23 -0
- package/resources/RocksIndexStore.ts +30 -9
- package/resources/RocksTransactionLogStore.ts +78 -21
- package/resources/Table.ts +1110 -159
- package/resources/auditStore.ts +331 -73
- package/resources/blob.ts +1029 -110
- package/resources/branchDatabase.ts +941 -0
- package/resources/crdt.ts +76 -12
- package/resources/databases.ts +1310 -252
- package/resources/defineTable.ts +18 -2
- package/resources/graphql.ts +70 -16
- package/resources/indexes/HierarchicalNavigableSmallWorld.ts +6 -2
- package/resources/longLivedTransactions.ts +360 -0
- package/resources/models/backendRegistry.ts +84 -2
- package/resources/models/bootstrap.ts +473 -28
- package/resources/recordLock.ts +253 -0
- package/resources/replayLogs.ts +147 -26
- package/resources/replayLogsGuards.ts +171 -8
- package/resources/search.ts +154 -7
- package/resources/transactionBroadcast.ts +3 -3
- package/security/auth.ts +68 -29
- package/security/authn/oidc/claims.ts +72 -0
- package/security/authn/oidc/identityToken.ts +129 -0
- package/security/authn/oidc/jwks.ts +260 -0
- package/security/authn/oidc/providers/generic.ts +40 -0
- package/security/authn/oidc/providers/githubActions.ts +137 -0
- package/security/authn/oidc/providers/index.ts +52 -0
- package/security/authn/oidc/tokenExchange.ts +300 -0
- package/security/authn/oidc/trustPolicyOperations.ts +343 -0
- package/security/authn/oidc/types.ts +41 -0
- package/security/certificateVerification/index.ts +54 -13
- package/security/certificateVerification/trustedIssuers.ts +76 -0
- package/security/certificateVerification/types.ts +1 -0
- package/security/credentialProvenance.ts +47 -0
- package/security/credentialRejection.ts +22 -0
- package/security/deferredAuthentication.ts +71 -0
- package/security/impersonation.ts +117 -12
- package/security/jsLoader.ts +81 -18
- package/security/keys.ts +298 -72
- package/security/operationScope.ts +33 -0
- package/security/permissionsTranslator.js +23 -0
- package/security/tokenAuthentication.ts +233 -12
- package/security/user.ts +4 -3
- package/server/DESIGN.md +183 -16
- package/server/DurableSubscriptionsSession.ts +71 -11
- package/server/REST.ts +79 -1
- package/server/graphqlQuerying.ts +4 -0
- package/server/http.ts +99 -18
- package/server/itc/serverHandlers.js +8 -1
- package/server/jobs/jobProcess.ts +8 -2
- package/server/jobs/jobs.ts +4 -1
- package/server/liveSubscriptionAuth.ts +129 -46
- package/server/loadRootComponents.js +50 -8
- package/server/mqtt.ts +179 -38
- package/server/nodeName.ts +103 -21
- package/server/serverHelpers/Headers.ts +131 -0
- package/server/serverHelpers/contentTypes.ts +29 -21
- package/server/serverHelpers/deployValidationState.ts +24 -13
- package/server/serverHelpers/operationAuthorizationState.ts +34 -3
- package/server/serverHelpers/registeredOperations.ts +79 -22
- package/server/serverHelpers/requestSanitization.ts +15 -0
- package/server/serverHelpers/serverHandlers.js +6 -3
- package/server/serverHelpers/serverUtilities.ts +104 -31
- package/server/serverHelpers/sharedMessageEncoding.ts +307 -0
- package/server/serverHelpers/uwsServer.ts +17 -2
- package/server/static.ts +23 -29
- package/server/storageReclamation.ts +23 -0
- package/server/threads/itc.js +11 -1
- package/server/threads/manageThreads.js +526 -56
- package/server/threads/socketRouter.ts +81 -26
- package/server/threads/threadHeapMemory.ts +26 -0
- package/server/threads/threadServer.js +43 -15
- package/sqlTranslator/index.ts +31 -8
- package/studio/web/assets/Chat-BnCBegQz.js +2267 -0
- package/studio/web/assets/FloatingChat-CoDW1ySS.js +23 -0
- package/studio/web/assets/{abnfDiagram-VCTEODGH-C0_BAZyO.js → abnfDiagram-VCTEODGH-B0BebmD2.js} +1 -1
- package/studio/web/assets/{alertDialog-DIHt7Z0r.js → alertDialog-CQyAJJhl.js} +1 -1
- package/studio/web/assets/{apiToken-c3Rd-w6g.js → apiToken-Bwk5BLXW.js} +1 -1
- package/studio/web/assets/applications-DHxGi7JH.js +296 -0
- package/studio/web/assets/architecture-7GRP2DOG-LB-MLAAb.js +1 -0
- package/studio/web/assets/{architectureDiagram-5GKGNRK7-BWzrASgm.js → architectureDiagram-5GKGNRK7-7SW3GD-K.js} +1 -1
- package/studio/web/assets/authStore-C3Nfubqr.js +3 -0
- package/studio/web/assets/{blockDiagram-NRAW4CY4-BdJX9Khj.js → blockDiagram-I7D4REHJ-BqguiadH.js} +2 -2
- package/studio/web/assets/{button-DhiX-njv.js → button-BIsUKRZq.js} +2 -2
- package/studio/web/assets/{c4Diagram-UCG6FXSJ-CI6MzGmQ.js → c4Diagram-7LVT6UL2-LBNf8t_X.js} +1 -1
- package/studio/web/assets/channel-yictG-U-.js +1 -0
- package/studio/web/assets/{chevron-up-Df2c8uoU.js → chevron-up-DtKGqDn3.js} +1 -1
- package/studio/web/assets/{chunk-TEH6E4GO-P87k5mNi.js → chunk-4HAMMTFA-DWtTut21.js} +1 -1
- package/studio/web/assets/{chunk-75Z2AOVW-BT8tVmks.js → chunk-75Z2AOVW-QGQD6th2.js} +1 -1
- package/studio/web/assets/{chunk-DU6HZSFF-9kAOOmI6.js → chunk-DU6HZSFF-Chq20Ba5.js} +1 -1
- package/studio/web/assets/{chunk-F27PBJKO-BW7ao8AY.js → chunk-F27PBJKO-BVA5EPhV.js} +1 -1
- package/studio/web/assets/{chunk-GMAD6QVW-BNyXpoQO.js → chunk-GMAD6QVW-BeS7S07A.js} +1 -1
- package/studio/web/assets/{chunk-OBVCFTLP-D4wWOqDQ.js → chunk-GVQU2GXP-sbwVIQ8i.js} +1 -1
- package/studio/web/assets/{chunk-G27WJ6UU-COyLMcgK.js → chunk-IMKFNOWR-Bnh3tAVd.js} +1 -1
- package/studio/web/assets/{chunk-JQ64N6SF-Cyz1IeLf.js → chunk-L3NEJ4N5-COfUyKII.js} +1 -1
- package/studio/web/assets/chunk-OSK3NFVY-ByciRftO.js +10 -0
- package/studio/web/assets/{chunk-P2QGCYS3-DmIFY4d7.js → chunk-P2QGCYS3-CP1VhG_c.js} +1 -1
- package/studio/web/assets/{chunk-POPQ4Y6H-BPrvMyKz.js → chunk-POPQ4Y6H-ClWhhkwW.js} +1 -1
- package/studio/web/assets/{chunk-PWAF6VOD-2zB6IW9i.js → chunk-PWAF6VOD-1z1THyS5.js} +1 -1
- package/studio/web/assets/{chunk-RHFEMEQ7-2FgyI8YU.js → chunk-SHT3W25Y-LpQkMsah.js} +2 -2
- package/studio/web/assets/{chunk-SVP7TREG-FwtbH2QC.js → chunk-SVP7TREG-jtdAHw0S.js} +1 -1
- package/studio/web/assets/{chunk-LCL6LL3I-HOzK_ppE.js → chunk-TICWLB2K-VOwzetX-.js} +1 -1
- package/studio/web/assets/classDiagram-ZZMXUADV-VaEwSy_g.js +1 -0
- package/studio/web/assets/classDiagram-v2-VYDZK3BY-VaEwSy_g.js +1 -0
- package/studio/web/assets/{createLucideIcon-BKGPfjm2.js → createLucideIcon-CzW9508A.js} +1 -1
- package/studio/web/assets/{cssMode-CEN2mzSA.js → cssMode-s0cWI-_M.js} +1 -1
- package/studio/web/assets/{cynefin-OW5HDTMX-BRkpLFQV.js → cynefin-OW5HDTMX-BbdbCvub.js} +1 -1
- package/studio/web/assets/{cynefinDiagram-5FMLGOSQ-CHT1DaX6.js → cynefinDiagram-5FMLGOSQ-TP-aIqbt.js} +1 -1
- package/studio/web/assets/{dagre-3AP2YEHR-DpUXBh63.js → dagre-GXQ25YYZ-DShnGpGo.js} +1 -1
- package/studio/web/assets/{diagram-S7CK7UJ4-BuymVFZT.js → diagram-S7CK7UJ4-aoCVTtcy.js} +1 -1
- package/studio/web/assets/{diagram-UQ7AKVKN-CyP148RM.js → diagram-UQ7AKVKN-DglXtQ6x.js} +1 -1
- package/studio/web/assets/{diagram-VSXAHHWV-CoCAg3M9.js → diagram-VSXAHHWV-fhEdmkwM.js} +1 -1
- package/studio/web/assets/{diagram-VX7I27RA-BpOqCFca.js → diagram-VX7I27RA-DccVJet6.js} +1 -1
- package/studio/web/assets/{diagram-Z3DM3KII-Bfpw7Vbj.js → diagram-Z3DM3KII-D-RyJJb7.js} +1 -1
- package/studio/web/assets/{dialog-CBf0Mr1d.js → dialog-Cn2uWgD4.js} +1 -1
- package/studio/web/assets/{dist-lkA3O3eM.js → dist-DP8UjMB_.js} +1 -1
- package/studio/web/assets/{download-BtTOBem-.js → download-B5T5r7ss.js} +1 -1
- package/studio/web/assets/{ebnfDiagram-PWID7BFC-DS_6aWqL.js → ebnfDiagram-PWID7BFC-DJGpIpz_.js} +1 -1
- package/studio/web/assets/{editor-D8oDeCTL.js → editor-DNcRHK54.js} +1 -1
- package/studio/web/assets/{erDiagram-SSCWMZ5O-DJNk6Fgw.js → erDiagram-RLTQ6QDP-CIfNlgkC.js} +1 -1
- package/studio/web/assets/eventmodeling-NTZA5JFV-CLxnp2CR.js +1 -0
- package/studio/web/assets/flowDiagram-HODETNUW-BIbhmz9f.js +1 -0
- package/studio/web/assets/{ganttDiagram-EL5Y4UJY-2pOExxMY.js → ganttDiagram-EL5Y4UJY-BxToTzzD.js} +1 -1
- package/studio/web/assets/{getAnalytics-D4LKGeVy.js → getAnalytics-GHK8ORfM.js} +1 -1
- package/studio/web/assets/{gitGraph-4MIJSDKK-CH5ZxwzF.js → gitGraph-4MIJSDKK-D2s2w8lE.js} +1 -1
- package/studio/web/assets/{gitGraphDiagram-WWUBYQGX-DVIsIhbO.js → gitGraphDiagram-WWUBYQGX-Dwntd4-x.js} +1 -1
- package/studio/web/assets/{html-u3vOg7LJ.js → html-Bdssedlg.js} +1 -1
- package/studio/web/assets/{htmlMode-DyO31v-P.js → htmlMode-CoDlJ3fw.js} +1 -1
- package/studio/web/assets/{index-Cxj2_wsl.css → index-7RMEgVG1.css} +1 -1
- package/studio/web/assets/index-D6sxmFLR.js +824 -0
- package/studio/web/assets/index.lazy-tmU5BS8s.js +2 -0
- package/studio/web/assets/{info-A6RAGUB7-CPQfTnaG.js → info-A6RAGUB7-DYjkvb0C.js} +1 -1
- package/studio/web/assets/{infoDiagram-RXCK75RN-DlwLYlwm.js → infoDiagram-27XIBGKW-Bnp1FJE5.js} +1 -1
- package/studio/web/assets/{ishikawaDiagram-5VMMS53U-BRXRp29U.js → ishikawaDiagram-5VMMS53U-D9Xh2r6X.js} +1 -1
- package/studio/web/assets/{javascript-CUvxOyTC.js → javascript-B8meVSTH.js} +1 -1
- package/studio/web/assets/{journeyDiagram-EYS64GPL-B0ou8k0n.js → journeyDiagram-3NMN7TZE-CokIi6ll.js} +2 -2
- package/studio/web/assets/{jsonMode-f_IwbF3D.js → jsonMode-DpIPd35T.js} +1 -1
- package/studio/web/assets/{kanban-definition-3QL26DDD-uYg7iYzp.js → kanban-definition-UXKFOSKX-CukSFJfX.js} +1 -1
- package/studio/web/assets/{languageServices-DXtZ6rEF.js → languageServices-C_5FMJzQ.js} +1 -1
- package/studio/web/assets/{lspLanguageFeatures-B4pCF1zO.js → lspLanguageFeatures-BIzNBzPK.js} +1 -1
- package/studio/web/assets/{mermaid-parser.core-Ck-fC8b7.js → mermaid-parser.core-BlEsOWNO.js} +3 -3
- package/studio/web/assets/{mermaid.core-CP8aNNYm.js → mermaid.core-BlkGaMIH.js} +5 -5
- package/studio/web/assets/{mindmap-definition-FBJOCRG2-CgTZ-rit.js → mindmap-definition-YA3MSWOX-IprMc_0j.js} +1 -1
- package/studio/web/assets/{notifications-D3tIQ4sg.js → notifications-CQf18QKb.js} +1 -1
- package/studio/web/assets/notifications-CvZivSbh.js +1 -0
- package/studio/web/assets/{packet-AYTQ26CC-DEyoPtPb.js → packet-AYTQ26CC-Bi3V04Zi.js} +1 -1
- package/studio/web/assets/{pegDiagram-XKGWAZYB-DrD-7sD9.js → pegDiagram-XKGWAZYB-BNuPDLZY.js} +1 -1
- package/studio/web/assets/{pie-WAS4IAKB-wjj-EI1d.js → pie-WAS4IAKB-_6DoDbng.js} +1 -1
- package/studio/web/assets/{pieDiagram-E7YTZNPT-GntqDCzv.js → pieDiagram-E7YTZNPT-DqNb6Ht2.js} +1 -1
- package/studio/web/assets/{profile-DZWU7MgT.js → profile-DdOwtntb.js} +1 -1
- package/studio/web/assets/{quadrantDiagram-AXDQQJYC-0UeqXQGd.js → quadrantDiagram-AXDQQJYC-BGH9E2YR.js} +1 -1
- package/studio/web/assets/{radar-RG4KPBEZ-DFSA5h7k.js → radar-RG4KPBEZ-DDdVczcL.js} +1 -1
- package/studio/web/assets/{railroad-74A4TZTK-CaOUG9wR.js → railroad-74A4TZTK-BJUP4Jds.js} +1 -1
- package/studio/web/assets/railroad-abnf-HS5TGJTU-Bm3L1L0h.js +1 -0
- package/studio/web/assets/railroad-ebnf-LZEXJU2U-CKzLGlkw.js +1 -0
- package/studio/web/assets/railroad-peg-WCYAUIDC-S8xLjslx.js +1 -0
- package/studio/web/assets/{railroadDiagram-O6MQD6OU-yHUELZaV.js → railroadDiagram-O6MQD6OU-DGTPh2KZ.js} +1 -1
- package/studio/web/assets/{regions-CkyurXzE.js → regions-n69fwagr.js} +1 -1
- package/studio/web/assets/{register-BUyhWjBO.js → register-PfWTCXWB.js} +3 -3
- package/studio/web/assets/{requirementDiagram-EFPCY7ZU-DNEGFjuW.js → requirementDiagram-BXWQKSXE-BJnO6uLz.js} +1 -1
- package/studio/web/assets/{sankeyDiagram-P5KCCOFB-DpyAmSVR.js → sankeyDiagram-P5KCCOFB-0vSOdymH.js} +1 -1
- package/studio/web/assets/{sequenceDiagram-WJ2MYXX4-TyaT7xNk.js → sequenceDiagram-WJ2MYXX4-hETizDWE.js} +1 -1
- package/studio/web/assets/{setComponentFile-CeyKSZAa.js → setComponentFile-Bg6O7X0S.js} +1 -1
- package/studio/web/assets/{setup-D2kn7cAA.js → setup-CUx_aUDl.js} +2 -2
- package/studio/web/assets/{stateDiagram-HBIQ2CUA-CeEdTArZ.js → stateDiagram-D77RDMKH-CdYQ_KtC.js} +1 -1
- package/studio/web/assets/stateDiagram-v2-MP3YSRHH-CdKuzQMT.js +1 -0
- package/studio/web/assets/status-D7BVKqX9.js +61 -0
- package/studio/web/assets/{swimlanes-XN3QIQJK-B54FmF46.js → swimlanes-42K2YHIH-B8cHIpU4.js} +1 -1
- package/studio/web/assets/swimlanesDiagram-VR7AAH4N-DmOSJwaH.js +8 -0
- package/studio/web/assets/{tabs-B_G5zscN.js → tabs-BrHu7gJi.js} +1 -1
- package/studio/web/assets/{timeline-definition-24CTP7MA-D-a9ujbo.js → timeline-definition-24CTP7MA-BJWYSXqF.js} +1 -1
- package/studio/web/assets/{toggleHighContrast-C0UW6rI2.js → toggleHighContrast-DBSyXzMr.js} +1 -1
- package/studio/web/assets/{treeView-Q6P3EWNA-CrW_6JnS.js → treeView-Q6P3EWNA-qxe_v6CQ.js} +1 -1
- package/studio/web/assets/{treemap-WGGIJYW6-BxyYLdP_.js → treemap-WGGIJYW6-dDo97XXF.js} +1 -1
- package/studio/web/assets/{tsMode-DBC0zmDx.js → tsMode-BByKCjBS.js} +1 -1
- package/studio/web/assets/{typescript-DApRQir3.js → typescript-DDLnLpw9.js} +1 -1
- package/studio/web/assets/{useEntityRestURL-DB6JStU1.js → useEntityRestURL-31CHGaHk.js} +1 -1
- package/studio/web/assets/{useLocalStorage-Dtj1QS8_.js → useLocalStorage-BqMR3D8_.js} +1 -1
- package/studio/web/assets/vendor-core-c2JRRJpV.js +58 -0
- package/studio/web/assets/vendor-datadog-CLUcJXOo.js +6 -0
- package/studio/web/assets/{vendor-react-Dyj4O3HE.js → vendor-react-CJV_K1u4.js} +1 -1
- package/studio/web/assets/vendor-tanstack-DxzraizX.js +1 -0
- package/studio/web/assets/{vendor-ui-vhu-UHhF.js → vendor-ui-BUjK0h8a.js} +2 -2
- package/studio/web/assets/{vennDiagram-4TSXK5OY-Cy7s7Mpy.js → vennDiagram-4TSXK5OY-A3i-lCdl.js} +1 -1
- package/studio/web/assets/{wardley-WFR3VGLG-BeBL35g2.js → wardley-WFR3VGLG-B0ik-_6g.js} +1 -1
- package/studio/web/assets/{wardleyDiagram-VM6X3IG4-BylmIGSg.js → wardleyDiagram-VM6X3IG4-CjrkKWUR.js} +1 -1
- package/studio/web/assets/{workers-C0bFIedw.js → workers-pR3jRY9D.js} +1 -1
- package/studio/web/assets/x-DIzaLEdK.js +1 -0
- package/studio/web/assets/{xml-HWd01lU-.js → xml-2iRnMhQO.js} +1 -1
- package/studio/web/assets/{xychartDiagram-S5SC5T6Z-CoKALMXr.js → xychartDiagram-S5SC5T6Z-Biok4GYV.js} +1 -1
- package/studio/web/assets/{yaml-CIH0Nt-h.js → yaml-Bf92gJpd.js} +1 -1
- package/studio/web/index.html +14 -14
- package/upgrade/directives/5-3-0.ts +132 -0
- package/upgrade/directives/directivesController.ts +2 -1
- package/utility/OperationFunctionCaller.ts +2 -1
- package/utility/common_utils.ts +30 -5
- package/utility/componentNames.ts +12 -0
- package/utility/environment/environmentManager.ts +3 -7
- package/utility/environment/systemInformation.ts +7 -0
- package/utility/errors/commonErrors.ts +4 -0
- package/utility/errors/hdbError.ts +29 -0
- package/utility/hdbTerms.ts +17 -0
- package/utility/logging/harper_logger.ts +87 -14
- package/utility/logging/logRotator.ts +72 -45
- package/utility/nodeIdentity.ts +45 -0
- package/utility/npmUtilities.ts +10 -8
- package/utility/operationPermissions.ts +18 -1
- package/utility/operation_authorization.ts +231 -42
- package/utility/watchPath.ts +63 -0
- package/utility/watcherFallback.ts +270 -0
- package/validation/configValidator.ts +209 -72
- package/validation/installValidator.ts +15 -0
- package/validation/validationWrapper.ts +18 -4
- package/studio/web/assets/Chat-JpO8EtUu.js +0 -2067
- package/studio/web/assets/FloatingChat-Bcj3xSZu.js +0 -23
- package/studio/web/assets/applications-ByqLRKyZ.js +0 -296
- package/studio/web/assets/architecture-7GRP2DOG-DNdx5tEU.js +0 -1
- package/studio/web/assets/authStore-qKmCZcaf.js +0 -3
- package/studio/web/assets/channel-DtCV8PTL.js +0 -1
- package/studio/web/assets/chunk-R7TYR2AO-Irip67yr.js +0 -10
- package/studio/web/assets/classDiagram-DTDB5LWJ-DbO_dCNE.js +0 -1
- package/studio/web/assets/classDiagram-v2-JRS7N3AN-DbO_dCNE.js +0 -1
- package/studio/web/assets/eventmodeling-NTZA5JFV-5jbe4A5P.js +0 -1
- package/studio/web/assets/flowDiagram-A5DVABFB-Dp9Ezlow.js +0 -1
- package/studio/web/assets/index-aSt5tY-L.js +0 -824
- package/studio/web/assets/index.lazy-B9jiPwT8.js +0 -2
- package/studio/web/assets/notifications-CUoYgU98.js +0 -1
- package/studio/web/assets/railroad-abnf-HS5TGJTU-Bc0Qi0WH.js +0 -1
- package/studio/web/assets/railroad-ebnf-LZEXJU2U-G8rVVZ2C.js +0 -1
- package/studio/web/assets/railroad-peg-WCYAUIDC-CrehKBhC.js +0 -1
- package/studio/web/assets/stateDiagram-v2-4QOOHH4V-D4tuw9Su.js +0 -1
- package/studio/web/assets/status-D7Xn5ePA.js +0 -61
- package/studio/web/assets/swimlanesDiagram-VK2B7HYN-XOhmNEvq.js +0 -8
- package/studio/web/assets/vendor-core-RCcadM3e.js +0 -73
- package/studio/web/assets/vendor-datadog-BRv-mOv1.js +0 -6
- package/studio/web/assets/vendor-tanstack-BiFWSB3W.js +0 -1
- package/studio/web/assets/x-B9o9hsep.js +0 -1
- /package/studio/web/assets/{sizeCapture-X5ZJPWSS-B0uUizjq.js → sizeCapture-INFHLROL-B0uUizjq.js} +0 -0
|
@@ -0,0 +1,253 @@
|
|
|
1
|
+
import harperLogger from '../utility/logging/harper_logger.ts';
|
|
2
|
+
import { ClientError } from '../utility/errors/hdbError.ts';
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* Exclusive per-record locks (harper#483, Phase 0: one node, every worker thread).
|
|
6
|
+
*
|
|
7
|
+
* The sole authority is the rocksdb-js process-wide key lock: one `locks` map per DBDescriptor
|
|
8
|
+
* shared by every worker thread's handle. Nothing is written to the store or audit log. Lock and
|
|
9
|
+
* unlock are pure in-memory operations; the record's version and bytes are unchanged.
|
|
10
|
+
*/
|
|
11
|
+
|
|
12
|
+
export const DEFAULT_LOCK_LEASE_MS = 30_000;
|
|
13
|
+
/** Below this a generation can expire before the caller's work completes, handing back a lock already lost. */
|
|
14
|
+
export const MIN_LOCK_LEASE_MS = 100;
|
|
15
|
+
export const MAX_LOCK_LEASE_MS = 300_000;
|
|
16
|
+
export const DEFAULT_LOCK_TIMEOUT_MS = 30_000;
|
|
17
|
+
export const MAX_LOCK_TIMEOUT_MS = 300_000;
|
|
18
|
+
const LOCK_KEY_PREFIX = Symbol.for('record-lock');
|
|
19
|
+
|
|
20
|
+
export interface RecordLockOptions {
|
|
21
|
+
/** Lease in ms; the lock expires on its own if the holder never releases it (default 30 s, max 5 min) */
|
|
22
|
+
lease?: number;
|
|
23
|
+
/** How long to wait for a contended lock in ms before failing with 423 (default 30 s, max 5 min) */
|
|
24
|
+
timeout?: number;
|
|
25
|
+
/** A held lock outlives the acquiring transaction; it is released by `unlock()` or by its lease */
|
|
26
|
+
hold?: boolean;
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
export interface ResolvedRecordLockOptions {
|
|
30
|
+
lease: number;
|
|
31
|
+
timeout: number;
|
|
32
|
+
hold: boolean;
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
/**
|
|
36
|
+
* The handle returned by `lock()` and held by each gated write until its transaction completes.
|
|
37
|
+
* `release()` is synchronous: it calls `store.unlock(key)` which is ownerless and fires any
|
|
38
|
+
* waiting callbacks cross-thread. The `expired` flag is set in the holder thread by the lease
|
|
39
|
+
* timer, so a stale holder cannot accidentally call unlock after its lease already fired and
|
|
40
|
+
* released the key to a new holder.
|
|
41
|
+
*/
|
|
42
|
+
export interface RecordLockHandle {
|
|
43
|
+
store: any;
|
|
44
|
+
key: any[]; // lockAttemptKey, passed to store.tryLock / store.unlock
|
|
45
|
+
keyId: unknown; // writeKeyId(id), used to scan the per-transaction recordLocks array
|
|
46
|
+
expiresAt: number;
|
|
47
|
+
hold: boolean;
|
|
48
|
+
released: boolean;
|
|
49
|
+
expired: boolean;
|
|
50
|
+
/** Monotonic timestamp at which tryLock succeeded; used as the base version for holder writes. */
|
|
51
|
+
acquiredAt: number;
|
|
52
|
+
/** Advance, but never lower, the version floor from the transaction that owns the actual write timestamp. */
|
|
53
|
+
noteHolderVersion(version: number): void;
|
|
54
|
+
/** Preserve a caller timestamp as a candidate floor without treating it as a committed write. */
|
|
55
|
+
noteCandidateFloor(version: number): void;
|
|
56
|
+
/** Compute a holder-write version without advancing the floor until that write commits. */
|
|
57
|
+
holderVersionCandidate(floor?: number): number;
|
|
58
|
+
/**
|
|
59
|
+
* Return the next version to stamp a holder write with. Starts at acquiredAt when no transaction
|
|
60
|
+
* version has been noted; otherwise advances by the minimum monotonic step from the recorded floor.
|
|
61
|
+
*/
|
|
62
|
+
nextHolderVersion(): number;
|
|
63
|
+
release(): boolean;
|
|
64
|
+
/**
|
|
65
|
+
* Flip this handle to hold mode and reset its lease timer. Used during scoped→hold upgrades
|
|
66
|
+
* so all instances that reference this handle object remain valid (no retire + replace).
|
|
67
|
+
*/
|
|
68
|
+
upgradeToHold(lease: number): void;
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
function requireDuration(name: string, value: unknown, fallback: number, min: number, max: number): number {
|
|
72
|
+
if (value === undefined) return fallback;
|
|
73
|
+
if (typeof value !== 'number' || !Number.isFinite(value) || value < min)
|
|
74
|
+
throw new ClientError(
|
|
75
|
+
`Lock option ${name} must be a number of milliseconds of at least ${min}, but received ${value}`
|
|
76
|
+
);
|
|
77
|
+
if (value > max) throw new ClientError(`Lock option ${name} must not exceed ${max}ms, but received ${value}`);
|
|
78
|
+
return value;
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
export function resolveLockOptions(options?: RecordLockOptions | null): ResolvedRecordLockOptions {
|
|
82
|
+
if (options != null && typeof options !== 'object')
|
|
83
|
+
throw new ClientError(`Lock options must be an object, but received ${typeof options}`);
|
|
84
|
+
const hold = options?.hold ?? false;
|
|
85
|
+
if (typeof hold !== 'boolean') throw new ClientError(`Lock option hold must be a boolean, but received ${hold}`);
|
|
86
|
+
return {
|
|
87
|
+
lease: requireDuration('lease', options?.lease, DEFAULT_LOCK_LEASE_MS, MIN_LOCK_LEASE_MS, MAX_LOCK_LEASE_MS),
|
|
88
|
+
timeout: requireDuration('timeout', options?.timeout, DEFAULT_LOCK_TIMEOUT_MS, 1, MAX_LOCK_TIMEOUT_MS),
|
|
89
|
+
hold,
|
|
90
|
+
};
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
/**
|
|
94
|
+
* The 409 for a write staged through a handle that is no longer live. A lease that ran out and a
|
|
95
|
+
* lock that was handed back are different causes, and a caller told the wrong one debugs the wrong
|
|
96
|
+
* thing — a commit-released scoped handle is not a timeout.
|
|
97
|
+
*/
|
|
98
|
+
export function lockNotHeldError(handle: Pick<RecordLockHandle, 'expired'>): ClientError {
|
|
99
|
+
return new ClientError(handle.expired ? 'Record lock lease expired' : 'Record lock already released', 409);
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
/** The advisory key for this (table, record) pair, distinct from getFromSource's bare-id single-flight lock. */
|
|
103
|
+
export function lockAttemptKey(tableId: number, id: any): any[] {
|
|
104
|
+
return Array.isArray(id) ? [LOCK_KEY_PREFIX, tableId, ...id] : [LOCK_KEY_PREFIX, tableId, id];
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
const warnedLeaseTimerStores = new WeakSet();
|
|
108
|
+
|
|
109
|
+
class KeyLockHandle implements RecordLockHandle {
|
|
110
|
+
store: any;
|
|
111
|
+
key: any[];
|
|
112
|
+
keyId: unknown;
|
|
113
|
+
expiresAt: number;
|
|
114
|
+
hold: boolean;
|
|
115
|
+
released = false;
|
|
116
|
+
expired = false;
|
|
117
|
+
acquiredAt: number;
|
|
118
|
+
#lastHolderVersion: number | undefined;
|
|
119
|
+
#candidateFloor: number | undefined;
|
|
120
|
+
#timer: ReturnType<typeof setTimeout> | undefined;
|
|
121
|
+
|
|
122
|
+
constructor(store: any, key: any[], keyId: unknown, lease?: number, hold = false, acquiredAt?: number) {
|
|
123
|
+
this.store = store;
|
|
124
|
+
this.key = key;
|
|
125
|
+
this.keyId = keyId;
|
|
126
|
+
this.expiresAt = lease != null ? Date.now() + lease : Infinity;
|
|
127
|
+
this.hold = hold;
|
|
128
|
+
this.acquiredAt = acquiredAt ?? store.getMonotonicTimestamp();
|
|
129
|
+
if (lease != null) {
|
|
130
|
+
this.#timer = setTimeout(() => this.#onLeaseExpire(), lease).unref();
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
noteHolderVersion(version: number): void {
|
|
135
|
+
this.#lastHolderVersion = Math.max(this.#lastHolderVersion ?? version, version);
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
noteCandidateFloor(version: number): void {
|
|
139
|
+
this.#candidateFloor = Math.max(this.#candidateFloor ?? version, version);
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
holderVersionCandidate(floor?: number): number {
|
|
143
|
+
// A small nonzero step prevents exact LWW ties without materially moving past the observed floor.
|
|
144
|
+
const MIN_STEP = 0.000488;
|
|
145
|
+
return Math.max(
|
|
146
|
+
this.#lastHolderVersion != null ? this.#lastHolderVersion + MIN_STEP : this.acquiredAt,
|
|
147
|
+
this.acquiredAt,
|
|
148
|
+
this.#candidateFloor ?? -Infinity,
|
|
149
|
+
floor ?? -Infinity
|
|
150
|
+
);
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
nextHolderVersion(): number {
|
|
154
|
+
const next = this.holderVersionCandidate();
|
|
155
|
+
this.#lastHolderVersion = next;
|
|
156
|
+
return next;
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
#onLeaseExpire() {
|
|
160
|
+
if (this.released) return;
|
|
161
|
+
this.released = true;
|
|
162
|
+
this.expired = true;
|
|
163
|
+
try {
|
|
164
|
+
this.store.unlock(this.key);
|
|
165
|
+
} catch (err) {
|
|
166
|
+
if (!warnedLeaseTimerStores.has(this.store)) {
|
|
167
|
+
warnedLeaseTimerStores.add(this.store);
|
|
168
|
+
harperLogger.warn?.('record lock lease timer failed (store may have been dropped)', err);
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
release(): boolean {
|
|
174
|
+
if (this.released) return false;
|
|
175
|
+
this.released = true;
|
|
176
|
+
clearTimeout(this.#timer);
|
|
177
|
+
try {
|
|
178
|
+
this.store.unlock(this.key);
|
|
179
|
+
} catch (err) {
|
|
180
|
+
if (!warnedLeaseTimerStores.has(this.store)) {
|
|
181
|
+
warnedLeaseTimerStores.add(this.store);
|
|
182
|
+
harperLogger.warn?.('record lock release failed (store may have been dropped)', err);
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
return true;
|
|
186
|
+
}
|
|
187
|
+
|
|
188
|
+
upgradeToHold(lease: number): void {
|
|
189
|
+
this.hold = true;
|
|
190
|
+
clearTimeout(this.#timer);
|
|
191
|
+
this.expiresAt = Date.now() + lease;
|
|
192
|
+
this.#timer = setTimeout(() => this.#onLeaseExpire(), lease).unref();
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
|
|
196
|
+
export function makeKeyLockHandle(
|
|
197
|
+
store: any,
|
|
198
|
+
key: any[],
|
|
199
|
+
keyId: unknown,
|
|
200
|
+
lease?: number,
|
|
201
|
+
hold = false,
|
|
202
|
+
acquiredAt?: number
|
|
203
|
+
): RecordLockHandle {
|
|
204
|
+
return new KeyLockHandle(store, key, keyId, lease, hold, acquiredAt);
|
|
205
|
+
}
|
|
206
|
+
|
|
207
|
+
/**
|
|
208
|
+
* Acquire the native key lock for a record, looping until acquired or deadline passes. Re-entrant
|
|
209
|
+
* within a transaction: if the transaction already holds this key (non-expired handle in its
|
|
210
|
+
* recordLocks map) the existing handle is returned without a second tryLock.
|
|
211
|
+
*/
|
|
212
|
+
export async function acquireRecordKey(
|
|
213
|
+
txn: { recordLockFor(store: any, keyId: unknown): RecordLockHandle | undefined },
|
|
214
|
+
store: any,
|
|
215
|
+
key: any[],
|
|
216
|
+
keyId: unknown,
|
|
217
|
+
waitMs: number,
|
|
218
|
+
lease?: number,
|
|
219
|
+
hold = false
|
|
220
|
+
): Promise<RecordLockHandle> {
|
|
221
|
+
const existing = txn.recordLockFor(store, keyId);
|
|
222
|
+
if (existing && !existing.released && !existing.expired) return existing;
|
|
223
|
+
|
|
224
|
+
const deadline = Date.now() + waitMs;
|
|
225
|
+
// One persistent wake slot: at most one onUnlocked callback is registered per waiter at any
|
|
226
|
+
// time. After the callback fires (holder released), hasCallback is cleared so the next
|
|
227
|
+
// tryLock can register a fresh callback for the new holder. When the timeout fires instead
|
|
228
|
+
// (the holder has not released yet), hasCallback stays true and subsequent retries skip the
|
|
229
|
+
// callback registration, preventing unbounded accumulation on a hot key.
|
|
230
|
+
let wakeResolve: (() => void) | undefined;
|
|
231
|
+
let hasCallback = false;
|
|
232
|
+
while (true) {
|
|
233
|
+
const onUnlocked = hasCallback
|
|
234
|
+
? undefined
|
|
235
|
+
: () => {
|
|
236
|
+
hasCallback = false;
|
|
237
|
+
wakeResolve?.();
|
|
238
|
+
};
|
|
239
|
+
const acquired = store.tryLock(key, onUnlocked);
|
|
240
|
+
if (acquired) return makeKeyLockHandle(store, key, keyId, lease, hold, store.getMonotonicTimestamp());
|
|
241
|
+
if (onUnlocked) hasCallback = true; // callback now registered; do not register another until it fires
|
|
242
|
+
const remaining = deadline - Date.now();
|
|
243
|
+
if (remaining <= 0) throw new ClientError(`Record is locked and was not released in time`, 423);
|
|
244
|
+
await new Promise<void>((resolve) => {
|
|
245
|
+
const t = setTimeout(resolve, remaining).unref();
|
|
246
|
+
wakeResolve = () => {
|
|
247
|
+
clearTimeout(t);
|
|
248
|
+
resolve();
|
|
249
|
+
};
|
|
250
|
+
});
|
|
251
|
+
wakeResolve = undefined;
|
|
252
|
+
}
|
|
253
|
+
}
|
package/resources/replayLogs.ts
CHANGED
|
@@ -40,13 +40,36 @@ export function structuresWouldShrink(existing: any, updated: any): boolean {
|
|
|
40
40
|
return false;
|
|
41
41
|
}
|
|
42
42
|
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
43
|
+
/** The total wall-clock budget (ms) a replay may spend, as configured for this process. */
|
|
44
|
+
export function replayTimeBudgetMs(): number {
|
|
45
|
+
const configuredReplayTimeout = Number(envGet(CONFIG_PARAMS.REPLICATION_REPLAYTIMEOUT));
|
|
46
|
+
return configuredReplayTimeout > 0 ? configuredReplayTimeout : REPLAY_WALL_CLOCK_LIMIT_MS;
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
/**
|
|
50
|
+
* `electedReplayer` marks a caller that has already won a cross-thread election for this store —
|
|
51
|
+
* the branch claim (branchDatabase.ts) — and so may replay off the main thread. It also makes the
|
|
52
|
+
* replay strict: the promise settles (never hangs), and a failure to apply the tail — a commit or
|
|
53
|
+
* write error, a stall or wall-clock abort — rejects instead of quietly serving a rewound store.
|
|
54
|
+
* Undecodable entries and a torn tail stay tolerated in both modes: a crash tears the last frame of
|
|
55
|
+
* a log by construction, and end-of-log is the designed reading of it (see replayLogsGuards.ts). A
|
|
56
|
+
* **mid-log** break is different — entries behind it were acknowledged and are now quarantined — so
|
|
57
|
+
* an elected replay rejects on one rather than publish a branch as a trustworthy point-in-time copy
|
|
58
|
+
* over known lost writes; boot replay still logs it and continues (harper#2016, harper#2063).
|
|
59
|
+
*/
|
|
60
|
+
export function replayLogs(rootStore: RocksDatabase, tables: any, electedReplayer?: boolean): Promise<void> {
|
|
61
|
+
if (!isMainThread && !electedReplayer) return Promise.resolve(); // ideally we don't do it like this, but for now this is predictable
|
|
62
|
+
return new Promise((resolve, reject) => {
|
|
46
63
|
const acquired = rootStore.tryLock('replayLogs', async () => {
|
|
47
64
|
resolve();
|
|
48
65
|
});
|
|
49
|
-
if (!acquired)
|
|
66
|
+
if (!acquired) {
|
|
67
|
+
// An elected replayer is the store's sole opener, so a held lock is a protocol violation;
|
|
68
|
+
// hanging its awaited promise would wedge the branch claim in CREATING. The boot-scan
|
|
69
|
+
// caller keeps the settle-on-unlock semantics (nothing awaits it).
|
|
70
|
+
if (electedReplayer) reject(new Error(`The replay lock for ${(rootStore as any).databaseName} is already held`));
|
|
71
|
+
return;
|
|
72
|
+
}
|
|
50
73
|
// Shed transaction-log files already older than the audit retention window before
|
|
51
74
|
// replaying. A node that crash-loops during recovery never reaches the steady-state
|
|
52
75
|
// cleanup loop, so without this its aged backlog only grows and enlarges each subsequent
|
|
@@ -75,9 +98,13 @@ export function replayLogs(rootStore: RocksDatabase, tables: any): Promise<void>
|
|
|
75
98
|
tableById.set(table.tableId, table);
|
|
76
99
|
}
|
|
77
100
|
// replay all the logs
|
|
78
|
-
let transaction: DatabaseTransaction;
|
|
101
|
+
let transaction: DatabaseTransaction | undefined;
|
|
79
102
|
let lastTimestamp = 0;
|
|
80
103
|
let writes = 0;
|
|
104
|
+
// Writes staged on the currently-open transaction, so a discard can be taken back out of `writes`.
|
|
105
|
+
let stagedWrites = 0;
|
|
106
|
+
// Records dropped because a corrupt frame truncated the transaction they belong to.
|
|
107
|
+
let discardedWrites = 0;
|
|
81
108
|
let skipped = 0;
|
|
82
109
|
// Track forward progress so a backlog of unwritable entries can't grind the boot thread
|
|
83
110
|
// forever (harper#1266). `noProgressRun` counts every entry processed without a successful
|
|
@@ -89,13 +116,33 @@ export function replayLogs(rootStore: RocksDatabase, tables: any): Promise<void>
|
|
|
89
116
|
let lastProgressTime = replayStartTime;
|
|
90
117
|
// Total wall-clock budget (ms) for replay, configurable via `replication.replayTimeout`;
|
|
91
118
|
// falls back to the 10-minute default (harper#1316).
|
|
92
|
-
const
|
|
93
|
-
|
|
119
|
+
const replayTimeoutMs = replayTimeBudgetMs();
|
|
120
|
+
// Set on the first unrecoverable failure in elected mode; rejects below instead of publishing
|
|
121
|
+
// a store the replay knows is incomplete.
|
|
122
|
+
let strictFailure: Error | undefined;
|
|
123
|
+
const strictAbort = (error: Error, staged: DatabaseTransaction | undefined): void => {
|
|
124
|
+
try {
|
|
125
|
+
staged?.abort();
|
|
126
|
+
} catch (abortError) {
|
|
127
|
+
logger.warn('Error aborting a strict replay transaction', abortError);
|
|
128
|
+
}
|
|
129
|
+
strictFailure = error;
|
|
130
|
+
};
|
|
94
131
|
const txnLog: RocksTransactionLogStore = (rootStore as any).auditStore;
|
|
95
|
-
|
|
132
|
+
const entries = txnLog.getRange({
|
|
133
|
+
startFromLastFlushed: true,
|
|
134
|
+
readUncommitted: true,
|
|
135
|
+
trackCorruptTransactions: true,
|
|
136
|
+
});
|
|
137
|
+
for (const auditRecord of entries as any) {
|
|
96
138
|
if (noProgressRun > 0 && shouldAbortStalledReplay(noProgressRun, performance.now() - lastProgressTime)) {
|
|
139
|
+
const stallDiagnostic = `Aborting transaction-log replay in ${(rootStore as any).databaseName} database: ${noProgressRun} consecutive audit entries with no successful write (${skipped} skipped as unrecoverable, ${writes} replayed so far). This backlog is making no forward progress and was blocking startup (harper#1266) — typically a peer transaction log whose values reference unresolvable shared structures (harper#1163), or a backlog for a dropped table.`;
|
|
140
|
+
if (electedReplayer) {
|
|
141
|
+
strictAbort(new Error(stallDiagnostic), transaction);
|
|
142
|
+
break;
|
|
143
|
+
}
|
|
97
144
|
logger.fatal(
|
|
98
|
-
|
|
145
|
+
`${stallDiagnostic} Continuing boot without replaying the remainder; shed or relocate the oversized/undecodable peer transaction log(s), or re-clone this node, to recover the unreplayed data.`
|
|
99
146
|
);
|
|
100
147
|
break;
|
|
101
148
|
}
|
|
@@ -105,6 +152,7 @@ export function replayLogs(rootStore: RocksDatabase, tables: any): Promise<void>
|
|
|
105
152
|
nodeId,
|
|
106
153
|
recordId,
|
|
107
154
|
version,
|
|
155
|
+
txnLogKey,
|
|
108
156
|
residencyId,
|
|
109
157
|
expiresAt,
|
|
110
158
|
originatingOperation,
|
|
@@ -165,14 +213,35 @@ export function replayLogs(rootStore: RocksDatabase, tables: any): Promise<void>
|
|
|
165
213
|
warnedReplayHappening = true;
|
|
166
214
|
console.warn('Harper was not properly shutdown, replaying transaction logs to synchronize database');
|
|
167
215
|
}
|
|
168
|
-
|
|
169
|
-
|
|
216
|
+
// Transactions are delimited by the log key — which is also what `truncatedVersions` records —
|
|
217
|
+
// and each write is replayed at its own stored record version. The two differ for a source
|
|
218
|
+
// fill, and stamping such a record at the log key would move its version forward and make a
|
|
219
|
+
// later legitimate write in between look stale (harper#2411).
|
|
220
|
+
if (lastTimestamp !== txnLogKey) {
|
|
221
|
+
const torn = entries.corruptFrameStop.truncatedVersions.has(lastTimestamp);
|
|
222
|
+
lastTimestamp = txnLogKey;
|
|
170
223
|
try {
|
|
171
|
-
// commit the last transaction since we are starting a new one
|
|
172
|
-
transaction
|
|
224
|
+
// commit the last transaction since we are starting a new one, unless a corrupt
|
|
225
|
+
// frame swallowed the rest of it — half of a source transaction must never become
|
|
226
|
+
// durable, so it is dropped whole and stays in the log for a repaired retry
|
|
227
|
+
if (torn) {
|
|
228
|
+
writes -= stagedWrites;
|
|
229
|
+
discardedWrites += stagedWrites;
|
|
230
|
+
transaction?.abort();
|
|
231
|
+
} else transaction?.directCommitSync();
|
|
173
232
|
} catch (error) {
|
|
174
|
-
|
|
233
|
+
// directCommitSync aborts and detaches its transaction on failure; no cleanup here.
|
|
234
|
+
// The torn branch already backed stagedWrites out of writes before this try, so
|
|
235
|
+
// only a failed COMMIT (never applied) needs it backed out here too — otherwise a
|
|
236
|
+
// commit failure left `writes` counting records that never actually landed.
|
|
237
|
+
if (!torn) writes -= stagedWrites;
|
|
238
|
+
if (electedReplayer) {
|
|
239
|
+
strictFailure = error;
|
|
240
|
+
break;
|
|
241
|
+
}
|
|
242
|
+
logger.error(`Error ${torn ? 'discarding a torn' : 'committing'} replay transaction`, error);
|
|
175
243
|
}
|
|
244
|
+
stagedWrites = 0;
|
|
176
245
|
// Abort if replay has exceeded the total wall-clock budget even while making progress
|
|
177
246
|
// (harper#1316, facet a). shouldAbortStalledReplay resets its counters on every write,
|
|
178
247
|
// so a slow-but-progressing replay (deep out-of-order audit chain walk per entry) can
|
|
@@ -181,15 +250,18 @@ export function replayLogs(rootStore: RocksDatabase, tables: any): Promise<void>
|
|
|
181
250
|
// is not yet staged, so aborting never tears a same-version (same source-transaction)
|
|
182
251
|
// write batch in half. Re-clone to recover the unreplayed remainder.
|
|
183
252
|
if (shouldAbortSlowReplay(performance.now() - replayStartTime, replayTimeoutMs)) {
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
)
|
|
187
|
-
|
|
253
|
+
const slowMessage = `Aborting transaction-log replay in ${(rootStore as any).databaseName} database: replay has exceeded the wall-clock time limit (${writes} written, ${skipped} skipped). The transaction log contains a pathologically deep out-of-order write history that is too expensive to reconcile during boot (harper#1316). Re-clone this node from a healthy leader to recover the unreplayed data.`;
|
|
254
|
+
transaction = undefined; // already committed above; nothing staged for the new version
|
|
255
|
+
if (electedReplayer) {
|
|
256
|
+
strictFailure = new Error(slowMessage);
|
|
257
|
+
break;
|
|
258
|
+
}
|
|
259
|
+
logger.fatal(slowMessage);
|
|
188
260
|
break;
|
|
189
261
|
}
|
|
190
262
|
transaction = new DatabaseTransaction();
|
|
191
263
|
transaction.db = primaryStore;
|
|
192
|
-
transaction.timestamp =
|
|
264
|
+
transaction.timestamp = txnLogKey;
|
|
193
265
|
// retries=1 routes operation.commit() through its retry path (no duplicate audit staging)
|
|
194
266
|
transaction.retries = 1;
|
|
195
267
|
// Explicit replay marker: skips schema validation (harper#1316) and makes save() stamp
|
|
@@ -198,8 +270,9 @@ export function replayLogs(rootStore: RocksDatabase, tables: any): Promise<void>
|
|
|
198
270
|
transaction.isReplay = true;
|
|
199
271
|
}
|
|
200
272
|
context.transaction = transaction;
|
|
201
|
-
const options = { context, residencyId, nodeId, originatingOperation };
|
|
273
|
+
const options = { context, residencyId, nodeId, originatingOperation, version };
|
|
202
274
|
writes++;
|
|
275
|
+
stagedWrites++;
|
|
203
276
|
switch (type) {
|
|
204
277
|
case 'put':
|
|
205
278
|
tableInstance._writeUpdate(recordId, record, true, options);
|
|
@@ -274,6 +347,10 @@ export function replayLogs(rootStore: RocksDatabase, tables: any): Promise<void>
|
|
|
274
347
|
noProgressRun = 0;
|
|
275
348
|
lastProgressTime = performance.now();
|
|
276
349
|
} catch (err) {
|
|
350
|
+
if (electedReplayer) {
|
|
351
|
+
strictAbort(err, transaction);
|
|
352
|
+
break;
|
|
353
|
+
}
|
|
277
354
|
// A write that threw made no forward progress either — count it toward the stall
|
|
278
355
|
// bound so a continuous stream of throwing writes can't grind the boot thread
|
|
279
356
|
// indefinitely (and the per-entry error log below can't spam unboundedly). harper#1266
|
|
@@ -283,18 +360,62 @@ export function replayLogs(rootStore: RocksDatabase, tables: any): Promise<void>
|
|
|
283
360
|
});
|
|
284
361
|
}
|
|
285
362
|
}
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
363
|
+
const finalTorn = entries.corruptFrameStop.truncatedVersions.has(lastTimestamp);
|
|
364
|
+
if (!strictFailure) {
|
|
365
|
+
try {
|
|
366
|
+
if (finalTorn) {
|
|
367
|
+
writes -= stagedWrites;
|
|
368
|
+
discardedWrites += stagedWrites;
|
|
369
|
+
transaction?.abort();
|
|
370
|
+
} else transaction?.directCommitSync();
|
|
371
|
+
} catch (error) {
|
|
372
|
+
// directCommitSync aborts and detaches its transaction on failure; no cleanup here.
|
|
373
|
+
// Mirrors the interior version-boundary catch above: a failed commit never applied, so
|
|
374
|
+
// it must not stay counted in `writes`.
|
|
375
|
+
if (!finalTorn) writes -= stagedWrites;
|
|
376
|
+
if (electedReplayer) strictFailure = error;
|
|
377
|
+
logger.error(`Error ${finalTorn ? 'discarding a torn' : 'committing'} replay transaction`, error);
|
|
378
|
+
}
|
|
379
|
+
}
|
|
380
|
+
// `breaks` also counts a torn tail — the designed, benign reading of a crash's last frame, and
|
|
381
|
+
// the reporter already logged it at `warn`. Only a mid-log break lost entries, so it alone earns
|
|
382
|
+
// this quarantine/repair summary; duplicating it for a torn tail would tell an operator to
|
|
383
|
+
// repair or re-clone the node on every ordinary unclean shutdown.
|
|
384
|
+
if (entries.corruptFrameStop.midLogBreak) {
|
|
385
|
+
logger.error(
|
|
386
|
+
`Transaction-log replay in ${(rootStore as any).databaseName} database stopped at a corrupt entry after replaying ${writes} records. Every entry after the break is quarantined — neither replayed nor replicated — and ${discardedWrites} record(s) of the transaction the break truncated were discarded rather than applied in part. Repair the transaction log or re-clone this node to recover them.`
|
|
387
|
+
);
|
|
388
|
+
// electedReplayer must not resolve past known loss — see the doc comment above. Only set
|
|
389
|
+
// strictFailure if nothing has already failed the replay for an unrelated reason, so this
|
|
390
|
+
// diagnostic never shadows a more specific commit/write error.
|
|
391
|
+
if (electedReplayer && !strictFailure) {
|
|
392
|
+
strictFailure = new Error(
|
|
393
|
+
`Elected replay in ${(rootStore as any).databaseName} database stopped at a mid-log corrupt transaction-log frame; entries behind the break were acknowledged and are now quarantined. Refusing to publish a branch over known lost writes — repair the transaction log or re-clone this node.`
|
|
394
|
+
);
|
|
395
|
+
}
|
|
290
396
|
}
|
|
291
397
|
if (writes > 0) logger.warn(`Replayed ${writes} records in ${(rootStore as any).databaseName} database`);
|
|
292
398
|
if (skipped > 0)
|
|
293
399
|
logger.warn(
|
|
294
400
|
`Skipped ${skipped} unrecoverable audit entries in ${(rootStore as any).databaseName} database during replay`
|
|
295
401
|
);
|
|
296
|
-
|
|
297
|
-
|
|
402
|
+
if (strictFailure) {
|
|
403
|
+
// A failed strict replay must be re-runnable: the branch claim resets for a retry, so the
|
|
404
|
+
// lock must not be what survives to wedge it. Only a COMPLETED replay keeps the lock
|
|
405
|
+
// forever (the once-per-boot guarantee). Reject BEFORE unlocking: unlock wakes tryLock
|
|
406
|
+
// callbacks — including this holder's own resolve() — and the first settle must be the
|
|
407
|
+
// rejection, or a failed replay reads as success.
|
|
408
|
+
reject(strictFailure);
|
|
409
|
+
try {
|
|
410
|
+
rootStore.unlock('replayLogs');
|
|
411
|
+
} catch (unlockError) {
|
|
412
|
+
logger.warn('Error releasing the replay lock after a failed replay', unlockError);
|
|
413
|
+
}
|
|
414
|
+
} else {
|
|
415
|
+
// we never actually release the lock because we only want to ever run one time
|
|
416
|
+
// rootStore.unlock('replayLogs');
|
|
417
|
+
resolve();
|
|
418
|
+
}
|
|
298
419
|
});
|
|
299
420
|
}
|
|
300
421
|
function asBinary(buffer) {
|