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 <afs/param.h>
15 #include <afsconfig.h>
20 #include <afs/cellconfig.h>
21 #include <afs/bosint.h>
22 #include <rx/rxstat.h>
23 #include <afs/afsint.h>
24 #define FSINT_COMMON_XG
25 #include <afs/afscbint.h>
26 #include <afs/kauth.h>
27 #include <afs/kautils.h>
28 #include <afs/ptint.h>
29 #include <afs/ptserver.h>
30 #include <afs/vldbint.h>
31 #include <afs/volint.h>
32 #include <afs/volser.h>
40 extern int RXSTATS_RetrieveProcessRPCStats();
41 extern int RXSTATS_RetrievePeerRPCStats();
42 extern int RXSTATS_QueryProcessRPCStats();
43 extern int RXSTATS_QueryPeerRPCStats();
44 extern int RXSTATS_EnableProcessRPCStats();
45 extern int RXSTATS_EnablePeerRPCStats();
46 extern int RXSTATS_DisableProcessRPCStats();
47 extern int RXSTATS_DisablePeerRPCStats();
48 extern int RXSTATS_ClearProcessRPCStats();
49 extern int RXSTATS_ClearPeerRPCStats();
52 * This structure stores the client and server function lists.
53 * This is kept separate from the actual interface definitions
54 * since an rpc interface can be offered by several servers
55 * (e.g. ubik and rxstat)
57 * The purpose of these functions is to allow a mapping from interfaceId
58 * to text representations of server process names and function names.
62 const char **functionList;
63 size_t functionListLen;
64 } interface_function_list_t, *interface_function_list_p;
69 * On NT, you cannot define an array of character pointers in a dll
70 * and then access this array outside the dll via a global initialization
71 * because the msvc compiler will complain that the initializer is not
72 * a constant (i.e. C2099: initializer is not a constant). This is because
73 * the dllimport and dllexport c language extensions cause references
74 * to the character array to go through another level of indirection -
75 * and this indirection is unknown at compilation time.
77 * To get around this problem I hand initialize this array on NT only
80 static interface_function_list_t afs_server;
81 static interface_function_list_t afscb_server;
82 static interface_function_list_t bos_server;
83 static interface_function_list_t kauth_kaa_server;
84 static interface_function_list_t kauth_kam_server;
85 static interface_function_list_t kauth_kat_server;
86 static interface_function_list_t pts_server;
87 static interface_function_list_t rxstat_server;
88 static interface_function_list_t ubik_disk_server;
89 static interface_function_list_t ubik_vote_server;
90 static interface_function_list_t vl_server;
91 static interface_function_list_t vol_server;
92 static pthread_once_t pthread_func_list_once = PTHREAD_ONCE_INIT;
93 static int pthread_func_list_done;
95 static void cr_list(void) {
96 afs_server.functionList = RXAFS_function_names;
97 afs_server.functionListLen = RXAFS_NO_OF_STAT_FUNCS;
98 afscb_server.functionList = RXAFSCB_function_names;
99 afscb_server.functionListLen = RXAFSCB_NO_OF_STAT_FUNCS;
100 bos_server.functionList = BOZO_function_names;
101 bos_server.functionListLen = BOZO_NO_OF_STAT_FUNCS;
102 kauth_kaa_server.functionList = KAA_function_names;
103 kauth_kaa_server.functionListLen = KAA_NO_OF_STAT_FUNCS;
104 kauth_kam_server.functionList = KAM_function_names;
105 kauth_kam_server.functionListLen = KAM_NO_OF_STAT_FUNCS;
106 kauth_kat_server.functionList = KAT_function_names;
107 kauth_kat_server.functionListLen = KAT_NO_OF_STAT_FUNCS;
108 pts_server.functionList = PR_function_names;
109 pts_server.functionListLen = PR_NO_OF_STAT_FUNCS;
110 rxstat_server.functionList = RXSTATS_function_names;
111 rxstat_server.functionListLen = RXSTATS_NO_OF_STAT_FUNCS;
112 ubik_disk_server.functionList = DISK_function_names;
113 ubik_disk_server.functionListLen = DISK_NO_OF_STAT_FUNCS;
114 ubik_vote_server.functionList = VOTE_function_names;
115 ubik_vote_server.functionListLen = VOTE_NO_OF_STAT_FUNCS;
116 vl_server.functionList = VL_function_names;
117 vl_server.functionListLen = VL_NO_OF_STAT_FUNCS;
118 vol_server.functionList = AFSVolfunction_names;
119 vol_server.functionListLen = AFSVolNO_OF_STAT_FUNCS;
120 pthread_func_list_done = 1;
125 static interface_function_list_t afs_server = {
126 RXAFS_function_names,
127 RXAFS_NO_OF_STAT_FUNCS
130 static interface_function_list_t afscb_server = {
131 RXAFSCB_function_names,
132 RXAFSCB_NO_OF_STAT_FUNCS
135 static interface_function_list_t bos_server = {
137 BOZO_NO_OF_STAT_FUNCS
140 static interface_function_list_t kauth_kaa_server = {
145 static interface_function_list_t kauth_kam_server = {
150 static interface_function_list_t kauth_kat_server = {
155 static interface_function_list_t pts_server = {
160 static interface_function_list_t rxstat_server = {
161 RXSTATS_function_names,
162 RXSTATS_NO_OF_STAT_FUNCS
165 static interface_function_list_t ubik_disk_server = {
167 DISK_NO_OF_STAT_FUNCS,
170 static interface_function_list_t ubik_vote_server = {
172 VOTE_NO_OF_STAT_FUNCS,
175 static interface_function_list_t vl_server = {
180 static interface_function_list_t vol_server = {
181 AFSVolfunction_names,
182 AFSVolNO_OF_STAT_FUNCS
185 #endif /* AFS_NT40_ENV */
187 static interface_function_list_t unknown_server = {
193 afs_uint32 interfaceId;
194 const char *interfaceName;
195 interface_function_list_p functionList;
196 } interface_t, *interface_p;
198 interface_t int_list[] = {
248 * Note the code below assumes that the following entry is the last entry
252 { 0, "unknown", &unknown_server}
260 DoClientLocalCellGet(struct cmd_syndesc *as, char *arock)
263 char cellName[MAXCELLCHARS];
265 if (!afsclient_LocalCellGet(cellName,&st)) {
266 ERR_ST_EXT("afsclient_LocalCellGet", st);
269 printf("This machine belongs to cell: %s\n", cellName);
275 DoClientMountPointCreate(struct cmd_syndesc *as, char *arock)
277 typedef enum {DIRECTORY, VOLUME, READWRITE, CHECK}
278 DoClientMountPointCreate_parm_t;
280 const char *directory;
282 vol_type_t vol_type = READ_ONLY;
283 vol_check_t vol_check = DONT_CHECK_VOLUME;
285 if (as->parms[DIRECTORY].items) {
286 directory = as->parms[DIRECTORY].items->data;
289 if (as->parms[VOLUME].items) {
290 volume = as->parms[VOLUME].items->data;
293 if (as->parms[READWRITE].items) {
294 vol_type = READ_WRITE;
297 if (as->parms[CHECK].items) {
298 vol_check = CHECK_VOLUME;
301 if (!afsclient_MountPointCreate(cellHandle,
307 ERR_ST_EXT("afsclient_MountPointCreate", st);
314 Print_afs_serverEntry_p(afs_serverEntry_p serv, const char *prefix)
318 printf("%sInformation for server %s\n", prefix, serv->serverName);
319 if (serv->serverType & DATABASE_SERVER) {
320 printf("%s\tIt is a database server\n", prefix);
322 if (serv->serverType & FILE_SERVER) {
323 printf("%s\tIt is a file server\n", prefix);
325 printf("%s\tServer addresses:%s\n", prefix, serv->serverName);
326 while (serv->serverAddress[i] != 0) {
327 printf("\t\t%s%x\n", prefix, serv->serverAddress[i++]);
332 DoClientAFSServerGet(struct cmd_syndesc *as, char *arock)
334 typedef enum {SERVER}
335 DoClientAFSServerGet_parm_t;
338 afs_serverEntry_t entry;
340 if (as->parms[SERVER].items) {
341 server = as->parms[SERVER].items->data;
344 if (!afsclient_AFSServerGet(cellHandle,
348 ERR_ST_EXT("afsclient_AFSServerGet", st);
351 Print_afs_serverEntry_p(&entry, "");
357 DoClientAFSServerList(struct cmd_syndesc *as, char *arock)
360 afs_serverEntry_t entry;
363 if (!afsclient_AFSServerGetBegin(cellHandle,
366 ERR_ST_EXT("afsclient_AFSServerGetBegin", st);
369 while(afsclient_AFSServerGetNext(iter, &entry, &st)) {
370 Print_afs_serverEntry_p(&entry, "");
373 if (st != ADMITERATORDONE) {
374 ERR_ST_EXT("afsclient_AFSServerGetNext", st);
377 if (!afsclient_AFSServerGetDone(iter, &st)) {
378 ERR_ST_EXT("afsclient_AFSServerGetDone", st);
386 Print_afs_RPCStatsState_p(
387 afs_RPCStatsState_p state,
390 printf("%sThe rpc stats state is: ", prefix);
392 case AFS_RPC_STATS_DISABLED:
393 printf("disabled\n");
395 case AFS_RPC_STATS_ENABLED:
403 afs_stat_source_t value;
404 } afs_type_map_t, *afs_type_map_p;
406 static afs_type_map_t map[] = {
407 {"bosserver", AFS_BOSSERVER},
408 {"fileserver", AFS_FILESERVER},
409 {"kaserver", AFS_KASERVER},
410 {"ptserver", AFS_PTSERVER},
411 {"volserver", AFS_VOLSERVER},
412 {"vlserver", AFS_VLSERVER},
413 {"client", AFS_CLIENT},
417 GetStatPortFromString(const char *type, int *port) {
422 tport = strtol(type, &end, 0);
423 if (tport == 0 || end == type || *end != '\0') {
432 GetStatSourceFromString(const char *type, afs_stat_source_t *src, int *port) {
434 size_t type_len = strlen(type);
436 for(i=0; (map[i].tag) && strncasecmp(type, map[i].tag, type_len); i++);
438 if (map[i].tag == 0) {
440 * Try to convert string to port number
442 if (GetStatPortFromString(type, port)) {
446 fprintf(stderr, "couldn't convert server to type, try one of the "
448 for(i=0; map[i].tag;i++) {
449 fprintf(stderr, "%s ", map[i].tag);
462 } afs_stat_type_t, *afs_stat_type_p;
464 static afs_stat_type_t
465 GetStatTypeFromString(const char *type) {
468 if (!strcmp(type, "peer")) {
470 } else if (!strcmp(type, "process")) {
471 rc = AFS_PROCESS_STATS;
473 ERR_EXT("stat_type must be process or peer");
480 DoClientRPCStatsStateGet(struct cmd_syndesc *as, char *arock)
482 typedef enum {SERVER, PROCESS, STAT_TYPE}
483 DoClientRPCStatsStateGet_parm_t;
485 struct rx_connection *conn;
487 afs_stat_source_t type;
490 afs_stat_type_t which;
491 afs_RPCStatsState_t state;
493 if (as->parms[PROCESS].items) {
494 typeIsValid = GetStatSourceFromString(as->parms[PROCESS].items->data,
498 if (as->parms[STAT_TYPE].items) {
499 which = GetStatTypeFromString(as->parms[STAT_TYPE].items->data);
502 if (as->parms[SERVER].items) {
504 if (!afsclient_RPCStatOpen(cellHandle,
505 as->parms[SERVER].items->data,
509 ERR_ST_EXT("afsclient_RPCStatOpen", st);
512 if (!afsclient_RPCStatOpenPort(cellHandle,
513 as->parms[SERVER].items->data,
517 ERR_ST_EXT("afsclient_RPCStatOpenPort", st);
522 if (which == AFS_PEER_STATS) {
523 if (!util_RPCStatsStateGet(conn, RXSTATS_QueryPeerRPCStats, &state, &st)) {
524 ERR_ST_EXT("util_RPCStatsStateGet", st);
527 if (!util_RPCStatsStateGet(conn, RXSTATS_QueryProcessRPCStats, &state, &st)) {
528 ERR_ST_EXT("util_RPCStatsStateGet", st);
532 Print_afs_RPCStatsState_p(&state, "");
534 afsclient_RPCStatClose(conn, 0);
540 DoClientRPCStatsStateEnable(struct cmd_syndesc *as, char *arock)
542 typedef enum {SERVER, PROCESS, STAT_TYPE}
543 DoClientRPCStatsEnable_parm_t;
545 struct rx_connection *conn;
547 afs_stat_source_t type;
550 afs_stat_type_t which;
552 if (as->parms[PROCESS].items) {
553 typeIsValid = GetStatSourceFromString(as->parms[PROCESS].items->data,
557 if (as->parms[STAT_TYPE].items) {
558 which = GetStatTypeFromString(as->parms[STAT_TYPE].items->data);
561 if (as->parms[SERVER].items) {
563 if (!afsclient_RPCStatOpen(cellHandle,
564 as->parms[SERVER].items->data,
568 ERR_ST_EXT("afsclient_RPCStatOpen", st);
571 if (!afsclient_RPCStatOpenPort(cellHandle,
572 as->parms[SERVER].items->data,
576 ERR_ST_EXT("afsclient_RPCStatOpenPort", st);
581 if (which == AFS_PEER_STATS) {
582 if (!util_RPCStatsStateEnable(conn, RXSTATS_EnablePeerRPCStats, &st)) {
583 ERR_ST_EXT("util_RPCStatsStateEnable", st);
586 if (!util_RPCStatsStateEnable(conn, RXSTATS_EnableProcessRPCStats, &st)) {
587 ERR_ST_EXT("util_RPCStatsStateEnable", st);
591 afsclient_RPCStatClose(conn, 0);
597 DoClientRPCStatsStateDisable(struct cmd_syndesc *as, char *arock)
599 typedef enum {SERVER, PROCESS, STAT_TYPE}
600 DoClientRPCStatsDisable_parm_t;
602 struct rx_connection *conn;
604 afs_stat_source_t type;
607 afs_stat_type_t which;
609 if (as->parms[PROCESS].items) {
610 typeIsValid = GetStatSourceFromString(as->parms[PROCESS].items->data,
614 if (as->parms[STAT_TYPE].items) {
615 which = GetStatTypeFromString(as->parms[STAT_TYPE].items->data);
618 if (as->parms[SERVER].items) {
620 if (!afsclient_RPCStatOpen(cellHandle,
621 as->parms[SERVER].items->data,
625 ERR_ST_EXT("afsclient_RPCStatOpen", st);
628 if (!afsclient_RPCStatOpenPort(cellHandle,
629 as->parms[SERVER].items->data,
633 ERR_ST_EXT("afsclient_RPCStatOpenPort", st);
638 if (which == AFS_PEER_STATS) {
639 if (!util_RPCStatsStateDisable(conn, RXSTATS_DisablePeerRPCStats, &st)) {
640 ERR_ST_EXT("util_RPCStatsStateDisable", st);
643 if (!util_RPCStatsStateDisable(conn, RXSTATS_DisableProcessRPCStats, &st)) {
644 ERR_ST_EXT("util_RPCStatsStateDisable", st);
648 afsclient_RPCStatClose(conn, 0);
654 Print_afs_RPCStats_p(
656 interface_function_list_p f_list,
659 afs_int32 index = stat->s.stats_v1.func_index;
661 if (index > ((afs_int32) f_list->functionListLen - 1)) {
662 printf("%sUnknown function ", prefix);
666 f_list->functionList[stat->s.stats_v1.func_index]);
669 if (!hiszero(stat->s.stats_v1.invocations)) {
670 printf("%sinvoc (%u.%u) bytes_sent (%u.%u) bytes_rcvd (%u.%u)\n",
671 prefix, hgethi(stat->s.stats_v1.invocations),
672 hgetlo(stat->s.stats_v1.invocations),
673 hgethi(stat->s.stats_v1.bytes_sent),
674 hgetlo(stat->s.stats_v1.bytes_sent),
675 hgethi(stat->s.stats_v1.bytes_rcvd),
676 hgetlo(stat->s.stats_v1.bytes_rcvd)
678 printf("\tqsum %d.%06d\tqsqr %d.%06d"
679 "\tqmin %d.%06d\tqmax %d.%06d\n",
680 stat->s.stats_v1.queue_time_sum.sec,
681 stat->s.stats_v1.queue_time_sum.usec,
682 stat->s.stats_v1.queue_time_sum_sqr.sec,
683 stat->s.stats_v1.queue_time_sum_sqr.usec,
684 stat->s.stats_v1.queue_time_min.sec,
685 stat->s.stats_v1.queue_time_min.usec,
686 stat->s.stats_v1.queue_time_max.sec,
687 stat->s.stats_v1.queue_time_max.usec
689 printf("\txsum %d.%06d\txsqr %d.%06d"
690 "\txmin %d.%06d\txmax %d.%06d\n",
691 stat->s.stats_v1.execution_time_sum.sec,
692 stat->s.stats_v1.execution_time_sum.usec,
693 stat->s.stats_v1.execution_time_sum_sqr.sec,
694 stat->s.stats_v1.execution_time_sum_sqr.usec,
695 stat->s.stats_v1.execution_time_min.sec,
696 stat->s.stats_v1.execution_time_min.usec,
697 stat->s.stats_v1.execution_time_max.sec,
698 stat->s.stats_v1.execution_time_max.usec
701 printf("never invoked\n");
706 DoClientRPCStatsList(struct cmd_syndesc *as, char *arock)
708 typedef enum {SERVER, PROCESS, STAT_TYPE}
709 DoClientRPCStatsList_parm_t;
711 struct rx_connection *conn;
713 afs_stat_source_t type;
716 afs_stat_type_t which;
717 afs_RPCStats_t stats;
722 (pthread_func_list_done || pthread_once(&pthread_func_list_once, cr_list));
725 if (as->parms[PROCESS].items) {
726 typeIsValid = GetStatSourceFromString(as->parms[PROCESS].items->data,
730 if (as->parms[STAT_TYPE].items) {
731 which = GetStatTypeFromString(as->parms[STAT_TYPE].items->data);
734 if (as->parms[SERVER].items) {
736 if (!afsclient_RPCStatOpen(cellHandle,
737 as->parms[SERVER].items->data,
741 ERR_ST_EXT("afsclient_RPCStatOpen", st);
744 if (!afsclient_RPCStatOpenPort(cellHandle,
745 as->parms[SERVER].items->data,
749 ERR_ST_EXT("afsclient_RPCStatOpenPort", st);
754 if (which == AFS_PEER_STATS) {
755 if (!util_RPCStatsGetBegin(conn, RXSTATS_RetrievePeerRPCStats, &iter, &st)) {
756 ERR_ST_EXT("util_RPCStatsGetBegin", st);
759 if (!util_RPCStatsGetBegin(conn, RXSTATS_RetrieveProcessRPCStats, &iter, &st)) {
760 ERR_ST_EXT("util_RPCStatsGetBegin", st);
764 printf("Listing rpc stats at server %s process %s:\n",
765 as->parms[SERVER].items->data,
766 as->parms[PROCESS].items->data);
768 while (util_RPCStatsGetNext(iter, &stats, &st)) {
771 * Print a new heading for each stat collection
774 if (stats.s.stats_v1.func_index == 0) {
779 * Look up the interface in our list
782 for(i=0;i<((sizeof(int_list)-1) / sizeof(interface_t));i++) {
783 if (stats.s.stats_v1.interfaceId == int_list[i].interfaceId) {
789 * Print out a meaningful header for each stat collection
792 if (which == AFS_PEER_STATS) {
794 ina.s_addr = htonl(stats.s.stats_v1.remote_peer);
796 printf("%s stats for remote peer located at %s port %u "
797 "%s %s as a %s via the %s interface\n",
798 as->parms[PROCESS].items->data,
800 stats.s.stats_v1.remote_port,
802 ((stats.s.stats_v1.remote_is_server) ?
803 "accessed by" : "accessing"),
805 as->parms[PROCESS].items->data,
807 ((stats.s.stats_v1.remote_is_server) ?
808 "client" : "server"),
809 int_list[i].interfaceName
812 printf("%s stats for the %s interface "
813 "accessed as a %s\n",
814 as->parms[PROCESS].items->data,
815 int_list[i].interfaceName,
817 ((stats.s.stats_v1.remote_is_server) ?
822 Print_afs_RPCStats_p(&stats, int_list[i].functionList, " ");
825 if (st != ADMITERATORDONE) {
826 ERR_ST_EXT("util_RPCStatsGetNext", st);
829 if (!util_RPCStatsGetDone(iter, &st)) {
830 ERR_ST_EXT("util_RPCStatsGetDone", st);
833 afsclient_RPCStatClose(conn, 0);
839 DoClientRPCStatsClear(struct cmd_syndesc *as, char *arock)
841 typedef enum {SERVER, PROCESS, STAT_TYPE, CLEAR_ALL, CLEAR_INVOCATIONS,
842 CLEAR_BYTES_SENT, CLEAR_BYTES_RCVD,
843 CLEAR_QUEUE_TIME_SUM, CLEAR_QUEUE_TIME_SQUARE,
844 CLEAR_QUEUE_TIME_MIN, CLEAR_QUEUE_TIME_MAX,
845 CLEAR_EXEC_TIME_SUM, CLEAR_EXEC_TIME_SQUARE,
846 CLEAR_EXEC_TIME_MIN, CLEAR_EXEC_TIME_MAX}
847 DoClientRPCStatsClear_parm_t;
849 struct rx_connection *conn;
851 afs_stat_source_t type;
854 afs_stat_type_t which;
855 afs_RPCStatsClearFlag_t flag = 0;
859 if (as->parms[PROCESS].items) {
860 typeIsValid = GetStatSourceFromString(as->parms[PROCESS].items->data,
864 if (as->parms[STAT_TYPE].items) {
865 which = GetStatTypeFromString(as->parms[STAT_TYPE].items->data);
868 if (as->parms[SERVER].items) {
870 if (!afsclient_RPCStatOpen(cellHandle,
871 as->parms[SERVER].items->data,
875 ERR_ST_EXT("afsclient_RPCStatOpen", st);
878 if (!afsclient_RPCStatOpenPort(cellHandle,
879 as->parms[SERVER].items->data,
883 ERR_ST_EXT("afsclient_RPCStatOpenPort", st);
888 if (as->parms[CLEAR_ALL].items) {
891 flag = AFS_RX_STATS_CLEAR_ALL;
894 if (as->parms[CLEAR_INVOCATIONS].items) {
896 ERR_EXT("cannot specify additional flags when "
897 "specifying clear_all");
900 flag |= AFS_RX_STATS_CLEAR_INVOCATIONS;
903 if (as->parms[CLEAR_BYTES_SENT].items) {
905 ERR_EXT("cannot specify additional flags when "
906 "specifying clear_all");
909 flag |= AFS_RX_STATS_CLEAR_BYTES_SENT;
912 if (as->parms[CLEAR_BYTES_RCVD].items) {
914 ERR_EXT("cannot specify additional flags when "
915 "specifying clear_all");
918 flag |= AFS_RX_STATS_CLEAR_BYTES_RCVD;
921 if (as->parms[CLEAR_QUEUE_TIME_SUM].items) {
923 ERR_EXT("cannot specify additional flags when "
924 "specifying clear_all");
927 flag |= AFS_RX_STATS_CLEAR_QUEUE_TIME_SUM;
930 if (as->parms[CLEAR_QUEUE_TIME_SQUARE].items) {
932 ERR_EXT("cannot specify additional flags when "
933 "specifying clear_all");
936 flag |= AFS_RX_STATS_CLEAR_QUEUE_TIME_SQUARE;
939 if (as->parms[CLEAR_QUEUE_TIME_MIN].items) {
941 ERR_EXT("cannot specify additional flags when "
942 "specifying clear_all");
945 flag |= AFS_RX_STATS_CLEAR_QUEUE_TIME_MIN;
948 if (as->parms[CLEAR_QUEUE_TIME_MAX].items) {
950 ERR_EXT("cannot specify additional flags when "
951 "specifying clear_all");
954 flag |= AFS_RX_STATS_CLEAR_QUEUE_TIME_MAX;
957 if (as->parms[CLEAR_EXEC_TIME_SUM].items) {
959 ERR_EXT("cannot specify additional flags when "
960 "specifying clear_all");
963 flag |= AFS_RX_STATS_CLEAR_EXEC_TIME_SUM;
966 if (as->parms[CLEAR_EXEC_TIME_SQUARE].items) {
968 ERR_EXT("cannot specify additional flags when "
969 "specifying clear_all");
972 flag |= AFS_RX_STATS_CLEAR_EXEC_TIME_SQUARE;
975 if (as->parms[CLEAR_EXEC_TIME_MIN].items) {
977 ERR_EXT("cannot specify additional flags when "
978 "specifying clear_all");
981 flag |= AFS_RX_STATS_CLEAR_EXEC_TIME_MIN;
984 if (as->parms[CLEAR_EXEC_TIME_MAX].items) {
986 ERR_EXT("cannot specify additional flags when "
987 "specifying clear_all");
990 flag |= AFS_RX_STATS_CLEAR_EXEC_TIME_MAX;
994 ERR_EXT("you must specify something to clear");
997 if (which == AFS_PEER_STATS) {
998 if (!util_RPCStatsClear(conn, RXSTATS_ClearPeerRPCStats, flag, &st)) {
999 ERR_ST_EXT("util_RPCStatsClear", st);
1002 if (!util_RPCStatsClear(conn, RXSTATS_ClearProcessRPCStats, flag, &st)) {
1003 ERR_ST_EXT("util_RPCStatsClear", st);
1007 afsclient_RPCStatClose(conn, 0);
1013 DoClientRPCStatsVersionGet(struct cmd_syndesc *as, char *arock)
1015 typedef enum {SERVER, PROCESS}
1016 DoClientRPCStatsVersionGet_parm_t;
1017 afs_status_t st = 0;
1018 struct rx_connection *conn;
1019 afs_stat_source_t type;
1023 afs_RPCStatsVersion_t version;
1025 if (as->parms[PROCESS].items) {
1026 typeIsValid = GetStatSourceFromString(as->parms[PROCESS].items->data,
1030 if (as->parms[SERVER].items) {
1032 if (!afsclient_RPCStatOpen(cellHandle,
1033 as->parms[SERVER].items->data,
1037 ERR_ST_EXT("afsclient_RPCStatOpen", st);
1040 if (!afsclient_RPCStatOpenPort(cellHandle,
1041 as->parms[SERVER].items->data,
1045 ERR_ST_EXT("afsclient_RPCStatOpenPort", st);
1050 if (!util_RPCStatsVersionGet(conn, &version, &st)) {
1051 ERR_ST_EXT("util_RPCStatsVersionGet", st);
1054 printf("the rpc stat version number is %u\n", version);
1056 afsclient_RPCStatClose(conn, 0);
1062 Print_afs_CMServerPref_p(afs_CMServerPref_p pref)
1066 taddr = pref->ipAddr;
1067 printf("%d.%d.%d.%d\t\t\t%d\n",
1068 (taddr >> 24) & 0xff, (taddr >> 16) & 0xff,
1069 (taddr >> 8) & 0xff, taddr & 0xff, pref->ipRank);
1073 DoClientCMGetServerPrefs(struct cmd_syndesc *as, char *arock)
1075 afs_status_t st = 0;
1076 typedef enum {SERVER, PORT}
1077 DoClientCMGetServerPrefs_parm_t;
1078 struct rx_connection *conn;
1080 int srvrPort = AFSCONF_CALLBACKPORT;
1081 afs_CMServerPref_t prefs;
1085 (pthread_func_list_done || pthread_once(&pthread_func_list_once, cr_list));
1088 if (as->parms[PORT].items) {
1089 if (!GetStatPortFromString(as->parms[PORT].items->data, &srvrPort)) {
1090 ERR_EXT("Couldn't undertand port number");
1094 if (as->parms[SERVER].items) {
1095 if (!afsclient_CMStatOpenPort(cellHandle,
1096 as->parms[SERVER].items->data,
1100 ERR_ST_EXT("afsclient_CMStatOpenPort", st);
1104 if (!util_CMGetServerPrefsBegin(conn, &iter, &st)) {
1105 ERR_ST_EXT("util_CMGetServerPrefsBegin", st);
1108 printf("Listing CellServDB for %s at port %s:\n",
1109 as->parms[SERVER].items->data,
1110 as->parms[PORT].items->data);
1112 while (util_CMGetServerPrefsNext(iter, &prefs, &st)) {
1114 Print_afs_CMServerPref_p(&prefs);
1117 if (st != ADMITERATORDONE) {
1118 ERR_ST_EXT("util_CMGetServerPrefsNext", st);
1121 if (!util_CMGetServerPrefsDone(iter, &st)) {
1122 ERR_ST_EXT("util_CMGetServerPrefsDone", st);
1125 afsclient_CMStatClose(conn, 0);
1131 Print_afs_CMListCell_p(afs_CMListCell_p cellInfo)
1136 printf("Cell %s on hosts", cellInfo->cellname);
1137 for (i = 0 ; i < UTIL_MAX_CELL_HOSTS && cellInfo->serverAddr[i] ; i++) {
1138 taddr = cellInfo->serverAddr[i];
1139 printf(" %d.%d.%d.%d",
1140 (taddr >> 24) & 0xff, (taddr >> 16) & 0xff,
1141 (taddr >> 8) & 0xff, taddr & 0xff);
1147 DoClientCMListCells(struct cmd_syndesc *as, char *arock)
1149 afs_status_t st = 0;
1150 typedef enum {SERVER, PORT}
1151 DoClientCMListCells_parm_t;
1152 struct rx_connection *conn;
1154 int srvrPort = AFSCONF_CALLBACKPORT;
1155 afs_CMListCell_t cellInfo;
1159 (pthread_func_list_done || pthread_once(&pthread_func_list_once, cr_list));
1162 if (as->parms[PORT].items) {
1163 if (!GetStatPortFromString(as->parms[PORT].items->data, &srvrPort)) {
1164 ERR_EXT("Couldn't undertand port number");
1168 if (as->parms[SERVER].items) {
1169 if (!afsclient_CMStatOpenPort(cellHandle,
1170 as->parms[SERVER].items->data,
1174 ERR_ST_EXT("afsclient_CMStatOpenPort", st);
1178 if (!util_CMListCellsBegin(conn, &iter, &st)) {
1179 ERR_ST_EXT("util_CMListCellsBegin", st);
1182 printf("Listing CellServDB for %s at port %s:\n",
1183 as->parms[SERVER].items->data,
1184 as->parms[PORT].items->data);
1186 while (util_CMListCellsNext(iter, &cellInfo, &st)) {
1188 Print_afs_CMListCell_p(&cellInfo);
1191 if (st != ADMITERATORDONE) {
1192 ERR_ST_EXT("util_CMListCellsNext", st);
1195 if (!util_CMListCellsDone(iter, &st)) {
1196 ERR_ST_EXT("util_CMListCellsDone", st);
1199 afsclient_CMStatClose(conn, 0);
1205 DoClientCMLocalCell(struct cmd_syndesc *as, char *arock)
1207 afs_status_t st = 0;
1208 typedef enum {SERVER, PORT}
1209 DoClientCMLocalCell_parm_t;
1210 struct rx_connection *conn;
1212 int srvrPort = AFSCONF_CALLBACKPORT;
1213 afs_CMCellName_t cellname;
1216 (pthread_func_list_done || pthread_once(&pthread_func_list_once, cr_list));
1219 if (as->parms[PORT].items) {
1220 if (!GetStatPortFromString(as->parms[PORT].items->data, &srvrPort)) {
1221 ERR_EXT("Couldn't undertand port number");
1225 if (as->parms[SERVER].items) {
1226 if (!afsclient_CMStatOpenPort(cellHandle,
1227 as->parms[SERVER].items->data,
1231 ERR_ST_EXT("afsclient_CMStatOpenPort", st);
1235 if (!util_CMLocalCell(conn, cellname, &st)) {
1236 ERR_ST_EXT("util_CMLocalCell", st);
1239 printf("Client %s (port %s) is in cell %s\n",
1240 as->parms[SERVER].items->data,
1241 as->parms[PORT].items->data,
1244 afsclient_CMStatClose(conn, 0);
1250 Print_afs_ClientConfig_p(afs_ClientConfig_p config)
1252 printf(" clientVersion: %d\n", config->clientVersion);
1253 printf(" serverVersion: %d\n", config->serverVersion);
1254 printf(" nChunkFiles: %d\n", config->c.config_v1.nChunkFiles);
1255 printf(" nStatCaches: %d\n", config->c.config_v1.nStatCaches);
1256 printf(" nDataCaches: %d\n", config->c.config_v1.nDataCaches);
1257 printf(" nVolumeCaches: %d\n", config->c.config_v1.nVolumeCaches);
1258 printf(" firstChunkSize: %d\n", config->c.config_v1.firstChunkSize);
1259 printf(" otherChunkSize: %d\n", config->c.config_v1.otherChunkSize);
1260 printf(" cacheSize: %d\n", config->c.config_v1.cacheSize);
1261 printf(" setTime: %d\n", config->c.config_v1.setTime);
1262 printf(" memCache: %d\n", config->c.config_v1.memCache);
1267 DoClientCMClientConfig(struct cmd_syndesc *as, char *arock)
1269 afs_status_t st = 0;
1270 typedef enum {SERVER, PORT}
1271 DoClientCMLocalCell_parm_t;
1272 struct rx_connection *conn;
1274 int srvrPort = AFSCONF_CALLBACKPORT;
1275 afs_ClientConfig_t config;
1278 (pthread_func_list_done || pthread_once(&pthread_func_list_once, cr_list));
1281 if (as->parms[PORT].items) {
1282 if (!GetStatPortFromString(as->parms[PORT].items->data, &srvrPort)) {
1283 ERR_EXT("Couldn't undertand port number");
1287 if (as->parms[SERVER].items) {
1288 if (!afsclient_CMStatOpenPort(cellHandle,
1289 as->parms[SERVER].items->data,
1293 ERR_ST_EXT("afsclient_CMStatOpenPort", st);
1297 if (!util_CMClientConfig(conn, &config, &st)) {
1298 ERR_ST_EXT("util_CMClientConfig", st);
1301 printf("Cache configuration for client %s (port %s):\n\n",
1302 as->parms[SERVER].items->data,
1303 as->parms[PORT].items->data);
1305 Print_afs_ClientConfig_p(&config);
1309 afsclient_CMStatClose(conn, 0);
1315 SetupClientAdminCmd(void)
1317 struct cmd_syndesc *ts;
1319 ts = cmd_CreateSyntax("ClientLocalCellGet",
1320 DoClientLocalCellGet, 0,
1321 "get the name of this machine's cell");
1322 SetupCommonCmdArgs(ts);
1324 ts = cmd_CreateSyntax("ClientMountPointCreate",
1325 DoClientMountPointCreate, 0,
1326 "create a mount point");
1331 "directory where mount point will be created");
1336 "the name of the volume to mount");
1341 "mount a read write volume");
1346 "check that the volume exists before mounting");
1347 SetupCommonCmdArgs(ts);
1349 ts = cmd_CreateSyntax("ClientAFSServerGet",
1350 DoClientAFSServerGet, 0,
1351 "retrieve information about an afs server");
1357 SetupCommonCmdArgs(ts);
1359 ts = cmd_CreateSyntax("ClientAFSServerList",
1360 DoClientAFSServerList, 0,
1361 "retrieve information about all afs "
1362 "servers in a cell");
1367 "server where command will execute");
1372 "process to query <bosserver fileserver ptserver "
1373 "kaserver client vlserver volserver>");
1378 "stats to retrieve <peer or process>");
1379 SetupCommonCmdArgs(ts);
1381 ts = cmd_CreateSyntax("ClientRPCStatsStateGet",
1382 DoClientRPCStatsStateGet,
1384 "retrieve the rpc stat collection state");
1389 "server where command will execute");
1394 "process to query <bosserver fileserver ptserver "
1395 "kaserver client vlserver volserver>");
1400 "stats to retrieve <peer or process>");
1401 SetupCommonCmdArgs(ts);
1403 ts = cmd_CreateSyntax("ClientRPCStatsStateEnable",
1404 DoClientRPCStatsStateEnable,
1406 "set the rpc stat collection state to on");
1411 "server where command will execute");
1416 "process to query <bosserver fileserver ptserver "
1417 "kaserver client vlserver volserver>");
1422 "stats to retrieve <peer or process>");
1423 SetupCommonCmdArgs(ts);
1425 ts = cmd_CreateSyntax("ClientRPCStatsStateDisable",
1426 DoClientRPCStatsStateDisable,
1428 "set the rpc stat collection state to off");
1433 "server where command will execute");
1438 "process to query <bosserver fileserver ptserver "
1439 "kaserver client vlserver volserver>");
1444 "stats to retrieve <peer or process>");
1445 SetupCommonCmdArgs(ts);
1447 ts = cmd_CreateSyntax("ClientRPCStatsList",
1448 DoClientRPCStatsList,
1450 "list the rpc stats");
1455 "server where command will execute");
1460 "process to query <bosserver fileserver ptserver "
1461 "kaserver client vlserver volserver>");
1466 "stats to retrieve <peer or process>");
1467 SetupCommonCmdArgs(ts);
1469 ts = cmd_CreateSyntax("ClientRPCStatsClear",
1470 DoClientRPCStatsClear,
1472 "reset rpc stat counters");
1477 "server where command will execute");
1482 "process to query <bosserver fileserver ptserver "
1483 "kaserver client vlserver volserver>");
1488 "stats to retrieve <peer or process>");
1493 "clear all existing counters");
1495 "-clear_invocations",
1498 "clear invocation count");
1500 "-clear_bytes_sent",
1503 "clear bytes_sent count");
1505 "-clear_bytes_rcvd",
1508 "clear bytes_rcvd count");
1510 "-clear_queue_time_sum",
1513 "clear queue time sum");
1515 "-clear_queue_time_square",
1518 "clear queue time square");
1520 "-clear_queue_time_min",
1523 "clear queue time min");
1525 "-clear_queue_time_max",
1528 "clear queue time max");
1530 "-clear_exec_time_sum",
1533 "clear exec time sum");
1535 "-clear_exec_time_square",
1538 "clear exec time square");
1540 "-clear_exec_time_min",
1543 "clear exec time min");
1545 "-clear_exec_time_max",
1548 "clear exec time max");
1549 SetupCommonCmdArgs(ts);
1551 ts = cmd_CreateSyntax("ClientRPCStatsVersionGet",
1552 DoClientRPCStatsVersionGet,
1554 "list the server's rpc stats version");
1559 "server where command will execute");
1564 "process to query <bosserver fileserver ptserver "
1565 "kaserver client vlserver volserver>");
1566 SetupCommonCmdArgs(ts);
1568 ts = cmd_CreateSyntax("ClientCMGetServerPrefs",
1569 DoClientCMGetServerPrefs,
1571 "list a client's server preferences ");
1576 "server where command will execute");
1581 "UDP port to query");
1582 SetupCommonCmdArgs(ts);
1584 ts = cmd_CreateSyntax("ClientCMListCells",
1585 DoClientCMListCells,
1587 "list a client's CellServDB ");
1592 "server where command will execute");
1597 "UDP port to query");
1598 SetupCommonCmdArgs(ts);
1600 ts = cmd_CreateSyntax("ClientCMLocalCell",
1601 DoClientCMLocalCell,
1603 "get the name of the client's local cell");
1608 "server where command will execute");
1613 "UDP port to query");
1614 SetupCommonCmdArgs(ts);
1616 ts = cmd_CreateSyntax("ClientCMClientConfig",
1617 DoClientCMClientConfig,
1619 "get the client's cache configuration");
1624 "server where command will execute");
1629 "UDP port to query");
1630 SetupCommonCmdArgs(ts);