Skip to content

Commit ac2d4d4

Browse files
committed
fix THD::system_time to follow, well, system time
Because NOW() is set to system time, unless overriden. And both should follow big manual system time changes, while still coping with lowres system clocks. Ignoring system time changes is both confusing and breaks with restarts.
1 parent 30981dc commit ac2d4d4

File tree

6 files changed

+37
-33
lines changed

6 files changed

+37
-33
lines changed

sql/partition_info.cc

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -900,7 +900,7 @@ void partition_info::vers_set_hist_part(THD *thd)
900900

901901
if (vers_info->interval.is_set())
902902
{
903-
if (vers_info->hist_part->range_value > thd->system_time)
903+
if (vers_info->hist_part->range_value > thd->systime())
904904
return;
905905

906906
partition_element *next= NULL;
@@ -911,7 +911,7 @@ void partition_info::vers_set_hist_part(THD *thd)
911911
while ((next= it++) != vers_info->now_part)
912912
{
913913
vers_info->hist_part= next;
914-
if (next->range_value > thd->system_time)
914+
if (next->range_value > thd->systime())
915915
return;
916916
}
917917
goto warn;

sql/sql_class.cc

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -819,8 +819,7 @@ THD::THD(my_thread_id id, bool is_wsrep_applier, bool skip_global_sys_var_lock)
819819
// Must be reset to handle error with THD's created for init of mysqld
820820
lex->current_select= 0;
821821
start_utime= utime_after_query= 0;
822-
system_time= 0;
823-
system_time_sec_part= 0;
822+
system_time.start.val= system_time.sec= system_time.sec_part= 0;
824823
utime_after_lock= 0L;
825824
progress.arena= 0;
826825
progress.report_to_client= 0;

sql/sql_class.h

Lines changed: 25 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -2418,8 +2418,6 @@ class THD :public Statement,
24182418
// track down slow pthread_create
24192419
ulonglong prior_thr_create_utime, thr_create_utime;
24202420
ulonglong utime_after_query;
2421-
my_time_t system_time;
2422-
ulong system_time_sec_part;
24232421

24242422
// Process indicator
24252423
struct {
@@ -3430,30 +3428,37 @@ class THD :public Statement,
34303428
{ query_start_sec_part_used=1; return start_time_sec_part; }
34313429
MYSQL_TIME query_start_TIME();
34323430

3433-
private:
3434-
bool system_time_ge(my_time_t secs, ulong usecs)
3435-
{
3436-
return (system_time == secs && system_time_sec_part >= usecs) ||
3437-
system_time > secs;
3438-
}
3431+
struct {
3432+
my_hrtime_t start;
3433+
my_time_t sec;
3434+
ulong sec_part;
3435+
} system_time;
3436+
3437+
ulong systime_sec_part() { return system_time.sec_part; }
3438+
my_time_t systime() { return system_time.sec; }
34393439

3440+
private:
34403441
void set_system_time()
34413442
{
34423443
my_hrtime_t hrtime= my_hrtime();
3443-
my_time_t secs= hrtime_to_my_time(hrtime);
3444-
ulong usecs= hrtime_sec_part(hrtime);
3445-
if (system_time_ge(secs, usecs))
3444+
my_time_t sec= hrtime_to_my_time(hrtime);
3445+
ulong sec_part= hrtime_sec_part(hrtime);
3446+
if (sec > system_time.sec ||
3447+
(sec == system_time.sec && sec_part > system_time.sec_part) ||
3448+
hrtime.val < system_time.start.val)
34463449
{
3447-
if (++system_time_sec_part == HRTIME_RESOLUTION)
3448-
{
3449-
++system_time;
3450-
system_time_sec_part= 0;
3451-
}
3450+
system_time.sec= sec;
3451+
system_time.sec_part= sec_part;
34523452
}
34533453
else
34543454
{
3455-
system_time= secs;
3456-
system_time_sec_part= usecs;
3455+
if (system_time.sec_part < TIME_MAX_SECOND_PART)
3456+
system_time.sec_part++;
3457+
else
3458+
{
3459+
system_time.sec++;
3460+
system_time.sec_part= 0;
3461+
}
34573462
}
34583463
}
34593464

@@ -3468,8 +3473,8 @@ class THD :public Statement,
34683473
}
34693474
else
34703475
{
3471-
start_time= system_time;
3472-
start_time_sec_part= system_time_sec_part;
3476+
start_time= system_time.sec;
3477+
start_time_sec_part= system_time.sec_part;
34733478
}
34743479
PSI_CALL_set_thread_start_time(start_time);
34753480
}

sql/sql_partition.cc

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1574,7 +1574,7 @@ static bool check_vers_constants(THD *thd, partition_info *part_info)
15741574
my_tz_OFFSET0->TIME_to_gmt_sec(&ltime, &error);
15751575
if (error)
15761576
goto err;
1577-
if (vers_info->hist_part->range_value <= thd->system_time)
1577+
if (vers_info->hist_part->range_value <= thd->systime())
15781578
vers_info->hist_part= el;
15791579
}
15801580
return 0;
@@ -5314,7 +5314,7 @@ that are reorganised.
53145314
if (*fast_alter_table && tab_part_info->vers_info->interval.is_set())
53155315
{
53165316
partition_element *hist_part= tab_part_info->vers_info->hist_part;
5317-
if (hist_part->range_value <= thd->system_time)
5317+
if (hist_part->range_value <= thd->systime())
53185318
hist_part->part_state= PART_CHANGED;
53195319
}
53205320
}

sql/sql_yacc.yy

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5872,7 +5872,7 @@ opt_versioning_rotation:
58725872
opt_versioning_interval_start:
58735873
/* empty */
58745874
{
5875-
$$= thd->system_time;
5875+
$$= thd->systime();
58765876
}
58775877
| remember_tok_start STARTS_SYM ulong_num
58785878
{

sql/table.cc

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -7764,8 +7764,8 @@ void TABLE::vers_update_fields()
77647764
{
77657765
if (!vers_write)
77667766
return;
7767-
if (vers_start_field()->store_timestamp(in_use->system_time,
7768-
in_use->system_time_sec_part))
7767+
if (vers_start_field()->store_timestamp(in_use->systime(),
7768+
in_use->systime_sec_part()))
77697769
DBUG_ASSERT(0);
77707770
}
77717771
else
@@ -7780,8 +7780,8 @@ void TABLE::vers_update_fields()
77807780

77817781
void TABLE::vers_update_end()
77827782
{
7783-
if (vers_end_field()->store_timestamp(in_use->system_time,
7784-
in_use->system_time_sec_part))
7783+
if (vers_end_field()->store_timestamp(in_use->systime(),
7784+
in_use->systime_sec_part()))
77857785
DBUG_ASSERT(0);
77867786
}
77877787

@@ -8622,9 +8622,9 @@ bool TR_table::update(ulonglong start_id, ulonglong end_id)
86228622
if (!table && open())
86238623
return true;
86248624

8625-
timeval start_time= {thd->system_time, long(thd->system_time_sec_part)};
8625+
timeval start_time= {thd->systime(), long(thd->systime_sec_part())};
86268626
thd->set_start_time();
8627-
timeval end_time= {thd->system_time, long(thd->system_time_sec_part)};
8627+
timeval end_time= {thd->systime(), long(thd->systime_sec_part())};
86288628
store(FLD_TRX_ID, start_id);
86298629
store(FLD_COMMIT_ID, end_id);
86308630
store(FLD_BEGIN_TS, start_time);

0 commit comments

Comments
 (0)