Skip to content
Open
Changes from all commits
Commits
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
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,9 @@
import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicInteger;
import java.util.concurrent.atomic.AtomicLong;
import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;

import javax.management.openmbean.CompositeDataSupport;
import javax.management.openmbean.CompositeType;
Expand All @@ -40,7 +43,6 @@
import javax.management.openmbean.TabularDataSupport;
import javax.management.openmbean.TabularType;

import org.apache.jackrabbit.guava.common.util.concurrent.Monitor;
import org.apache.commons.io.FileUtils;
import org.apache.jackrabbit.oak.commons.collections.IterableUtils;
import org.apache.jackrabbit.oak.commons.collections.SetUtils;
Expand Down Expand Up @@ -95,7 +97,8 @@
private final AtomicLong downloadTime = new AtomicLong();
private final AtomicLong uploadTime = new AtomicLong();

private final Monitor copyCompletionMonitor = new Monitor();
private final Lock copyCompletionLock = new ReentrantLock();
private final Condition notCopyingCondition = copyCompletionLock.newCondition();

private final Map<String, String> indexPathVersionMapping = new ConcurrentHashMap<>();
private final ConcurrentMap<String, LocalIndexFile> failedToDeleteFiles = new ConcurrentHashMap<>();
Expand Down Expand Up @@ -363,28 +366,31 @@
* @param timeoutMillis
*/
public void waitForCopyCompletion(LocalIndexFile file, long timeoutMillis) {
final Monitor.Guard notCopyingGuard = new Monitor.Guard(copyCompletionMonitor) {
@Override
public boolean isSatisfied() {
return !isCopyInProgress(file);
}
};
long localLength = file.actualSize();
long lastLocalLength = localLength;

boolean notCopying = !isCopyInProgress(file);
while (!notCopying) {
final long deadline = System.nanoTime() + TimeUnit.MILLISECONDS.toNanos(timeoutMillis);
copyCompletionLock.lock();
try {
if (log.isDebugEnabled()) {
log.debug("Checking for copy completion of {} - {}", file.getKey(), file.copyLog());
}
notCopying = copyCompletionMonitor.enterWhen(notCopyingGuard, timeoutMillis, TimeUnit.MILLISECONDS);
if (notCopying) {
copyCompletionMonitor.leave();
while (isCopyInProgress(file)) {
long remaining = deadline - System.nanoTime();
if (remaining <= 0) {
// timeout
break;
}
notCopyingCondition.awaitNanos(remaining);

Check warning on line 386 in oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/IndexCopier.java

View check run for this annotation

SonarQubeCloud / SonarCloud Code Analysis

Do something with the "long" value returned by "awaitNanos".

See more on https://sonarcloud.io/project/issues?id=org.apache.jackrabbit%3Ajackrabbit-oak&issues=AZseN8U6ekvuHONwFd01&open=AZseN8U6ekvuHONwFd01&pullRequest=2660
}
notCopying = !isCopyInProgress(file);
} catch (InterruptedException e) {
// ignore and reset interrupt flag
Thread.currentThread().interrupt();
} finally {
copyCompletionLock.unlock();
}

localLength = file.actualSize();
Expand All @@ -405,11 +411,13 @@
}

public void doneCopy(LocalIndexFile file, long start) {
copyCompletionMonitor.enter();
copyCompletionLock.lock();
try {
copyInProgressFiles.remove(file);
// wake up any threads waiting in waitForCopyCompletion(...)
notCopyingCondition.signalAll();
} finally {
copyCompletionMonitor.leave();
copyCompletionLock.unlock();
}
copyInProgressCount.decrementAndGet();
copyInProgressSize.addAndGet(-file.getSize());
Expand Down
Loading