Changeset: 3cf1dd61f451 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=3cf1dd61f451
Added Files:
sql/backends/monet5/sql_datetrunc.c
sql/test/BugTracker-2019/Tests/date_trunc.sql
sql/test/BugTracker-2019/Tests/date_trunc.stable.err
sql/test/BugTracker-2019/Tests/date_trunc.stable.out
sql/test/BugTracker-2019/Tests/date_trunc_bulk.sql
sql/test/BugTracker-2019/Tests/date_trunc_bulk.stable.err
sql/test/BugTracker-2019/Tests/date_trunc_bulk.stable.out
sql/test/FeatureRequests/Tests/enhanced_date_operators.sql
Modified Files:
clients/Tests/MAL-signatures.stable.out
clients/Tests/MAL-signatures.stable.out.int128
clients/Tests/exports.stable.out
gdk/gdk_imprints.c
gdk/gdk_system.c
gdk/gdk_system.h
gdk/gdk_system_private.h
gdk/gdk_utils.c
monetdb5/mal/mal_client.c
monetdb5/mal/mal_client.h
monetdb5/mal/mal_dataflow.c
monetdb5/mal/mal_profiler.c
monetdb5/mal/mal_scenario.c
monetdb5/mal/mal_session.c
monetdb5/modules/atoms/mtime.c
monetdb5/modules/atoms/mtime.h
monetdb5/modules/mal/mal_mapi.c
sql/backends/monet5/Makefile.ag
sql/backends/monet5/sql.h
sql/backends/monet5/sql.mal
sql/backends/monet5/sql_bat2time.c
sql/backends/monet5/sql_execute.c
sql/backends/monet5/sql_scenario.c
sql/backends/monet5/sql_upgrades.c
sql/backends/monet5/wlr.c
sql/scripts/17_temporal.sql
sql/storage/store.c
sql/test/BugTracker-2019/Tests/All
sql/test/Tests/systemfunctions.stable.out
sql/test/Tests/systemfunctions.stable.out.int128
sql/test/emptydb-upgrade-chain-hge/Tests/upgrade.stable.out.int128
sql/test/emptydb-upgrade-chain-hge/Tests/upgrade.stable.out.powerpc64.int128
sql/test/emptydb-upgrade-chain/Tests/upgrade.stable.out
sql/test/emptydb-upgrade-chain/Tests/upgrade.stable.out.32bit
sql/test/emptydb-upgrade-chain/Tests/upgrade.stable.out.int128
sql/test/emptydb-upgrade-chain/Tests/upgrade.stable.out.powerpc64
sql/test/emptydb-upgrade-chain/Tests/upgrade.stable.out.powerpc64.int128
sql/test/emptydb-upgrade-hge/Tests/upgrade.stable.out.int128
sql/test/emptydb-upgrade/Tests/upgrade.stable.out
sql/test/emptydb-upgrade/Tests/upgrade.stable.out.32bit
sql/test/emptydb-upgrade/Tests/upgrade.stable.out.int128
sql/test/emptydb/Tests/check.stable.out
sql/test/emptydb/Tests/check.stable.out.32bit
sql/test/emptydb/Tests/check.stable.out.int128
sql/test/testdb-upgrade-chain-hge/Tests/upgrade.stable.out.int128
sql/test/testdb-upgrade-chain/Tests/upgrade.stable.out
sql/test/testdb-upgrade-chain/Tests/upgrade.stable.out.32bit
sql/test/testdb-upgrade-chain/Tests/upgrade.stable.out.int128
sql/test/testdb-upgrade-hge/Tests/upgrade.stable.out.int128
sql/test/testdb-upgrade/Tests/upgrade.stable.out
sql/test/testdb-upgrade/Tests/upgrade.stable.out.32bit
sql/test/testdb-upgrade/Tests/upgrade.stable.out.int128
sql/test/testdb-upgrade/Tests/upgrade.stable.out.powerpc64.int128
Branch: default
Log Message:
Merge with Apr2019 branch.
diffs (truncated from 1919 to 300 lines):
diff --git a/clients/Tests/MAL-signatures.stable.out
b/clients/Tests/MAL-signatures.stable.out
--- a/clients/Tests/MAL-signatures.stable.out
+++ b/clients/Tests/MAL-signatures.stable.out
@@ -11675,6 +11675,8 @@ Ready.
[ "sql", "cume_dist", "pattern sql.cume_dist(b:any_1, p:bit,
o:bit):dbl ", "SQLcume_dist;", "return the accumulated distribution
of the number of rows per group to the total number of partition rows" ]
[ "sql", "current_time", "pattern sql.current_time():daytime ",
"SQLcurrent_daytime;", "Get the clients current daytime" ]
[ "sql", "current_timestamp", "pattern
sql.current_timestamp():timestamp ", "SQLcurrent_timestamp;", "Get the
clients current timestamp" ]
+[ "sql", "date_trunc", "command sql.date_trunc(scale:str,
v:bat[:timestamp]):bat[:timestamp] ", "bat_date_trunc;", "Truncate
a timestamp to (millenium,
century,decade,year,quarter,month,week,day,hour,minute,second,
milliseconds,microseconds)" ]
+[ "sql", "date_trunc", "command sql.date_trunc(scale:str,
v:timestamp):timestamp ", "date_trunc;", "Truncate a timestamp to
(millenium, century,decade,year,quarter,month,week,day,hour,minute,second,
milliseconds,microseconds)" ]
[ "sql", "db_users", "pattern sql.db_users():bat[:str] ",
"db_users_wrap;", "return table of users with sql scenario" ]
[ "sql", "dec_round", "command sql.dec_round(v:bte, r:bte):bte ",
"bte_dec_round_wrap;", "round off the value v to nearests multiple of r"
]
[ "sql", "dec_round", "command sql.dec_round(v:dbl, r:dbl):dbl ",
"dbl_dec_round_wrap;", "round off the value v to nearests multiple of r"
]
diff --git a/clients/Tests/MAL-signatures.stable.out.int128
b/clients/Tests/MAL-signatures.stable.out.int128
--- a/clients/Tests/MAL-signatures.stable.out.int128
+++ b/clients/Tests/MAL-signatures.stable.out.int128
@@ -16088,6 +16088,8 @@ Ready.
[ "sql", "cume_dist", "pattern sql.cume_dist(b:any_1, p:bit,
o:bit):dbl ", "SQLcume_dist;", "return the accumulated distribution
of the number of rows per group to the total number of partition rows" ]
[ "sql", "current_time", "pattern sql.current_time():daytime ",
"SQLcurrent_daytime;", "Get the clients current daytime" ]
[ "sql", "current_timestamp", "pattern
sql.current_timestamp():timestamp ", "SQLcurrent_timestamp;", "Get the
clients current timestamp" ]
+[ "sql", "date_trunc", "command sql.date_trunc(scale:str,
v:bat[:timestamp]):bat[:timestamp] ", "bat_date_trunc;", "Truncate
a timestamp to (millenium,
century,decade,year,quarter,month,week,day,hour,minute,second,
milliseconds,microseconds)" ]
+[ "sql", "date_trunc", "command sql.date_trunc(scale:str,
v:timestamp):timestamp ", "date_trunc;", "Truncate a timestamp to
(millenium, century,decade,year,quarter,month,week,day,hour,minute,second,
milliseconds,microseconds)" ]
[ "sql", "db_users", "pattern sql.db_users():bat[:str] ",
"db_users_wrap;", "return table of users with sql scenario" ]
[ "sql", "dec_round", "command sql.dec_round(v:bte, r:bte):bte ",
"bte_dec_round_wrap;", "round off the value v to nearests multiple of r"
]
[ "sql", "dec_round", "command sql.dec_round(v:dbl, r:dbl):dbl ",
"dbl_dec_round_wrap;", "round off the value v to nearests multiple of r"
]
diff --git a/clients/Tests/exports.stable.out b/clients/Tests/exports.stable.out
--- a/clients/Tests/exports.stable.out
+++ b/clients/Tests/exports.stable.out
@@ -318,6 +318,7 @@ bool MT_thread_init(void);
void MT_thread_setdata(void *data);
void MT_thread_setlockwait(MT_Lock *lock);
void MT_thread_setsemawait(MT_Sema *sema);
+void MT_thread_setworking(const char *work);
void OIDXdestroy(BAT *b);
ssize_t OIDfromStr(const char *src, size_t *len, oid **dst, bool external);
ssize_t OIDtoStr(str *dst, size_t *len, const oid *src, bool external);
@@ -1499,6 +1500,7 @@ str MTIMEdate_extract_quarter_bulk(bat *
str MTIMEdate_extract_weekofyear(int *ret, const date *v);
str MTIMEdate_extract_year(int *ret, const date *v);
str MTIMEdate_extract_year_bulk(bat *ret, const bat *bid);
+str MTIMEdate_extract_ymd(int *year, int *month, int *day, const date *v);
str MTIMEdate_fromstr(date *ret, const char *const *s);
str MTIMEdate_sub_msec_interval_lng_wrap(date *ret, const date *t, const lng
*msec);
str MTIMEdate_sub_sec_interval_wrap(date *ret, const date *t, const int *sec);
diff --git a/gdk/gdk_imprints.c b/gdk/gdk_imprints.c
--- a/gdk/gdk_imprints.c
+++ b/gdk/gdk_imprints.c
@@ -360,7 +360,6 @@ BATimprints(BAT *b)
if (BATcheckimprints(b))
return GDK_SUCCEED;
- assert(b->timprints == NULL);
if (VIEWtparent(b)) {
/* views always keep null pointer and need to obtain
@@ -370,7 +369,6 @@ BATimprints(BAT *b)
assert(b);
if (BATcheckimprints(b))
return GDK_SUCCEED;
- assert(b->timprints == NULL);
}
MT_lock_set(&GDKimprintsLock(b->batCacheid));
ACCELDEBUG t0 = GDKusec();
diff --git a/gdk/gdk_system.c b/gdk/gdk_system.c
--- a/gdk/gdk_system.c
+++ b/gdk/gdk_system.c
@@ -174,6 +174,7 @@ static struct winthread {
MT_Lock *lockwait; /* lock we're waiting for */
MT_Sema *semawait; /* semaphore we're waiting for */
struct winthread *joinwait; /* process we are joining with */
+ const char *working; /* what we're currently doing */
ATOMIC_TYPE exited;
bool detached:1, waiting:1;
char threadname[16];
@@ -186,6 +187,23 @@ static struct winthread mainthread = {
static CRITICAL_SECTION winthread_cs;
static DWORD threadslot = TLS_OUT_OF_INDEXES;
+void
+dump_threads(void)
+{
+ EnterCriticalSection(&winthread_cs);
+ for (struct winthread *w = winthreads; w; w = w->next) {
+ fprintf(stderr, "%s, waiting for %s, working on %.200s\n",
+ w->threadname,
+ w->lockwait ? w->lockwait->name :
+ w->semawait ? w->semawait->name :
+ w->joinwait ? w->joinwait->threadname :
+ "nothing",
+ ATOMIC_GET(&w->exited) ? "exiting" :
+ w->working ? w->working : "nothing");
+ }
+ LeaveCriticalSection(&winthread_cs);
+}
+
bool
MT_thread_init(void)
{
@@ -250,6 +268,15 @@ MT_thread_setsemawait(MT_Sema *sema)
w->semawait = sema;
}
+void
+MT_thread_setworking(const char *work)
+{
+ struct winthread *w = TlsGetValue(threadslot);
+
+ if (w)
+ w->working = work;
+}
+
void *
MT_thread_getdata(void)
{
@@ -398,6 +425,7 @@ MT_exiting_thread(void)
if (w) {
ATOMIC_SET(&w->exited, 1);
+ w->working = NULL;
}
}
@@ -459,6 +487,7 @@ static struct posthread {
MT_Lock *lockwait; /* lock we're waiting for */
MT_Sema *semawait; /* semaphore we're waiting for */
struct posthread *joinwait; /* process we are joining with */
+ const char *working; /* what we're currently doing */
char threadname[16];
pthread_t tid;
MT_Id mtid;
@@ -475,6 +504,23 @@ static MT_Id MT_thread_id = 1;
static pthread_key_t threadkey;
+void
+dump_threads(void)
+{
+ pthread_mutex_lock(&posthread_lock);
+ for (struct posthread *p = posthreads; p; p = p->next) {
+ fprintf(stderr, "%s, waiting for %s, working on %.200s\n",
+ p->threadname,
+ p->lockwait ? p->lockwait->name :
+ p->semawait ? p->semawait->name :
+ p->joinwait ? p->joinwait->threadname :
+ "nothing",
+ ATOMIC_GET(&p->exited) ? "exiting" :
+ p->working ? p->working : "nothing");
+ }
+ pthread_mutex_unlock(&posthread_lock);
+}
+
bool
MT_thread_init(void)
{
@@ -551,6 +597,15 @@ MT_thread_setsemawait(MT_Sema *sema)
p->semawait = sema;
}
+void
+MT_thread_setworking(const char *work)
+{
+ struct posthread *p = pthread_getspecific(threadkey);
+
+ if (p)
+ p->working = work;
+}
+
#ifdef HAVE_PTHREAD_SIGMASK
static void
MT_thread_sigmask(sigset_t *new_mask, sigset_t *orig_mask)
@@ -732,6 +787,7 @@ MT_exiting_thread(void)
p = pthread_getspecific(threadkey);
if (p) {
ATOMIC_SET(&p->exited, 1);
+ p->working = NULL;
}
}
diff --git a/gdk/gdk_system.h b/gdk/gdk_system.h
--- a/gdk/gdk_system.h
+++ b/gdk/gdk_system.h
@@ -637,6 +637,7 @@ typedef struct {
gdk_export void MT_thread_setlockwait(MT_Lock *lock);
gdk_export void MT_thread_setsemawait(MT_Sema *sema);
+gdk_export void MT_thread_setworking(const char *work);
gdk_export int MT_check_nr_cores(void);
diff --git a/gdk/gdk_system_private.h b/gdk/gdk_system_private.h
--- a/gdk/gdk_system_private.h
+++ b/gdk/gdk_system_private.h
@@ -12,6 +12,8 @@
#error this file should not be included outside its source directory
#endif
+__hidden void dump_threads(void)
+ __attribute__((__visibility__("hidden")));
__hidden void join_detached_threads(void)
__attribute__((__visibility__("hidden")));
__hidden int MT_kill_thread(MT_Id t)
diff --git a/gdk/gdk_utils.c b/gdk/gdk_utils.c
--- a/gdk/gdk_utils.c
+++ b/gdk/gdk_utils.c
@@ -706,6 +706,7 @@ GDKprepareExit(void)
if (ATOMIC_ADD(&GDKstopped, 1) > 0)
return;
+ THRDDEBUG dump_threads();
MT_lock_set(&GDKthreadLock);
for (st = serverthread; st; st = serverthread) {
MT_lock_unset(&GDKthreadLock);
diff --git a/monetdb5/mal/mal_client.c b/monetdb5/mal/mal_client.c
--- a/monetdb5/mal/mal_client.c
+++ b/monetdb5/mal/mal_client.c
@@ -274,6 +274,7 @@ MCinitClientRecord(Client c, oid user, b
c->protocol = PROTOCOL_9;
c->filetrans = false;
+ c->query = NULL;
char name[16];
snprintf(name, sizeof(name), "Client%d->s", (int) (c - mal_clients));
diff --git a/monetdb5/mal/mal_client.h b/monetdb5/mal/mal_client.h
--- a/monetdb5/mal/mal_client.h
+++ b/monetdb5/mal/mal_client.h
@@ -191,6 +191,7 @@ typedef struct CLIENT {
size_t blocksize;
protocol_version protocol;
bool filetrans; /* whether the client can read
files for us */
+ const char *query; /* string, identify whatever
we're working on */
} *Client, ClientRec;
mal_export void MCinit(void);
diff --git a/monetdb5/mal/mal_dataflow.c b/monetdb5/mal/mal_dataflow.c
--- a/monetdb5/mal/mal_dataflow.c
+++ b/monetdb5/mal/mal_dataflow.c
@@ -345,6 +345,7 @@ DFLOWworker(void *T)
}
while (1) {
if (fnxt == 0) {
+ MT_thread_setworking(NULL);
MT_lock_set(&dataflowLock);
cntxt = t->cntxt;
MT_lock_unset(&dataflowLock);
@@ -363,6 +364,7 @@ DFLOWworker(void *T)
/* no more work to be done: exit */
break;
}
+ MT_thread_setworking(fe->flow->cntxt->query);
} else
fe = fnxt;
if (ATOMIC_GET(&exiting)) {
diff --git a/monetdb5/mal/mal_profiler.c b/monetdb5/mal/mal_profiler.c
--- a/monetdb5/mal/mal_profiler.c
+++ b/monetdb5/mal/mal_profiler.c
@@ -1047,6 +1047,7 @@ static void profilerHeartbeat(void *dumm
(void) dummy;
for (;;) {
/* wait until you need this info */
+ MT_thread_setworking("sleeping");
while (ATOMIC_GET(&hbdelay) == 0 || eventstream == NULL) {
if (GDKexiting() || !ATOMIC_GET(&hbrunning))
return;
@@ -1057,6 +1058,7 @@ static void profilerHeartbeat(void *dumm
return;
MT_sleep_ms(t > timeout ? timeout : t);
}
+ MT_thread_setworking("pinging");
profilerHeartbeatEvent("ping");
}
}
diff --git a/monetdb5/mal/mal_scenario.c b/monetdb5/mal/mal_scenario.c
--- a/monetdb5/mal/mal_scenario.c
+++ b/monetdb5/mal/mal_scenario.c
@@ -498,12 +498,24 @@ resetScenario(Client c)
* between speed and ability to analysis its behavior.
*
*/
+static const char *phases[] = {
+ [MAL_SCENARIO_CALLBACK] = "scenario callback",
+ [MAL_SCENARIO_ENGINE] = "scenario engine",
+ [MAL_SCENARIO_EXITCLIENT] = "scenario exitclient",
+ [MAL_SCENARIO_INITCLIENT] = "scenario initclient",
+ [MAL_SCENARIO_OPTIMIZE] = "scenario optimize",
+ [MAL_SCENARIO_PARSER] = "scenario parser",
+ [MAL_SCENARIO_READER] = "scenario reader",
+ [MAL_SCENARIO_SCHEDULER] = "scenario scheduler",
+};
static str
runPhase(Client c, int phase)
{
str msg = MAL_SUCCEED;
- if (c->phase[phase])
+ if (c->phase[phase]) {
+ MT_thread_setworking(phases[phase]);
return msg = (str) (*c->phase[phase])(c);
+ }
return msg;
}
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list