mirror of https://github.com/grpc/grpc-java.git
context: Store Deadline in CancellableContext directly
This commit is contained in:
parent
68e8dc240c
commit
7cafb6745b
|
|
@ -99,8 +99,6 @@ public class Context {
|
||||||
private static final PersistentHashArrayMappedTrie<Key<?>, Object> EMPTY_ENTRIES =
|
private static final PersistentHashArrayMappedTrie<Key<?>, Object> EMPTY_ENTRIES =
|
||||||
new PersistentHashArrayMappedTrie<Key<?>, Object>();
|
new PersistentHashArrayMappedTrie<Key<?>, Object>();
|
||||||
|
|
||||||
private static final Key<Deadline> DEADLINE_KEY = new Key<Deadline>("deadline");
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The logical root context which is the ultimate ancestor of all contexts. This context
|
* The logical root context which is the ultimate ancestor of all contexts. This context
|
||||||
* is not cancellable and so will not cascade cancellation or retain listeners.
|
* is not cancellable and so will not cascade cancellation or retain listeners.
|
||||||
|
|
@ -191,8 +189,7 @@ public class Context {
|
||||||
*/
|
*/
|
||||||
private Context(PersistentHashArrayMappedTrie<Key<?>, Object> keyValueEntries) {
|
private Context(PersistentHashArrayMappedTrie<Key<?>, Object> keyValueEntries) {
|
||||||
cancellableAncestor = null;
|
cancellableAncestor = null;
|
||||||
// Not inheriting cancellation implies not inheriting a deadline too.
|
this.keyValueEntries = keyValueEntries;
|
||||||
this.keyValueEntries = keyValueEntries.put(DEADLINE_KEY, null);
|
|
||||||
cascadesCancellation = false;
|
cascadesCancellation = false;
|
||||||
canBeCancelled = false;
|
canBeCancelled = false;
|
||||||
}
|
}
|
||||||
|
|
@ -466,7 +463,10 @@ public class Context {
|
||||||
* @return A {@link io.grpc.Deadline} or {@code null} if no deadline is set.
|
* @return A {@link io.grpc.Deadline} or {@code null} if no deadline is set.
|
||||||
*/
|
*/
|
||||||
public Deadline getDeadline() {
|
public Deadline getDeadline() {
|
||||||
return DEADLINE_KEY.get(this);
|
if (cancellableAncestor == null) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
return cancellableAncestor.getDeadline();
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
@ -685,28 +685,19 @@ public class Context {
|
||||||
*/
|
*/
|
||||||
public static final class CancellableContext extends Context {
|
public static final class CancellableContext extends Context {
|
||||||
|
|
||||||
|
private final Deadline deadline;
|
||||||
|
private final Context uncancellableSurrogate;
|
||||||
|
|
||||||
private boolean cancelled;
|
private boolean cancelled;
|
||||||
private Throwable cancellationCause;
|
private Throwable cancellationCause;
|
||||||
private final Context uncancellableSurrogate;
|
|
||||||
private ScheduledFuture<?> pendingDeadline;
|
private ScheduledFuture<?> pendingDeadline;
|
||||||
|
|
||||||
/**
|
|
||||||
* If the parent deadline is before the given deadline there is no need to install the value
|
|
||||||
* or listen for its expiration as the parent context will already be listening for it.
|
|
||||||
*/
|
|
||||||
private static PersistentHashArrayMappedTrie<Key<?>, Object> deriveDeadline(
|
|
||||||
Context parent, Deadline deadline) {
|
|
||||||
Deadline parentDeadline = DEADLINE_KEY.get(parent);
|
|
||||||
return parentDeadline == null || deadline.isBefore(parentDeadline)
|
|
||||||
? parent.keyValueEntries.put(DEADLINE_KEY, deadline)
|
|
||||||
: parent.keyValueEntries;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Create a cancellable context that does not have a deadline.
|
* Create a cancellable context that does not have a deadline.
|
||||||
*/
|
*/
|
||||||
private CancellableContext(Context parent) {
|
private CancellableContext(Context parent) {
|
||||||
super(parent, parent.keyValueEntries, true);
|
super(parent, parent.keyValueEntries, true);
|
||||||
|
deadline = parent.getDeadline();
|
||||||
// Create a surrogate that inherits from this to attach so that you cannot retrieve a
|
// Create a surrogate that inherits from this to attach so that you cannot retrieve a
|
||||||
// cancellable context from Context.current()
|
// cancellable context from Context.current()
|
||||||
uncancellableSurrogate = new Context(this, keyValueEntries);
|
uncancellableSurrogate = new Context(this, keyValueEntries);
|
||||||
|
|
@ -717,8 +708,13 @@ public class Context {
|
||||||
*/
|
*/
|
||||||
private CancellableContext(Context parent, Deadline deadline,
|
private CancellableContext(Context parent, Deadline deadline,
|
||||||
ScheduledExecutorService scheduler) {
|
ScheduledExecutorService scheduler) {
|
||||||
super(parent, deriveDeadline(parent, deadline), true);
|
super(parent, parent.keyValueEntries, true);
|
||||||
if (DEADLINE_KEY.get(this) == deadline) {
|
Deadline parentDeadline = parent.getDeadline();
|
||||||
|
if (parentDeadline != null && parentDeadline.compareTo(deadline) <= 0) {
|
||||||
|
// The new deadline won't have an effect, so ignore it
|
||||||
|
deadline = parentDeadline;
|
||||||
|
} else {
|
||||||
|
// The new deadline has an effect
|
||||||
if (!deadline.isExpired()) {
|
if (!deadline.isExpired()) {
|
||||||
// The parent deadline was after the new deadline so we need to install a listener
|
// The parent deadline was after the new deadline so we need to install a listener
|
||||||
// on the new earlier deadline to trigger expiration for this context.
|
// on the new earlier deadline to trigger expiration for this context.
|
||||||
|
|
@ -737,6 +733,7 @@ public class Context {
|
||||||
cancel(new TimeoutException("context timed out"));
|
cancel(new TimeoutException("context timed out"));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
this.deadline = deadline;
|
||||||
uncancellableSurrogate = new Context(this, keyValueEntries);
|
uncancellableSurrogate = new Context(this, keyValueEntries);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -829,6 +826,11 @@ public class Context {
|
||||||
}
|
}
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Deadline getDeadline() {
|
||||||
|
return deadline;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue