mirror of https://github.com/grpc/grpc-java.git
all: use a proper log id which can reference channels, subchannels, and transports
This commit is contained in:
parent
7ec8167ada
commit
e9779d7c00
|
|
@ -44,7 +44,7 @@ import io.grpc.Status;
|
||||||
import io.grpc.internal.ClientStream;
|
import io.grpc.internal.ClientStream;
|
||||||
import io.grpc.internal.ClientStreamListener;
|
import io.grpc.internal.ClientStreamListener;
|
||||||
import io.grpc.internal.ConnectionClientTransport;
|
import io.grpc.internal.ConnectionClientTransport;
|
||||||
import io.grpc.internal.GrpcUtil;
|
import io.grpc.internal.LogId;
|
||||||
import io.grpc.internal.ManagedClientTransport;
|
import io.grpc.internal.ManagedClientTransport;
|
||||||
import io.grpc.internal.NoopClientStream;
|
import io.grpc.internal.NoopClientStream;
|
||||||
import io.grpc.internal.ServerStream;
|
import io.grpc.internal.ServerStream;
|
||||||
|
|
@ -71,6 +71,7 @@ import javax.annotation.concurrent.ThreadSafe;
|
||||||
class InProcessTransport implements ServerTransport, ConnectionClientTransport {
|
class InProcessTransport implements ServerTransport, ConnectionClientTransport {
|
||||||
private static final Logger log = Logger.getLogger(InProcessTransport.class.getName());
|
private static final Logger log = Logger.getLogger(InProcessTransport.class.getName());
|
||||||
|
|
||||||
|
private final LogId logId = LogId.allocate(getClass().getName());
|
||||||
private final String name;
|
private final String name;
|
||||||
private ServerTransportListener serverTransportListener;
|
private ServerTransportListener serverTransportListener;
|
||||||
private Attributes serverStreamAttributes;
|
private Attributes serverStreamAttributes;
|
||||||
|
|
@ -203,8 +204,8 @@ class InProcessTransport implements ServerTransport, ConnectionClientTransport {
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public String getLogId() {
|
public LogId getLogId() {
|
||||||
return GrpcUtil.getLogId(this);
|
return logId;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|
|
||||||
|
|
@ -63,6 +63,9 @@ import javax.annotation.concurrent.GuardedBy;
|
||||||
* streams are transferred to the given transport, thus this transport won't own any stream.
|
* streams are transferred to the given transport, thus this transport won't own any stream.
|
||||||
*/
|
*/
|
||||||
class DelayedClientTransport implements ManagedClientTransport {
|
class DelayedClientTransport implements ManagedClientTransport {
|
||||||
|
|
||||||
|
private final LogId lodId = LogId.allocate(getClass().getName());
|
||||||
|
|
||||||
private final Object lock = new Object();
|
private final Object lock = new Object();
|
||||||
|
|
||||||
private final Executor streamCreationExecutor;
|
private final Executor streamCreationExecutor;
|
||||||
|
|
@ -455,9 +458,10 @@ class DelayedClientTransport implements ManagedClientTransport {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// TODO(carl-mastrangelo): remove this once the Subchannel change is in.
|
||||||
@Override
|
@Override
|
||||||
public final String getLogId() {
|
public LogId getLogId() {
|
||||||
return GrpcUtil.getLogId(this);
|
return lodId;
|
||||||
}
|
}
|
||||||
|
|
||||||
@VisibleForTesting
|
@VisibleForTesting
|
||||||
|
|
|
||||||
|
|
@ -73,7 +73,7 @@ abstract class ForwardingConnectionClientTransport implements ConnectionClientTr
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public String getLogId() {
|
public LogId getLogId() {
|
||||||
return delegate().getLogId();
|
return delegate().getLogId();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -535,13 +535,6 @@ public final class GrpcUtil {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* The canonical implementation of {@link WithLogId#getLogId}.
|
|
||||||
*/
|
|
||||||
public static String getLogId(WithLogId subject) {
|
|
||||||
return subject.getClass().getSimpleName() + "@" + Integer.toHexString(subject.hashCode());
|
|
||||||
}
|
|
||||||
|
|
||||||
private GrpcUtil() {}
|
private GrpcUtil() {}
|
||||||
|
|
||||||
private static String getImplementationVersion() {
|
private static String getImplementationVersion() {
|
||||||
|
|
|
||||||
|
|
@ -72,7 +72,9 @@ import javax.annotation.concurrent.ThreadSafe;
|
||||||
final class InternalSubchannel implements WithLogId {
|
final class InternalSubchannel implements WithLogId {
|
||||||
private static final Logger log = Logger.getLogger(InternalSubchannel.class.getName());
|
private static final Logger log = Logger.getLogger(InternalSubchannel.class.getName());
|
||||||
|
|
||||||
|
|
||||||
private final Object lock = new Object();
|
private final Object lock = new Object();
|
||||||
|
private final LogId logId = LogId.allocate(getClass().getName());
|
||||||
private final EquivalentAddressGroup addressGroup;
|
private final EquivalentAddressGroup addressGroup;
|
||||||
private final String authority;
|
private final String authority;
|
||||||
private final String userAgent;
|
private final String userAgent;
|
||||||
|
|
@ -119,12 +121,12 @@ final class InternalSubchannel implements WithLogId {
|
||||||
* also be present.
|
* also be present.
|
||||||
*/
|
*/
|
||||||
@GuardedBy("lock")
|
@GuardedBy("lock")
|
||||||
private final Collection<ManagedClientTransport> transports =
|
private final Collection<ConnectionClientTransport> transports =
|
||||||
new ArrayList<ManagedClientTransport>();
|
new ArrayList<ConnectionClientTransport>();
|
||||||
|
|
||||||
// Must only be used from channelExecutor
|
// Must only be used from channelExecutor
|
||||||
private final InUseStateAggregator2<ManagedClientTransport> inUseStateAggregator =
|
private final InUseStateAggregator2<ConnectionClientTransport> inUseStateAggregator =
|
||||||
new InUseStateAggregator2<ManagedClientTransport>() {
|
new InUseStateAggregator2<ConnectionClientTransport>() {
|
||||||
@Override
|
@Override
|
||||||
void handleInUse() {
|
void handleInUse() {
|
||||||
callback.onInUse(InternalSubchannel.this);
|
callback.onInUse(InternalSubchannel.this);
|
||||||
|
|
@ -329,7 +331,7 @@ final class InternalSubchannel implements WithLogId {
|
||||||
}
|
}
|
||||||
|
|
||||||
private void handleTransportInUseState(
|
private void handleTransportInUseState(
|
||||||
final ManagedClientTransport transport, final boolean inUse) {
|
final ConnectionClientTransport transport, final boolean inUse) {
|
||||||
channelExecutor.execute(new Runnable() {
|
channelExecutor.execute(new Runnable() {
|
||||||
@Override
|
@Override
|
||||||
public void run() {
|
public void run() {
|
||||||
|
|
@ -358,8 +360,8 @@ final class InternalSubchannel implements WithLogId {
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public String getLogId() {
|
public LogId getLogId() {
|
||||||
return GrpcUtil.getLogId(this);
|
return logId;
|
||||||
}
|
}
|
||||||
|
|
||||||
@VisibleForTesting
|
@VisibleForTesting
|
||||||
|
|
@ -371,10 +373,10 @@ final class InternalSubchannel implements WithLogId {
|
||||||
|
|
||||||
/** Listener for real transports. */
|
/** Listener for real transports. */
|
||||||
private class TransportListener implements ManagedClientTransport.Listener {
|
private class TransportListener implements ManagedClientTransport.Listener {
|
||||||
final ManagedClientTransport transport;
|
final ConnectionClientTransport transport;
|
||||||
final SocketAddress address;
|
final SocketAddress address;
|
||||||
|
|
||||||
TransportListener(ManagedClientTransport transport, SocketAddress address) {
|
TransportListener(ConnectionClientTransport transport, SocketAddress address) {
|
||||||
this.transport = transport;
|
this.transport = transport;
|
||||||
this.address = address;
|
this.address = address;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,69 @@
|
||||||
|
/*
|
||||||
|
* Copyright 2016, Google Inc. All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions are
|
||||||
|
* met:
|
||||||
|
*
|
||||||
|
* * Redistributions of source code must retain the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer.
|
||||||
|
* * 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.
|
||||||
|
*
|
||||||
|
* * Neither the name of Google Inc. nor the names of its
|
||||||
|
* contributors may be used to endorse or promote products derived from
|
||||||
|
* this software without specific prior written permission.
|
||||||
|
*
|
||||||
|
* 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
|
||||||
|
* OWNER 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 io.grpc.internal;
|
||||||
|
|
||||||
|
import java.util.concurrent.atomic.AtomicLong;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* A loggable ID, unique for the duration of the program.
|
||||||
|
*/
|
||||||
|
public final class LogId {
|
||||||
|
private static final AtomicLong idAlloc = new AtomicLong();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param tag a loggable tag associated with this ID.
|
||||||
|
*/
|
||||||
|
public static LogId allocate(String tag) {
|
||||||
|
return new LogId(tag, idAlloc.incrementAndGet());
|
||||||
|
}
|
||||||
|
|
||||||
|
private final String tag;
|
||||||
|
private final long id;
|
||||||
|
|
||||||
|
private LogId(String tag, long id) {
|
||||||
|
this.tag = tag;
|
||||||
|
this.id = id;
|
||||||
|
}
|
||||||
|
|
||||||
|
public long getId() {
|
||||||
|
return id;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getTag() {
|
||||||
|
return tag;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String toString() {
|
||||||
|
return tag + "-" + id;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -130,6 +130,7 @@ public final class ManagedChannelImpl extends ManagedChannel implements WithLogI
|
||||||
private final Executor executor;
|
private final Executor executor;
|
||||||
private final boolean usingSharedExecutor;
|
private final boolean usingSharedExecutor;
|
||||||
private final Object lock = new Object();
|
private final Object lock = new Object();
|
||||||
|
private final LogId logId = LogId.allocate(getClass().getName());
|
||||||
|
|
||||||
private final DecompressorRegistry decompressorRegistry;
|
private final DecompressorRegistry decompressorRegistry;
|
||||||
private final CompressorRegistry compressorRegistry;
|
private final CompressorRegistry compressorRegistry;
|
||||||
|
|
@ -745,8 +746,8 @@ public final class ManagedChannelImpl extends ManagedChannel implements WithLogI
|
||||||
};
|
};
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public String getLogId() {
|
public LogId getLogId() {
|
||||||
return GrpcUtil.getLogId(this);
|
return logId;
|
||||||
}
|
}
|
||||||
|
|
||||||
private static class NameResolverListenerImpl implements NameResolver.Listener {
|
private static class NameResolverListenerImpl implements NameResolver.Listener {
|
||||||
|
|
|
||||||
|
|
@ -73,6 +73,7 @@ final class TransportSet extends ManagedChannel implements WithLogId {
|
||||||
|
|
||||||
private final CountDownLatch terminatedLatch = new CountDownLatch(1);
|
private final CountDownLatch terminatedLatch = new CountDownLatch(1);
|
||||||
private final Object lock = new Object();
|
private final Object lock = new Object();
|
||||||
|
private final LogId logId = LogId.allocate(getClass().getName());
|
||||||
private final EquivalentAddressGroup addressGroup;
|
private final EquivalentAddressGroup addressGroup;
|
||||||
private final String authority;
|
private final String authority;
|
||||||
private final String userAgent;
|
private final String userAgent;
|
||||||
|
|
@ -352,8 +353,8 @@ final class TransportSet extends ManagedChannel implements WithLogId {
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public String getLogId() {
|
public LogId getLogId() {
|
||||||
return GrpcUtil.getLogId(this);
|
return logId;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|
|
||||||
|
|
@ -43,5 +43,5 @@ public interface WithLogId {
|
||||||
* <p>The subclasses of this interface usually want to include the log ID in their {@link
|
* <p>The subclasses of this interface usually want to include the log ID in their {@link
|
||||||
* #toString} results.
|
* #toString} results.
|
||||||
*/
|
*/
|
||||||
String getLogId();
|
LogId getLogId();
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -422,7 +422,7 @@ public class InternalSubchannelTest {
|
||||||
// No scheduled tasks that would ever try to reconnect ...
|
// No scheduled tasks that would ever try to reconnect ...
|
||||||
assertEquals(0, fakeClock.numPendingTasks());
|
assertEquals(0, fakeClock.numPendingTasks());
|
||||||
assertEquals(0, fakeExecutor.numPendingTasks());
|
assertEquals(0, fakeExecutor.numPendingTasks());
|
||||||
|
|
||||||
// ... until it's requested.
|
// ... until it's requested.
|
||||||
internalSubchannel.obtainActiveTransport();
|
internalSubchannel.obtainActiveTransport();
|
||||||
assertExactCallbackInvokes("onStateChange:CONNECTING");
|
assertExactCallbackInvokes("onStateChange:CONNECTING");
|
||||||
|
|
@ -434,7 +434,7 @@ public class InternalSubchannelTest {
|
||||||
public void shutdownWhenReady() throws Exception {
|
public void shutdownWhenReady() throws Exception {
|
||||||
SocketAddress addr = mock(SocketAddress.class);
|
SocketAddress addr = mock(SocketAddress.class);
|
||||||
createInternalSubchannel(addr);
|
createInternalSubchannel(addr);
|
||||||
|
|
||||||
internalSubchannel.obtainActiveTransport();
|
internalSubchannel.obtainActiveTransport();
|
||||||
MockClientTransportInfo transportInfo = transports.poll();
|
MockClientTransportInfo transportInfo = transports.poll();
|
||||||
transportInfo.listener.transportReady();
|
transportInfo.listener.transportReady();
|
||||||
|
|
@ -528,7 +528,7 @@ public class InternalSubchannelTest {
|
||||||
public void shutdownNow() throws Exception {
|
public void shutdownNow() throws Exception {
|
||||||
SocketAddress addr = mock(SocketAddress.class);
|
SocketAddress addr = mock(SocketAddress.class);
|
||||||
createInternalSubchannel(addr);
|
createInternalSubchannel(addr);
|
||||||
|
|
||||||
internalSubchannel.obtainActiveTransport();
|
internalSubchannel.obtainActiveTransport();
|
||||||
MockClientTransportInfo t1 = transports.poll();
|
MockClientTransportInfo t1 = transports.poll();
|
||||||
t1.listener.transportReady();
|
t1.listener.transportReady();
|
||||||
|
|
@ -565,8 +565,8 @@ public class InternalSubchannelTest {
|
||||||
@Test
|
@Test
|
||||||
public void logId() {
|
public void logId() {
|
||||||
createInternalSubchannel(mock(SocketAddress.class));
|
createInternalSubchannel(mock(SocketAddress.class));
|
||||||
assertEquals("InternalSubchannel@" + Integer.toHexString(internalSubchannel.hashCode()),
|
|
||||||
internalSubchannel.getLogId());
|
assertNotNull(internalSubchannel.getLogId());
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
|
|
|
||||||
|
|
@ -690,8 +690,8 @@ public class TransportSetTest {
|
||||||
@Test
|
@Test
|
||||||
public void logId() {
|
public void logId() {
|
||||||
createTransportSet(mock(SocketAddress.class));
|
createTransportSet(mock(SocketAddress.class));
|
||||||
assertEquals("TransportSet@" + Integer.toHexString(transportSet.hashCode()),
|
|
||||||
transportSet.getLogId());
|
assertNotNull(transportSet.getLogId());
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
|
|
|
||||||
|
|
@ -46,6 +46,7 @@ import io.grpc.internal.ClientStream;
|
||||||
import io.grpc.internal.ConnectionClientTransport;
|
import io.grpc.internal.ConnectionClientTransport;
|
||||||
import io.grpc.internal.GrpcUtil;
|
import io.grpc.internal.GrpcUtil;
|
||||||
import io.grpc.internal.Http2Ping;
|
import io.grpc.internal.Http2Ping;
|
||||||
|
import io.grpc.internal.LogId;
|
||||||
import io.grpc.internal.StatsTraceContext;
|
import io.grpc.internal.StatsTraceContext;
|
||||||
import io.netty.bootstrap.Bootstrap;
|
import io.netty.bootstrap.Bootstrap;
|
||||||
import io.netty.channel.Channel;
|
import io.netty.channel.Channel;
|
||||||
|
|
@ -62,12 +63,14 @@ import java.net.SocketAddress;
|
||||||
import java.nio.channels.ClosedChannelException;
|
import java.nio.channels.ClosedChannelException;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
import java.util.concurrent.Executor;
|
import java.util.concurrent.Executor;
|
||||||
|
|
||||||
import javax.annotation.Nullable;
|
import javax.annotation.Nullable;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* A Netty-based {@link ConnectionClientTransport} implementation.
|
* A Netty-based {@link ConnectionClientTransport} implementation.
|
||||||
*/
|
*/
|
||||||
class NettyClientTransport implements ConnectionClientTransport {
|
class NettyClientTransport implements ConnectionClientTransport {
|
||||||
|
private final LogId logId = LogId.allocate(getClass().getName());
|
||||||
private final Map<ChannelOption<?>, ?> channelOptions;
|
private final Map<ChannelOption<?>, ?> channelOptions;
|
||||||
private final SocketAddress address;
|
private final SocketAddress address;
|
||||||
private final Class<? extends Channel> channelType;
|
private final Class<? extends Channel> channelType;
|
||||||
|
|
@ -241,8 +244,8 @@ class NettyClientTransport implements ConnectionClientTransport {
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public String getLogId() {
|
public LogId getLogId() {
|
||||||
return GrpcUtil.getLogId(this);
|
return logId;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|
|
||||||
|
|
@ -51,6 +51,7 @@ import io.grpc.internal.ConnectionClientTransport;
|
||||||
import io.grpc.internal.GrpcUtil;
|
import io.grpc.internal.GrpcUtil;
|
||||||
import io.grpc.internal.Http2Ping;
|
import io.grpc.internal.Http2Ping;
|
||||||
import io.grpc.internal.KeepAliveManager;
|
import io.grpc.internal.KeepAliveManager;
|
||||||
|
import io.grpc.internal.LogId;
|
||||||
import io.grpc.internal.SerializingExecutor;
|
import io.grpc.internal.SerializingExecutor;
|
||||||
import io.grpc.internal.SharedResourceHolder;
|
import io.grpc.internal.SharedResourceHolder;
|
||||||
import io.grpc.internal.StatsTraceContext;
|
import io.grpc.internal.StatsTraceContext;
|
||||||
|
|
@ -140,6 +141,7 @@ class OkHttpClientTransport implements ConnectionClientTransport {
|
||||||
private AsyncFrameWriter frameWriter;
|
private AsyncFrameWriter frameWriter;
|
||||||
private OutboundFlowController outboundFlow;
|
private OutboundFlowController outboundFlow;
|
||||||
private final Object lock = new Object();
|
private final Object lock = new Object();
|
||||||
|
private final LogId logId = LogId.allocate(getClass().getName());
|
||||||
@GuardedBy("lock")
|
@GuardedBy("lock")
|
||||||
private int nextStreamId;
|
private int nextStreamId;
|
||||||
@GuardedBy("lock")
|
@GuardedBy("lock")
|
||||||
|
|
@ -445,8 +447,8 @@ class OkHttpClientTransport implements ConnectionClientTransport {
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public String getLogId() {
|
public LogId getLogId() {
|
||||||
return GrpcUtil.getLogId(this);
|
return logId;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue