|
38 | 38 |
|
39 | 39 | #include "flow/actorcompiler.h" // This must be the last #include. |
40 | 40 |
|
| 41 | +Version figureVersion(Version current, |
| 42 | + double now, |
| 43 | + Version reference, |
| 44 | + int64_t toAdd, |
| 45 | + double maxVersionRateModifier, |
| 46 | + int64_t maxVersionRateOffset) { |
| 47 | + // Versions should roughly follow wall-clock time, based on the |
| 48 | + // system clock of the current machine and an FDB-specific epoch. |
| 49 | + // Calculate the expected version and determine whether we need to |
| 50 | + // hand out versions faster or slower to stay in sync with the |
| 51 | + // clock. |
| 52 | + Version expected = now * SERVER_KNOBS->VERSIONS_PER_SECOND - reference; |
| 53 | + |
| 54 | + // Attempt to jump directly to the expected version. But make |
| 55 | + // sure that versions are still being handed out at a rate |
| 56 | + // around VERSIONS_PER_SECOND. This rate is scaled depending on |
| 57 | + // how far off the calculated version is from the expected |
| 58 | + // version. |
| 59 | + int64_t maxOffset = std::min(static_cast<int64_t>(toAdd * maxVersionRateModifier), maxVersionRateOffset); |
| 60 | + return std::clamp(expected, current + toAdd - maxOffset, current + toAdd + maxOffset); |
| 61 | +} |
| 62 | + |
41 | 63 | ACTOR Future<Void> getVersion(Reference<MasterData> self, GetCommitVersionRequest req) { |
42 | 64 | // TODO: we likely can pre-bake something to make these calls easier, without the explicit Promise creation |
43 | 65 | auto promise = Promise<Void>(); |
@@ -340,34 +362,34 @@ ACTOR Future<Void> masterServer(MasterInterface mi, |
340 | 362 |
|
341 | 363 | TEST_CASE("/fdbserver/MasterServer/FigureVersion/Simple") { |
342 | 364 | ASSERT_EQ( |
343 | | - fdbserver_swift::figureVersion(0, 1.0, 0, 1e6, SERVER_KNOBS->MAX_VERSION_RATE_MODIFIER, SERVER_KNOBS->MAX_VERSION_RATE_OFFSET), |
| 365 | + figureVersion(0, 1.0, 0, 1e6, SERVER_KNOBS->MAX_VERSION_RATE_MODIFIER, SERVER_KNOBS->MAX_VERSION_RATE_OFFSET), |
344 | 366 | 1e6); |
345 | | - ASSERT_EQ(fdbserver_swift::figureVersion(1e6, 1.5, 0, 100, 0.1, 1e6), 1000110); |
346 | | - ASSERT_EQ(fdbserver_swift::figureVersion(1e6, 1.5, 0, 550000, 0.1, 1e6), 1500000); |
| 367 | + ASSERT_EQ(figureVersion(1e6, 1.5, 0, 100, 0.1, 1e6), 1000110); |
| 368 | + ASSERT_EQ(figureVersion(1e6, 1.5, 0, 550000, 0.1, 1e6), 1500000); |
347 | 369 | return Void(); |
348 | 370 | } |
349 | 371 |
|
350 | 372 | TEST_CASE("/fdbserver/MasterServer/FigureVersion/Small") { |
351 | 373 | // Should always advance by at least 1 version. |
352 | | - ASSERT_EQ(fdbserver_swift::figureVersion(1e6, 2.0, 0, 1, 0.0001, 1e6), 1000001); |
353 | | - ASSERT_EQ(fdbserver_swift::figureVersion(1e6, 0.0, 0, 1, 0.1, 1e6), 1000001); |
| 374 | + ASSERT_EQ(figureVersion(1e6, 2.0, 0, 1, 0.0001, 1e6), 1000001); |
| 375 | + ASSERT_EQ(figureVersion(1e6, 0.0, 0, 1, 0.1, 1e6), 1000001); |
354 | 376 | return Void(); |
355 | 377 | } |
356 | 378 |
|
357 | 379 | TEST_CASE("/fdbserver/MasterServer/FigureVersion/MaxOffset") { |
358 | | - ASSERT_EQ(fdbserver_swift::figureVersion(1e6, 10.0, 0, 5e6, 0.1, 1e6), 6500000); |
359 | | - ASSERT_EQ(fdbserver_swift::figureVersion(1e6, 20.0, 0, 15e6, 0.1, 1e6), 17e6); |
| 380 | + ASSERT_EQ(figureVersion(1e6, 10.0, 0, 5e6, 0.1, 1e6), 6500000); |
| 381 | + ASSERT_EQ(figureVersion(1e6, 20.0, 0, 15e6, 0.1, 1e6), 17e6); |
360 | 382 | return Void(); |
361 | 383 | } |
362 | 384 |
|
363 | 385 | TEST_CASE("/fdbserver/MasterServer/FigureVersion/PositiveReferenceVersion") { |
364 | | - ASSERT_EQ(fdbserver_swift::figureVersion(1e6, 3.0, 1e6, 1e6, 0.1, 1e6), 2e6); |
365 | | - ASSERT_EQ(fdbserver_swift::figureVersion(1e6, 3.0, 1e6, 100, 0.1, 1e6), 1000110); |
| 386 | + ASSERT_EQ(figureVersion(1e6, 3.0, 1e6, 1e6, 0.1, 1e6), 2e6); |
| 387 | + ASSERT_EQ(figureVersion(1e6, 3.0, 1e6, 100, 0.1, 1e6), 1000110); |
366 | 388 | return Void(); |
367 | 389 | } |
368 | 390 |
|
369 | 391 | TEST_CASE("/fdbserver/MasterServer/FigureVersion/NegativeReferenceVersion") { |
370 | | - ASSERT_EQ(fdbserver_swift::figureVersion(0, 2.0, -1e6, 3e6, 0.1, 1e6), 3e6); |
371 | | - ASSERT_EQ(fdbserver_swift::figureVersion(0, 2.0, -1e6, 5e5, 0.1, 1e6), 550000); |
| 392 | + ASSERT_EQ(figureVersion(0, 2.0, -1e6, 3e6, 0.1, 1e6), 3e6); |
| 393 | + ASSERT_EQ(figureVersion(0, 2.0, -1e6, 5e5, 0.1, 1e6), 550000); |
372 | 394 | return Void(); |
373 | 395 | } |
0 commit comments