• Home
  • Features
  • Pricing
  • Docs
  • Announcements
  • Sign In

grpc / grpc-java / #19899

03 Jul 2025 06:14AM CUT coverage: 88.52% (-0.02%) from 88.541%
#19899

push

github

web-flow
core: grpc-timeout should always be positive (#12201)

PROTOCOL-HTTP2.md specifies "TimeoutValue → {positive integer as ASCII
string of at most 8 digits}". Zero is not positive, so it should be
avoided. So make sure timeouts are at least 1 nanosecond instead of 0
nanoseconds.

grpc-go recently began disallowing zero timeouts in
https://github.com/grpc/grpc-go/pull/8290 which caused a regression as
grpc-java can generate such timeouts. Apparently no gRPC implementation
had previously been checking for zero timeouts.

Instead of changing the max(0) to max(1) everywhere, just move the max
handling into TimeoutMarshaller, since every caller of TIMEOUT_KEY was
doing the same max() handling.

Before fd8fd517d (in 2016!), grpc-java actually behaved correctly, as it
failed RPCs with timeouts "<= 0". The commit changed the handling to the
max(0) handling we see now.

b/427338711

34643 of 39136 relevant lines covered (88.52%)

0.89 hits per line

Source File
Press 'n' to go to next uncovered line, 'b' for previous

0.0
/../netty/src/main/java/io/grpc/netty/InternalNettySocketSupport.java
1
/*
2
 * Copyright 2018 The gRPC Authors
3
 *
4
 * Licensed under the Apache License, Version 2.0 (the "License");
5
 * you may not use this file except in compliance with the License.
6
 * You may obtain a copy of the License at
7
 *
8
 *     http://www.apache.org/licenses/LICENSE-2.0
9
 *
10
 * Unless required by applicable law or agreed to in writing, software
11
 * distributed under the License is distributed on an "AS IS" BASIS,
12
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
 * See the License for the specific language governing permissions and
14
 * limitations under the License.
15
 */
16

17
package io.grpc.netty;
18

19
import io.grpc.Internal;
20
import io.grpc.InternalChannelz.TcpInfo;
21
import java.util.Map;
22

23
/**
24
 * An internal accessor. Do not use.
25
 */
26
@Internal
27
public final class InternalNettySocketSupport {
28

29
  public interface InternalHelper extends NettySocketSupport.Helper {
30
    @Override
31
    InternalNativeSocketOptions getNativeSocketOptions(io.netty.channel.Channel ch);
32
  }
33

34
  public static final class InternalNativeSocketOptions
35
      extends NettySocketSupport.NativeSocketOptions {
36
    public InternalNativeSocketOptions(TcpInfo tcpInfo, Map<String, String> otherInfo) {
37
      super(tcpInfo, otherInfo);
×
38
    }
×
39
  }
40

41
  public static void setHelper(InternalHelper helper) {
42
    NettySocketSupport.setHelper(helper);
×
43
  }
×
44

45
  private InternalNettySocketSupport() {}
46
}
STATUS · Troubleshooting · Open an Issue · Sales · Support · CAREERS · ENTERPRISE · START FREE · SCHEDULE DEMO
ANNOUNCEMENTS · TWITTER · TOS & SLA · Supported CI Services · What's a CI service? · Automated Testing

© 2025 Coveralls, Inc