Skip to content

Commit 2fa7a98

Browse files
committed
Add Option::NO_KEEP_ALIVE
The NO_KEEP_ALIVE option tells Homa to neither send pings nor timeout a message once it has been sent.
1 parent 45d7f9e commit 2fa7a98

4 files changed

Lines changed: 48 additions & 15 deletions

File tree

CMakeLists.txt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
cmake_minimum_required (VERSION 3.11)
22

3-
project(Homa VERSION 0.1.0.0 LANGUAGES CXX)
3+
project(Homa VERSION 0.1.1.0 LANGUAGES CXX)
44

55
################################################################################
66
## Dependency Configuration ####################################################

include/Homa/Homa.h

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -140,6 +140,11 @@ class OutMessage {
140140
NO_RETRY = 1 << 0, //< Message will not be resent if recoverable send
141141
//< failure occurs; provides at-most-once delivery
142142
//< of messages.
143+
NO_KEEP_ALIVE = 1 << 1, //< Once the Message has been sent, Homa will
144+
//< not automatically ping the Message's
145+
//< receiver to ensure the receiver is still
146+
//< alive and the Message will not "timeout"
147+
//< due to receiver inactivity.
143148
};
144149

145150
/**
@@ -293,6 +298,17 @@ class Transport {
293298
virtual uint64_t getId() = 0;
294299
};
295300

301+
/**
302+
* Combine Options flags.
303+
*/
304+
inline OutMessage::Options
305+
operator|(OutMessage::Options lhs, OutMessage::Options rhs)
306+
{
307+
typedef std::underlying_type<OutMessage::Options>::type options_t;
308+
return OutMessage::Options(static_cast<options_t>(lhs) |
309+
static_cast<options_t>(rhs));
310+
}
311+
296312
} // namespace Homa
297313

298314
#endif // HOMA_INCLUDE_HOMA_HOMA_H

src/Sender.cc

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -920,6 +920,12 @@ Sender::checkMessageTimeouts()
920920
// Found expired timeout.
921921
if (message->state != OutMessage::Status::COMPLETED) {
922922
message->state.store(OutMessage::Status::FAILED);
923+
// A sent NO_KEEP_ALIVE message should never reach this state
924+
// since the shorter ping timeout should have already canceled
925+
// the message timeout.
926+
assert(
927+
!((message->state == OutMessage::Status::SENT) &&
928+
(message->options & OutMessage::Options::NO_KEEP_ALIVE)));
923929
}
924930
bucket->messageTimeouts.cancelTimeout(&message->messageTimeout);
925931
bucket->pingTimeouts.cancelTimeout(&message->pingTimeout);
@@ -965,6 +971,11 @@ Sender::checkPingTimeouts()
965971
message->state == OutMessage::Status::FAILED) {
966972
bucket->pingTimeouts.cancelTimeout(&message->pingTimeout);
967973
continue;
974+
} else if (message->options & OutMessage::Options::NO_KEEP_ALIVE &&
975+
message->state == OutMessage::Status::SENT) {
976+
bucket->messageTimeouts.cancelTimeout(&message->messageTimeout);
977+
bucket->pingTimeouts.cancelTimeout(&message->pingTimeout);
978+
continue;
968979
} else {
969980
bucket->pingTimeouts.setTimeout(&message->pingTimeout);
970981
}

src/SenderTest.cc

Lines changed: 20 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1578,8 +1578,8 @@ TEST_F(SenderTest, checkMessageTimeouts_empty)
15781578

15791579
TEST_F(SenderTest, checkPingTimeouts_basic)
15801580
{
1581-
Sender::Message* message[4];
1582-
for (uint64_t i = 0; i < 4; ++i) {
1581+
Sender::Message* message[5];
1582+
for (uint64_t i = 0; i < 5; ++i) {
15831583
Protocol::MessageId id = {42, 10 + i};
15841584
message[i] = dynamic_cast<Sender::Message*>(sender->allocMessage());
15851585
SenderTest::addMessage(sender, id, message[i]);
@@ -1589,15 +1589,19 @@ TEST_F(SenderTest, checkPingTimeouts_basic)
15891589

15901590
// Message[0]: Normal timeout: COMPLETED
15911591
message[0]->state = Homa::OutMessage::Status::COMPLETED;
1592-
message[0]->pingTimeout.expirationCycleTime = 9998;
1592+
message[0]->pingTimeout.expirationCycleTime = 9997;
15931593
// Message[1]: Normal timeout: FAILED
15941594
message[1]->state = Homa::OutMessage::Status::FAILED;
1595-
message[1]->pingTimeout.expirationCycleTime = 9999;
1596-
// Message[2]: Normal timeout: SENT
1595+
message[1]->pingTimeout.expirationCycleTime = 9998;
1596+
// Message[2]: Normal timeout: NO_KEEP_ALIVE && SENT
1597+
message[2]->options = Homa::OutMessage::Options::NO_KEEP_ALIVE;
15971598
message[2]->state = Homa::OutMessage::Status::SENT;
1598-
message[2]->pingTimeout.expirationCycleTime = 10000;
1599-
// Message[3]: No timeout
1600-
message[3]->pingTimeout.expirationCycleTime = 10001;
1599+
message[2]->pingTimeout.expirationCycleTime = 9999;
1600+
// Message[3]: Normal timeout: SENT
1601+
message[3]->state = Homa::OutMessage::Status::SENT;
1602+
message[3]->pingTimeout.expirationCycleTime = 10000;
1603+
// Message[4]: No timeout
1604+
message[4]->pingTimeout.expirationCycleTime = 10001;
16011605

16021606
EXPECT_EQ(10000U, PerfUtils::Cycles::rdtsc());
16031607

@@ -1608,19 +1612,21 @@ TEST_F(SenderTest, checkPingTimeouts_basic)
16081612

16091613
uint64_t nextTimeout = sender->checkPingTimeouts();
16101614

1611-
EXPECT_EQ(message[3]->pingTimeout.expirationCycleTime, nextTimeout);
1615+
EXPECT_EQ(message[4]->pingTimeout.expirationCycleTime, nextTimeout);
16121616
// Message[0]: Normal timeout: COMPLETED
16131617
EXPECT_EQ(nullptr, message[0]->pingTimeout.node.list);
16141618
// Message[1]: Normal timeout: FAILED
16151619
EXPECT_EQ(nullptr, message[1]->pingTimeout.node.list);
1616-
// Message[2]: Normal timeout: SENT
1617-
EXPECT_EQ(10100, message[2]->pingTimeout.expirationCycleTime);
1620+
// Message[2]: Normal timeout: NO_KEEP_ALIVE && SENT
1621+
EXPECT_EQ(nullptr, message[2]->pingTimeout.node.list);
1622+
// Message[3]: Normal timeout: SENT
1623+
EXPECT_EQ(10100, message[3]->pingTimeout.expirationCycleTime);
16181624
Protocol::Packet::CommonHeader* header =
16191625
static_cast<Protocol::Packet::CommonHeader*>(mockPacket.payload);
16201626
EXPECT_EQ(Protocol::Packet::PING, header->opcode);
1621-
EXPECT_EQ(message[2]->id, header->messageId);
1622-
// Message[3]: No timeout
1623-
EXPECT_EQ(10001, message[3]->pingTimeout.expirationCycleTime);
1627+
EXPECT_EQ(message[3]->id, header->messageId);
1628+
// Message[4]: No timeout
1629+
EXPECT_EQ(10001, message[4]->pingTimeout.expirationCycleTime);
16241630
}
16251631

16261632
TEST_F(SenderTest, checkPingTimeouts_empty)

0 commit comments

Comments
 (0)