2 * Copyright 2000, International Business Machines Corporation and others.
5 * This software has been released under the terms of the IBM Public
6 * License. For details, see the LICENSE file in the top-level source
7 * directory or online at http://www.openafs.org/dl/license10.html
11 * This file implements the client related funtions for afscp
14 #include <afsconfig.h>
15 #include <afs/param.h>
21 #include <afs/cellconfig.h>
22 #include <afs/bosint.h>
23 #include <rx/rxstat.h>
24 #include <afs/afsint.h>
25 #define FSINT_COMMON_XG
26 #include <afs/afscbint.h>
27 #include <afs/kauth.h>
28 #include <afs/kautils.h>
29 #include <afs/ptint.h>
30 #include <afs/ptserver.h>
31 #include <afs/vldbint.h>
32 #include <afs/volint.h>
33 #include <afs/volser.h>
41 extern int RXSTATS_RetrieveProcessRPCStats();
42 extern int RXSTATS_RetrievePeerRPCStats();
43 extern int RXSTATS_QueryProcessRPCStats();
44 extern int RXSTATS_QueryPeerRPCStats();
45 extern int RXSTATS_EnableProcessRPCStats();
46 extern int RXSTATS_EnablePeerRPCStats();
47 extern int RXSTATS_DisableProcessRPCStats();
48 extern int RXSTATS_DisablePeerRPCStats();
49 extern int RXSTATS_ClearProcessRPCStats();
50 extern int RXSTATS_ClearPeerRPCStats();
53 * This structure stores the client and server function lists.
54 * This is kept separate from the actual interface definitions
55 * since an rpc interface can be offered by several servers
56 * (e.g. ubik and rxstat)
58 * The purpose of these functions is to allow a mapping from interfaceId
59 * to text representations of server process names and function names.
63 const char **functionList;
64 size_t functionListLen;
65 } interface_function_list_t, *interface_function_list_p;
70 * On NT, you cannot define an array of character pointers in a dll
71 * and then access this array outside the dll via a global initialization
72 * because the msvc compiler will complain that the initializer is not
73 * a constant (i.e. C2099: initializer is not a constant). This is because
74 * the dllimport and dllexport c language extensions cause references
75 * to the character array to go through another level of indirection -
76 * and this indirection is unknown at compilation time.
78 * To get around this problem I hand initialize this array on NT only
81 static interface_function_list_t afs_server;
82 static interface_function_list_t afscb_server;
83 static interface_function_list_t bos_server;
84 static interface_function_list_t kauth_kaa_server;
85 static interface_function_list_t kauth_kam_server;
86 static interface_function_list_t kauth_kat_server;
87 static interface_function_list_t pts_server;
88 static interface_function_list_t rxstat_server;
89 static interface_function_list_t ubik_disk_server;
90 static interface_function_list_t ubik_vote_server;
91 static interface_function_list_t vl_server;
92 static interface_function_list_t vol_server;
93 static pthread_once_t pthread_func_list_once = PTHREAD_ONCE_INIT;
94 static int pthread_func_list_done;
99 afs_server.functionList = RXAFS_function_names;
100 afs_server.functionListLen = RXAFS_NO_OF_STAT_FUNCS;
101 afscb_server.functionList = RXAFSCB_function_names;
102 afscb_server.functionListLen = RXAFSCB_NO_OF_STAT_FUNCS;
103 bos_server.functionList = BOZO_function_names;
104 bos_server.functionListLen = BOZO_NO_OF_STAT_FUNCS;
105 kauth_kaa_server.functionList = KAA_function_names;
106 kauth_kaa_server.functionListLen = KAA_NO_OF_STAT_FUNCS;
107 kauth_kam_server.functionList = KAM_function_names;
108 kauth_kam_server.functionListLen = KAM_NO_OF_STAT_FUNCS;
109 kauth_kat_server.functionList = KAT_function_names;
110 kauth_kat_server.functionListLen = KAT_NO_OF_STAT_FUNCS;
111 pts_server.functionList = PR_function_names;
112 pts_server.functionListLen = PR_NO_OF_STAT_FUNCS;
113 rxstat_server.functionList = RXSTATS_function_names;
114 rxstat_server.functionListLen = RXSTATS_NO_OF_STAT_FUNCS;
115 ubik_disk_server.functionList = DISK_function_names;
116 ubik_disk_server.functionListLen = DISK_NO_OF_STAT_FUNCS;
117 ubik_vote_server.functionList = VOTE_function_names;
118 ubik_vote_server.functionListLen = VOTE_NO_OF_STAT_FUNCS;
119 vl_server.functionList = VL_function_names;
120 vl_server.functionListLen = VL_NO_OF_STAT_FUNCS;
121 vol_server.functionList = AFSVolfunction_names;
122 vol_server.functionListLen = AFSVolNO_OF_STAT_FUNCS;
123 pthread_func_list_done = 1;
128 static interface_function_list_t afs_server = {
129 RXAFS_function_names,
130 RXAFS_NO_OF_STAT_FUNCS
133 static interface_function_list_t afscb_server = {
134 RXAFSCB_function_names,
135 RXAFSCB_NO_OF_STAT_FUNCS
138 static interface_function_list_t bos_server = {
140 BOZO_NO_OF_STAT_FUNCS
143 static interface_function_list_t kauth_kaa_server = {
148 static interface_function_list_t kauth_kam_server = {
153 static interface_function_list_t kauth_kat_server = {
158 static interface_function_list_t pts_server = {
163 static interface_function_list_t rxstat_server = {
164 RXSTATS_function_names,
165 RXSTATS_NO_OF_STAT_FUNCS
168 static interface_function_list_t ubik_disk_server = {
170 DISK_NO_OF_STAT_FUNCS,
173 static interface_function_list_t ubik_vote_server = {
175 VOTE_NO_OF_STAT_FUNCS,
178 static interface_function_list_t vl_server = {
183 static interface_function_list_t vol_server = {
184 AFSVolfunction_names,
185 AFSVolNO_OF_STAT_FUNCS
188 #endif /* AFS_NT40_ENV */
190 static interface_function_list_t unknown_server = {
196 afs_uint32 interfaceId;
197 const char *interfaceName;
198 interface_function_list_p functionList;
199 } interface_t, *interface_p;
201 interface_t int_list[] = {
251 * Note the code below assumes that the following entry is the last entry
255 {0, "unknown", &unknown_server}
263 DoClientLocalCellGet(struct cmd_syndesc *as, char *arock)
266 char cellName[MAXCELLCHARS];
268 if (!afsclient_LocalCellGet(cellName, &st)) {
269 ERR_ST_EXT("afsclient_LocalCellGet", st);
272 printf("This machine belongs to cell: %s\n", cellName);
278 DoClientMountPointCreate(struct cmd_syndesc *as, char *arock)
280 typedef enum { DIRECTORY, VOLUME, READWRITE,
281 CHECK } DoClientMountPointCreate_parm_t;
283 const char *directory;
285 vol_type_t vol_type = READ_ONLY;
286 vol_check_t vol_check = DONT_CHECK_VOLUME;
288 if (as->parms[DIRECTORY].items) {
289 directory = as->parms[DIRECTORY].items->data;
292 if (as->parms[VOLUME].items) {
293 volume = as->parms[VOLUME].items->data;
296 if (as->parms[READWRITE].items) {
297 vol_type = READ_WRITE;
300 if (as->parms[CHECK].items) {
301 vol_check = CHECK_VOLUME;
304 if (!afsclient_MountPointCreate
305 (cellHandle, directory, volume, vol_type, vol_check, &st)) {
306 ERR_ST_EXT("afsclient_MountPointCreate", st);
313 Print_afs_serverEntry_p(afs_serverEntry_p serv, const char *prefix)
317 printf("%sInformation for server %s\n", prefix, serv->serverName);
318 if (serv->serverType & DATABASE_SERVER) {
319 printf("%s\tIt is a database server\n", prefix);
321 if (serv->serverType & FILE_SERVER) {
322 printf("%s\tIt is a file server\n", prefix);
324 printf("%s\tServer addresses:%s\n", prefix, serv->serverName);
325 while (serv->serverAddress[i] != 0) {
326 printf("\t\t%s%x\n", prefix, serv->serverAddress[i++]);
331 DoClientAFSServerGet(struct cmd_syndesc *as, char *arock)
333 typedef enum { SERVER } DoClientAFSServerGet_parm_t;
336 afs_serverEntry_t entry;
338 if (as->parms[SERVER].items) {
339 server = as->parms[SERVER].items->data;
342 if (!afsclient_AFSServerGet(cellHandle, server, &entry, &st)) {
343 ERR_ST_EXT("afsclient_AFSServerGet", st);
346 Print_afs_serverEntry_p(&entry, "");
352 DoClientAFSServerList(struct cmd_syndesc *as, char *arock)
355 afs_serverEntry_t entry;
358 if (!afsclient_AFSServerGetBegin(cellHandle, &iter, &st)) {
359 ERR_ST_EXT("afsclient_AFSServerGetBegin", st);
362 while (afsclient_AFSServerGetNext(iter, &entry, &st)) {
363 Print_afs_serverEntry_p(&entry, "");
366 if (st != ADMITERATORDONE) {
367 ERR_ST_EXT("afsclient_AFSServerGetNext", st);
370 if (!afsclient_AFSServerGetDone(iter, &st)) {
371 ERR_ST_EXT("afsclient_AFSServerGetDone", st);
379 Print_afs_RPCStatsState_p(afs_RPCStatsState_p state, const char *prefix)
381 printf("%sThe rpc stats state is: ", prefix);
383 case AFS_RPC_STATS_DISABLED:
384 printf("disabled\n");
386 case AFS_RPC_STATS_ENABLED:
394 afs_stat_source_t value;
395 } afs_type_map_t, *afs_type_map_p;
397 static afs_type_map_t map[] = {
398 {"bosserver", AFS_BOSSERVER},
399 {"fileserver", AFS_FILESERVER},
400 {"kaserver", AFS_KASERVER},
401 {"ptserver", AFS_PTSERVER},
402 {"volserver", AFS_VOLSERVER},
403 {"vlserver", AFS_VLSERVER},
404 {"client", AFS_CLIENT},
409 GetStatPortFromString(const char *type, int *port)
415 tport = strtol(type, &end, 0);
416 if (tport == 0 || end == type || *end != '\0') {
425 GetStatSourceFromString(const char *type, afs_stat_source_t * src, int *port)
428 size_t type_len = strlen(type);
430 for (i = 0; (map[i].tag) && strncasecmp(type, map[i].tag, type_len); i++);
432 if (map[i].tag == 0) {
434 * Try to convert string to port number
436 if (GetStatPortFromString(type, port)) {
441 "couldn't convert server to type, try one of the "
443 for (i = 0; map[i].tag; i++) {
444 fprintf(stderr, "%s ", map[i].tag);
457 } afs_stat_type_t, *afs_stat_type_p;
459 static afs_stat_type_t
460 GetStatTypeFromString(const char *type)
464 if (!strcmp(type, "peer")) {
466 } else if (!strcmp(type, "process")) {
467 rc = AFS_PROCESS_STATS;
469 ERR_EXT("stat_type must be process or peer");
476 DoClientRPCStatsStateGet(struct cmd_syndesc *as, char *arock)
478 typedef enum { SERVER, PROCESS,
479 STAT_TYPE } DoClientRPCStatsStateGet_parm_t;
481 struct rx_connection *conn;
483 afs_stat_source_t type;
486 afs_stat_type_t which;
487 afs_RPCStatsState_t state;
489 if (as->parms[PROCESS].items) {
491 GetStatSourceFromString(as->parms[PROCESS].items->data, &type,
495 if (as->parms[STAT_TYPE].items) {
496 which = GetStatTypeFromString(as->parms[STAT_TYPE].items->data);
499 if (as->parms[SERVER].items) {
501 if (!afsclient_RPCStatOpen
502 (cellHandle, as->parms[SERVER].items->data, type, &conn,
504 ERR_ST_EXT("afsclient_RPCStatOpen", st);
507 if (!afsclient_RPCStatOpenPort
508 (cellHandle, as->parms[SERVER].items->data, srvrPort, &conn,
510 ERR_ST_EXT("afsclient_RPCStatOpenPort", st);
515 if (which == AFS_PEER_STATS) {
516 if (!util_RPCStatsStateGet
517 (conn, RXSTATS_QueryPeerRPCStats, &state, &st)) {
518 ERR_ST_EXT("util_RPCStatsStateGet", st);
521 if (!util_RPCStatsStateGet
522 (conn, RXSTATS_QueryProcessRPCStats, &state, &st)) {
523 ERR_ST_EXT("util_RPCStatsStateGet", st);
527 Print_afs_RPCStatsState_p(&state, "");
529 afsclient_RPCStatClose(conn, 0);
535 DoClientRPCStatsStateEnable(struct cmd_syndesc *as, char *arock)
537 typedef enum { SERVER, PROCESS, STAT_TYPE } DoClientRPCStatsEnable_parm_t;
539 struct rx_connection *conn;
541 afs_stat_source_t type;
544 afs_stat_type_t which;
546 if (as->parms[PROCESS].items) {
548 GetStatSourceFromString(as->parms[PROCESS].items->data, &type,
552 if (as->parms[STAT_TYPE].items) {
553 which = GetStatTypeFromString(as->parms[STAT_TYPE].items->data);
556 if (as->parms[SERVER].items) {
558 if (!afsclient_RPCStatOpen
559 (cellHandle, as->parms[SERVER].items->data, type, &conn,
561 ERR_ST_EXT("afsclient_RPCStatOpen", st);
564 if (!afsclient_RPCStatOpenPort
565 (cellHandle, as->parms[SERVER].items->data, srvrPort, &conn,
567 ERR_ST_EXT("afsclient_RPCStatOpenPort", st);
572 if (which == AFS_PEER_STATS) {
573 if (!util_RPCStatsStateEnable(conn, RXSTATS_EnablePeerRPCStats, &st)) {
574 ERR_ST_EXT("util_RPCStatsStateEnable", st);
577 if (!util_RPCStatsStateEnable
578 (conn, RXSTATS_EnableProcessRPCStats, &st)) {
579 ERR_ST_EXT("util_RPCStatsStateEnable", st);
583 afsclient_RPCStatClose(conn, 0);
589 DoClientRPCStatsStateDisable(struct cmd_syndesc *as, char *arock)
591 typedef enum { SERVER, PROCESS,
592 STAT_TYPE } DoClientRPCStatsDisable_parm_t;
594 struct rx_connection *conn;
596 afs_stat_source_t type;
599 afs_stat_type_t which;
601 if (as->parms[PROCESS].items) {
603 GetStatSourceFromString(as->parms[PROCESS].items->data, &type,
607 if (as->parms[STAT_TYPE].items) {
608 which = GetStatTypeFromString(as->parms[STAT_TYPE].items->data);
611 if (as->parms[SERVER].items) {
613 if (!afsclient_RPCStatOpen
614 (cellHandle, as->parms[SERVER].items->data, type, &conn,
616 ERR_ST_EXT("afsclient_RPCStatOpen", st);
619 if (!afsclient_RPCStatOpenPort
620 (cellHandle, as->parms[SERVER].items->data, srvrPort, &conn,
622 ERR_ST_EXT("afsclient_RPCStatOpenPort", st);
627 if (which == AFS_PEER_STATS) {
628 if (!util_RPCStatsStateDisable
629 (conn, RXSTATS_DisablePeerRPCStats, &st)) {
630 ERR_ST_EXT("util_RPCStatsStateDisable", st);
633 if (!util_RPCStatsStateDisable
634 (conn, RXSTATS_DisableProcessRPCStats, &st)) {
635 ERR_ST_EXT("util_RPCStatsStateDisable", st);
639 afsclient_RPCStatClose(conn, 0);
645 Print_afs_RPCStats_p(afs_RPCStats_p stat, interface_function_list_p f_list,
648 afs_int32 index = stat->s.stats_v1.func_index;
650 if (index > ((afs_int32) f_list->functionListLen - 1)) {
651 printf("%sUnknown function ", prefix);
653 printf("%s%s ", prefix,
654 f_list->functionList[stat->s.stats_v1.func_index]);
657 if (!hiszero(stat->s.stats_v1.invocations)) {
658 printf("%sinvoc (%u.%u) bytes_sent (%u.%u) bytes_rcvd (%u.%u)\n",
659 prefix, hgethi(stat->s.stats_v1.invocations),
660 hgetlo(stat->s.stats_v1.invocations),
661 hgethi(stat->s.stats_v1.bytes_sent),
662 hgetlo(stat->s.stats_v1.bytes_sent),
663 hgethi(stat->s.stats_v1.bytes_rcvd),
664 hgetlo(stat->s.stats_v1.bytes_rcvd)
666 printf("\tqsum %d.%06d\tqsqr %d.%06d"
667 "\tqmin %d.%06d\tqmax %d.%06d\n",
668 stat->s.stats_v1.queue_time_sum.sec,
669 stat->s.stats_v1.queue_time_sum.usec,
670 stat->s.stats_v1.queue_time_sum_sqr.sec,
671 stat->s.stats_v1.queue_time_sum_sqr.usec,
672 stat->s.stats_v1.queue_time_min.sec,
673 stat->s.stats_v1.queue_time_min.usec,
674 stat->s.stats_v1.queue_time_max.sec,
675 stat->s.stats_v1.queue_time_max.usec);
676 printf("\txsum %d.%06d\txsqr %d.%06d"
677 "\txmin %d.%06d\txmax %d.%06d\n",
678 stat->s.stats_v1.execution_time_sum.sec,
679 stat->s.stats_v1.execution_time_sum.usec,
680 stat->s.stats_v1.execution_time_sum_sqr.sec,
681 stat->s.stats_v1.execution_time_sum_sqr.usec,
682 stat->s.stats_v1.execution_time_min.sec,
683 stat->s.stats_v1.execution_time_min.usec,
684 stat->s.stats_v1.execution_time_max.sec,
685 stat->s.stats_v1.execution_time_max.usec);
687 printf("never invoked\n");
692 DoClientRPCStatsList(struct cmd_syndesc *as, char *arock)
694 typedef enum { SERVER, PROCESS, STAT_TYPE } DoClientRPCStatsList_parm_t;
696 struct rx_connection *conn;
698 afs_stat_source_t type;
701 afs_stat_type_t which;
702 afs_RPCStats_t stats;
707 (pthread_func_list_done
708 || pthread_once(&pthread_func_list_once, cr_list));
711 if (as->parms[PROCESS].items) {
713 GetStatSourceFromString(as->parms[PROCESS].items->data, &type,
717 if (as->parms[STAT_TYPE].items) {
718 which = GetStatTypeFromString(as->parms[STAT_TYPE].items->data);
721 if (as->parms[SERVER].items) {
723 if (!afsclient_RPCStatOpen
724 (cellHandle, as->parms[SERVER].items->data, type, &conn,
726 ERR_ST_EXT("afsclient_RPCStatOpen", st);
729 if (!afsclient_RPCStatOpenPort
730 (cellHandle, as->parms[SERVER].items->data, srvrPort, &conn,
732 ERR_ST_EXT("afsclient_RPCStatOpenPort", st);
737 if (which == AFS_PEER_STATS) {
738 if (!util_RPCStatsGetBegin
739 (conn, RXSTATS_RetrievePeerRPCStats, &iter, &st)) {
740 ERR_ST_EXT("util_RPCStatsGetBegin", st);
743 if (!util_RPCStatsGetBegin
744 (conn, RXSTATS_RetrieveProcessRPCStats, &iter, &st)) {
745 ERR_ST_EXT("util_RPCStatsGetBegin", st);
749 printf("Listing rpc stats at server %s process %s:\n",
750 as->parms[SERVER].items->data, as->parms[PROCESS].items->data);
752 while (util_RPCStatsGetNext(iter, &stats, &st)) {
755 * Print a new heading for each stat collection
758 if (stats.s.stats_v1.func_index == 0) {
763 * Look up the interface in our list
766 for (i = 0; i < ((sizeof(int_list) - 1) / sizeof(interface_t));
768 if (stats.s.stats_v1.interfaceId == int_list[i].interfaceId) {
774 * Print out a meaningful header for each stat collection
777 if (which == AFS_PEER_STATS) {
779 ina.s_addr = htonl(stats.s.stats_v1.remote_peer);
781 printf("%s stats for remote peer located at %s port %u "
782 "%s %s as a %s via the %s interface\n",
783 as->parms[PROCESS].items->data, inet_ntoa(ina),
784 stats.s.stats_v1.remote_port,
786 remote_is_server) ? "accessed by" : "accessing"),
787 as->parms[PROCESS].items->data,
789 remote_is_server) ? "client" : "server"),
790 int_list[i].interfaceName);
792 printf("%s stats for the %s interface " "accessed as a %s\n",
793 as->parms[PROCESS].items->data,
794 int_list[i].interfaceName,
796 remote_is_server) ? "client" : "server")
800 Print_afs_RPCStats_p(&stats, int_list[i].functionList, " ");
803 if (st != ADMITERATORDONE) {
804 ERR_ST_EXT("util_RPCStatsGetNext", st);
807 if (!util_RPCStatsGetDone(iter, &st)) {
808 ERR_ST_EXT("util_RPCStatsGetDone", st);
811 afsclient_RPCStatClose(conn, 0);
817 DoClientRPCStatsClear(struct cmd_syndesc *as, char *arock)
819 typedef enum { SERVER, PROCESS, STAT_TYPE, CLEAR_ALL, CLEAR_INVOCATIONS,
820 CLEAR_BYTES_SENT, CLEAR_BYTES_RCVD,
821 CLEAR_QUEUE_TIME_SUM, CLEAR_QUEUE_TIME_SQUARE,
822 CLEAR_QUEUE_TIME_MIN, CLEAR_QUEUE_TIME_MAX,
823 CLEAR_EXEC_TIME_SUM, CLEAR_EXEC_TIME_SQUARE,
824 CLEAR_EXEC_TIME_MIN, CLEAR_EXEC_TIME_MAX
825 } DoClientRPCStatsClear_parm_t;
827 struct rx_connection *conn;
829 afs_stat_source_t type;
832 afs_stat_type_t which;
833 afs_RPCStatsClearFlag_t flag = 0;
837 if (as->parms[PROCESS].items) {
839 GetStatSourceFromString(as->parms[PROCESS].items->data, &type,
843 if (as->parms[STAT_TYPE].items) {
844 which = GetStatTypeFromString(as->parms[STAT_TYPE].items->data);
847 if (as->parms[SERVER].items) {
849 if (!afsclient_RPCStatOpen
850 (cellHandle, as->parms[SERVER].items->data, type, &conn,
852 ERR_ST_EXT("afsclient_RPCStatOpen", st);
855 if (!afsclient_RPCStatOpenPort
856 (cellHandle, as->parms[SERVER].items->data, srvrPort, &conn,
858 ERR_ST_EXT("afsclient_RPCStatOpenPort", st);
863 if (as->parms[CLEAR_ALL].items) {
866 flag = AFS_RX_STATS_CLEAR_ALL;
869 if (as->parms[CLEAR_INVOCATIONS].items) {
871 ERR_EXT("cannot specify additional flags when "
872 "specifying clear_all");
875 flag |= AFS_RX_STATS_CLEAR_INVOCATIONS;
878 if (as->parms[CLEAR_BYTES_SENT].items) {
880 ERR_EXT("cannot specify additional flags when "
881 "specifying clear_all");
884 flag |= AFS_RX_STATS_CLEAR_BYTES_SENT;
887 if (as->parms[CLEAR_BYTES_RCVD].items) {
889 ERR_EXT("cannot specify additional flags when "
890 "specifying clear_all");
893 flag |= AFS_RX_STATS_CLEAR_BYTES_RCVD;
896 if (as->parms[CLEAR_QUEUE_TIME_SUM].items) {
898 ERR_EXT("cannot specify additional flags when "
899 "specifying clear_all");
902 flag |= AFS_RX_STATS_CLEAR_QUEUE_TIME_SUM;
905 if (as->parms[CLEAR_QUEUE_TIME_SQUARE].items) {
907 ERR_EXT("cannot specify additional flags when "
908 "specifying clear_all");
911 flag |= AFS_RX_STATS_CLEAR_QUEUE_TIME_SQUARE;
914 if (as->parms[CLEAR_QUEUE_TIME_MIN].items) {
916 ERR_EXT("cannot specify additional flags when "
917 "specifying clear_all");
920 flag |= AFS_RX_STATS_CLEAR_QUEUE_TIME_MIN;
923 if (as->parms[CLEAR_QUEUE_TIME_MAX].items) {
925 ERR_EXT("cannot specify additional flags when "
926 "specifying clear_all");
929 flag |= AFS_RX_STATS_CLEAR_QUEUE_TIME_MAX;
932 if (as->parms[CLEAR_EXEC_TIME_SUM].items) {
934 ERR_EXT("cannot specify additional flags when "
935 "specifying clear_all");
938 flag |= AFS_RX_STATS_CLEAR_EXEC_TIME_SUM;
941 if (as->parms[CLEAR_EXEC_TIME_SQUARE].items) {
943 ERR_EXT("cannot specify additional flags when "
944 "specifying clear_all");
947 flag |= AFS_RX_STATS_CLEAR_EXEC_TIME_SQUARE;
950 if (as->parms[CLEAR_EXEC_TIME_MIN].items) {
952 ERR_EXT("cannot specify additional flags when "
953 "specifying clear_all");
956 flag |= AFS_RX_STATS_CLEAR_EXEC_TIME_MIN;
959 if (as->parms[CLEAR_EXEC_TIME_MAX].items) {
961 ERR_EXT("cannot specify additional flags when "
962 "specifying clear_all");
965 flag |= AFS_RX_STATS_CLEAR_EXEC_TIME_MAX;
969 ERR_EXT("you must specify something to clear");
972 if (which == AFS_PEER_STATS) {
973 if (!util_RPCStatsClear(conn, RXSTATS_ClearPeerRPCStats, flag, &st)) {
974 ERR_ST_EXT("util_RPCStatsClear", st);
977 if (!util_RPCStatsClear
978 (conn, RXSTATS_ClearProcessRPCStats, flag, &st)) {
979 ERR_ST_EXT("util_RPCStatsClear", st);
983 afsclient_RPCStatClose(conn, 0);
989 DoClientRPCStatsVersionGet(struct cmd_syndesc *as, char *arock)
991 typedef enum { SERVER, PROCESS } DoClientRPCStatsVersionGet_parm_t;
993 struct rx_connection *conn;
994 afs_stat_source_t type;
998 afs_RPCStatsVersion_t version;
1000 if (as->parms[PROCESS].items) {
1002 GetStatSourceFromString(as->parms[PROCESS].items->data, &type,
1006 if (as->parms[SERVER].items) {
1008 if (!afsclient_RPCStatOpen
1009 (cellHandle, as->parms[SERVER].items->data, type, &conn,
1011 ERR_ST_EXT("afsclient_RPCStatOpen", st);
1014 if (!afsclient_RPCStatOpenPort
1015 (cellHandle, as->parms[SERVER].items->data, srvrPort, &conn,
1017 ERR_ST_EXT("afsclient_RPCStatOpenPort", st);
1022 if (!util_RPCStatsVersionGet(conn, &version, &st)) {
1023 ERR_ST_EXT("util_RPCStatsVersionGet", st);
1026 printf("the rpc stat version number is %u\n", version);
1028 afsclient_RPCStatClose(conn, 0);
1034 Print_afs_CMServerPref_p(afs_CMServerPref_p pref)
1038 taddr = pref->ipAddr;
1039 printf("%d.%d.%d.%d\t\t\t%d\n", (taddr >> 24) & 0xff,
1040 (taddr >> 16) & 0xff, (taddr >> 8) & 0xff, taddr & 0xff,
1045 DoClientCMGetServerPrefs(struct cmd_syndesc *as, char *arock)
1047 afs_status_t st = 0;
1048 typedef enum { SERVER, PORT } DoClientCMGetServerPrefs_parm_t;
1049 struct rx_connection *conn;
1051 int srvrPort = AFSCONF_CALLBACKPORT;
1052 afs_CMServerPref_t prefs;
1056 (pthread_func_list_done
1057 || pthread_once(&pthread_func_list_once, cr_list));
1060 if (as->parms[PORT].items) {
1061 if (!GetStatPortFromString(as->parms[PORT].items->data, &srvrPort)) {
1062 ERR_EXT("Couldn't undertand port number");
1066 if (as->parms[SERVER].items) {
1067 if (!afsclient_CMStatOpenPort
1068 (cellHandle, as->parms[SERVER].items->data, srvrPort, &conn,
1070 ERR_ST_EXT("afsclient_CMStatOpenPort", st);
1074 if (!util_CMGetServerPrefsBegin(conn, &iter, &st)) {
1075 ERR_ST_EXT("util_CMGetServerPrefsBegin", st);
1078 printf("Listing CellServDB for %s at port %s:\n",
1079 as->parms[SERVER].items->data, as->parms[PORT].items->data);
1081 while (util_CMGetServerPrefsNext(iter, &prefs, &st)) {
1083 Print_afs_CMServerPref_p(&prefs);
1086 if (st != ADMITERATORDONE) {
1087 ERR_ST_EXT("util_CMGetServerPrefsNext", st);
1090 if (!util_CMGetServerPrefsDone(iter, &st)) {
1091 ERR_ST_EXT("util_CMGetServerPrefsDone", st);
1094 afsclient_CMStatClose(conn, 0);
1100 Print_afs_CMListCell_p(afs_CMListCell_p cellInfo)
1105 printf("Cell %s on hosts", cellInfo->cellname);
1106 for (i = 0; i < UTIL_MAX_CELL_HOSTS && cellInfo->serverAddr[i]; i++) {
1107 taddr = cellInfo->serverAddr[i];
1108 printf(" %d.%d.%d.%d", (taddr >> 24) & 0xff, (taddr >> 16) & 0xff,
1109 (taddr >> 8) & 0xff, taddr & 0xff);
1115 DoClientCMListCells(struct cmd_syndesc *as, char *arock)
1117 afs_status_t st = 0;
1118 typedef enum { SERVER, PORT } DoClientCMListCells_parm_t;
1119 struct rx_connection *conn;
1121 int srvrPort = AFSCONF_CALLBACKPORT;
1122 afs_CMListCell_t cellInfo;
1126 (pthread_func_list_done
1127 || pthread_once(&pthread_func_list_once, cr_list));
1130 if (as->parms[PORT].items) {
1131 if (!GetStatPortFromString(as->parms[PORT].items->data, &srvrPort)) {
1132 ERR_EXT("Couldn't undertand port number");
1136 if (as->parms[SERVER].items) {
1137 if (!afsclient_CMStatOpenPort
1138 (cellHandle, as->parms[SERVER].items->data, srvrPort, &conn,
1140 ERR_ST_EXT("afsclient_CMStatOpenPort", st);
1144 if (!util_CMListCellsBegin(conn, &iter, &st)) {
1145 ERR_ST_EXT("util_CMListCellsBegin", st);
1148 printf("Listing CellServDB for %s at port %s:\n",
1149 as->parms[SERVER].items->data, as->parms[PORT].items->data);
1151 while (util_CMListCellsNext(iter, &cellInfo, &st)) {
1153 Print_afs_CMListCell_p(&cellInfo);
1156 if (st != ADMITERATORDONE) {
1157 ERR_ST_EXT("util_CMListCellsNext", st);
1160 if (!util_CMListCellsDone(iter, &st)) {
1161 ERR_ST_EXT("util_CMListCellsDone", st);
1164 afsclient_CMStatClose(conn, 0);
1170 DoClientCMLocalCell(struct cmd_syndesc *as, char *arock)
1172 afs_status_t st = 0;
1173 typedef enum { SERVER, PORT } DoClientCMLocalCell_parm_t;
1174 struct rx_connection *conn;
1176 int srvrPort = AFSCONF_CALLBACKPORT;
1177 afs_CMCellName_t cellname;
1180 (pthread_func_list_done
1181 || pthread_once(&pthread_func_list_once, cr_list));
1184 if (as->parms[PORT].items) {
1185 if (!GetStatPortFromString(as->parms[PORT].items->data, &srvrPort)) {
1186 ERR_EXT("Couldn't undertand port number");
1190 if (as->parms[SERVER].items) {
1191 if (!afsclient_CMStatOpenPort
1192 (cellHandle, as->parms[SERVER].items->data, srvrPort, &conn,
1194 ERR_ST_EXT("afsclient_CMStatOpenPort", st);
1198 if (!util_CMLocalCell(conn, cellname, &st)) {
1199 ERR_ST_EXT("util_CMLocalCell", st);
1202 printf("Client %s (port %s) is in cell %s\n",
1203 as->parms[SERVER].items->data, as->parms[PORT].items->data,
1206 afsclient_CMStatClose(conn, 0);
1212 Print_afs_ClientConfig_p(afs_ClientConfig_p config)
1214 printf(" clientVersion: %d\n", config->clientVersion);
1215 printf(" serverVersion: %d\n", config->serverVersion);
1216 printf(" nChunkFiles: %d\n", config->c.config_v1.nChunkFiles);
1217 printf(" nStatCaches: %d\n", config->c.config_v1.nStatCaches);
1218 printf(" nDataCaches: %d\n", config->c.config_v1.nDataCaches);
1219 printf(" nVolumeCaches: %d\n", config->c.config_v1.nVolumeCaches);
1220 printf(" firstChunkSize: %d\n", config->c.config_v1.firstChunkSize);
1221 printf(" otherChunkSize: %d\n", config->c.config_v1.otherChunkSize);
1222 printf(" cacheSize: %d\n", config->c.config_v1.cacheSize);
1223 printf(" setTime: %d\n", config->c.config_v1.setTime);
1224 printf(" memCache: %d\n", config->c.config_v1.memCache);
1229 DoClientCMClientConfig(struct cmd_syndesc *as, char *arock)
1231 afs_status_t st = 0;
1232 typedef enum { SERVER, PORT } DoClientCMLocalCell_parm_t;
1233 struct rx_connection *conn;
1235 int srvrPort = AFSCONF_CALLBACKPORT;
1236 afs_ClientConfig_t config;
1239 (pthread_func_list_done
1240 || pthread_once(&pthread_func_list_once, cr_list));
1243 if (as->parms[PORT].items) {
1244 if (!GetStatPortFromString(as->parms[PORT].items->data, &srvrPort)) {
1245 ERR_EXT("Couldn't undertand port number");
1249 if (as->parms[SERVER].items) {
1250 if (!afsclient_CMStatOpenPort
1251 (cellHandle, as->parms[SERVER].items->data, srvrPort, &conn,
1253 ERR_ST_EXT("afsclient_CMStatOpenPort", st);
1257 if (!util_CMClientConfig(conn, &config, &st)) {
1258 ERR_ST_EXT("util_CMClientConfig", st);
1261 printf("Cache configuration for client %s (port %s):\n\n",
1262 as->parms[SERVER].items->data, as->parms[PORT].items->data);
1264 Print_afs_ClientConfig_p(&config);
1268 afsclient_CMStatClose(conn, 0);
1274 SetupClientAdminCmd(void)
1276 struct cmd_syndesc *ts;
1278 ts = cmd_CreateSyntax("ClientLocalCellGet", DoClientLocalCellGet, 0,
1279 "get the name of this machine's cell");
1280 SetupCommonCmdArgs(ts);
1282 ts = cmd_CreateSyntax("ClientMountPointCreate", DoClientMountPointCreate,
1283 0, "create a mount point");
1284 cmd_AddParm(ts, "-directory", CMD_SINGLE, CMD_REQUIRED,
1285 "directory where mount point will be created");
1286 cmd_AddParm(ts, "-volume", CMD_SINGLE, CMD_REQUIRED,
1287 "the name of the volume to mount");
1288 cmd_AddParm(ts, "-readwrite", CMD_FLAG, CMD_OPTIONAL,
1289 "mount a read write volume");
1290 cmd_AddParm(ts, "-check", CMD_FLAG, CMD_OPTIONAL,
1291 "check that the volume exists before mounting");
1292 SetupCommonCmdArgs(ts);
1294 ts = cmd_CreateSyntax("ClientAFSServerGet", DoClientAFSServerGet, 0,
1295 "retrieve information about an afs server");
1296 cmd_AddParm(ts, "-server", CMD_SINGLE, CMD_REQUIRED, "server to query");
1297 SetupCommonCmdArgs(ts);
1299 ts = cmd_CreateSyntax("ClientAFSServerList", DoClientAFSServerList, 0,
1300 "retrieve information about all afs "
1301 "servers in a cell");
1302 cmd_AddParm(ts, "-server", CMD_SINGLE, CMD_REQUIRED,
1303 "server where command will execute");
1304 cmd_AddParm(ts, "-process", CMD_SINGLE, CMD_REQUIRED,
1305 "process to query <bosserver fileserver ptserver "
1306 "kaserver client vlserver volserver>");
1307 cmd_AddParm(ts, "-stat_type", CMD_SINGLE, CMD_REQUIRED,
1308 "stats to retrieve <peer or process>");
1309 SetupCommonCmdArgs(ts);
1311 ts = cmd_CreateSyntax("ClientRPCStatsStateGet", DoClientRPCStatsStateGet,
1312 0, "retrieve the rpc stat collection state");
1313 cmd_AddParm(ts, "-server", CMD_SINGLE, CMD_REQUIRED,
1314 "server where command will execute");
1315 cmd_AddParm(ts, "-process", CMD_SINGLE, CMD_REQUIRED,
1316 "process to query <bosserver fileserver ptserver "
1317 "kaserver client vlserver volserver>");
1318 cmd_AddParm(ts, "-stat_type", CMD_SINGLE, CMD_REQUIRED,
1319 "stats to retrieve <peer or process>");
1320 SetupCommonCmdArgs(ts);
1322 ts = cmd_CreateSyntax("ClientRPCStatsStateEnable",
1323 DoClientRPCStatsStateEnable, 0,
1324 "set the rpc stat collection state to on");
1325 cmd_AddParm(ts, "-server", CMD_SINGLE, CMD_REQUIRED,
1326 "server where command will execute");
1327 cmd_AddParm(ts, "-process", CMD_SINGLE, CMD_REQUIRED,
1328 "process to query <bosserver fileserver ptserver "
1329 "kaserver client vlserver volserver>");
1330 cmd_AddParm(ts, "-stat_type", CMD_SINGLE, CMD_REQUIRED,
1331 "stats to retrieve <peer or process>");
1332 SetupCommonCmdArgs(ts);
1334 ts = cmd_CreateSyntax("ClientRPCStatsStateDisable",
1335 DoClientRPCStatsStateDisable, 0,
1336 "set the rpc stat collection state to off");
1337 cmd_AddParm(ts, "-server", CMD_SINGLE, CMD_REQUIRED,
1338 "server where command will execute");
1339 cmd_AddParm(ts, "-process", CMD_SINGLE, CMD_REQUIRED,
1340 "process to query <bosserver fileserver ptserver "
1341 "kaserver client vlserver volserver>");
1342 cmd_AddParm(ts, "-stat_type", CMD_SINGLE, CMD_REQUIRED,
1343 "stats to retrieve <peer or process>");
1344 SetupCommonCmdArgs(ts);
1346 ts = cmd_CreateSyntax("ClientRPCStatsList", DoClientRPCStatsList, 0,
1347 "list the rpc stats");
1348 cmd_AddParm(ts, "-server", CMD_SINGLE, CMD_REQUIRED,
1349 "server where command will execute");
1350 cmd_AddParm(ts, "-process", CMD_SINGLE, CMD_REQUIRED,
1351 "process to query <bosserver fileserver ptserver "
1352 "kaserver client vlserver volserver>");
1353 cmd_AddParm(ts, "-stat_type", CMD_SINGLE, CMD_REQUIRED,
1354 "stats to retrieve <peer or process>");
1355 SetupCommonCmdArgs(ts);
1357 ts = cmd_CreateSyntax("ClientRPCStatsClear", DoClientRPCStatsClear, 0,
1358 "reset rpc stat counters");
1359 cmd_AddParm(ts, "-server", CMD_SINGLE, CMD_REQUIRED,
1360 "server where command will execute");
1361 cmd_AddParm(ts, "-process", CMD_SINGLE, CMD_REQUIRED,
1362 "process to query <bosserver fileserver ptserver "
1363 "kaserver client vlserver volserver>");
1364 cmd_AddParm(ts, "-stat_type", CMD_SINGLE, CMD_REQUIRED,
1365 "stats to retrieve <peer or process>");
1366 cmd_AddParm(ts, "-clear_all", CMD_FLAG, CMD_OPTIONAL,
1367 "clear all existing counters");
1368 cmd_AddParm(ts, "-clear_invocations", CMD_FLAG, CMD_OPTIONAL,
1369 "clear invocation count");
1370 cmd_AddParm(ts, "-clear_bytes_sent", CMD_FLAG, CMD_OPTIONAL,
1371 "clear bytes_sent count");
1372 cmd_AddParm(ts, "-clear_bytes_rcvd", CMD_FLAG, CMD_OPTIONAL,
1373 "clear bytes_rcvd count");
1374 cmd_AddParm(ts, "-clear_queue_time_sum", CMD_FLAG, CMD_OPTIONAL,
1375 "clear queue time sum");
1376 cmd_AddParm(ts, "-clear_queue_time_square", CMD_FLAG, CMD_OPTIONAL,
1377 "clear queue time square");
1378 cmd_AddParm(ts, "-clear_queue_time_min", CMD_FLAG, CMD_OPTIONAL,
1379 "clear queue time min");
1380 cmd_AddParm(ts, "-clear_queue_time_max", CMD_FLAG, CMD_OPTIONAL,
1381 "clear queue time max");
1382 cmd_AddParm(ts, "-clear_exec_time_sum", CMD_FLAG, CMD_OPTIONAL,
1383 "clear exec time sum");
1384 cmd_AddParm(ts, "-clear_exec_time_square", CMD_FLAG, CMD_OPTIONAL,
1385 "clear exec time square");
1386 cmd_AddParm(ts, "-clear_exec_time_min", CMD_FLAG, CMD_OPTIONAL,
1387 "clear exec time min");
1388 cmd_AddParm(ts, "-clear_exec_time_max", CMD_FLAG, CMD_OPTIONAL,
1389 "clear exec time max");
1390 SetupCommonCmdArgs(ts);
1392 ts = cmd_CreateSyntax("ClientRPCStatsVersionGet",
1393 DoClientRPCStatsVersionGet, 0,
1394 "list the server's rpc stats version");
1395 cmd_AddParm(ts, "-server", CMD_SINGLE, CMD_REQUIRED,
1396 "server where command will execute");
1397 cmd_AddParm(ts, "-process", CMD_SINGLE, CMD_REQUIRED,
1398 "process to query <bosserver fileserver ptserver "
1399 "kaserver client vlserver volserver>");
1400 SetupCommonCmdArgs(ts);
1402 ts = cmd_CreateSyntax("ClientCMGetServerPrefs", DoClientCMGetServerPrefs,
1403 0, "list a client's server preferences ");
1404 cmd_AddParm(ts, "-server", CMD_SINGLE, CMD_REQUIRED,
1405 "server where command will execute");
1406 cmd_AddParm(ts, "-port", CMD_SINGLE, CMD_OPTIONAL, "UDP port to query");
1407 SetupCommonCmdArgs(ts);
1409 ts = cmd_CreateSyntax("ClientCMListCells", DoClientCMListCells, 0,
1410 "list a client's CellServDB ");
1411 cmd_AddParm(ts, "-server", CMD_SINGLE, CMD_REQUIRED,
1412 "server where command will execute");
1413 cmd_AddParm(ts, "-port", CMD_SINGLE, CMD_OPTIONAL, "UDP port to query");
1414 SetupCommonCmdArgs(ts);
1416 ts = cmd_CreateSyntax("ClientCMLocalCell", DoClientCMLocalCell, 0,
1417 "get the name of the client's local cell");
1418 cmd_AddParm(ts, "-server", CMD_SINGLE, CMD_REQUIRED,
1419 "server where command will execute");
1420 cmd_AddParm(ts, "-port", CMD_SINGLE, CMD_OPTIONAL, "UDP port to query");
1421 SetupCommonCmdArgs(ts);
1423 ts = cmd_CreateSyntax("ClientCMClientConfig", DoClientCMClientConfig, 0,
1424 "get the client's cache configuration");
1425 cmd_AddParm(ts, "-server", CMD_SINGLE, CMD_REQUIRED,
1426 "server where command will execute");
1427 cmd_AddParm(ts, "-port", CMD_SINGLE, CMD_OPTIONAL, "UDP port to query");
1428 SetupCommonCmdArgs(ts);