This is an automated email from the ASF dual-hosted git repository.
markap14 pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/nifi.git
The following commit(s) were added to refs/heads/main by this push:
new 8612c67a1c0 NIFI-15991 - Flaky test
TestFileSystemRepository.testClaimsArchivedWhenMarkedDestructable (#11305)
8612c67a1c0 is described below
commit 8612c67a1c0ab88c02f820d700ad505f64d80701
Author: Pierre Villard <[email protected]>
AuthorDate: Thu Jun 11 08:42:43 2026 -0600
NIFI-15991 - Flaky test
TestFileSystemRepository.testClaimsArchivedWhenMarkedDestructable (#11305)
---
.../repository/TestFileSystemRepository.java | 67 ++++++++++++++++------
1 file changed, 49 insertions(+), 18 deletions(-)
diff --git
a/nifi-framework-bundle/nifi-framework/nifi-framework-core/src/test/java/org/apache/nifi/controller/repository/TestFileSystemRepository.java
b/nifi-framework-bundle/nifi-framework/nifi-framework-core/src/test/java/org/apache/nifi/controller/repository/TestFileSystemRepository.java
index 12e0e57e616..b9ed4bf9c0f 100644
---
a/nifi-framework-bundle/nifi-framework/nifi-framework-core/src/test/java/org/apache/nifi/controller/repository/TestFileSystemRepository.java
+++
b/nifi-framework-bundle/nifi-framework/nifi-framework-core/src/test/java/org/apache/nifi/controller/repository/TestFileSystemRepository.java
@@ -68,6 +68,7 @@ import static org.junit.jupiter.api.Assertions.assertNotNull;
import static org.junit.jupiter.api.Assertions.assertNotSame;
import static org.junit.jupiter.api.Assertions.assertThrows;
import static org.junit.jupiter.api.Assertions.assertTrue;
+import static org.junit.jupiter.api.Assertions.fail;
public class TestFileSystemRepository {
@@ -154,28 +155,58 @@ public class TestFileSystemRepository {
@Test
@Timeout(30)
public void testClaimsArchivedWhenMarkedDestructable() throws IOException,
InterruptedException {
- final ContentClaim contentClaim = repository.create(false);
- final Map<String, Path> containerPaths =
nifiProperties.getContentRepositoryPaths();
- assertEquals(1, containerPaths.size());
- final String containerName = containerPaths.keySet().iterator().next();
-
- try (final OutputStream out = repository.write(contentClaim)) {
- long bytesWritten = 0L;
- final byte[] bytes = "Hello
World".getBytes(StandardCharsets.UTF_8);
+ // Release the repository created during setup and use one that
reports no disk pressure. Otherwise, on a
+ // host whose content repository partition is nearly full, the
background archive cleanup task can reclaim
+ // the freshly archived claim before this test observes it, leaving
the archive count oscillating at 0.
+ shutdown();
- while (bytesWritten <= maxClaimLength) {
- out.write(bytes);
- bytesWritten += bytes.length;
+ final FileSystemRepository localRepository = new
FileSystemRepository(nifiProperties) {
+ @Override
+ public long getContainerUsableSpace(final String containerName) {
+ return Long.MAX_VALUE;
}
- }
+ };
+
+ try {
+ final StandardResourceClaimManager localClaimManager = new
StandardResourceClaimManager();
+ localRepository.initialize(new
StandardContentRepositoryContext(localClaimManager, EventReporter.NO_OP));
+ localRepository.purge();
- assertEquals(0, repository.getArchiveCount(containerName));
- assertEquals(0,
claimManager.decrementClaimantCount(contentClaim.getResourceClaim()));
- claimManager.markDestructable(contentClaim.getResourceClaim());
+ final ContentClaim contentClaim = localRepository.create(false);
+ final Map<String, Path> containerPaths =
nifiProperties.getContentRepositoryPaths();
+ assertEquals(1, containerPaths.size());
+ final String containerName =
containerPaths.keySet().iterator().next();
+
+ try (final OutputStream out = localRepository.write(contentClaim))
{
+ long bytesWritten = 0L;
+ final byte[] bytes = "Hello
World".getBytes(StandardCharsets.UTF_8);
+
+ while (bytesWritten <= maxClaimLength) {
+ out.write(bytes);
+ bytesWritten += bytes.length;
+ }
+ }
- // The claim should become archived but it may take a few seconds, as
it's handled by background threads
- while (repository.getArchiveCount(containerName) != 1) {
- Thread.sleep(50L);
+ assertEquals(0, localRepository.getArchiveCount(containerName));
+ assertEquals(0,
localClaimManager.decrementClaimantCount(contentClaim.getResourceClaim()));
+
localClaimManager.markDestructable(contentClaim.getResourceClaim());
+
+ // The claim is archived by background threads, so poll until the
archive count reflects it. With disk
+ // pressure disabled the count remains at 1 once archived, so this
terminates reliably within a few seconds.
+ final long deadline = System.nanoTime() +
TimeUnit.SECONDS.toNanos(10);
+ while (localRepository.getArchiveCount(containerName) != 1) {
+ if (System.nanoTime() > deadline) {
+ final Path livePath = getPath(localRepository,
contentClaim);
+ final Path archivePath = livePath == null ? null :
FileSystemRepository.getArchivePath(livePath);
+ fail("Claim was not archived for container %s; archive
count is %d. Live path %s exists=%s, archive path %s exists=%s".formatted(
+ containerName,
localRepository.getArchiveCount(containerName),
+ livePath, livePath != null && Files.exists(livePath),
+ archivePath, archivePath != null &&
Files.exists(archivePath)));
+ }
+ Thread.sleep(50L);
+ }
+ } finally {
+ localRepository.shutdown();
}
}