Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
T
trackrdrd
Project
Project
Details
Activity
Releases
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
uplex-varnish
trackrdrd
Commits
01871d35
Commit
01871d35
authored
Nov 24, 2012
by
Geoff Simmons
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
trackrdrd: added an assertion failure callback and stats monitor for
worker threads
parent
3f56bab9
Changes
4
Show whitespace changes
Inline
Side-by-side
Showing
4 changed files
with
65 additions
and
19 deletions
+65
-19
monitor.c
trackrdrd/src/monitor.c
+1
-0
trackrdrd.c
trackrdrd/src/trackrdrd.c
+23
-6
trackrdrd.h
trackrdrd/src/trackrdrd.h
+1
-0
worker.c
trackrdrd/src/worker.c
+40
-13
No files found.
trackrdrd/src/monitor.c
View file @
01871d35
...
@@ -76,6 +76,7 @@ void
...
@@ -76,6 +76,7 @@ void
tbl
.
open
,
tbl
.
done
,
100
.
0
*
((
float
)
tbl
.
open
+
tbl
.
done
)
/
tbl
.
len
,
tbl
.
open
,
tbl
.
done
,
100
.
0
*
((
float
)
tbl
.
open
+
tbl
.
done
)
/
tbl
.
len
,
tbl
.
occ_hi
,
tbl
.
seen
,
tbl
.
submitted
,
tbl
.
sent
,
tbl
.
failed
,
tbl
.
occ_hi
,
tbl
.
seen
,
tbl
.
submitted
,
tbl
.
sent
,
tbl
.
failed
,
tbl
.
wait_qfull
,
tbl
.
data_hi
);
tbl
.
wait_qfull
,
tbl
.
data_hi
);
WRK_Stats
();
}
}
LOG_Log0
(
LOG_INFO
,
"Monitoring thread exiting"
);
LOG_Log0
(
LOG_INFO
,
"Monitoring thread exiting"
);
...
...
trackrdrd/src/trackrdrd.c
View file @
01871d35
...
@@ -262,15 +262,26 @@ OSL_Track(void *priv, enum VSL_tag_e tag, unsigned fd, unsigned len,
...
@@ -262,15 +262,26 @@ OSL_Track(void *priv, enum VSL_tag_e tag, unsigned fd, unsigned len,
struct
vpf_fh
*
pfh
=
NULL
;
struct
vpf_fh
*
pfh
=
NULL
;
static
void
static
void
stacktrace
(
int
sig
)
assert_failure
(
const
char
*
func
,
const
char
*
file
,
int
line
,
const
char
*
cond
,
int
err
,
int
xxx
)
{
(
void
)
xxx
;
LOG_Log
(
LOG_ALERT
,
"Condition (%s) failed in %s(), %s line %d"
,
cond
,
func
,
file
,
line
);
if
(
err
)
LOG_Log
(
LOG_ALERT
,
"errno = %d (%s)"
,
err
,
strerror
(
err
));
abort
();
}
static
void
stacktrace
(
void
)
{
{
void
*
buf
[
MAX_STACK_DEPTH
];
void
*
buf
[
MAX_STACK_DEPTH
];
int
depth
,
i
;
int
depth
,
i
;
char
**
strings
;
char
**
strings
;
depth
=
backtrace
(
buf
,
MAX_STACK_DEPTH
);
depth
=
backtrace
(
buf
,
MAX_STACK_DEPTH
);
LOG_Log
(
LOG_ALERT
,
"Received signal %d (%s), stacktrace follows"
,
sig
,
strsignal
(
sig
));
if
(
depth
==
0
)
{
if
(
depth
==
0
)
{
LOG_Log0
(
LOG_ERR
,
"Stacktrace empty"
);
LOG_Log0
(
LOG_ERR
,
"Stacktrace empty"
);
return
;
return
;
...
@@ -280,8 +291,9 @@ stacktrace(int sig)
...
@@ -280,8 +291,9 @@ stacktrace(int sig)
LOG_Log0
(
LOG_ERR
,
"Cannot retrieve symbols for stacktrace"
);
LOG_Log0
(
LOG_ERR
,
"Cannot retrieve symbols for stacktrace"
);
return
;
return
;
}
}
/* XXX: get symbol names from nm? cf. cache_panic.c/pan_backtrace */
for
(
i
=
0
;
i
<
depth
;
i
++
)
for
(
i
=
0
;
i
<
depth
;
i
++
)
LOG_Log
(
LOG_ERR
,
"%
p: %s"
,
buf
[
i
]
,
strings
[
i
]);
LOG_Log
(
LOG_ERR
,
"%
s"
,
strings
[
i
]);
free
(
strings
);
free
(
strings
);
}
}
...
@@ -303,7 +315,9 @@ terminate(int sig)
...
@@ -303,7 +315,9 @@ terminate(int sig)
static
void
static
void
stacktrace_abort
(
int
sig
)
stacktrace_abort
(
int
sig
)
{
{
stacktrace
(
sig
);
LOG_Log
(
LOG_ALERT
,
"Received signal %d (%s), stacktrace follows"
,
sig
,
strsignal
(
sig
));
stacktrace
();
AZ
(
sigaction
(
SIGABRT
,
&
default_action
,
NULL
));
AZ
(
sigaction
(
SIGABRT
,
&
default_action
,
NULL
));
LOG_Log0
(
LOG_ALERT
,
"Aborting"
);
LOG_Log0
(
LOG_ALERT
,
"Aborting"
);
abort
();
abort
();
...
@@ -593,9 +607,12 @@ main(int argc, char * const *argv)
...
@@ -593,9 +607,12 @@ main(int argc, char * const *argv)
exit
(
EXIT_FAILURE
);
exit
(
EXIT_FAILURE
);
}
}
VAS_Fail
=
assert_failure
;
if
(
d_flag
)
if
(
d_flag
)
LOG_SetLevel
(
LOG_DEBUG
);
LOG_SetLevel
(
LOG_DEBUG
);
LOG_Log0
(
LOG_INFO
,
"initializing"
);
LOG_Log0
(
LOG_INFO
,
"initializing (v"
PACKAGE_VERSION
" revision "
REVISION
")"
);
CONF_Dump
();
CONF_Dump
();
...
...
trackrdrd/src/trackrdrd.h
View file @
01871d35
...
@@ -45,6 +45,7 @@
...
@@ -45,6 +45,7 @@
*/
*/
int
WRK_Init
(
void
);
int
WRK_Init
(
void
);
void
WRK_Start
(
void
);
void
WRK_Start
(
void
);
void
WRK_Stats
(
void
);
void
WRK_Halt
(
void
);
void
WRK_Halt
(
void
);
void
WRK_Shutdown
(
void
);
void
WRK_Shutdown
(
void
);
...
...
trackrdrd/src/worker.c
View file @
01871d35
...
@@ -44,6 +44,10 @@ typedef struct {
...
@@ -44,6 +44,10 @@ typedef struct {
#define WORKER_DATA_MAGIC 0xd8eef137
#define WORKER_DATA_MAGIC 0xd8eef137
unsigned
id
;
unsigned
id
;
unsigned
status
;
unsigned
status
;
unsigned
deqs
;
unsigned
waits
;
unsigned
sends
;
unsigned
fails
;
}
worker_data_t
;
}
worker_data_t
;
typedef
struct
{
typedef
struct
{
...
@@ -55,7 +59,7 @@ static unsigned run, cleaned = 0;
...
@@ -55,7 +59,7 @@ static unsigned run, cleaned = 0;
static
thread_data_t
*
thread_data
;
static
thread_data_t
*
thread_data
;
static
inline
void
static
inline
void
wrk_send
(
void
*
amq_worker
,
dataentry
*
entry
,
unsigned
id
)
wrk_send
(
void
*
amq_worker
,
dataentry
*
entry
,
worker_data_t
*
wrk
)
{
{
const
char
*
err
;
const
char
*
err
;
...
@@ -66,13 +70,16 @@ wrk_send(void *amq_worker, dataentry *entry, unsigned id)
...
@@ -66,13 +70,16 @@ wrk_send(void *amq_worker, dataentry *entry, unsigned id)
err
=
MQ_Send
(
amq_worker
,
entry
->
data
,
entry
->
end
);
err
=
MQ_Send
(
amq_worker
,
entry
->
data
,
entry
->
end
);
if
(
err
!=
NULL
)
{
if
(
err
!=
NULL
)
{
/* XXX: error recovery? reconnect? preserve the data? */
/* XXX: error recovery? reconnect? preserve the data? */
LOG_Log
(
LOG_ALERT
,
"Worker %d: Failed to send data: %s"
,
id
,
err
);
wrk
->
fails
++
;
LOG_Log
(
LOG_ERR
,
"Worker %d: Data DISCARDED [%.*s]"
,
id
,
entry
->
end
,
LOG_Log
(
LOG_ALERT
,
"Worker %d: Failed to send data: %s"
,
wrk
->
id
,
err
);
entry
->
data
);
LOG_Log
(
LOG_ERR
,
"Worker %d: Data DISCARDED [%.*s]"
,
wrk
->
id
,
entry
->
end
,
entry
->
data
);
MON_StatsUpdate
(
STATS_FAILED
);
MON_StatsUpdate
(
STATS_FAILED
);
}
}
else
else
{
wrk
->
sends
++
;
MON_StatsUpdate
(
STATS_SENT
);
MON_StatsUpdate
(
STATS_SENT
);
}
entry
->
state
=
DATA_EMPTY
;
entry
->
state
=
DATA_EMPTY
;
/* From Varnish vmb.h -- platform-independent write memory barrier */
/* From Varnish vmb.h -- platform-independent write memory barrier */
VWMB
();
VWMB
();
...
@@ -100,8 +107,8 @@ static void
...
@@ -100,8 +107,8 @@ static void
while
(
run
)
{
while
(
run
)
{
entry
=
(
dataentry
*
)
SPMCQ_Deq
();
entry
=
(
dataentry
*
)
SPMCQ_Deq
();
if
(
entry
!=
NULL
)
{
if
(
entry
!=
NULL
)
{
/* Dequeued a data entry */
wrk
->
deqs
++
;
wrk_send
(
amq_worker
,
entry
,
wrk
->
id
);
wrk_send
(
amq_worker
,
entry
,
wrk
);
continue
;
continue
;
}
}
/* Queue is empty, wait until data are available, or quit is
/* Queue is empty, wait until data are available, or quit is
...
@@ -110,15 +117,19 @@ static void
...
@@ -110,15 +117,19 @@ static void
barrier */
barrier */
AZ
(
pthread_mutex_lock
(
&
spmcq_nonempty_lock
));
AZ
(
pthread_mutex_lock
(
&
spmcq_nonempty_lock
));
/* run is guaranteed to be fresh here */
/* run is guaranteed to be fresh here */
if
(
run
)
if
(
run
)
{
wrk
->
waits
++
;
AZ
(
pthread_cond_wait
(
&
spmcq_nonempty_cond
,
AZ
(
pthread_cond_wait
(
&
spmcq_nonempty_cond
,
&
spmcq_nonempty_lock
));
&
spmcq_nonempty_lock
));
}
AZ
(
pthread_mutex_unlock
(
&
spmcq_nonempty_lock
));
AZ
(
pthread_mutex_unlock
(
&
spmcq_nonempty_lock
));
}
}
/* Prepare to exit, drain the queue */
/* Prepare to exit, drain the queue */
while
((
entry
=
(
dataentry
*
)
SPMCQ_Deq
())
!=
NULL
)
while
((
entry
=
(
dataentry
*
)
SPMCQ_Deq
())
!=
NULL
)
{
wrk_send
(
amq_worker
,
entry
,
wrk
->
id
);
wrk
->
deqs
++
;
wrk_send
(
amq_worker
,
entry
,
wrk
);
}
wrk
->
status
=
EXIT_SUCCESS
;
wrk
->
status
=
EXIT_SUCCESS
;
err
=
MQ_WorkerShutdown
(
&
amq_worker
);
err
=
MQ_WorkerShutdown
(
&
amq_worker
);
...
@@ -166,8 +177,10 @@ WRK_Init(void)
...
@@ -166,8 +177,10 @@ WRK_Init(void)
return
(
errno
);
return
(
errno
);
}
}
thread_data
[
i
].
wrk_data
->
magic
=
WORKER_DATA_MAGIC
;
worker_data_t
*
wrk
=
thread_data
[
i
].
wrk_data
;
thread_data
[
i
].
wrk_data
->
id
=
i
+
1
;
wrk
->
magic
=
WORKER_DATA_MAGIC
;
wrk
->
id
=
i
+
1
;
wrk
->
deqs
=
wrk
->
waits
=
wrk
->
sends
=
wrk
->
fails
=
0
;
}
}
AZ
(
pthread_mutex_init
(
&
spmcq_nonempty_lock
,
NULL
));
AZ
(
pthread_mutex_init
(
&
spmcq_nonempty_lock
,
NULL
));
...
@@ -187,6 +200,20 @@ WRK_Start(void)
...
@@ -187,6 +200,20 @@ WRK_Start(void)
thread_data
[
i
].
wrk_data
));
thread_data
[
i
].
wrk_data
));
}
}
void
WRK_Stats
(
void
)
{
worker_data_t
*
wrk
;
if
(
!
run
)
return
;
for
(
int
i
=
0
;
i
<
config
.
nworkers
;
i
++
)
{
wrk
=
thread_data
[
i
].
wrk_data
;
LOG_Log
(
LOG_INFO
,
"Worker %d: seen=%d waits=%d sent=%d failed=%d"
,
wrk
->
id
,
wrk
->
deqs
,
wrk
->
waits
,
wrk
->
sends
,
wrk
->
fails
);
}
}
void
void
WRK_Halt
(
void
)
WRK_Halt
(
void
)
{
{
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment