OAK-12282 : defining a fixed bound for the AbstractDiskCache#2978
Conversation
joerghoh
left a comment
There was a problem hiding this comment.
a lot of minor things:
- Comments: AI writes too many comments which are 100% valid and helpful in the context of this PR, but not really helpful in a year in the context of a different problem.
- some consistency
| * registered with the Whiteboard to revert to the pre-fix unbounded queue. | ||
| * <strong>Note:</strong> changing this flag requires a process restart, as | ||
| * the executor is created at startup. | ||
| */ |
There was a problem hiding this comment.
I would remove this for consistency reasons (or we would need to annotate every configuration parameter for the cache with the same).
There was a problem hiding this comment.
I cleared these comments as part of the fix since we can simply increase the list size no need for the toggle
| private static final Logger logger = LoggerFactory.getLogger(AbstractPersistentCache.class); | ||
|
|
||
| public static final int THREADS = Integer.getInteger("oak.segment.cache.threads", 10); | ||
| public static final int WRITE_QUEUE_SIZE = Integer.getInteger("oak.segment.cache.writeQueueSize", THREADS * 100); |
There was a problem hiding this comment.
Writing to disk will be limited to the performance of the IO system and does not scale much with the number of threads that are writing. In fact, a single thread writing efficiently to disk will likely saturate the disk. The max queue size should be a function of the write IO of the disk and of the memory that we want to devote to buffering pending writes, it should not depend on the number of write threads. And we also don't want to cause an OOME only by increasing the number of threads. The number of writers and the size of the queue should be separate settings.
Since segments are around 256KB, a queue size of 100 would take up 25MB when full. I'd say this is enough, as writes to a local SSD should be faster than reading from the network, so a few write threads should be able to keep up with whatever we can get from Azure.
There was a problem hiding this comment.
Writing to disk will be limited to the performance of the IO system and does not scale much with the number of threads that are writing
This is definitely true for the classic hard drives (aka "spinning rust"), but not anymore for NVME-SSDs. You get the full IOPS only when you execute operations at a massive scale (IIRC 256 concurrent threads). And this is applicable for both read and write. Assuming a modern operating system also the filesystem should be able to handle that.
For that I strongly recommend to keep these 10 as default.
There was a problem hiding this comment.
Yes, my claim that read/write does not scale much with number of threads is wrong for modern SSDs. They do scale.
In this particular case, the maximum download rate we can achieve from Azure will likely be far below what we can write to an SSD, so a small number of writers may be enough to keep up. But I was not advocating to decrease the number of writer threads. 10 is probably more than needed but the cost of having these threads around is minimal, so it's not an issue.
| * Name of the feature toggle for the OAK-12282 bounded write-queue fix. | ||
| * See {@link #FT_OAK_12282_BOUNDED_WRITE_QUEUE_ENABLED}. | ||
| */ | ||
| public static final String FT_OAK_12282 = "FT_OAK-12282"; |
There was a problem hiding this comment.
Personally, I think this is unnecessary. The change is quite safe. And if for some reason having a bound on the queue causes trouble, we can increase it's size to be effectively unlimited.
nfsantos
left a comment
There was a problem hiding this comment.
LGTM, but please get a few more approvals from people who are more involved with the usage of this cache.
| private static final Logger logger = LoggerFactory.getLogger(AbstractPersistentCache.class); | ||
|
|
||
| public static final int THREADS = Integer.getInteger("oak.segment.cache.threads", 10); | ||
| public static final int WRITE_QUEUE_SIZE = Integer.getInteger("oak.segment.cache.writeQueueSize", THREADS * 100); |
There was a problem hiding this comment.
Yes, my claim that read/write does not scale much with number of threads is wrong for modern SSDs. They do scale.
In this particular case, the maximum download rate we can achieve from Azure will likely be far below what we can write to an SSD, so a small number of writers may be enough to keep up. But I was not advocating to decrease the number of writer threads. 10 is probably more than needed but the cost of having these threads around is minimal, so it's not an issue.
|
@joerghoh any additional requests for this PR or can we merge it? |
) * OAK-12287: Update to Apache Parent POM to version 39 * OAK-12287: Update to Apache Parent POM to version 39 - revert removal of bundle-plugin version * OAK-12289 : disabled blob id tracking for document node store (#2987) * OAK-12289 : disabled blob id tracking for document node store * OAK-12289 : fixed test case * OAK-12259: oak-http: OakServlet mis-parses HTTP Basic credentials * OAK-12293 : bump commons-io to 2.21.0 (#2997) * OAK-12293 : bump commons-io to 2.22.0 * OAK-12293 : bump commons-io to 2.21.0 * OAK-12294 : bump commons-codec to 1.20.0 (#2998) * OAK-12295 : bump mongo-driver-sync to 5.3.1 (#3001) * OAK-12295 : bump mongo-driver-sync to 5.3.1 * OAK-12295 : fixed the compilation issues * OAK-12296 : bump testcontainers version to 2.0.3 (#3002) * OAK-12296 : bump testcontainers version to 2.0.3 * OAK-12296 : fixed the junit 4 compatibility issues * OAK-12296 : fixed compatibulity issues with Junit 4 * OAK-12296 : fixed compatibulity issues with ES tests * OAK-12296 : incorporated review comments to use withEnv override for ElasticTestServer * OAK-12244: index nodes that gain a mixin rule, delete stale docs when… (#2949) * OAK-12244: index nodes that gain a mixin rule, delete stale docs when mixin rule is lost (#2938) When an existing node's applicable indexing rule changes at runtime (e.g. jcr:mixinTypes added or removed), FulltextIndexEditor did not update the index because propertiesChanged was never set — jcr:mixinTypes is not normally listed in a rule's property definitions. Track wasIndexable (rule matched before) alongside isIndexable() (rule matches after). In leave(), act on transitions: - !wasIndexable && isIndexable(): node gained a rule → addOrUpdate - wasIndexable && !isIndexable(): node lost a rule → deleteDocuments Tests added: - PropertyIndexCommonTest: two end-to-end integration tests (all backends) - LuceneIndexEditor2Test: two unit tests verifying writer.docs / writer.deletedPaths * OAK-12244: fix mixin type changes not reflected in fulltext index (#2953) Root cause: when a node gains or loses a mixin type at runtime, FulltextIndexEditor did not update the index because propertiesChanged was never set — jcr:mixinTypes is not normally listed in a rule's property definitions. Fix: track wasIndexable (rule matched before) alongside isIndexable() (rule matches after). In leave(), act on the indexing-rule transition: - !wasIndexable && isIndexable(): node gained a rule → addOrUpdate - wasIndexable && !isIndexable(): node lost a rule → deleteDocument Split FulltextIndexWriter into two explicit operations: - deleteDocumentTree(path): node physically removed; cascade is correct - deleteDocument(path): node lost indexability at runtime; exact only The original deleteDocuments used a PrefixQuery that cascaded to all descendants; in the mixin-loss branch this was a bug — children carrying their own mixin types were incorrectly evicted from the index. Additional changes: - Snapshot FT_OAK_12244_DISABLE once per commit cycle in FulltextIndexEditorContext as typeChangeTrackingEnabled so enter() and leave() always agree - Skip getApplicableIndexingRule(before) on the hot path via hasNodeTypeChange guard when neither jcr:primaryType nor jcr:mixinTypes changed - Register FT_OAK_12244 toggle in ElasticIndexProviderService - Reuse CommitFailedException code 5 for the deleteDocument error path Tests: - PropertyIndexCommonTest: end-to-end integration tests (all backends) - LuceneIndexEditor2Test: unit tests verifying writer.docs / writer.deletedPaths - Verified: 1245 tests, 0 failures in oak-lucene --------- Co-authored-by: Benjamin Habegger <bhabegger@adobe.com> * OAK-12282 : defining a fixed bound for the AbstractDiskCache (#2978) * OAK-12282 defining a fixed bound for the AbstractDiskCache --------- Co-authored-by: patlego <patriquelegault@gmail.com> * OAK-12303: Update mina-core dependency version to 2.1.15 (#3008) (#3010) ack @telegrapher Co-authored-by: Jose Antonio Insua <ungoliant@gmail.com> * Revert "OAK-12295 : bump mongo-driver-sync to 5.3.1 (#3001)" (#3012) This reverts commit 480eb14. * OAK-12219: Upgrade Azure SDK V8 to V12 for oak-blob-azure - rework Ai-Assisted-By: claude * OAK-12219: Upgrade Azure SDK V8 to V12 for oak-blob-azure - rework - Sonar fixes Ai-Assisted-By: claude * OAK-12219: Upgrade Azure SDK V8 to V12 for oak-blob-azure - rework - Sonar fixes Ai-Assisted-By: claude * OAK-12219: Upgrade Azure SDK V8 to V12 for oak-blob-azure - rework - pin jackson version to the one in AEM to prevent transitive dep download. Ai-Assisted-By: claude * OAK-12219: fix Sonar annotations from PR #2989 CI run AzureBlobStoreBackendV12: - RuntimeException -> IllegalStateException in getMetadataRecord/getAllMetadataRecords/deleteAllMetadataRecords - chain DataStoreException (not unwrapped IOException cause) in write() catch block - .collect(Collectors.toList()) -> .toList() in commitBlocksAndGetSize - instanceof pattern matching for BlobStorageException in completeHttpUpload - nested ternary -> if-else for operation string in presigned URI error log - return new byte[0] instead of null in readMetadataBytes; update caller check RegressionCSOV8Test: - swap assertEquals args to (actual, expected) order per Sonar S3415 Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> Ai-Assisted-By: claude-code * OAK-12219: raise unit-test coverage on new V12 code to clear Sonar gate PR #2989 failed the quality gate at 67.9% coverage on new code (need 80%). The Azure ITs that cover blob CRUD don't run in CI, so the new V12 classes were largely uncovered. Add mock-based unit tests (Mockito mocks the Azure BlobContainerClient/BlockBlobClient chain) so the SDK-call paths are covered without a live Azurite endpoint. New/expanded tests: - AzureBlobStoreBackendV12MockTest (new): read/getRecord/exists/deleteRecord success + 404 + storage-error paths; metadata get/exists/delete; init() config parsing (concurrent-request clamping, secondary location, presigned URI config); getAllIdentifiers/getAllRecords meta+no-dash filtering; getAllMetadataRecords success; write exists/missing/length-collision; addMetadataRecord(File); initiateHttpUpload arg validation; data record getters - AzureHttpRequestLoggingPolicyV12Test (new): verbose on/off process() paths - AzureDataStoreWrapperTest: createDataStore v8/v12, getDescription, init delegation, 3-arg upload, statistics provider getter/setter - AzureBlobContainerProviderV12Test: service-principal credential branch, getEndpointUrl variants Blended new-code coverage (line+branch) on the new files now ~82% locally. Also make getOrCreateReferenceKey tolerate a null from a readMetadataBytes override (production returns empty array; test subclasses may return null). Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> Ai-Assisted-By: claude * Oak 12219 upgrade azure sdk v8 to v12 for oak blob azure rework (#2992) * OAK-12219: Upgrade Azure SDK V8 to V12 for oak-blob-azure - rework - fix blob upload/download related constants that control memory and streaming behavior Ai-Assisted-By: claude * OAK-12219: Upgrade Azure SDK V8 to V12 for oak-blob-azure - rework - fix blob block size, prevent size zero Ai-Assisted-By: claude * OAK-12219: Upgrade Azure SDK V8 to V12 for oak-blob-azure - rework - removed oak-run-commons dependency on azure sdk v8 from oak-blob-cloud-azure Ai-Assisted-By: claude * OAK-12219: Upgrade Azure SDK V8 to V12 for oak-blob-azure - rework - cached the UserDelegationKey to avoid repeated calls to get it from Azure for every URI. Ai-Assisted-By: claude * Oak 12219 upgrade azure sdk v8 to v12 for oak blob azure rework (#2994) * OAK-12219: Upgrade Azure SDK V8 to V12 for oak-blob-azure - rework - fix blob upload/download related constants that control memory and streaming behavior Ai-Assisted-By: claude Ai-Assisted-By: claude-code * OAK-12219: Upgrade Azure SDK V8 to V12 for oak-blob-azure - rework - fix blob block size, prevent size zero Ai-Assisted-By: claude Ai-Assisted-By: claude-code * OAK-12219: Upgrade Azure SDK V8 to V12 for oak-blob-azure - rework - fixed automated code review findings Ai-Assisted-By: claude-code * OAK-12219: Upgrade Azure SDK V8 to V12 for oak-blob-azure - rework - PropertiesUtil.populate() uses reflection to inject config properties (e.g. cacheSize) into the DataStore returned by createDataStore(). When the class is package-private, Java's reflection access control blocks it because the caller is in a different package — even if the individual setter methods are public. Making the class itself public fixes that Ai-Assisted-By: claude Ai-Assisted-By: claude-code * OAK-12219: Upgrade Azure SDK V8 to V12 for oak-blob-azure - rework - fix blob upload/download related constants that control memory and streaming behavior Ai-Assisted-By: claude Ai-Assisted-By: claude-code * OAK-12219: Upgrade Azure SDK V8 to V12 for oak-blob-azure - rework - fix blob block size, prevent size zero Ai-Assisted-By: claude Ai-Assisted-By: claude-code * Remove internal service reference from comment Drop 'e.g. oak-repository-service' — internal detail, not relevant to Apache OSS. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com> Ai-Assisted-By: claude-code * OAK-12219: cache HttpClient in AzureBlobContainerProviderV12 Build the Netty HTTP client once at construction instead of on every getBlobContainer() call. Also drops dead Properties threading and duplicate proxy/connection-string overloads in UtilsV12. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com> Ai-Assisted-By: claude-code * OAK-12219: replace wildcard imports with explicit imports Ai-Assisted-By: claude-code * OAK-12219: move retryOptions into provider, drop getBlobContainerFromServicePrincipals retryOptions is now a field built at construction instead of passed per-call. Service-principal auth reuses the cached BlobServiceClient instead of rebuilding a client on every call. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com> Ai-Assisted-By: claude-code * OAK-12219: address remaining PR #2982 review comments Use SystemPropertySupplier for the JVM-property override (reschke), rename registerService to registerDataStoreService (joerghoh), and match the suggested "falling back to v8" log wording. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com> Ai-Assisted-By: claude,claude-code Ai-Assisted-By: claude-code * OAK-12219: Upgrade Azure SDK V8 to V12 for oak-blob-azure - rework - fixed comments from #2982 * OAK-12219: Upgrade Azure SDK V8 to V12 for oak-blob-azure - rework - fixed comments from #2989 --------- Co-authored-by: Julian Reschke <julian.reschke@gmx.de> Co-authored-by: Rishabh Kumar <rishabhdaim1991@gmail.com> Co-authored-by: Julian Reschke <reschke@apache.org> Co-authored-by: Thomas Mueller <thomasm@apache.org> Co-authored-by: Benjamin Habegger <bhabegger@adobe.com> Co-authored-by: Patrique Legault <patrique.legault@gmail.com> Co-authored-by: patlego <patriquelegault@gmail.com> Co-authored-by: Jose Antonio Insua <ungoliant@gmail.com>
* OAK-12287: Update to Apache Parent POM to version 39 * OAK-12287: Update to Apache Parent POM to version 39 - revert removal of bundle-plugin version * OAK-12289 : disabled blob id tracking for document node store (#2987) * OAK-12289 : disabled blob id tracking for document node store * OAK-12289 : fixed test case * OAK-12259: oak-http: OakServlet mis-parses HTTP Basic credentials * OAK-12293 : bump commons-io to 2.21.0 (#2997) * OAK-12293 : bump commons-io to 2.22.0 * OAK-12293 : bump commons-io to 2.21.0 * OAK-12294 : bump commons-codec to 1.20.0 (#2998) * OAK-12295 : bump mongo-driver-sync to 5.3.1 (#3001) * OAK-12295 : bump mongo-driver-sync to 5.3.1 * OAK-12295 : fixed the compilation issues * OAK-12296 : bump testcontainers version to 2.0.3 (#3002) * OAK-12296 : bump testcontainers version to 2.0.3 * OAK-12296 : fixed the junit 4 compatibility issues * OAK-12296 : fixed compatibulity issues with Junit 4 * OAK-12296 : fixed compatibulity issues with ES tests * OAK-12296 : incorporated review comments to use withEnv override for ElasticTestServer * OAK-12244: index nodes that gain a mixin rule, delete stale docs when… (#2949) * OAK-12244: index nodes that gain a mixin rule, delete stale docs when mixin rule is lost (#2938) When an existing node's applicable indexing rule changes at runtime (e.g. jcr:mixinTypes added or removed), FulltextIndexEditor did not update the index because propertiesChanged was never set — jcr:mixinTypes is not normally listed in a rule's property definitions. Track wasIndexable (rule matched before) alongside isIndexable() (rule matches after). In leave(), act on transitions: - !wasIndexable && isIndexable(): node gained a rule → addOrUpdate - wasIndexable && !isIndexable(): node lost a rule → deleteDocuments Tests added: - PropertyIndexCommonTest: two end-to-end integration tests (all backends) - LuceneIndexEditor2Test: two unit tests verifying writer.docs / writer.deletedPaths * OAK-12244: fix mixin type changes not reflected in fulltext index (#2953) Root cause: when a node gains or loses a mixin type at runtime, FulltextIndexEditor did not update the index because propertiesChanged was never set — jcr:mixinTypes is not normally listed in a rule's property definitions. Fix: track wasIndexable (rule matched before) alongside isIndexable() (rule matches after). In leave(), act on the indexing-rule transition: - !wasIndexable && isIndexable(): node gained a rule → addOrUpdate - wasIndexable && !isIndexable(): node lost a rule → deleteDocument Split FulltextIndexWriter into two explicit operations: - deleteDocumentTree(path): node physically removed; cascade is correct - deleteDocument(path): node lost indexability at runtime; exact only The original deleteDocuments used a PrefixQuery that cascaded to all descendants; in the mixin-loss branch this was a bug — children carrying their own mixin types were incorrectly evicted from the index. Additional changes: - Snapshot FT_OAK_12244_DISABLE once per commit cycle in FulltextIndexEditorContext as typeChangeTrackingEnabled so enter() and leave() always agree - Skip getApplicableIndexingRule(before) on the hot path via hasNodeTypeChange guard when neither jcr:primaryType nor jcr:mixinTypes changed - Register FT_OAK_12244 toggle in ElasticIndexProviderService - Reuse CommitFailedException code 5 for the deleteDocument error path Tests: - PropertyIndexCommonTest: end-to-end integration tests (all backends) - LuceneIndexEditor2Test: unit tests verifying writer.docs / writer.deletedPaths - Verified: 1245 tests, 0 failures in oak-lucene --------- Co-authored-by: Benjamin Habegger <bhabegger@adobe.com> * OAK-12282 : defining a fixed bound for the AbstractDiskCache (#2978) * OAK-12282 defining a fixed bound for the AbstractDiskCache --------- Co-authored-by: patlego <patriquelegault@gmail.com> * OAK-12303: Update mina-core dependency version to 2.1.15 (#3008) (#3010) ack @telegrapher Co-authored-by: Jose Antonio Insua <ungoliant@gmail.com> * Revert "OAK-12295 : bump mongo-driver-sync to 5.3.1 (#3001)" (#3012) This reverts commit 480eb14. * OAK-12219: Upgrade Azure SDK V8 to V12 for oak-blob-azure - rework Ai-Assisted-By: claude * OAK-12219: Upgrade Azure SDK V8 to V12 for oak-blob-azure - rework - Sonar fixes Ai-Assisted-By: claude * OAK-12219: Upgrade Azure SDK V8 to V12 for oak-blob-azure - rework - Sonar fixes Ai-Assisted-By: claude * OAK-12219: Upgrade Azure SDK V8 to V12 for oak-blob-azure - rework - pin jackson version to the one in AEM to prevent transitive dep download. Ai-Assisted-By: claude * OAK-12219: fix Sonar annotations from PR #2989 CI run AzureBlobStoreBackendV12: - RuntimeException -> IllegalStateException in getMetadataRecord/getAllMetadataRecords/deleteAllMetadataRecords - chain DataStoreException (not unwrapped IOException cause) in write() catch block - .collect(Collectors.toList()) -> .toList() in commitBlocksAndGetSize - instanceof pattern matching for BlobStorageException in completeHttpUpload - nested ternary -> if-else for operation string in presigned URI error log - return new byte[0] instead of null in readMetadataBytes; update caller check RegressionCSOV8Test: - swap assertEquals args to (actual, expected) order per Sonar S3415 Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> Ai-Assisted-By: claude-code * OAK-12219: raise unit-test coverage on new V12 code to clear Sonar gate PR #2989 failed the quality gate at 67.9% coverage on new code (need 80%). The Azure ITs that cover blob CRUD don't run in CI, so the new V12 classes were largely uncovered. Add mock-based unit tests (Mockito mocks the Azure BlobContainerClient/BlockBlobClient chain) so the SDK-call paths are covered without a live Azurite endpoint. New/expanded tests: - AzureBlobStoreBackendV12MockTest (new): read/getRecord/exists/deleteRecord success + 404 + storage-error paths; metadata get/exists/delete; init() config parsing (concurrent-request clamping, secondary location, presigned URI config); getAllIdentifiers/getAllRecords meta+no-dash filtering; getAllMetadataRecords success; write exists/missing/length-collision; addMetadataRecord(File); initiateHttpUpload arg validation; data record getters - AzureHttpRequestLoggingPolicyV12Test (new): verbose on/off process() paths - AzureDataStoreWrapperTest: createDataStore v8/v12, getDescription, init delegation, 3-arg upload, statistics provider getter/setter - AzureBlobContainerProviderV12Test: service-principal credential branch, getEndpointUrl variants Blended new-code coverage (line+branch) on the new files now ~82% locally. Also make getOrCreateReferenceKey tolerate a null from a readMetadataBytes override (production returns empty array; test subclasses may return null). Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> Ai-Assisted-By: claude * Oak 12219 upgrade azure sdk v8 to v12 for oak blob azure rework (#2992) * OAK-12219: Upgrade Azure SDK V8 to V12 for oak-blob-azure - rework - fix blob upload/download related constants that control memory and streaming behavior Ai-Assisted-By: claude * OAK-12219: Upgrade Azure SDK V8 to V12 for oak-blob-azure - rework - fix blob block size, prevent size zero Ai-Assisted-By: claude * OAK-12219: Upgrade Azure SDK V8 to V12 for oak-blob-azure - rework - removed oak-run-commons dependency on azure sdk v8 from oak-blob-cloud-azure Ai-Assisted-By: claude * OAK-12219: Upgrade Azure SDK V8 to V12 for oak-blob-azure - rework - cached the UserDelegationKey to avoid repeated calls to get it from Azure for every URI. Ai-Assisted-By: claude * Oak 12219 upgrade azure sdk v8 to v12 for oak blob azure rework (#2994) * OAK-12219: Upgrade Azure SDK V8 to V12 for oak-blob-azure - rework - fix blob upload/download related constants that control memory and streaming behavior Ai-Assisted-By: claude Ai-Assisted-By: claude-code * OAK-12219: Upgrade Azure SDK V8 to V12 for oak-blob-azure - rework - fix blob block size, prevent size zero Ai-Assisted-By: claude Ai-Assisted-By: claude-code * OAK-12219: Upgrade Azure SDK V8 to V12 for oak-blob-azure - rework - fixed automated code review findings Ai-Assisted-By: claude-code * OAK-12219: Upgrade Azure SDK V8 to V12 for oak-blob-azure - rework - PropertiesUtil.populate() uses reflection to inject config properties (e.g. cacheSize) into the DataStore returned by createDataStore(). When the class is package-private, Java's reflection access control blocks it because the caller is in a different package — even if the individual setter methods are public. Making the class itself public fixes that Ai-Assisted-By: claude Ai-Assisted-By: claude-code * OAK-12219: Upgrade Azure SDK V8 to V12 for oak-blob-azure - rework - fix blob upload/download related constants that control memory and streaming behavior Ai-Assisted-By: claude Ai-Assisted-By: claude-code * OAK-12219: Upgrade Azure SDK V8 to V12 for oak-blob-azure - rework - fix blob block size, prevent size zero Ai-Assisted-By: claude Ai-Assisted-By: claude-code * Remove internal service reference from comment Drop 'e.g. oak-repository-service' — internal detail, not relevant to Apache OSS. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com> Ai-Assisted-By: claude-code * OAK-12219: cache HttpClient in AzureBlobContainerProviderV12 Build the Netty HTTP client once at construction instead of on every getBlobContainer() call. Also drops dead Properties threading and duplicate proxy/connection-string overloads in UtilsV12. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com> Ai-Assisted-By: claude-code * OAK-12219: replace wildcard imports with explicit imports Ai-Assisted-By: claude-code * OAK-12219: move retryOptions into provider, drop getBlobContainerFromServicePrincipals retryOptions is now a field built at construction instead of passed per-call. Service-principal auth reuses the cached BlobServiceClient instead of rebuilding a client on every call. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com> Ai-Assisted-By: claude-code * OAK-12219: address remaining PR #2982 review comments Use SystemPropertySupplier for the JVM-property override (reschke), rename registerService to registerDataStoreService (joerghoh), and match the suggested "falling back to v8" log wording. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com> Ai-Assisted-By: claude,claude-code Ai-Assisted-By: claude-code * OAK-12219: Upgrade Azure SDK V8 to V12 for oak-blob-azure - rework - fixed comments from #2982 * OAK-12219: Upgrade Azure SDK V8 to V12 for oak-blob-azure - rework - fixed comments from #2989 * OAK-12219: Upgrade Azure SDK V8 to V12 for oak-blob-azure - rework - fixed compilation fail because of misplaced comment --------- Co-authored-by: Julian Reschke <julian.reschke@gmx.de> Co-authored-by: Rishabh Kumar <rishabhdaim1991@gmail.com> Co-authored-by: Julian Reschke <reschke@apache.org> Co-authored-by: Thomas Mueller <thomasm@apache.org> Co-authored-by: Benjamin Habegger <bhabegger@adobe.com> Co-authored-by: Patrique Legault <patrique.legault@gmail.com> Co-authored-by: patlego <patriquelegault@gmail.com> Co-authored-by: Jose Antonio Insua <ungoliant@gmail.com>
* OAK-12287: Update to Apache Parent POM to version 39 * OAK-12287: Update to Apache Parent POM to version 39 - revert removal of bundle-plugin version * OAK-12289 : disabled blob id tracking for document node store (#2987) * OAK-12289 : disabled blob id tracking for document node store * OAK-12289 : fixed test case * OAK-12259: oak-http: OakServlet mis-parses HTTP Basic credentials * OAK-12293 : bump commons-io to 2.21.0 (#2997) * OAK-12293 : bump commons-io to 2.22.0 * OAK-12293 : bump commons-io to 2.21.0 * OAK-12294 : bump commons-codec to 1.20.0 (#2998) * OAK-12295 : bump mongo-driver-sync to 5.3.1 (#3001) * OAK-12295 : bump mongo-driver-sync to 5.3.1 * OAK-12295 : fixed the compilation issues * OAK-12296 : bump testcontainers version to 2.0.3 (#3002) * OAK-12296 : bump testcontainers version to 2.0.3 * OAK-12296 : fixed the junit 4 compatibility issues * OAK-12296 : fixed compatibulity issues with Junit 4 * OAK-12296 : fixed compatibulity issues with ES tests * OAK-12296 : incorporated review comments to use withEnv override for ElasticTestServer * OAK-12244: index nodes that gain a mixin rule, delete stale docs when… (#2949) * OAK-12244: index nodes that gain a mixin rule, delete stale docs when mixin rule is lost (#2938) When an existing node's applicable indexing rule changes at runtime (e.g. jcr:mixinTypes added or removed), FulltextIndexEditor did not update the index because propertiesChanged was never set — jcr:mixinTypes is not normally listed in a rule's property definitions. Track wasIndexable (rule matched before) alongside isIndexable() (rule matches after). In leave(), act on transitions: - !wasIndexable && isIndexable(): node gained a rule → addOrUpdate - wasIndexable && !isIndexable(): node lost a rule → deleteDocuments Tests added: - PropertyIndexCommonTest: two end-to-end integration tests (all backends) - LuceneIndexEditor2Test: two unit tests verifying writer.docs / writer.deletedPaths * OAK-12244: fix mixin type changes not reflected in fulltext index (#2953) Root cause: when a node gains or loses a mixin type at runtime, FulltextIndexEditor did not update the index because propertiesChanged was never set — jcr:mixinTypes is not normally listed in a rule's property definitions. Fix: track wasIndexable (rule matched before) alongside isIndexable() (rule matches after). In leave(), act on the indexing-rule transition: - !wasIndexable && isIndexable(): node gained a rule → addOrUpdate - wasIndexable && !isIndexable(): node lost a rule → deleteDocument Split FulltextIndexWriter into two explicit operations: - deleteDocumentTree(path): node physically removed; cascade is correct - deleteDocument(path): node lost indexability at runtime; exact only The original deleteDocuments used a PrefixQuery that cascaded to all descendants; in the mixin-loss branch this was a bug — children carrying their own mixin types were incorrectly evicted from the index. Additional changes: - Snapshot FT_OAK_12244_DISABLE once per commit cycle in FulltextIndexEditorContext as typeChangeTrackingEnabled so enter() and leave() always agree - Skip getApplicableIndexingRule(before) on the hot path via hasNodeTypeChange guard when neither jcr:primaryType nor jcr:mixinTypes changed - Register FT_OAK_12244 toggle in ElasticIndexProviderService - Reuse CommitFailedException code 5 for the deleteDocument error path Tests: - PropertyIndexCommonTest: end-to-end integration tests (all backends) - LuceneIndexEditor2Test: unit tests verifying writer.docs / writer.deletedPaths - Verified: 1245 tests, 0 failures in oak-lucene --------- Co-authored-by: Benjamin Habegger <bhabegger@adobe.com> * OAK-12282 : defining a fixed bound for the AbstractDiskCache (#2978) * OAK-12282 defining a fixed bound for the AbstractDiskCache --------- Co-authored-by: patlego <patriquelegault@gmail.com> * OAK-12303: Update mina-core dependency version to 2.1.15 (#3008) (#3010) ack @telegrapher Co-authored-by: Jose Antonio Insua <ungoliant@gmail.com> * Revert "OAK-12295 : bump mongo-driver-sync to 5.3.1 (#3001)" (#3012) This reverts commit 480eb14. * OAK-12219: Upgrade Azure SDK V8 to V12 for oak-blob-azure - rework Ai-Assisted-By: claude * OAK-12219: Upgrade Azure SDK V8 to V12 for oak-blob-azure - rework - Sonar fixes Ai-Assisted-By: claude * OAK-12219: Upgrade Azure SDK V8 to V12 for oak-blob-azure - rework - Sonar fixes Ai-Assisted-By: claude * OAK-12219: Upgrade Azure SDK V8 to V12 for oak-blob-azure - rework - pin jackson version to the one in AEM to prevent transitive dep download. Ai-Assisted-By: claude * OAK-12219: fix Sonar annotations from PR #2989 CI run AzureBlobStoreBackendV12: - RuntimeException -> IllegalStateException in getMetadataRecord/getAllMetadataRecords/deleteAllMetadataRecords - chain DataStoreException (not unwrapped IOException cause) in write() catch block - .collect(Collectors.toList()) -> .toList() in commitBlocksAndGetSize - instanceof pattern matching for BlobStorageException in completeHttpUpload - nested ternary -> if-else for operation string in presigned URI error log - return new byte[0] instead of null in readMetadataBytes; update caller check RegressionCSOV8Test: - swap assertEquals args to (actual, expected) order per Sonar S3415 Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> Ai-Assisted-By: claude-code * OAK-12219: raise unit-test coverage on new V12 code to clear Sonar gate PR #2989 failed the quality gate at 67.9% coverage on new code (need 80%). The Azure ITs that cover blob CRUD don't run in CI, so the new V12 classes were largely uncovered. Add mock-based unit tests (Mockito mocks the Azure BlobContainerClient/BlockBlobClient chain) so the SDK-call paths are covered without a live Azurite endpoint. New/expanded tests: - AzureBlobStoreBackendV12MockTest (new): read/getRecord/exists/deleteRecord success + 404 + storage-error paths; metadata get/exists/delete; init() config parsing (concurrent-request clamping, secondary location, presigned URI config); getAllIdentifiers/getAllRecords meta+no-dash filtering; getAllMetadataRecords success; write exists/missing/length-collision; addMetadataRecord(File); initiateHttpUpload arg validation; data record getters - AzureHttpRequestLoggingPolicyV12Test (new): verbose on/off process() paths - AzureDataStoreWrapperTest: createDataStore v8/v12, getDescription, init delegation, 3-arg upload, statistics provider getter/setter - AzureBlobContainerProviderV12Test: service-principal credential branch, getEndpointUrl variants Blended new-code coverage (line+branch) on the new files now ~82% locally. Also make getOrCreateReferenceKey tolerate a null from a readMetadataBytes override (production returns empty array; test subclasses may return null). Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> Ai-Assisted-By: claude * Oak 12219 upgrade azure sdk v8 to v12 for oak blob azure rework (#2992) * OAK-12219: Upgrade Azure SDK V8 to V12 for oak-blob-azure - rework - fix blob upload/download related constants that control memory and streaming behavior Ai-Assisted-By: claude * OAK-12219: Upgrade Azure SDK V8 to V12 for oak-blob-azure - rework - fix blob block size, prevent size zero Ai-Assisted-By: claude * OAK-12219: Upgrade Azure SDK V8 to V12 for oak-blob-azure - rework - removed oak-run-commons dependency on azure sdk v8 from oak-blob-cloud-azure Ai-Assisted-By: claude * OAK-12219: Upgrade Azure SDK V8 to V12 for oak-blob-azure - rework - cached the UserDelegationKey to avoid repeated calls to get it from Azure for every URI. Ai-Assisted-By: claude * Oak 12219 upgrade azure sdk v8 to v12 for oak blob azure rework (#2994) * OAK-12219: Upgrade Azure SDK V8 to V12 for oak-blob-azure - rework - fix blob upload/download related constants that control memory and streaming behavior Ai-Assisted-By: claude Ai-Assisted-By: claude-code * OAK-12219: Upgrade Azure SDK V8 to V12 for oak-blob-azure - rework - fix blob block size, prevent size zero Ai-Assisted-By: claude Ai-Assisted-By: claude-code * OAK-12219: Upgrade Azure SDK V8 to V12 for oak-blob-azure - rework - fixed automated code review findings Ai-Assisted-By: claude-code * OAK-12219: Upgrade Azure SDK V8 to V12 for oak-blob-azure - rework - PropertiesUtil.populate() uses reflection to inject config properties (e.g. cacheSize) into the DataStore returned by createDataStore(). When the class is package-private, Java's reflection access control blocks it because the caller is in a different package — even if the individual setter methods are public. Making the class itself public fixes that Ai-Assisted-By: claude Ai-Assisted-By: claude-code * OAK-12219: Upgrade Azure SDK V8 to V12 for oak-blob-azure - rework - fix blob upload/download related constants that control memory and streaming behavior Ai-Assisted-By: claude Ai-Assisted-By: claude-code * OAK-12219: Upgrade Azure SDK V8 to V12 for oak-blob-azure - rework - fix blob block size, prevent size zero Ai-Assisted-By: claude Ai-Assisted-By: claude-code * Remove internal service reference from comment Drop 'e.g. oak-repository-service' — internal detail, not relevant to Apache OSS. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com> Ai-Assisted-By: claude-code * OAK-12219: cache HttpClient in AzureBlobContainerProviderV12 Build the Netty HTTP client once at construction instead of on every getBlobContainer() call. Also drops dead Properties threading and duplicate proxy/connection-string overloads in UtilsV12. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com> Ai-Assisted-By: claude-code * OAK-12219: replace wildcard imports with explicit imports Ai-Assisted-By: claude-code * OAK-12219: move retryOptions into provider, drop getBlobContainerFromServicePrincipals retryOptions is now a field built at construction instead of passed per-call. Service-principal auth reuses the cached BlobServiceClient instead of rebuilding a client on every call. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com> Ai-Assisted-By: claude-code * OAK-12219: address remaining PR #2982 review comments Use SystemPropertySupplier for the JVM-property override (reschke), rename registerService to registerDataStoreService (joerghoh), and match the suggested "falling back to v8" log wording. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com> Ai-Assisted-By: claude,claude-code Ai-Assisted-By: claude-code * OAK-12219: Upgrade Azure SDK V8 to V12 for oak-blob-azure - rework - fixed comments from #2982 * OAK-12219: Upgrade Azure SDK V8 to V12 for oak-blob-azure - rework - fixed comments from #2989 * OAK-12219: Upgrade Azure SDK V8 to V12 for oak-blob-azure - rework - fixed compilation fail because of misplaced comment * OAK-12219: Upgrade Azure SDK V8 to V12 for oak-blob-azure - rework - fixed test Ai-Assisted-By: claude --------- Co-authored-by: Julian Reschke <julian.reschke@gmx.de> Co-authored-by: Rishabh Kumar <rishabhdaim1991@gmail.com> Co-authored-by: Julian Reschke <reschke@apache.org> Co-authored-by: Thomas Mueller <thomasm@apache.org> Co-authored-by: Benjamin Habegger <bhabegger@adobe.com> Co-authored-by: Patrique Legault <patrique.legault@gmail.com> Co-authored-by: patlego <patriquelegault@gmail.com> Co-authored-by: Jose Antonio Insua <ungoliant@gmail.com>
The AbstractPersistentCache is unbound leading to OOM exceptions.