1
- use tokio :: sync :: oneshot ;
1
+ use crate :: eventfd ;
2
2
use async_channel;
3
3
use async_channel:: TryRecvError ;
4
- use thiserror:: Error ;
5
- use crate :: eventfd;
6
- use std:: os:: unix:: io:: { AsRawFd , RawFd } ;
7
- use std:: io;
8
4
use mlua:: Lua ;
5
+ use tracing_opentelemetry:: OpenTelemetrySpanExt ;
6
+ use std:: io;
7
+ use std:: os:: unix:: io:: { AsRawFd , RawFd } ;
8
+ use thiserror:: Error ;
9
+ use tokio:: sync:: oneshot;
10
+ use tracing:: Instrument ;
11
+ use opentelemetry:: Context ;
9
12
10
- pub type Task = Box < dyn FnOnce ( & Lua ) -> Result < ( ) , ChannelError > + Send > ;
11
- type TaskSender = async_channel:: Sender < Task > ;
12
- type TaskReceiver = async_channel:: Receiver < Task > ;
13
+ pub type Task = Box < dyn FnOnce ( & Lua , Context ) -> Result < ( ) , ChannelError > + Send > ;
14
+ pub type InstrumentedTask = ( Task , Context ) ;
15
+ type TaskSender = async_channel:: Sender < InstrumentedTask > ;
16
+ type TaskReceiver = async_channel:: Receiver < InstrumentedTask > ;
13
17
14
18
#[ derive( Error , Debug ) ]
15
19
pub enum ChannelError {
@@ -40,24 +44,33 @@ impl Dispatcher {
40
44
} )
41
45
}
42
46
47
+ #[ tracing:: instrument( level = "trace" , skip_all) ]
43
48
pub async fn call < Func , Ret > ( & self , func : Func ) -> Result < Ret , ChannelError >
44
- where
45
- Ret : Send + ' static ,
46
- Func : FnOnce ( & Lua ) -> Ret ,
47
- Func : Send + ' static ,
49
+ where
50
+ Ret : Send + ' static ,
51
+ Func : FnOnce ( & Lua , Context ) -> Ret ,
52
+ Func : Send + ' static ,
48
53
{
54
+ tracing:: event!( tracing:: Level :: TRACE , "bass drop begin" ) ;
55
+
49
56
let ( result_tx, result_rx) = oneshot:: channel ( ) ;
50
- let handler_func: Task = Box :: new ( move |lua| {
57
+ let result_rx = result_rx
58
+ . instrument ( tracing:: span!( tracing:: Level :: TRACE , "result_rx" ) ) ;
59
+ let result_rx_span_ctx = result_rx. span ( ) . context ( ) ;
60
+
61
+ let handler_func: Task = Box :: new ( move |lua, exec_ctx| {
51
62
if result_tx. is_closed ( ) {
52
- return Err ( ChannelError :: TXChannelClosed )
63
+ return Err ( ChannelError :: TXChannelClosed ) ;
53
64
} ;
54
65
55
- let result = func ( lua) ;
56
- result_tx. send ( result) . or ( Err ( ChannelError :: TXChannelClosed ) )
66
+ let result = func ( lua, exec_ctx) ;
67
+ result_tx
68
+ . send ( result)
69
+ . or ( Err ( ChannelError :: TXChannelClosed ) )
57
70
} ) ;
58
-
71
+
59
72
let task_tx_len = self . task_tx . len ( ) ;
60
- if let Err ( _channel_closed) = self . task_tx . send ( handler_func) . await {
73
+ if let Err ( _channel_closed) = self . task_tx . send ( ( handler_func, result_rx_span_ctx ) ) . await {
61
74
return Err ( ChannelError :: TXChannelClosed ) ;
62
75
}
63
76
@@ -67,15 +80,18 @@ impl Dispatcher {
67
80
}
68
81
}
69
82
70
- result_rx. await . or ( Err ( ChannelError :: RXChannelClosed ) )
83
+ tracing:: event!( tracing:: Level :: TRACE , "bass drop end" ) ;
84
+
85
+ result_rx
86
+ . await
87
+ . or ( Err ( ChannelError :: RXChannelClosed ) )
71
88
}
72
89
73
90
pub fn len ( & self ) -> usize {
74
91
self . task_tx . len ( )
75
92
}
76
93
}
77
94
78
-
79
95
pub struct Executor {
80
96
task_rx : TaskReceiver ,
81
97
eventfd : eventfd:: EventFd ,
@@ -86,10 +102,23 @@ impl Executor {
86
102
Self { task_rx, eventfd }
87
103
}
88
104
105
+ // #[tracing::instrument(level = "trace", skip_all)]
89
106
pub fn exec ( & self , lua : & Lua , coio_timeout : f64 ) -> Result < ( ) , ChannelError > {
90
107
loop {
91
- match self . task_rx . try_recv ( ) {
92
- Ok ( func) => return func ( lua) ,
108
+ // tracing::event!(tracing::Level::TRACE, "exec: iteration");
109
+
110
+ // let _ = tracing::trace_span!("executing task").enter();
111
+ match self . task_rx . try_recv ( )
112
+ {
113
+ Ok ( ( func, span_ctx) ) => {
114
+ // tracing::event!(tracing::Level::TRACE, "task: start");
115
+ println ! ( "{:?}" , span_ctx) ;
116
+
117
+ let res = func ( lua, span_ctx) ;
118
+
119
+ // tracing::event!(tracing::Level::TRACE, "task: finish");
120
+ return res;
121
+ }
93
122
Err ( TryRecvError :: Empty ) => ( ) ,
94
123
Err ( TryRecvError :: Closed ) => return Err ( ChannelError :: RXChannelClosed ) ,
95
124
} ;
@@ -98,7 +127,8 @@ impl Executor {
98
127
}
99
128
}
100
129
101
- pub fn pop_many ( & self , max_tasks : usize , coio_timeout : f64 ) -> Result < Vec < Task > , ChannelError > {
130
+ // #[tracing::instrument(level = "trace", skip_all)]
131
+ pub fn pop_many ( & self , max_tasks : usize , coio_timeout : f64 ) -> Result < Vec < InstrumentedTask > , ChannelError > {
102
132
if self . task_rx . is_empty ( ) {
103
133
let _ = self . eventfd . coio_read ( coio_timeout) ;
104
134
}
@@ -137,5 +167,8 @@ pub fn channel(buffer: usize) -> io::Result<(Dispatcher, Executor)> {
137
167
let ( task_tx, task_rx) = async_channel:: bounded ( buffer) ;
138
168
let efd = eventfd:: EventFd :: new ( 0 , false ) ?;
139
169
140
- Ok ( ( Dispatcher :: new ( task_tx, efd. try_clone ( ) ?) , Executor :: new ( task_rx, efd) ) )
170
+ Ok ( (
171
+ Dispatcher :: new ( task_tx, efd. try_clone ( ) ?) ,
172
+ Executor :: new ( task_rx, efd) ,
173
+ ) )
141
174
}
0 commit comments