8330077: Allow max number of events to be buffered to be configurable to avoid OVERFLOW_EVENT

Reviewed-by: bpb, alanb
This commit is contained in:
Fabian Meumertzheim 2024-05-06 17:01:11 +00:00 committed by Brian Burkhalter
parent ae60d84500
commit a8b3f194e8
3 changed files with 160 additions and 4 deletions

View file

@ -1,5 +1,5 @@
/*
* Copyright (c) 2007, 2021, Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 2007, 2024, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@ -98,6 +98,20 @@ import java.util.concurrent.TimeUnit;
* it is not required that changes to files carried out on remote systems be
* detected.
*
* @implNote
* The JDK's {@code WatchService} implementations buffer up to 512 pending
* events for each registered watchable object. If this limit is exceeded,
* pending events are discarded and the special
* {@link StandardWatchEventKinds#OVERFLOW OVERFLOW} event is queued. This
* special event is the trigger to re-examine the state of the object, e.g.
* scan a watched directory to get an updated list of the files in the
* directory. The limit for the pending events can be changed from its default
* with the system property
* {@systemProperty jdk.nio.file.WatchService.maxEventsPerPoll}
* set to a value that parses as a positive integer. This may be useful in
* environments where there is a high volume of changes and where the impact
* of discarded events is high.
*
* @since 1.7
*
* @see FileSystem#newWatchService

View file

@ -1,5 +1,5 @@
/*
* Copyright (c) 2008, 2011, Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 2008, 2024, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@ -28,16 +28,38 @@ package sun.nio.fs;
import java.nio.file.*;
import java.util.*;
import jdk.internal.util.ArraysSupport;
import sun.security.action.GetPropertyAction;
/**
* Base implementation class for watch keys.
*/
abstract class AbstractWatchKey implements WatchKey {
private static final int DEFAULT_MAX_EVENT_LIST_SIZE = 512;
/**
* Maximum size of event list (in the future this may be tunable)
* Maximum size of event list before dropping events and signalling OVERFLOW
*/
static final int MAX_EVENT_LIST_SIZE = 512;
static final int MAX_EVENT_LIST_SIZE;
static {
String rawValue = GetPropertyAction.privilegedGetProperty(
"jdk.nio.file.WatchService.maxEventsPerPoll",
String.valueOf(DEFAULT_MAX_EVENT_LIST_SIZE));
int intValue;
try {
// Clamp to max array length to signal OVERFLOW and drop events
// before OOMing.
intValue = Math.clamp(
Long.decode(rawValue),
1,
ArraysSupport.SOFT_MAX_ARRAY_LENGTH);
} catch (NumberFormatException e) {
intValue = DEFAULT_MAX_EVENT_LIST_SIZE;
}
MAX_EVENT_LIST_SIZE = intValue;
}
/**
* Special event to signal overflow