Skip to content

Commit d2419d4

Browse files
authored
pubsub: fix race in messageDeadlineSeconds (#2470)
The variable is concurrently accessed, so it should be made atomic.
1 parent 8f77925 commit d2419d4

1 file changed

Lines changed: 7 additions & 4 deletions

File tree

google-cloud-pubsub/src/main/java/com/google/cloud/pubsub/v1/MessageDispatcher.java

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,7 @@
4141
import java.util.concurrent.ScheduledFuture;
4242
import java.util.concurrent.TimeUnit;
4343
import java.util.concurrent.atomic.AtomicBoolean;
44+
import java.util.concurrent.atomic.AtomicInteger;
4445
import java.util.concurrent.locks.Lock;
4546
import java.util.concurrent.locks.ReentrantLock;
4647
import java.util.logging.Level;
@@ -76,7 +77,9 @@ class MessageDispatcher {
7677
private final Set<String> pendingNacks;
7778

7879
private final Lock alarmsLock;
79-
private int messageDeadlineSeconds;
80+
// The deadline should be set by the subscriber connection before use,
81+
// but set it to some reasonable value just in case.
82+
private final AtomicInteger messageDeadlineSeconds = new AtomicInteger(10);
8083
private ScheduledFuture<?> ackDeadlineExtensionAlarm;
8184
private Instant nextAckDeadlineExtensionAlarmTime;
8285
private ScheduledFuture<?> pendingAcksAlarm;
@@ -276,11 +279,11 @@ public void stop() {
276279
}
277280

278281
public void setMessageDeadlineSeconds(int messageDeadlineSeconds) {
279-
this.messageDeadlineSeconds = messageDeadlineSeconds;
282+
this.messageDeadlineSeconds.set(messageDeadlineSeconds);
280283
}
281284

282285
public int getMessageDeadlineSeconds() {
283-
return messageDeadlineSeconds;
286+
return messageDeadlineSeconds.get();
284287
}
285288

286289
static class OutstandingMessageBatch {
@@ -336,7 +339,7 @@ public void processReceivedMessages(List<ReceivedMessage> messages, Runnable don
336339
}
337340

338341
Instant expiration = Instant.ofEpochMilli(clock.millisTime())
339-
.plusSeconds(messageDeadlineSeconds);
342+
.plusSeconds(messageDeadlineSeconds.get());
340343
synchronized (outstandingAckHandlers) {
341344
outstandingAckHandlers.add(
342345
new ExtensionJob(

0 commit comments

Comments
 (0)