23 from graphviz 
import Digraph
    24 from req_utils 
import *
    30     schema = [(
"s3_request_id", 
"s3_request_id", 
"client_id", 
"s3_request_to_client",  
"C")]
    35 def get_timelines_ioo(client_id: str, grange: int, client_pid: int, create_attr_graph: bool,
    36                       export_only: bool, ext_graph: Digraph):
    37     return ior.get_timelines(client_id, grange, client_pid, create_attr_graph,
    38                              export_only, ext_graph, 
False)
    40 def get_timelines_cob(client_id: str, grange: int, client_pid: int, create_attr_graph: bool,
    41                       export_only: bool, ext_graph: Digraph):
    42     return ior.get_timelines(client_id, grange, client_pid, create_attr_graph,
    43                              export_only, ext_graph, 
True)
    45 def get_timelines(s3reqs: List[str], pid: str, create_attr_graph: bool = 
False, verbose: bool = 
False):
    46     get_timelines_fns = [mdr.get_timelines, get_timelines_ioo, get_timelines_cob]
    52             s3_req_rel_d = s3_request_uid.select().where(s3_request_uid.uuid == s3id)
    54             s3_req_rel_d = s3_request_uid.select().where(s3_request_uid.id == s3id)
    57             s3_req_rel_d = 
filter(
lambda x: x.pid == pid, s3_req_rel_d)
    59         for s3_req_rel 
in s3_req_rel_d:
    60             s3_req_d = 
query2dlist(s3_request_state.select().where(
    61                 (s3_request_state.id == s3_req_rel.id) &
    62                 (s3_request_state.pid == s3_req_rel.pid)))
    64                 r[
'op'] = s3_req_rel.uuid
    66             time_table.append(s3_req_d)
    68             s3_to_client_d = 
query2dlist(s3_request_to_client.select().where(
    69                 (s3_request_to_client.s3_request_id == s3_req_rel.id) &
    70                 (s3_request_to_client.pid == s3_req_rel.pid)))
    72             s3_to_client_d.sort(key=
lambda s3rc: s3rc[
'client_id'])
    74             print(
"Processing S3 request {} (id {}, pid {}), client requests: "    75                   .
format(s3_req_rel.uuid, s3_req_rel.id, s3_req_rel.pid), end=
'')
    77             for s3c 
in s3_to_client_d:
    78                 cids_str += 
"{}, ".
format(s3c[
'client_id'])
    83 select client_req.*, 'client[' || ifnull(cob.op, '') || ifnull(dix.op, '') || ifnull(ioo.op, '') || '] ' || client_req.id as 'op' from    84 client_req LEFT JOIN (select 'cob' as 'op', client_id, pid from client_to_cob) as cob ON cob.client_id = client_req.id AND cob.pid = client_req.pid    85 LEFT JOIN (select 'dix' as 'op', client_id, pid from client_to_dix) as dix ON dix.client_id = client_req.id AND dix.pid = client_req.pid    86 LEFT JOIN (select 'ioo' as 'op', client_id, pid from client_to_ioo) as ioo ON ioo.client_id = client_req.id AND ioo.pid = client_req.pid    87 WHERE client_req.id = {clvid} and client_req.pid = {clvpid};    89                 for s3c 
in s3_to_client_d:
    90                     clvreq = sql_tmpl.format(clvid=s3c[
'client_id'], clvpid=s3c[
'pid'])
    91                     lbls = [
"time", 
"pid", 
"id", 
"state", 
"op"]
    92                     clov_req_d = 
list(map(
lambda tpl: dict(zip(lbls, tpl)),
    93                                           DB.execute_sql(clvreq).fetchall()))
    94                     time_table.append(clov_req_d)
    98                 attr_graph = Digraph(strict=
True, format=
'png', node_attr = {
'shape': 
'plaintext'})
    99                 relations = [dict(s3_request_id = s3_req_rel.id, cli_pid = s3_req_rel.pid, srv_pid = 
None)]
   102             for s3c 
in s3_to_client_d:
   107                 print(
"Processing client request {} (pid {})...".
format(s3c[
'client_id'], s3c[
'pid']))
   109                 while not found 
and i < len(get_timelines_fns):
   111                         ext_tml, _, _, _, _ = get_timelines_fns[i](s3c[
'client_id'], [0, 0], s3c[
'pid'],
   112                                                                    create_attr_graph, 
True, attr_graph)
   119                     time_table += ext_tml
   123                     print(
"Could not build timelines for client request {} (pid: {})".
format(s3c[
'client_id'], s3c[
'pid']))
   125             if create_attr_graph:
   126                 attr_graph.render(filename=
's3_graph_{}'.
format(s3_req_rel.uuid))
   131     parser = argparse.ArgumentParser(description=
"draws s3 request timeline")
   132     parser.add_argument(
'--s3reqs', nargs=
'+', type=str, required=
True,
   133                         help=
"requests ids to draw")
   134     parser.add_argument(
"-p", 
"--pid", type=int, required=
False, default=
None,
   135                         help=
"Client pid to get requests for")
   136     parser.add_argument(
'--db', type=str, required=
False, default=
"m0play.db",
   137                         help=
"input database file")
   138     parser.add_argument(
"-a", 
"--attr", action=
'store_true', help=
"Create attributes graph")
   139     parser.add_argument(
"-m", 
"--maximize", action=
'store_true', help=
"Display in maximised window")
   140     parser.add_argument(
"-u", 
"--time-unit", choices=[
'ms',
'us'], default=
'us',
   141                         help=
"Default time unit")
   142     parser.add_argument(
"-v", 
"--verbose", action=
'store_true',
   143                         help=
"Display detailed request structure")
   144     parser.add_argument(
"-i", 
"--index", action=
'store_true',
   145                         help=
"Create indexes before processing")
   147     return parser.parse_args()
   150     index_query = 
"CREATE INDEX {} ON {} ({});"   151     tbl_name = tbl_model.__name__
   152     tbl_fields = 
filter(
lambda nm: ((
"id" in nm) 
or (
"time" in nm)) 
and "__" not in nm,
   153                         tbl_model.__dict__.keys())
   155         iq = index_query.format(f
"idx_{tbl_name}_{f}", tbl_name, f)
   162     for tbl 
in db_create_delete_tables:
   165 if __name__ == 
'__main__':
   179     print(
"Plotting timelines...")
   181     draw_timelines(time_table, 
None, 0, 
None, args.time_unit, 
False, args.maximize)
 static struct m0_list list
 
def prepare_time_table(time_table)
 
static M0_UNUSED void print(struct m0_be_list *list)
 
def create_table_index(tbl_model)