|
22 | 22 | import java.util.concurrent.CompletableFuture;
|
23 | 23 | import java.util.concurrent.ExecutorService;
|
24 | 24 | import java.util.concurrent.Executors;
|
| 25 | +import java.util.concurrent.TimeUnit; |
25 | 26 | import java.util.concurrent.atomic.AtomicBoolean;
|
26 | 27 | import java.util.concurrent.atomic.AtomicReference;
|
27 | 28 | import java.util.function.Function;
|
|
40 | 41 | import org.apache.beam.runners.dataflow.worker.windmill.work.budget.GetWorkBudgetSpender;
|
41 | 42 | import org.apache.beam.runners.dataflow.worker.windmill.work.refresh.FixedStreamHeartbeatSender;
|
42 | 43 | import org.apache.beam.sdk.annotations.Internal;
|
| 44 | +import org.apache.beam.vendor.guava.v32_1_2_jre.com.google.common.base.Preconditions; |
43 | 45 | import org.apache.beam.vendor.guava.v32_1_2_jre.com.google.common.util.concurrent.ThreadFactoryBuilder;
|
44 | 46 |
|
45 | 47 | /**
|
|
58 | 60 | @ThreadSafe
|
59 | 61 | final class WindmillStreamSender implements GetWorkBudgetSpender, StreamSender {
|
60 | 62 | private static final String STREAM_STARTER_THREAD_NAME = "StartWindmillStreamThread-%d";
|
| 63 | + private static final int TERMINATION_TIMEOUT_SECONDS = 5; |
61 | 64 | private final AtomicBoolean started;
|
62 | 65 | private final AtomicReference<GetWorkBudget> getWorkBudget;
|
63 | 66 | private final GetWorkStream getWorkStream;
|
@@ -142,11 +145,26 @@ synchronized void start() {
|
142 | 145 |
|
143 | 146 | @Override
|
144 | 147 | public synchronized void close() {
|
145 |
| - streamStarter.shutdownNow(); |
| 148 | + streamStarter.shutdown(); |
146 | 149 | getWorkStream.shutdown();
|
147 | 150 | getDataStream.shutdown();
|
148 | 151 | workCommitter.stop();
|
149 | 152 | commitWorkStream.shutdown();
|
| 153 | + try { |
| 154 | + if (!Preconditions.checkNotNull(streamStarter) |
| 155 | + .awaitTermination(TERMINATION_TIMEOUT_SECONDS, TimeUnit.SECONDS)) { |
| 156 | + streamStarter.shutdownNow(); |
| 157 | + } |
| 158 | + Preconditions.checkNotNull(getWorkStream) |
| 159 | + .awaitTermination(TERMINATION_TIMEOUT_SECONDS, TimeUnit.SECONDS); |
| 160 | + Preconditions.checkNotNull(getDataStream) |
| 161 | + .awaitTermination(TERMINATION_TIMEOUT_SECONDS, TimeUnit.SECONDS); |
| 162 | + Preconditions.checkNotNull(commitWorkStream) |
| 163 | + .awaitTermination(TERMINATION_TIMEOUT_SECONDS, TimeUnit.SECONDS); |
| 164 | + } catch (InterruptedException e) { |
| 165 | + Thread.currentThread().interrupt(); |
| 166 | + throw new RuntimeException("Interrupted while waiting for streams to terminate", e); |
| 167 | + } |
150 | 168 | }
|
151 | 169 |
|
152 | 170 | @Override
|
|
0 commit comments