Skip to content
Merged
Show file tree
Hide file tree
Changes from 10 commits
Commits
Show all changes
36 commits
Select commit Hold shift + click to select a range
d51d88f
Update torture test to ignore overflows (they're auto-handled)
sungshik Mar 10, 2025
671d5eb
Add `JDKFileTreeWatch`
sungshik Mar 10, 2025
62f4b1c
Move `updateChildWatches` to inner class
sungshik Mar 10, 2025
36c4299
Merge branch 'improved-overflow-support-main' into improved-overflow-…
sungshik Mar 11, 2025
47b8a10
Use `computeIfAbsent` instead of `putIfAbsent`
sungshik Mar 11, 2025
500e238
Update `JDKRecursiveDirectoryWatch`
sungshik Mar 11, 2025
6a328bf
Add import
sungshik Mar 11, 2025
4aed091
Improve code quality of `JDKFileTreeWatch`
sungshik Mar 12, 2025
71ac833
Improve code quality of `JDKFileTreeWatch`
sungshik Mar 12, 2025
fa65b30
Add mechanism to avoid relativization in `JDKFileTreeWatch`
sungshik Mar 12, 2025
fdd24f8
Simplify relativization of paths in `JDKFileTreeWatch`
sungshik Mar 14, 2025
3bdafe6
Change order of closing internal/child watches in `JDKFileTreeWatch`
sungshik Mar 14, 2025
4582d23
Simplify relativization of paths in `JDKFileTreeWatch`
sungshik Mar 14, 2025
6a7df86
Use file names to store child watches (instead of full paths)
sungshik Mar 14, 2025
e676b5f
Use `JDKFileTreeWatch`
sungshik Mar 14, 2025
387e7c3
Add asynchronous bookkeeping of `CREATED` and `OVERFLOW` events
sungshik Mar 14, 2025
748e8ac
Fix issue that `JDKFileTreeWatch` relied on overflow handling to pres…
sungshik Mar 18, 2025
4a1423b
Add license
sungshik Mar 18, 2025
1ab8f29
Make the child watches updater asynchronous
sungshik Mar 18, 2025
385db76
Add code to close child watches when their directories no longer exis…
sungshik Mar 18, 2025
58d9561
Remove `JDKRecursiveDirectoryWatch` (replaced by `JDKFileTreeWatch`)
sungshik Mar 25, 2025
c96c943
Add filtering mechanism to `Watcher` and `JDK...` classes
sungshik Mar 25, 2025
eca305b
Move method implementation from base class to subclass (was already o…
sungshik Mar 25, 2025
408c9d7
Improve logic to close `JDK...Watch` classes (avoid event handling o…
sungshik Mar 25, 2025
e0f039d
Fix a few relativization issues in `JDKFileTreeWatch` and `IndexingRe…
sungshik Mar 25, 2025
b8adb45
Add event filter to test
sungshik Mar 25, 2025
bbd1d39
Add test to check if overflows are recoverd from
sungshik Mar 25, 2025
02b10b7
Fix JavaDoc
sungshik Mar 25, 2025
76ec380
Remove old test
sungshik Mar 25, 2025
2cc3c66
Remove `trySleep` helpers
sungshik Mar 26, 2025
b760db9
Rename method to better convey intent
sungshik Mar 26, 2025
9b58bc4
Revert change to `relativize` in `JDKFileTreeWatch` (and add comment …
sungshik Mar 26, 2025
84b627b
Move closed check to `handleEvent`
sungshik Mar 26, 2025
e53569a
Add general `handleEvent` implementation back to the base watch
sungshik Mar 26, 2025
6feac60
Fix race in closing child watches
sungshik Mar 26, 2025
3f80e77
Merge branch 'improved-overflow-support-main' into improved-overflow-…
sungshik Mar 26, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 4 additions & 2 deletions src/main/java/engineering/swat/watch/Watcher.java
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,7 @@

import engineering.swat.watch.impl.EventHandlingWatch;
import engineering.swat.watch.impl.jdk.JDKDirectoryWatch;
import engineering.swat.watch.impl.jdk.JDKFileTreeWatch;
import engineering.swat.watch.impl.jdk.JDKFileWatch;
import engineering.swat.watch.impl.jdk.JDKRecursiveDirectoryWatch;
import engineering.swat.watch.impl.overflows.IndexingRescanner;
Expand Down Expand Up @@ -186,14 +187,15 @@ public ActiveWatch start() throws IOException {
}
case PATH_AND_ALL_DESCENDANTS: {
try {
var result = new JDKDirectoryWatch(path, executor, eventHandler, true);
var result = new JDKDirectoryWatch(path, executor, h, true);
result.open();
return result;
} catch (Throwable ex) {
// no native support, use the simulation
logger.debug("Not possible to register the native watcher, using fallback for {}", path);
logger.trace(ex);
var result = new JDKRecursiveDirectoryWatch(path, executor, eventHandler);
var result = new JDKRecursiveDirectoryWatch(path, executor, h);
// var result = new JDKFileTreeWatch(path, executor, h);
result.open();
return result;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -99,7 +99,7 @@ protected WatchEvent translate(java.nio.file.WatchEvent<?> jdkEvent) {
return event;
}

private WatchEvent.Kind translate(java.nio.file.WatchEvent.Kind<?> jdkKind) {
protected WatchEvent.Kind translate(java.nio.file.WatchEvent.Kind<?> jdkKind) {
if (jdkKind == StandardWatchEventKinds.ENTRY_CREATE) {
return WatchEvent.Kind.CREATED;
}
Expand Down
221 changes: 221 additions & 0 deletions src/main/java/engineering/swat/watch/impl/jdk/JDKFileTreeWatch.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,221 @@
/*
* BSD 2-Clause License
*
* Copyright (c) 2023, Swat.engineering
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* 1. Redistributions of source code must retain the above copyright notice, this
* list of conditions and the following disclaimer.
*
* 2. Redistributions in binary form must reproduce the above copyright notice,
* this list of conditions and the following disclaimer in the documentation
* and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
* SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
package engineering.swat.watch.impl.jdk;

import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.Executor;
import java.util.function.BiConsumer;
import java.util.function.Function;

import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;

import engineering.swat.watch.WatchEvent;
import engineering.swat.watch.WatchScope;
import engineering.swat.watch.impl.EventHandlingWatch;

public class JDKFileTreeWatch extends JDKBaseWatch {
private final Logger logger = LogManager.getLogger();

Check warning on line 46 in src/main/java/engineering/swat/watch/impl/jdk/JDKFileTreeWatch.java

View check run for this annotation

Codecov / codecov/patch

src/main/java/engineering/swat/watch/impl/jdk/JDKFileTreeWatch.java#L46

Added line #L46 was not covered by tests
private final Path rootPath;
private final Path relativePathParent;
private final Map<Path, JDKFileTreeWatch> childWatches = new ConcurrentHashMap<>();

Check warning on line 49 in src/main/java/engineering/swat/watch/impl/jdk/JDKFileTreeWatch.java

View check run for this annotation

Codecov / codecov/patch

src/main/java/engineering/swat/watch/impl/jdk/JDKFileTreeWatch.java#L49

Added line #L49 was not covered by tests
private final JDKBaseWatch internal;

public JDKFileTreeWatch(Path fullPath, Executor exec,
BiConsumer<EventHandlingWatch, WatchEvent> eventHandler) {
this(fullPath, Path.of(""), exec, eventHandler);
}

Check warning on line 55 in src/main/java/engineering/swat/watch/impl/jdk/JDKFileTreeWatch.java

View check run for this annotation

Codecov / codecov/patch

src/main/java/engineering/swat/watch/impl/jdk/JDKFileTreeWatch.java#L54-L55

Added lines #L54 - L55 were not covered by tests

public JDKFileTreeWatch(Path rootPath, Path relativePathParent, Executor exec,
BiConsumer<EventHandlingWatch, WatchEvent> eventHandler) {

super(rootPath.resolve(relativePathParent), exec, eventHandler);
this.rootPath = rootPath;
this.relativePathParent = relativePathParent;

Check warning on line 62 in src/main/java/engineering/swat/watch/impl/jdk/JDKFileTreeWatch.java

View check run for this annotation

Codecov / codecov/patch

src/main/java/engineering/swat/watch/impl/jdk/JDKFileTreeWatch.java#L60-L62

Added lines #L60 - L62 were not covered by tests

var internalEventHandler = eventHandler.andThen(new ChildWatchesUpdater());
this.internal = new JDKDirectoryWatch(path, exec, internalEventHandler) {

Check warning on line 65 in src/main/java/engineering/swat/watch/impl/jdk/JDKFileTreeWatch.java

View check run for this annotation

Codecov / codecov/patch

src/main/java/engineering/swat/watch/impl/jdk/JDKFileTreeWatch.java#L64-L65

Added lines #L64 - L65 were not covered by tests

// Override to ensure that this watch relativizes events wrt
// `rootPath` (instead of `path`, as is the default behavior)
@Override
public WatchEvent relativize(WatchEvent event) {
return new WatchEvent(event.getKind(), rootPath,
rootPath.relativize(event.calculateFullPath()));

Check warning on line 72 in src/main/java/engineering/swat/watch/impl/jdk/JDKFileTreeWatch.java

View check run for this annotation

Codecov / codecov/patch

src/main/java/engineering/swat/watch/impl/jdk/JDKFileTreeWatch.java#L71-L72

Added lines #L71 - L72 were not covered by tests
}

// Override to ensure that this watch translates JDK events using
// `rootPath` (instead of `path`, as is the default behavior).
// Events returned by this method do not need to be relativized.
@Override
protected WatchEvent translate(java.nio.file.WatchEvent<?> jdkEvent) {
var kind = translate(jdkEvent.kind());

Check warning on line 80 in src/main/java/engineering/swat/watch/impl/jdk/JDKFileTreeWatch.java

View check run for this annotation

Codecov / codecov/patch

src/main/java/engineering/swat/watch/impl/jdk/JDKFileTreeWatch.java#L80

Added line #L80 was not covered by tests

Path relativePath = null;

Check warning on line 82 in src/main/java/engineering/swat/watch/impl/jdk/JDKFileTreeWatch.java

View check run for this annotation

Codecov / codecov/patch

src/main/java/engineering/swat/watch/impl/jdk/JDKFileTreeWatch.java#L82

Added line #L82 was not covered by tests
if (kind != WatchEvent.Kind.OVERFLOW) {
var child = (Path) jdkEvent.context();

Check warning on line 84 in src/main/java/engineering/swat/watch/impl/jdk/JDKFileTreeWatch.java

View check run for this annotation

Codecov / codecov/patch

src/main/java/engineering/swat/watch/impl/jdk/JDKFileTreeWatch.java#L84

Added line #L84 was not covered by tests
if (child != null) {
relativePath = relativePathParent.resolve(child);

Check warning on line 86 in src/main/java/engineering/swat/watch/impl/jdk/JDKFileTreeWatch.java

View check run for this annotation

Codecov / codecov/patch

src/main/java/engineering/swat/watch/impl/jdk/JDKFileTreeWatch.java#L86

Added line #L86 was not covered by tests
}
}

var event = new WatchEvent(kind, rootPath, relativePath);
logger.trace("Translated: {} to {}", jdkEvent, event);
return event;

Check warning on line 92 in src/main/java/engineering/swat/watch/impl/jdk/JDKFileTreeWatch.java

View check run for this annotation

Codecov / codecov/patch

src/main/java/engineering/swat/watch/impl/jdk/JDKFileTreeWatch.java#L90-L92

Added lines #L90 - L92 were not covered by tests
}
};
}

Check warning on line 95 in src/main/java/engineering/swat/watch/impl/jdk/JDKFileTreeWatch.java

View check run for this annotation

Codecov / codecov/patch

src/main/java/engineering/swat/watch/impl/jdk/JDKFileTreeWatch.java#L95

Added line #L95 was not covered by tests

/**
* Event handler that updates the child watches according to the following
* rules: (a) when an overflow happens, it's propagated to each existing
* child watch; (b) when a subdirectory creation happens, a new child watch
* is opened for that subdirectory; (c) when a subdirectory deletion
* happens, an existing child watch is closed for that subdirectory.
*/
private class ChildWatchesUpdater implements BiConsumer<EventHandlingWatch, WatchEvent> {

Check warning on line 104 in src/main/java/engineering/swat/watch/impl/jdk/JDKFileTreeWatch.java

View check run for this annotation

Codecov / codecov/patch

src/main/java/engineering/swat/watch/impl/jdk/JDKFileTreeWatch.java#L104

Added line #L104 was not covered by tests
@Override
public void accept(EventHandlingWatch watch, WatchEvent event) {
switch (event.getKind()) {
case OVERFLOW: acceptOverflow(); break;
case CREATED: acceptCreated(event.calculateFullPath()); break;
case DELETED: acceptDeleted(event.calculateFullPath()); break;

Check warning on line 110 in src/main/java/engineering/swat/watch/impl/jdk/JDKFileTreeWatch.java

View check run for this annotation

Codecov / codecov/patch

src/main/java/engineering/swat/watch/impl/jdk/JDKFileTreeWatch.java#L108-L110

Added lines #L108 - L110 were not covered by tests
case MODIFIED: break;
}
}

Check warning on line 113 in src/main/java/engineering/swat/watch/impl/jdk/JDKFileTreeWatch.java

View check run for this annotation

Codecov / codecov/patch

src/main/java/engineering/swat/watch/impl/jdk/JDKFileTreeWatch.java#L113

Added line #L113 was not covered by tests

private void acceptOverflow() {
for (var childWatch : childWatches.values()) {
reportOverflowTo(childWatch);
}
}

Check warning on line 119 in src/main/java/engineering/swat/watch/impl/jdk/JDKFileTreeWatch.java

View check run for this annotation

Codecov / codecov/patch

src/main/java/engineering/swat/watch/impl/jdk/JDKFileTreeWatch.java#L117-L119

Added lines #L117 - L119 were not covered by tests

private void acceptCreated(Path fullPath) {
if (Files.isDirectory(fullPath)) {
var childWatch = openChildWatch(fullPath);

Check warning on line 123 in src/main/java/engineering/swat/watch/impl/jdk/JDKFileTreeWatch.java

View check run for this annotation

Codecov / codecov/patch

src/main/java/engineering/swat/watch/impl/jdk/JDKFileTreeWatch.java#L123

Added line #L123 was not covered by tests
// Events in the newly created directory might have been missed
// between its creation and setting up its watch. So, generate
// an `OVERFLOW` event for the watch.
reportOverflowTo(childWatch);

Check warning on line 127 in src/main/java/engineering/swat/watch/impl/jdk/JDKFileTreeWatch.java

View check run for this annotation

Codecov / codecov/patch

src/main/java/engineering/swat/watch/impl/jdk/JDKFileTreeWatch.java#L127

Added line #L127 was not covered by tests
}
}

Check warning on line 129 in src/main/java/engineering/swat/watch/impl/jdk/JDKFileTreeWatch.java

View check run for this annotation

Codecov / codecov/patch

src/main/java/engineering/swat/watch/impl/jdk/JDKFileTreeWatch.java#L129

Added line #L129 was not covered by tests

private void acceptDeleted(Path fullPath) {
try {
closeChildWatch(fullPath);
} catch (IOException e) {
logger.error("Could not close (nested) file tree watch for: {} ({})", fullPath, e);
}
}

Check warning on line 137 in src/main/java/engineering/swat/watch/impl/jdk/JDKFileTreeWatch.java

View check run for this annotation

Codecov / codecov/patch

src/main/java/engineering/swat/watch/impl/jdk/JDKFileTreeWatch.java#L133-L137

Added lines #L133 - L137 were not covered by tests

private void reportOverflowTo(JDKFileTreeWatch childWatch) {
var overflow = new WatchEvent(WatchEvent.Kind.OVERFLOW,

Check warning on line 140 in src/main/java/engineering/swat/watch/impl/jdk/JDKFileTreeWatch.java

View check run for this annotation

Codecov / codecov/patch

src/main/java/engineering/swat/watch/impl/jdk/JDKFileTreeWatch.java#L140

Added line #L140 was not covered by tests
childWatch.rootPath, childWatch.relativePathParent);
childWatch.handleEvent(overflow);
}

Check warning on line 143 in src/main/java/engineering/swat/watch/impl/jdk/JDKFileTreeWatch.java

View check run for this annotation

Codecov / codecov/patch

src/main/java/engineering/swat/watch/impl/jdk/JDKFileTreeWatch.java#L142-L143

Added lines #L142 - L143 were not covered by tests
}

private JDKFileTreeWatch openChildWatch(Path child) {
Function<Path, JDKFileTreeWatch> newChildWatch = p -> new JDKFileTreeWatch(
rootPath, rootPath.relativize(child), exec, eventHandler);

Check warning on line 148 in src/main/java/engineering/swat/watch/impl/jdk/JDKFileTreeWatch.java

View check run for this annotation

Codecov / codecov/patch

src/main/java/engineering/swat/watch/impl/jdk/JDKFileTreeWatch.java#L147-L148

Added lines #L147 - L148 were not covered by tests

var childWatch = childWatches.computeIfAbsent(child, newChildWatch);

Check warning on line 150 in src/main/java/engineering/swat/watch/impl/jdk/JDKFileTreeWatch.java

View check run for this annotation

Codecov / codecov/patch

src/main/java/engineering/swat/watch/impl/jdk/JDKFileTreeWatch.java#L150

Added line #L150 was not covered by tests
try {
childWatch.startIfFirstTime();
} catch (IOException e) {
logger.error("Could not open (nested) file tree watch for: {} ({})", child, e);
}
return childWatch;

Check warning on line 156 in src/main/java/engineering/swat/watch/impl/jdk/JDKFileTreeWatch.java

View check run for this annotation

Codecov / codecov/patch

src/main/java/engineering/swat/watch/impl/jdk/JDKFileTreeWatch.java#L152-L156

Added lines #L152 - L156 were not covered by tests
}

private void closeChildWatch(Path child) throws IOException {
var childWatch = childWatches.remove(child);

Check warning on line 160 in src/main/java/engineering/swat/watch/impl/jdk/JDKFileTreeWatch.java

View check run for this annotation

Codecov / codecov/patch

src/main/java/engineering/swat/watch/impl/jdk/JDKFileTreeWatch.java#L160

Added line #L160 was not covered by tests
if (childWatch != null) {
childWatch.close();

Check warning on line 162 in src/main/java/engineering/swat/watch/impl/jdk/JDKFileTreeWatch.java

View check run for this annotation

Codecov / codecov/patch

src/main/java/engineering/swat/watch/impl/jdk/JDKFileTreeWatch.java#L162

Added line #L162 was not covered by tests
}
}

Check warning on line 164 in src/main/java/engineering/swat/watch/impl/jdk/JDKFileTreeWatch.java

View check run for this annotation

Codecov / codecov/patch

src/main/java/engineering/swat/watch/impl/jdk/JDKFileTreeWatch.java#L164

Added line #L164 was not covered by tests

// -- JDKBaseWatch --

@Override
public WatchScope getScope() {
return WatchScope.PATH_AND_ALL_DESCENDANTS;

Check warning on line 170 in src/main/java/engineering/swat/watch/impl/jdk/JDKFileTreeWatch.java

View check run for this annotation

Codecov / codecov/patch

src/main/java/engineering/swat/watch/impl/jdk/JDKFileTreeWatch.java#L170

Added line #L170 was not covered by tests
}

@Override
public void handleEvent(WatchEvent event) {
internal.handleEvent(event);
}

Check warning on line 176 in src/main/java/engineering/swat/watch/impl/jdk/JDKFileTreeWatch.java

View check run for this annotation

Codecov / codecov/patch

src/main/java/engineering/swat/watch/impl/jdk/JDKFileTreeWatch.java#L175-L176

Added lines #L175 - L176 were not covered by tests

@Override
public synchronized void close() throws IOException {
IOException firstFail = null;
var children = childWatches.keySet().iterator();

Check warning on line 181 in src/main/java/engineering/swat/watch/impl/jdk/JDKFileTreeWatch.java

View check run for this annotation

Codecov / codecov/patch

src/main/java/engineering/swat/watch/impl/jdk/JDKFileTreeWatch.java#L180-L181

Added lines #L180 - L181 were not covered by tests
while (true) {
try {
// First, close all child watches
if (children.hasNext()) {
closeChildWatch(children.next());

Check warning on line 186 in src/main/java/engineering/swat/watch/impl/jdk/JDKFileTreeWatch.java

View check run for this annotation

Codecov / codecov/patch

src/main/java/engineering/swat/watch/impl/jdk/JDKFileTreeWatch.java#L186

Added line #L186 was not covered by tests
}
// Last, close the internal watch
else {
internal.close();
break;

Check warning on line 191 in src/main/java/engineering/swat/watch/impl/jdk/JDKFileTreeWatch.java

View check run for this annotation

Codecov / codecov/patch

src/main/java/engineering/swat/watch/impl/jdk/JDKFileTreeWatch.java#L190-L191

Added lines #L190 - L191 were not covered by tests
}
} catch (IOException ex) {
logger.error("Could not close watch", ex);

Check warning on line 194 in src/main/java/engineering/swat/watch/impl/jdk/JDKFileTreeWatch.java

View check run for this annotation

Codecov / codecov/patch

src/main/java/engineering/swat/watch/impl/jdk/JDKFileTreeWatch.java#L193-L194

Added lines #L193 - L194 were not covered by tests
firstFail = firstFail == null ? ex : firstFail;
} catch (Exception ex) {
logger.error("Could not close watch", ex);

Check warning on line 197 in src/main/java/engineering/swat/watch/impl/jdk/JDKFileTreeWatch.java

View check run for this annotation

Codecov / codecov/patch

src/main/java/engineering/swat/watch/impl/jdk/JDKFileTreeWatch.java#L196-L197

Added lines #L196 - L197 were not covered by tests
firstFail = firstFail == null ? new IOException("Unexpected exception when closing", ex) : firstFail;
}

Check warning on line 199 in src/main/java/engineering/swat/watch/impl/jdk/JDKFileTreeWatch.java

View check run for this annotation

Codecov / codecov/patch

src/main/java/engineering/swat/watch/impl/jdk/JDKFileTreeWatch.java#L199

Added line #L199 was not covered by tests
}
if (firstFail != null) {
throw firstFail;

Check warning on line 202 in src/main/java/engineering/swat/watch/impl/jdk/JDKFileTreeWatch.java

View check run for this annotation

Codecov / codecov/patch

src/main/java/engineering/swat/watch/impl/jdk/JDKFileTreeWatch.java#L202

Added line #L202 was not covered by tests
}
}

Check warning on line 204 in src/main/java/engineering/swat/watch/impl/jdk/JDKFileTreeWatch.java

View check run for this annotation

Codecov / codecov/patch

src/main/java/engineering/swat/watch/impl/jdk/JDKFileTreeWatch.java#L204

Added line #L204 was not covered by tests

@Override
protected synchronized void start() throws IOException {
internal.open();

Check warning on line 208 in src/main/java/engineering/swat/watch/impl/jdk/JDKFileTreeWatch.java

View check run for this annotation

Codecov / codecov/patch

src/main/java/engineering/swat/watch/impl/jdk/JDKFileTreeWatch.java#L208

Added line #L208 was not covered by tests
try (var children = Files.find(path, 1, (p, attrs) -> p != path && attrs.isDirectory())) {
children.forEach(this::openChildWatch);
} catch (IOException e) {
logger.error("File tree watch (for: {}) could not iterate over its children ({})", path, e);
}

Check warning on line 213 in src/main/java/engineering/swat/watch/impl/jdk/JDKFileTreeWatch.java

View check run for this annotation

Codecov / codecov/patch

src/main/java/engineering/swat/watch/impl/jdk/JDKFileTreeWatch.java#L210-L213

Added lines #L210 - L213 were not covered by tests
// There's no need to report an overflow event, because `internal` was
// opened *before* the file system was accessed to fetch children. Thus,
// if a new directory is created while this method is running, then at
// least one of the following is true: (a) the new directory is already
// visible by the time the file system is accessed; (b) its `CREATED`
// event is handled later, which starts a new child watch if needed.
}

Check warning on line 220 in src/main/java/engineering/swat/watch/impl/jdk/JDKFileTreeWatch.java

View check run for this annotation

Codecov / codecov/patch

src/main/java/engineering/swat/watch/impl/jdk/JDKFileTreeWatch.java#L220

Added line #L220 was not covered by tests
}
Loading