Skip to content
Merged
Show file tree
Hide file tree
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 @@ -71,7 +71,13 @@ protected AbstractProducesMethodProducer(
protected final ListenableFuture<T> compute() {
monitor = monitorProvider.get().producerMonitorFor(token);
monitor.requested();
ListenableFuture<T> result = Futures.transformAsync(collectDependencies(), this, this);
ListenableFuture<D> dependenciesFuture;
try {
dependenciesFuture = collectDependencies();
} finally {
monitor.dependenciesRequested();
}
ListenableFuture<T> result = Futures.transformAsync(dependenciesFuture, this, this);
monitor.addCallbackTo(result);
return result;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,8 @@
* <p>The lifecycle of the monitor, under normal conditions, is:
* <ul>
* <li>{@link #requested()}
* <li>{@link #dependenciesRequested()}
* <li>{@link #ready()}
* <li>{@link #methodStarting()}
* <li>The method is called
* <li>{@link #methodFinished()}
Expand Down Expand Up @@ -58,6 +60,9 @@
* <li>A requested
* <li>B requested
* <li>C requested
* <li>C dependenciesRequested
* <li>B dependenciesRequested
* <li>A dependenciesRequested
* <li>C methodStarting
* <li>C methodFinished
* <li>C succeeded
Expand Down Expand Up @@ -102,6 +107,17 @@ public abstract class ProducerMonitor {
*/
public void requested() {}

/**
* Called when all of the producer's dependencies have been requested. This will be called from
* the same thread as {@link #requested()}.
*
* <p>When multiple monitors are installed, calls to this method will be in the reverse order from
* calls to {@link #requested()}.
*
* <p>This implementation is a no-op.
*/
public void dependenciesRequested() {}

/**
* Called when all of the producer's inputs are available. This is called regardless of whether
* the inputs have succeeded or not; when the inputs have succeeded, this is called prior to
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -135,6 +135,15 @@ public void requested() {
}
}

@Override
public void dependenciesRequested() {
try {
delegate.dependenciesRequested();
} catch (RuntimeException e) {
logProducerMonitorMethodException(e, delegate, "dependenciesRequested");
}
}

@Override
public void ready() {
try {
Expand Down Expand Up @@ -270,6 +279,17 @@ public void requested() {
}
}

@Override
public void dependenciesRequested() {
for (ProducerMonitor delegate : delegates.reverse()) {
try {
delegate.dependenciesRequested();
} catch (RuntimeException e) {
logProducerMonitorMethodException(e, delegate, "dependenciesRequested");
}
}
}

@Override
public void ready() {
for (ProducerMonitor delegate : delegates) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -88,13 +88,16 @@ public void basicMonitoring() throws Exception {
inOrder.verify(callServer2Monitor).requested();
inOrder.verify(callServer1Monitor).requested();
inOrder.verify(requestDataMonitor).requested();
inOrder.verify(requestDataMonitor).dependenciesRequested();
inOrder.verify(requestDataMonitor).ready();
inOrder.verify(requestDataMonitor).methodStarting();
inOrder.verify(requestDataMonitor).methodFinished();
inOrder.verify(requestDataMonitor).succeeded("Hello, World!");
inOrder.verify(callServer1Monitor).dependenciesRequested();
inOrder.verify(callServer1Monitor).ready();
inOrder.verify(callServer1Monitor).methodStarting();
inOrder.verify(callServer1Monitor).methodFinished();
inOrder.verify(callServer2Monitor).dependenciesRequested();
verifyNoMoreInteractions(requestDataMonitor, callServer1Monitor, callServer2Monitor);

server1Future.set("server 1 response");
Expand Down Expand Up @@ -133,13 +136,16 @@ public void basicMonitoringWithFailure() throws Exception {
inOrder.verify(callServer2Monitor).requested();
inOrder.verify(callServer1Monitor).requested();
inOrder.verify(requestDataMonitor).requested();
inOrder.verify(requestDataMonitor).dependenciesRequested();
inOrder.verify(requestDataMonitor).ready();
inOrder.verify(requestDataMonitor).methodStarting();
inOrder.verify(requestDataMonitor).methodFinished();
inOrder.verify(requestDataMonitor).succeeded("Hello, World!");
inOrder.verify(callServer1Monitor).dependenciesRequested();
inOrder.verify(callServer1Monitor).ready();
inOrder.verify(callServer1Monitor).methodStarting();
inOrder.verify(callServer1Monitor).methodFinished();
inOrder.verify(callServer2Monitor).dependenciesRequested();
verifyNoMoreInteractions(requestDataMonitor, callServer1Monitor, callServer2Monitor);

RuntimeException cause = new RuntimeException("monkey");
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -76,6 +76,7 @@ public void monitor_success() throws Exception {
assertThat(future.isDone()).isFalse();
verify(monitor).ready();
verify(monitor).requested();
verify(monitor).dependenciesRequested();
verify(monitor).addCallbackTo(anyListenableFuture());
verify(monitor).methodStarting();
verify(monitor).methodFinished();
Expand All @@ -94,6 +95,7 @@ public void monitor_failure() throws Exception {
assertThat(future.isDone()).isFalse();
verify(monitor).ready();
verify(monitor).requested();
verify(monitor).dependenciesRequested();
verify(monitor).addCallbackTo(anyListenableFuture());
verify(monitor).methodStarting();
verify(monitor).methodFinished();
Expand Down
32 changes: 32 additions & 0 deletions javatests/dagger/producers/monitoring/internal/MonitorsTest.java
Original file line number Diff line number Diff line change
Expand Up @@ -124,12 +124,14 @@ public void singleMonitor_normalProducerMonitorSuccess() {
monitor.producerMonitorFor(ProducerToken.create(Object.class));
Object o = new Object();
producerMonitor.requested();
producerMonitor.dependenciesRequested();
producerMonitor.methodStarting();
producerMonitor.methodFinished();
producerMonitor.succeeded(o);

InOrder order = inOrder(mockProducerMonitor);
order.verify(mockProducerMonitor).requested();
order.verify(mockProducerMonitor).dependenciesRequested();
order.verify(mockProducerMonitor).methodStarting();
order.verify(mockProducerMonitor).methodFinished();
order.verify(mockProducerMonitor).succeeded(o);
Expand All @@ -147,12 +149,14 @@ public void singleMonitor_normalProducerMonitorFailure() {
monitor.producerMonitorFor(ProducerToken.create(Object.class));
Throwable t = new RuntimeException("monkey");
producerMonitor.requested();
producerMonitor.dependenciesRequested();
producerMonitor.methodStarting();
producerMonitor.methodFinished();
producerMonitor.failed(t);

InOrder order = inOrder(mockProducerMonitor);
order.verify(mockProducerMonitor).requested();
order.verify(mockProducerMonitor).dependenciesRequested();
order.verify(mockProducerMonitor).methodStarting();
order.verify(mockProducerMonitor).methodFinished();
order.verify(mockProducerMonitor).failed(t);
Expand All @@ -163,6 +167,7 @@ public void singleMonitor_normalProducerMonitorFailure() {
public void singleMonitor_throwingProducerMonitorSuccess() {
setUpNormalSingleMonitor();
doThrow(new RuntimeException("monkey")).when(mockProducerMonitor).requested();
doThrow(new RuntimeException("monkey")).when(mockProducerMonitor).dependenciesRequested();
doThrow(new RuntimeException("monkey")).when(mockProducerMonitor).methodStarting();
doThrow(new RuntimeException("monkey")).when(mockProducerMonitor).methodFinished();
doThrow(new RuntimeException("monkey"))
Expand All @@ -176,12 +181,14 @@ public void singleMonitor_throwingProducerMonitorSuccess() {
monitor.producerMonitorFor(ProducerToken.create(Object.class));
Object o = new Object();
producerMonitor.requested();
producerMonitor.dependenciesRequested();
producerMonitor.methodStarting();
producerMonitor.methodFinished();
producerMonitor.succeeded(o);

InOrder order = inOrder(mockProducerMonitor);
order.verify(mockProducerMonitor).requested();
order.verify(mockProducerMonitor).dependenciesRequested();
order.verify(mockProducerMonitor).methodStarting();
order.verify(mockProducerMonitor).methodFinished();
order.verify(mockProducerMonitor).succeeded(o);
Expand All @@ -192,6 +199,7 @@ public void singleMonitor_throwingProducerMonitorSuccess() {
public void singleMonitor_throwingProducerMonitorFailure() {
setUpNormalSingleMonitor();
doThrow(new RuntimeException("monkey")).when(mockProducerMonitor).requested();
doThrow(new RuntimeException("monkey")).when(mockProducerMonitor).dependenciesRequested();
doThrow(new RuntimeException("monkey")).when(mockProducerMonitor).methodStarting();
doThrow(new RuntimeException("monkey")).when(mockProducerMonitor).methodFinished();
doThrow(new RuntimeException("monkey")).when(mockProducerMonitor).failed(any(Throwable.class));
Expand All @@ -203,12 +211,14 @@ public void singleMonitor_throwingProducerMonitorFailure() {
monitor.producerMonitorFor(ProducerToken.create(Object.class));
Throwable t = new RuntimeException("gorilla");
producerMonitor.requested();
producerMonitor.dependenciesRequested();
producerMonitor.methodStarting();
producerMonitor.methodFinished();
producerMonitor.failed(t);

InOrder order = inOrder(mockProducerMonitor);
order.verify(mockProducerMonitor).requested();
order.verify(mockProducerMonitor).dependenciesRequested();
order.verify(mockProducerMonitor).methodStarting();
order.verify(mockProducerMonitor).methodFinished();
order.verify(mockProducerMonitor).failed(t);
Expand Down Expand Up @@ -269,12 +279,14 @@ public void multipleMonitors_someNullProductionComponentMonitors() {

Object o = new Object();
producerMonitor.requested();
producerMonitor.dependenciesRequested();
producerMonitor.methodStarting();
producerMonitor.methodFinished();
producerMonitor.succeeded(o);

InOrder order = inOrder(mockProducerMonitorA);
order.verify(mockProducerMonitorA).requested();
order.verify(mockProducerMonitorA).dependenciesRequested();
order.verify(mockProducerMonitorA).methodStarting();
order.verify(mockProducerMonitorA).methodFinished();
order.verify(mockProducerMonitorA).succeeded(o);
Expand Down Expand Up @@ -305,12 +317,14 @@ public void multipleMonitors_someThrowingProductionComponentMonitorFactories() {

Object o = new Object();
producerMonitor.requested();
producerMonitor.dependenciesRequested();
producerMonitor.methodStarting();
producerMonitor.methodFinished();
producerMonitor.succeeded(o);

InOrder order = inOrder(mockProducerMonitorA);
order.verify(mockProducerMonitorA).requested();
order.verify(mockProducerMonitorA).dependenciesRequested();
order.verify(mockProducerMonitorA).methodStarting();
order.verify(mockProducerMonitorA).methodFinished();
order.verify(mockProducerMonitorA).succeeded(o);
Expand All @@ -332,6 +346,7 @@ public void multipleMonitors_normalProductionComponentMonitorSuccess() {

Object o = new Object();
producerMonitor.requested();
producerMonitor.dependenciesRequested();
producerMonitor.methodStarting();
producerMonitor.methodFinished();
producerMonitor.succeeded(o);
Expand All @@ -340,6 +355,9 @@ public void multipleMonitors_normalProductionComponentMonitorSuccess() {
order.verify(mockProducerMonitorA).requested();
order.verify(mockProducerMonitorB).requested();
order.verify(mockProducerMonitorC).requested();
order.verify(mockProducerMonitorC).dependenciesRequested();
order.verify(mockProducerMonitorB).dependenciesRequested();
order.verify(mockProducerMonitorA).dependenciesRequested();
order.verify(mockProducerMonitorA).methodStarting();
order.verify(mockProducerMonitorB).methodStarting();
order.verify(mockProducerMonitorC).methodStarting();
Expand Down Expand Up @@ -367,6 +385,7 @@ public void multipleMonitors_normalProductionComponentMonitorFailure() {

Throwable t = new RuntimeException("chimpanzee");
producerMonitor.requested();
producerMonitor.dependenciesRequested();
producerMonitor.methodStarting();
producerMonitor.methodFinished();
producerMonitor.failed(t);
Expand All @@ -375,6 +394,9 @@ public void multipleMonitors_normalProductionComponentMonitorFailure() {
order.verify(mockProducerMonitorA).requested();
order.verify(mockProducerMonitorB).requested();
order.verify(mockProducerMonitorC).requested();
order.verify(mockProducerMonitorC).dependenciesRequested();
order.verify(mockProducerMonitorB).dependenciesRequested();
order.verify(mockProducerMonitorA).dependenciesRequested();
order.verify(mockProducerMonitorA).methodStarting();
order.verify(mockProducerMonitorB).methodStarting();
order.verify(mockProducerMonitorC).methodStarting();
Expand All @@ -391,6 +413,7 @@ public void multipleMonitors_normalProductionComponentMonitorFailure() {
public void multipleMonitors_someThrowingProducerMonitorsSuccess() {
setUpNormalMultipleMonitors();
doThrow(new RuntimeException("monkey")).when(mockProducerMonitorA).requested();
doThrow(new RuntimeException("monkey")).when(mockProducerMonitorA).dependenciesRequested();
doThrow(new RuntimeException("monkey")).when(mockProducerMonitorA).methodStarting();
doThrow(new RuntimeException("monkey")).when(mockProducerMonitorB).methodFinished();
doThrow(new RuntimeException("monkey"))
Expand All @@ -408,6 +431,7 @@ public void multipleMonitors_someThrowingProducerMonitorsSuccess() {

Object o = new Object();
producerMonitor.requested();
producerMonitor.dependenciesRequested();
producerMonitor.methodStarting();
producerMonitor.methodFinished();
producerMonitor.succeeded(o);
Expand All @@ -416,6 +440,9 @@ public void multipleMonitors_someThrowingProducerMonitorsSuccess() {
order.verify(mockProducerMonitorA).requested();
order.verify(mockProducerMonitorB).requested();
order.verify(mockProducerMonitorC).requested();
order.verify(mockProducerMonitorC).dependenciesRequested();
order.verify(mockProducerMonitorB).dependenciesRequested();
order.verify(mockProducerMonitorA).dependenciesRequested();
order.verify(mockProducerMonitorA).methodStarting();
order.verify(mockProducerMonitorB).methodStarting();
order.verify(mockProducerMonitorC).methodStarting();
Expand All @@ -432,6 +459,7 @@ public void multipleMonitors_someThrowingProducerMonitorsSuccess() {
public void multipleMonitors_someThrowingProducerMonitorsFailure() {
setUpNormalMultipleMonitors();
doThrow(new RuntimeException("monkey")).when(mockProducerMonitorA).requested();
doThrow(new RuntimeException("monkey")).when(mockProducerMonitorA).dependenciesRequested();
doThrow(new RuntimeException("monkey")).when(mockProducerMonitorA).methodStarting();
doThrow(new RuntimeException("monkey")).when(mockProducerMonitorB).methodFinished();
doThrow(new RuntimeException("monkey")).when(mockProducerMonitorC).failed(any(Throwable.class));
Expand All @@ -447,6 +475,7 @@ public void multipleMonitors_someThrowingProducerMonitorsFailure() {

Throwable t = new RuntimeException("chimpanzee");
producerMonitor.requested();
producerMonitor.dependenciesRequested();
producerMonitor.methodStarting();
producerMonitor.methodFinished();
producerMonitor.failed(t);
Expand All @@ -455,6 +484,9 @@ public void multipleMonitors_someThrowingProducerMonitorsFailure() {
order.verify(mockProducerMonitorA).requested();
order.verify(mockProducerMonitorB).requested();
order.verify(mockProducerMonitorC).requested();
order.verify(mockProducerMonitorC).dependenciesRequested();
order.verify(mockProducerMonitorB).dependenciesRequested();
order.verify(mockProducerMonitorA).dependenciesRequested();
order.verify(mockProducerMonitorA).methodStarting();
order.verify(mockProducerMonitorB).methodStarting();
order.verify(mockProducerMonitorC).methodStarting();
Expand Down
Loading