Skip to content

Commit ecf9a28

Browse files
committed
yugabyte#5359: Revert "yugabyte#5081: Fix MetricsTest.SimpleLagTest"
Summary: This reverts commit 4c0a2fe. There is currently an issue with the new clock introduced with this diff that causes a crash in some scenarios when the metric is queried. ```#0 Now (this=0x742f680192a46a02) at ../../src/yb/common/clock.h:27 #1 lag_ms (this=0x5dadc40) at ../../src/yb/util/metrics.h:1355 #2 yb::AtomicMillisLag::WriteForPrometheus (this=0x5dadc40, writer=0x7fbdc2f84bb0, attr=..., opts=...) at ../../src/yb/util/metrics.h:1374 #3 0x00007fbdedc2ab83 in yb::MetricEntity::WriteForPrometheus (this=<optimized out>, writer=writer@entry=0x7fbdc2f84bb0, opts=...) at ../../src/yb/util/metrics.cc:351 #4 0x00007fbdedc2cf05 in yb::MetricRegistry::WriteForPrometheus (this=this@entry=0x1a70a80, writer=writer@entry=0x7fbdc2f84bb0, opts=...) at ../../src/yb/util/metrics.cc:491 #5 0x00007fbdf2cfe6d0 in yb::(anonymous namespace)::WriteForPrometheus (metrics=0x1a70a80, req=..., resp=0x7fbdc2f84de0) at ../../src/yb/server/default-path-handlers.cc:278 #6 0x00007fbdf2d2d95c in operator() (__args#1=0x7fbdc2f84de0, __args#0=..., this=<optimized out>) at /home/yugabyte/yb-software/yugabyte-2.3.0.0-b88-centos-x86_64/linuxbrew-xxxxxxxxxxxxx/Cellar/gcc/5.5.0_4/include/c++/5.5.0/functional:2267 #7 yb::Webserver::RunPathHandler (this=this@entry=0x1d64000, handler=..., connection=connection@entry=0x7d88000, request_info=request_info@entry=0x7d88000) at ../../src/yb/server/webserver.cc:423 #8 0x00007fbdf2d2e5ea in yb::Webserver::BeginRequestCallback (this=0x1d64000, connection=0x7d88000, request_info=0x7d88000) at ../../src/yb/server/webserver.cc:360 #9 0x00007fbdf2d438f6 in handle_request () from /home/yugabyte/yb-software/yugabyte-2.3.0.0-b88-centos-x86_64/lib/yb/libserver_process.so #10 0x00007fbdf2d464de in worker_thread () from /home/yugabyte/yb-software/yugabyte-2.3.0.0-b88-centos-x86_64/lib/yb/libserver_process.so #11 0x00007fbde84c5694 in start_thread (arg=0x7fbdc2f8f700) at pthread_create.c:333 yugabyte#12 0x00007fbde7c0241d in clone () at ../sysdeps/unix/sysv/linux/x86_64/clone.S:109``` Test Plan: Build and unit tests Reviewers: bogdan, amitanand, kannan Reviewed By: kannan Subscribers: kannan, ybase Differential Revision: https://phabricator.dev.yugabyte.com/D9322
1 parent 8af029e commit ecf9a28

File tree

9 files changed

+62
-141
lines changed

9 files changed

+62
-141
lines changed

src/yb/common/hybrid_time.h

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -202,11 +202,6 @@ class HybridTime {
202202
return v >> kBitsForLogicalComponent;
203203
}
204204

205-
// Returns the physical value embedded in this HybridTime, in milliseconds.
206-
inline MillisTime GetPhysicalValueMillis() const {
207-
return GetPhysicalValueMicros() / 1000;
208-
}
209-
210205
inline int64_t PhysicalDiff(const HybridTime& other) const {
211206
return static_cast<int64_t>(GetPhysicalValueMicros() - other.GetPhysicalValueMicros());
212207
}

src/yb/consensus/raft_consensus.cc

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -340,7 +340,7 @@ RaftConsensus::RaftConsensus(
340340
term_metric_(metric_entity->FindOrCreateGauge(&METRIC_raft_term,
341341
cmeta->current_term())),
342342
follower_last_update_time_ms_metric_(
343-
metric_entity->FindOrCreateAtomicMillisLag(&METRIC_follower_lag_ms, clock_)),
343+
metric_entity->FindOrCreateAtomicMillisLag(&METRIC_follower_lag_ms)),
344344
is_raft_leader_metric_(metric_entity->FindOrCreateGauge(&METRIC_is_raft_leader,
345345
static_cast<int64_t>(0))),
346346
parent_mem_tracker_(std::move(parent_mem_tracker)),
@@ -954,7 +954,7 @@ Status RaftConsensus::BecomeLeaderUnlocked() {
954954
// Set the timestamp to max uint64_t so that every time this metric is queried, the returned
955955
// lag is 0. We will need to restore the timestamp once this peer steps down.
956956
follower_last_update_time_ms_metric_->UpdateTimestampInMilliseconds(
957-
std::numeric_limits<uint64_t>::max());
957+
std::numeric_limits<int64_t>::max());
958958
is_raft_leader_metric_->set_value(1);
959959

960960
return Status::OK();

src/yb/server/CMakeLists.txt

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,6 @@ ADD_YB_TEST(hybrid_clock-test)
5858
ADD_YB_TEST(logical_clock-test)
5959
# This test is here and not in common because we need access to HybridClock.
6060
ADD_YB_TEST(doc_hybrid_time-test)
61-
ADD_YB_TEST(lag_metrics_test)
6261

6362
#########################################
6463
# server_base_proto

src/yb/server/clock.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@
3636
#include <string>
3737

3838
#include "yb/common/clock.h"
39+
#include "yb/common/common.pb.h"
3940
#include "yb/common/hybrid_time.h"
4041

4142
#include "yb/gutil/ref_counted.h"

src/yb/server/lag_metrics_test.cc

Lines changed: 0 additions & 90 deletions
This file was deleted.

src/yb/util/metrics-test.cc

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -66,6 +66,22 @@ class MetricsTest : public YBTest {
6666
}
6767

6868
protected:
69+
template <class LagType>
70+
void DoLagTest(const MillisLagPrototype& metric) {
71+
auto lag = new LagType(&metric);
72+
ASSERT_EQ(metric.description(), lag->prototype()->description());
73+
auto now_ms = std::chrono::duration_cast<std::chrono::milliseconds>(
74+
std::chrono::system_clock::now().time_since_epoch()).count();
75+
SleepFor(MonoDelta::FromMilliseconds(100));
76+
ASSERT_LT(now_ms, lag->lag_ms());
77+
lag->UpdateTimestampInMilliseconds(now_ms);
78+
ASSERT_GT(10000, lag->lag_ms());
79+
// Set the timestamp to some time in the future to verify that the metric can correctly deal
80+
// with this case.
81+
lag->UpdateTimestampInMilliseconds(now_ms * 2);
82+
ASSERT_EQ(0, lag->lag_ms());
83+
}
84+
6985
MetricRegistry registry_;
7086
scoped_refptr<MetricEntity> entity_;
7187
};
@@ -84,6 +100,17 @@ TEST_F(MetricsTest, SimpleCounterTest) {
84100
ASSERT_EQ(3, requests->value());
85101
}
86102

103+
METRIC_DEFINE_lag(test_entity, lag_simple, "Test MillisLag", "Test MillisLag Description");
104+
TEST_F(MetricsTest, SimpleLagTest) {
105+
ASSERT_NO_FATALS(DoLagTest<MillisLag>(METRIC_lag_simple));
106+
}
107+
108+
METRIC_DEFINE_lag(test_entity, atomic_lag_simple, "Test Atomic MillisLag",
109+
"Test Atomic MillisLag Description");
110+
TEST_F(MetricsTest, SimpleAtomicLagTest) {
111+
ASSERT_NO_FATALS(DoLagTest<AtomicMillisLag>(METRIC_atomic_lag_simple));
112+
}
113+
87114
METRIC_DEFINE_gauge_uint64(test_entity, fake_memory_usage, "Memory Usage",
88115
MetricUnit::kBytes, "Test Gauge 1");
89116

src/yb/util/metrics.cc

Lines changed: 5 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -776,12 +776,11 @@ CHECKED_STATUS Counter::WriteForPrometheus(
776776
//
777777

778778
scoped_refptr<MillisLag> MillisLagPrototype::Instantiate(
779-
const scoped_refptr<MetricEntity>& entity, const scoped_refptr<server::Clock>& clock) {
780-
return entity->FindOrCreateMillisLag(this, clock);
779+
const scoped_refptr<MetricEntity>& entity) {
780+
return entity->FindOrCreateMillisLag(this);
781781
}
782782

783-
MillisLag::MillisLag(const MillisLagPrototype* proto, const scoped_refptr<server::Clock>& clock)
784-
: Metric(proto), clock_(clock), timestamp_ms_(clock_->Now().GetPhysicalValueMillis()) {
783+
MillisLag::MillisLag(const MillisLagPrototype* proto) : Metric(proto) {
785784
}
786785

787786
Status MillisLag::WriteAsJson(JsonWriter* writer, const MetricJsonOptions& opts) const {
@@ -794,7 +793,7 @@ Status MillisLag::WriteAsJson(JsonWriter* writer, const MetricJsonOptions& opts)
794793
prototype_->WriteFields(writer, opts);
795794

796795
writer->String("value");
797-
writer->Uint64(lag_ms());
796+
writer->Int64(lag_ms());
798797

799798
writer->EndObject();
800799
return Status::OK();
@@ -810,11 +809,6 @@ Status MillisLag::WriteForPrometheus(
810809
return writer->WriteSingleEntry(attr, prototype_->name(), lag_ms());
811810
}
812811

813-
AtomicMillisLag::AtomicMillisLag(const MillisLagPrototype* proto,
814-
const scoped_refptr<server::Clock>& clock)
815-
: MillisLag(proto, clock), atomic_timestamp_ms_(clock_->Now().GetPhysicalValueMillis()) {
816-
}
817-
818812
Status AtomicMillisLag::WriteAsJson(JsonWriter* writer, const MetricJsonOptions& opts) const {
819813
if (prototype_->level() < opts.level) {
820814
return Status::OK();
@@ -825,7 +819,7 @@ Status AtomicMillisLag::WriteAsJson(JsonWriter* writer, const MetricJsonOptions&
825819
prototype_->WriteFields(writer, opts);
826820

827821
writer->String("value");
828-
writer->Uint64(this->lag_ms());
822+
writer->Int64(this->lag_ms());
829823

830824
writer->EndObject();
831825
return Status::OK();

src/yb/util/metrics.h

Lines changed: 27 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -258,8 +258,6 @@
258258
#include "yb/gutil/ref_counted.h"
259259
#include "yb/gutil/singleton.h"
260260

261-
#include "yb/server/clock.h"
262-
263261
#include "yb/util/atomic.h"
264262
#include "yb/util/jsonwriter.h"
265263
#include "yb/util/locks.h"
@@ -560,11 +558,8 @@ class MetricEntity : public RefCountedThreadSafe<MetricEntity> {
560558
ExternalPrometheusMetricsCb;
561559

562560
scoped_refptr<Counter> FindOrCreateCounter(const CounterPrototype* proto);
563-
scoped_refptr<MillisLag> FindOrCreateMillisLag(const MillisLagPrototype* proto,
564-
const scoped_refptr<server::Clock>& clock);
565-
scoped_refptr<AtomicMillisLag> FindOrCreateAtomicMillisLag(
566-
const MillisLagPrototype* proto,
567-
const scoped_refptr<server::Clock>& clock);
561+
scoped_refptr<MillisLag> FindOrCreateMillisLag(const MillisLagPrototype* proto);
562+
scoped_refptr<AtomicMillisLag> FindOrCreateAtomicMillisLag(const MillisLagPrototype* proto);
568563
scoped_refptr<Histogram> FindOrCreateHistogram(const HistogramPrototype* proto);
569564

570565
template<typename T>
@@ -1311,8 +1306,7 @@ class MillisLagPrototype : public MetricPrototype {
13111306
public:
13121307
explicit MillisLagPrototype(const MetricPrototype::CtorArgs& args) : MetricPrototype(args) {
13131308
}
1314-
scoped_refptr<MillisLag> Instantiate(const scoped_refptr<MetricEntity>& entity,
1315-
const scoped_refptr<server::Clock>& clock);
1309+
scoped_refptr<MillisLag> Instantiate(const scoped_refptr<MetricEntity>& entity);
13161310

13171311
virtual MetricType::Type type() const override { return MetricType::kLag; }
13181312

@@ -1325,13 +1319,12 @@ class MillisLagPrototype : public MetricPrototype {
13251319
// will be in charge of calculating the lag by doing now() - metric_timestamp_.
13261320
class MillisLag : public Metric {
13271321
public:
1328-
MillisLag(const MillisLagPrototype* proto, const scoped_refptr<server::Clock>& clock);
1329-
1330-
virtual uint64_t lag_ms() const {
1331-
auto now = clock_->Now().GetPhysicalValueMillis();
1332-
return now > timestamp_ms_ ? now - timestamp_ms_ : 0;
1322+
virtual int64_t lag_ms() const {
1323+
return std::max(static_cast<int64_t>(0),
1324+
static_cast<int64_t>(std::chrono::duration_cast<std::chrono::milliseconds>(
1325+
std::chrono::system_clock::now().time_since_epoch()).count()) - timestamp_ms_);
13331326
}
1334-
virtual void UpdateTimestampInMilliseconds(uint64_t timestamp) {
1327+
virtual void UpdateTimestampInMilliseconds(int64_t timestamp) {
13351328
timestamp_ms_ = timestamp;
13361329
}
13371330
virtual CHECKED_STATUS WriteAsJson(JsonWriter* w,
@@ -1340,24 +1333,28 @@ class MillisLag : public Metric {
13401333
PrometheusWriter* writer, const MetricEntity::AttributeMap& attr,
13411334
const MetricPrometheusOptions& opts) const override;
13421335

1343-
protected:
1344-
const scoped_refptr<server::Clock>& clock_;
1345-
13461336
private:
1347-
uint64_t timestamp_ms_;
1337+
friend class MetricEntity;
1338+
friend class AtomicMillisLag;
1339+
friend class MetricsTest;
1340+
1341+
explicit MillisLag(const MillisLagPrototype* proto);
1342+
1343+
int64_t timestamp_ms_;
13481344
};
13491345

13501346
class AtomicMillisLag : public MillisLag {
13511347
public:
1352-
AtomicMillisLag(const MillisLagPrototype* proto, const scoped_refptr<server::Clock>& clock);
1348+
explicit AtomicMillisLag(const MillisLagPrototype* proto) : MillisLag(proto) {}
13531349

1354-
uint64_t lag_ms() const override {
1355-
auto now = clock_->Now().GetPhysicalValueMillis();
1356-
auto timestamp = atomic_timestamp_ms_.load(std::memory_order_acquire);
1357-
return now > timestamp ? now - timestamp : 0;
1350+
int64_t lag_ms() const override {
1351+
return std::max(static_cast<int64_t>(0),
1352+
static_cast<int64_t>(std::chrono::duration_cast<std::chrono::milliseconds>(
1353+
std::chrono::system_clock::now().time_since_epoch()).count()) -
1354+
atomic_timestamp_ms_.load(std::memory_order_acquire));
13581355
}
13591356

1360-
void UpdateTimestampInMilliseconds(uint64_t timestamp) override {
1357+
void UpdateTimestampInMilliseconds(int64_t timestamp) override {
13611358
atomic_timestamp_ms_.store(timestamp, std::memory_order_release);
13621359
}
13631360

@@ -1375,8 +1372,7 @@ class AtomicMillisLag : public MillisLag {
13751372
}
13761373

13771374
protected:
1378-
std::atomic<uint64_t> atomic_timestamp_ms_;
1379-
1375+
std::atomic<int64_t> atomic_timestamp_ms_;
13801376
private:
13811377
DISALLOW_COPY_AND_ASSIGN(AtomicMillisLag);
13821378
};
@@ -1505,25 +1501,25 @@ inline scoped_refptr<Counter> MetricEntity::FindOrCreateCounter(
15051501
}
15061502

15071503
inline scoped_refptr<MillisLag> MetricEntity::FindOrCreateMillisLag(
1508-
const MillisLagPrototype* proto, const scoped_refptr<server::Clock>& clock) {
1504+
const MillisLagPrototype* proto) {
15091505
CheckInstantiation(proto);
15101506
std::lock_guard<simple_spinlock> l(lock_);
15111507
scoped_refptr<MillisLag> m = down_cast<MillisLag*>(FindPtrOrNull(metric_map_, proto).get());
15121508
if (!m) {
1513-
m = new MillisLag(proto, clock);
1509+
m = new MillisLag(proto);
15141510
InsertOrDie(&metric_map_, proto, m);
15151511
}
15161512
return m;
15171513
}
15181514

15191515
inline scoped_refptr<AtomicMillisLag> MetricEntity::FindOrCreateAtomicMillisLag(
1520-
const MillisLagPrototype* proto, const scoped_refptr<server::Clock>& clock) {
1516+
const MillisLagPrototype* proto) {
15211517
CheckInstantiation(proto);
15221518
std::lock_guard<simple_spinlock> l(lock_);
15231519
scoped_refptr<AtomicMillisLag> m = down_cast<AtomicMillisLag*>(
15241520
FindPtrOrNull(metric_map_, proto).get());
15251521
if (!m) {
1526-
m = new AtomicMillisLag(proto, clock);
1522+
m = new AtomicMillisLag(proto);
15271523
InsertOrDie(&metric_map_, proto, m);
15281524
}
15291525
return m;

src/yb/util/physical_time.h

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,6 @@
2121
namespace yb {
2222

2323
using MicrosTime = uint64_t;
24-
using MillisTime = uint64_t;
2524

2625
struct PhysicalTime {
2726
MicrosTime time_point;

0 commit comments

Comments
 (0)