1 /* Copyright (C) 1998 Transarc Corporation - All rights reserved.
6 * This file implements the client related funtions for afscp
10 #include <afs/cellconfig.h>
11 #include <afs/bosint.h>
12 #include <rx/rxstat.h>
13 #include <afs/afsint.h>
14 #define FSINT_COMMON_XG
15 #include <afs/afscbint.h>
16 #include <afs/kauth.h>
17 #include <afs/kautils.h>
18 #include <afs/ptint.h>
19 #include <afs/ptserver.h>
20 #include <afs/vldbint.h>
21 #include <afs/volint.h>
22 #include <afs/volser.h>
30 extern int RXSTATS_RetrieveProcessRPCStats();
31 extern int RXSTATS_RetrievePeerRPCStats();
32 extern int RXSTATS_QueryProcessRPCStats();
33 extern int RXSTATS_QueryPeerRPCStats();
34 extern int RXSTATS_EnableProcessRPCStats();
35 extern int RXSTATS_EnablePeerRPCStats();
36 extern int RXSTATS_DisableProcessRPCStats();
37 extern int RXSTATS_DisablePeerRPCStats();
38 extern int RXSTATS_ClearProcessRPCStats();
39 extern int RXSTATS_ClearPeerRPCStats();
42 * This structure stores the client and server function lists.
43 * This is kept separate from the actual interface definitions
44 * since an rpc interface can be offered by several servers
45 * (e.g. ubik and rxstat)
47 * The purpose of these functions is to allow a mapping from interfaceId
48 * to text representations of server process names and function names.
52 const char **functionList;
53 size_t functionListLen;
54 } interface_function_list_t, *interface_function_list_p;
59 * On NT, you cannot define an array of character pointers in a dll
60 * and then access this array outside the dll via a global initialization
61 * because the msvc compiler will complain that the initializer is not
62 * a constant (i.e. C2099: initializer is not a constant). This is because
63 * the dllimport and dllexport c language extensions cause references
64 * to the character array to go through another level of indirection -
65 * and this indirection is unknown at compilation time.
67 * To get around this problem I hand initialize this array on NT only
70 static interface_function_list_t afs_server;
71 static interface_function_list_t afscb_server;
72 static interface_function_list_t bos_server;
73 static interface_function_list_t kauth_kaa_server;
74 static interface_function_list_t kauth_kam_server;
75 static interface_function_list_t kauth_kat_server;
76 static interface_function_list_t pts_server;
77 static interface_function_list_t rxstat_server;
78 static interface_function_list_t ubik_disk_server;
79 static interface_function_list_t ubik_vote_server;
80 static interface_function_list_t vl_server;
81 static interface_function_list_t vol_server;
82 static pthread_once_t pthread_func_list_once = PTHREAD_ONCE_INIT;
83 static int pthread_func_list_done;
85 static void cr_list(void) {
86 afs_server.functionList = RXAFS_function_names;
87 afs_server.functionListLen = RXAFS_NO_OF_STAT_FUNCS;
88 afscb_server.functionList = RXAFSCB_function_names;
89 afscb_server.functionListLen = RXAFSCB_NO_OF_STAT_FUNCS;
90 bos_server.functionList = BOZO_function_names;
91 bos_server.functionListLen = BOZO_NO_OF_STAT_FUNCS;
92 kauth_kaa_server.functionList = KAA_function_names;
93 kauth_kaa_server.functionListLen = KAA_NO_OF_STAT_FUNCS;
94 kauth_kam_server.functionList = KAM_function_names;
95 kauth_kam_server.functionListLen = KAM_NO_OF_STAT_FUNCS;
96 kauth_kat_server.functionList = KAT_function_names;
97 kauth_kat_server.functionListLen = KAT_NO_OF_STAT_FUNCS;
98 pts_server.functionList = PR_function_names;
99 pts_server.functionListLen = PR_NO_OF_STAT_FUNCS;
100 rxstat_server.functionList = RXSTATS_function_names;
101 rxstat_server.functionListLen = RXSTATS_NO_OF_STAT_FUNCS;
102 ubik_disk_server.functionList = DISK_function_names;
103 ubik_disk_server.functionListLen = DISK_NO_OF_STAT_FUNCS;
104 ubik_vote_server.functionList = VOTE_function_names;
105 ubik_vote_server.functionListLen = VOTE_NO_OF_STAT_FUNCS;
106 vl_server.functionList = VL_function_names;
107 vl_server.functionListLen = VL_NO_OF_STAT_FUNCS;
108 vol_server.functionList = AFSVolfunction_names;
109 vol_server.functionListLen = AFSVolNO_OF_STAT_FUNCS;
110 pthread_func_list_done = 1;
115 static interface_function_list_t afs_server = {
116 RXAFS_function_names,
117 RXAFS_NO_OF_STAT_FUNCS
120 static interface_function_list_t afscb_server = {
121 RXAFSCB_function_names,
122 RXAFSCB_NO_OF_STAT_FUNCS
125 static interface_function_list_t bos_server = {
127 BOZO_NO_OF_STAT_FUNCS
130 static interface_function_list_t kauth_kaa_server = {
135 static interface_function_list_t kauth_kam_server = {
140 static interface_function_list_t kauth_kat_server = {
145 static interface_function_list_t pts_server = {
150 static interface_function_list_t rxstat_server = {
151 RXSTATS_function_names,
152 RXSTATS_NO_OF_STAT_FUNCS
155 static interface_function_list_t ubik_disk_server = {
157 DISK_NO_OF_STAT_FUNCS,
160 static interface_function_list_t ubik_vote_server = {
162 VOTE_NO_OF_STAT_FUNCS,
165 static interface_function_list_t vl_server = {
170 static interface_function_list_t vol_server = {
171 AFSVolfunction_names,
172 AFSVolNO_OF_STAT_FUNCS
175 #endif /* AFS_NT40_ENV */
177 static interface_function_list_t unknown_server = {
183 afs_uint32 interfaceId;
184 const char *interfaceName;
185 interface_function_list_p functionList;
186 } interface_t, *interface_p;
188 interface_t int_list[] = {
238 * Note the code below assumes that the following entry is the last entry
242 { 0, "unknown", &unknown_server}
250 DoClientLocalCellGet(struct cmd_syndesc *as, char *arock)
253 char cellName[MAXCELLCHARS];
255 if (!afsclient_LocalCellGet(cellName,&st)) {
256 ERR_ST_EXT("afsclient_LocalCellGet", st);
259 printf("This machine belongs to cell: %s\n", cellName);
265 DoClientMountPointCreate(struct cmd_syndesc *as, char *arock)
267 typedef enum {DIRECTORY, VOLUME, READWRITE, CHECK}
268 DoClientMountPointCreate_parm_t;
270 const char *directory;
272 vol_type_t vol_type = READ_ONLY;
273 vol_check_t vol_check = DONT_CHECK_VOLUME;
275 if (as->parms[DIRECTORY].items) {
276 directory = as->parms[DIRECTORY].items->data;
279 if (as->parms[VOLUME].items) {
280 volume = as->parms[VOLUME].items->data;
283 if (as->parms[READWRITE].items) {
284 vol_type = READ_WRITE;
287 if (as->parms[CHECK].items) {
288 vol_check = CHECK_VOLUME;
291 if (!afsclient_MountPointCreate(cellHandle,
297 ERR_ST_EXT("afsclient_MountPointCreate", st);
304 Print_afs_serverEntry_p(afs_serverEntry_p serv, const char *prefix)
308 printf("%sInformation for server %s\n", prefix, serv->serverName);
309 if (serv->serverType & DATABASE_SERVER) {
310 printf("%s\tIt is a database server\n", prefix);
312 if (serv->serverType & FILE_SERVER) {
313 printf("%s\tIt is a file server\n", prefix);
315 printf("%s\tServer addresses:%s\n", prefix, serv->serverName);
316 while (serv->serverAddress[i] != 0) {
317 printf("\t\t%s%x\n", prefix, serv->serverAddress[i++]);
322 DoClientAFSServerGet(struct cmd_syndesc *as, char *arock)
324 typedef enum {SERVER}
325 DoClientAFSServerGet_parm_t;
328 afs_serverEntry_t entry;
330 if (as->parms[SERVER].items) {
331 server = as->parms[SERVER].items->data;
334 if (!afsclient_AFSServerGet(cellHandle,
338 ERR_ST_EXT("afsclient_AFSServerGet", st);
341 Print_afs_serverEntry_p(&entry, "");
347 DoClientAFSServerList(struct cmd_syndesc *as, char *arock)
350 afs_serverEntry_t entry;
353 if (!afsclient_AFSServerGetBegin(cellHandle,
356 ERR_ST_EXT("afsclient_AFSServerGetBegin", st);
359 while(afsclient_AFSServerGetNext(iter, &entry, &st)) {
360 Print_afs_serverEntry_p(&entry, "");
363 if (st != ADMITERATORDONE) {
364 ERR_ST_EXT("afsclient_AFSServerGetNext", st);
367 if (!afsclient_AFSServerGetDone(iter, &st)) {
368 ERR_ST_EXT("afsclient_AFSServerGetDone", st);
376 Print_afs_RPCStatsState_p(
377 afs_RPCStatsState_p state,
380 printf("%sThe rpc stats state is: ", prefix);
382 case AFS_RPC_STATS_DISABLED:
383 printf("disabled\n");
385 case AFS_RPC_STATS_ENABLED:
393 afs_stat_source_t value;
394 } afs_type_map_t, *afs_type_map_p;
396 static afs_type_map_t map[] = {
397 {"bosserver", AFS_BOSSERVER},
398 {"fileserver", AFS_FILESERVER},
399 {"kaserver", AFS_KASERVER},
400 {"ptserver", AFS_PTSERVER},
401 {"volserver", AFS_VOLSERVER},
402 {"vlserver", AFS_VLSERVER},
403 {"client", AFS_CLIENT},
407 GetStatPortFromString(const char *type, int *port) {
412 tport = strtol(type, &end, 0);
413 if (tport == 0 || end == type || *end != '\0') {
422 GetStatSourceFromString(const char *type, afs_stat_source_t *src, int *port) {
424 size_t type_len = strlen(type);
426 for(i=0; (map[i].tag) && strncasecmp(type, map[i].tag, type_len); i++);
428 if (map[i].tag == 0) {
430 * Try to convert string to port number
432 if (GetStatPortFromString(type, port)) {
436 fprintf(stderr, "couldn't convert server to type, try one of the "
438 for(i=0; map[i].tag;i++) {
439 fprintf(stderr, "%s ", map[i].tag);
452 } afs_stat_type_t, *afs_stat_type_p;
454 static afs_stat_type_t
455 GetStatTypeFromString(const char *type) {
458 if (!strcmp(type, "peer")) {
460 } else if (!strcmp(type, "process")) {
461 rc = AFS_PROCESS_STATS;
463 ERR_EXT("stat_type must be process or peer");
470 DoClientRPCStatsStateGet(struct cmd_syndesc *as, char *arock)
472 typedef enum {SERVER, PROCESS, STAT_TYPE}
473 DoClientRPCStatsStateGet_parm_t;
475 struct rx_connection *conn;
477 afs_stat_source_t type;
480 afs_stat_type_t which;
481 afs_RPCStatsState_t state;
483 if (as->parms[PROCESS].items) {
484 typeIsValid = GetStatSourceFromString(as->parms[PROCESS].items->data,
488 if (as->parms[STAT_TYPE].items) {
489 which = GetStatTypeFromString(as->parms[STAT_TYPE].items->data);
492 if (as->parms[SERVER].items) {
494 if (!afsclient_RPCStatOpen(cellHandle,
495 as->parms[SERVER].items->data,
499 ERR_ST_EXT("afsclient_RPCStatOpen", st);
502 if (!afsclient_RPCStatOpenPort(cellHandle,
503 as->parms[SERVER].items->data,
507 ERR_ST_EXT("afsclient_RPCStatOpenPort", st);
512 if (which == AFS_PEER_STATS) {
513 if (!util_RPCStatsStateGet(conn, RXSTATS_QueryPeerRPCStats, &state, &st)) {
514 ERR_ST_EXT("util_RPCStatsStateGet", st);
517 if (!util_RPCStatsStateGet(conn, RXSTATS_QueryProcessRPCStats, &state, &st)) {
518 ERR_ST_EXT("util_RPCStatsStateGet", st);
522 Print_afs_RPCStatsState_p(&state, "");
524 afsclient_RPCStatClose(conn, 0);
530 DoClientRPCStatsStateEnable(struct cmd_syndesc *as, char *arock)
532 typedef enum {SERVER, PROCESS, STAT_TYPE}
533 DoClientRPCStatsEnable_parm_t;
535 struct rx_connection *conn;
537 afs_stat_source_t type;
540 afs_stat_type_t which;
542 if (as->parms[PROCESS].items) {
543 typeIsValid = GetStatSourceFromString(as->parms[PROCESS].items->data,
547 if (as->parms[STAT_TYPE].items) {
548 which = GetStatTypeFromString(as->parms[STAT_TYPE].items->data);
551 if (as->parms[SERVER].items) {
553 if (!afsclient_RPCStatOpen(cellHandle,
554 as->parms[SERVER].items->data,
558 ERR_ST_EXT("afsclient_RPCStatOpen", st);
561 if (!afsclient_RPCStatOpenPort(cellHandle,
562 as->parms[SERVER].items->data,
566 ERR_ST_EXT("afsclient_RPCStatOpenPort", st);
571 if (which == AFS_PEER_STATS) {
572 if (!util_RPCStatsStateEnable(conn, RXSTATS_EnablePeerRPCStats, &st)) {
573 ERR_ST_EXT("util_RPCStatsStateEnable", st);
576 if (!util_RPCStatsStateEnable(conn, RXSTATS_EnableProcessRPCStats, &st)) {
577 ERR_ST_EXT("util_RPCStatsStateEnable", st);
581 afsclient_RPCStatClose(conn, 0);
587 DoClientRPCStatsStateDisable(struct cmd_syndesc *as, char *arock)
589 typedef enum {SERVER, PROCESS, STAT_TYPE}
590 DoClientRPCStatsDisable_parm_t;
592 struct rx_connection *conn;
594 afs_stat_source_t type;
597 afs_stat_type_t which;
599 if (as->parms[PROCESS].items) {
600 typeIsValid = GetStatSourceFromString(as->parms[PROCESS].items->data,
604 if (as->parms[STAT_TYPE].items) {
605 which = GetStatTypeFromString(as->parms[STAT_TYPE].items->data);
608 if (as->parms[SERVER].items) {
610 if (!afsclient_RPCStatOpen(cellHandle,
611 as->parms[SERVER].items->data,
615 ERR_ST_EXT("afsclient_RPCStatOpen", st);
618 if (!afsclient_RPCStatOpenPort(cellHandle,
619 as->parms[SERVER].items->data,
623 ERR_ST_EXT("afsclient_RPCStatOpenPort", st);
628 if (which == AFS_PEER_STATS) {
629 if (!util_RPCStatsStateDisable(conn, RXSTATS_DisablePeerRPCStats, &st)) {
630 ERR_ST_EXT("util_RPCStatsStateDisable", st);
633 if (!util_RPCStatsStateDisable(conn, RXSTATS_DisableProcessRPCStats, &st)) {
634 ERR_ST_EXT("util_RPCStatsStateDisable", st);
638 afsclient_RPCStatClose(conn, 0);
644 Print_afs_RPCStats_p(
646 interface_function_list_p f_list,
649 afs_int32 index = stat->s.stats_v1.func_index;
651 if (index > ((afs_int32) f_list->functionListLen - 1)) {
652 printf("%sUnknown function ", prefix);
656 f_list->functionList[stat->s.stats_v1.func_index]);
659 if (!hiszero(stat->s.stats_v1.invocations)) {
660 printf("%sinvoc (%u.%u) bytes_sent (%u.%u) bytes_rcvd (%u.%u)\n",
661 prefix, hgethi(stat->s.stats_v1.invocations),
662 hgetlo(stat->s.stats_v1.invocations),
663 hgethi(stat->s.stats_v1.bytes_sent),
664 hgetlo(stat->s.stats_v1.bytes_sent),
665 hgethi(stat->s.stats_v1.bytes_rcvd),
666 hgetlo(stat->s.stats_v1.bytes_rcvd)
668 printf("\tqsum %d.%06d\tqsqr %d.%06d"
669 "\tqmin %d.%06d\tqmax %d.%06d\n",
670 stat->s.stats_v1.queue_time_sum.sec,
671 stat->s.stats_v1.queue_time_sum.usec,
672 stat->s.stats_v1.queue_time_sum_sqr.sec,
673 stat->s.stats_v1.queue_time_sum_sqr.usec,
674 stat->s.stats_v1.queue_time_min.sec,
675 stat->s.stats_v1.queue_time_min.usec,
676 stat->s.stats_v1.queue_time_max.sec,
677 stat->s.stats_v1.queue_time_max.usec
679 printf("\txsum %d.%06d\txsqr %d.%06d"
680 "\txmin %d.%06d\txmax %d.%06d\n",
681 stat->s.stats_v1.execution_time_sum.sec,
682 stat->s.stats_v1.execution_time_sum.usec,
683 stat->s.stats_v1.execution_time_sum_sqr.sec,
684 stat->s.stats_v1.execution_time_sum_sqr.usec,
685 stat->s.stats_v1.execution_time_min.sec,
686 stat->s.stats_v1.execution_time_min.usec,
687 stat->s.stats_v1.execution_time_max.sec,
688 stat->s.stats_v1.execution_time_max.usec
691 printf("never invoked\n");
696 DoClientRPCStatsList(struct cmd_syndesc *as, char *arock)
698 typedef enum {SERVER, PROCESS, STAT_TYPE}
699 DoClientRPCStatsList_parm_t;
701 struct rx_connection *conn;
703 afs_stat_source_t type;
706 afs_stat_type_t which;
707 afs_RPCStats_t stats;
712 (pthread_func_list_done || pthread_once(&pthread_func_list_once, cr_list));
715 if (as->parms[PROCESS].items) {
716 typeIsValid = GetStatSourceFromString(as->parms[PROCESS].items->data,
720 if (as->parms[STAT_TYPE].items) {
721 which = GetStatTypeFromString(as->parms[STAT_TYPE].items->data);
724 if (as->parms[SERVER].items) {
726 if (!afsclient_RPCStatOpen(cellHandle,
727 as->parms[SERVER].items->data,
731 ERR_ST_EXT("afsclient_RPCStatOpen", st);
734 if (!afsclient_RPCStatOpenPort(cellHandle,
735 as->parms[SERVER].items->data,
739 ERR_ST_EXT("afsclient_RPCStatOpenPort", st);
744 if (which == AFS_PEER_STATS) {
745 if (!util_RPCStatsGetBegin(conn, RXSTATS_RetrievePeerRPCStats, &iter, &st)) {
746 ERR_ST_EXT("util_RPCStatsGetBegin", st);
749 if (!util_RPCStatsGetBegin(conn, RXSTATS_RetrieveProcessRPCStats, &iter, &st)) {
750 ERR_ST_EXT("util_RPCStatsGetBegin", st);
754 printf("Listing rpc stats at server %s process %s:\n",
755 as->parms[SERVER].items->data,
756 as->parms[PROCESS].items->data);
758 while (util_RPCStatsGetNext(iter, &stats, &st)) {
761 * Print a new heading for each stat collection
764 if (stats.s.stats_v1.func_index == 0) {
769 * Look up the interface in our list
772 for(i=0;i<((sizeof(int_list)-1) / sizeof(interface_t));i++) {
773 if (stats.s.stats_v1.interfaceId == int_list[i].interfaceId) {
779 * Print out a meaningful header for each stat collection
782 if (which == AFS_PEER_STATS) {
784 ina.s_addr = htonl(stats.s.stats_v1.remote_peer);
786 printf("%s stats for remote peer located at %s port %u "
787 "%s %s as a %s via the %s interface\n",
788 as->parms[PROCESS].items->data,
790 stats.s.stats_v1.remote_port,
792 ((stats.s.stats_v1.remote_is_server) ?
793 "accessed by" : "accessing"),
795 as->parms[PROCESS].items->data,
797 ((stats.s.stats_v1.remote_is_server) ?
798 "client" : "server"),
799 int_list[i].interfaceName
802 printf("%s stats for the %s interface "
803 "accessed as a %s\n",
804 as->parms[PROCESS].items->data,
805 int_list[i].interfaceName,
807 ((stats.s.stats_v1.remote_is_server) ?
812 Print_afs_RPCStats_p(&stats, int_list[i].functionList, " ");
815 if (st != ADMITERATORDONE) {
816 ERR_ST_EXT("util_RPCStatsGetNext", st);
819 if (!util_RPCStatsGetDone(iter, &st)) {
820 ERR_ST_EXT("util_RPCStatsGetDone", st);
823 afsclient_RPCStatClose(conn, 0);
829 DoClientRPCStatsClear(struct cmd_syndesc *as, char *arock)
831 typedef enum {SERVER, PROCESS, STAT_TYPE, CLEAR_ALL, CLEAR_INVOCATIONS,
832 CLEAR_BYTES_SENT, CLEAR_BYTES_RCVD,
833 CLEAR_QUEUE_TIME_SUM, CLEAR_QUEUE_TIME_SQUARE,
834 CLEAR_QUEUE_TIME_MIN, CLEAR_QUEUE_TIME_MAX,
835 CLEAR_EXEC_TIME_SUM, CLEAR_EXEC_TIME_SQUARE,
836 CLEAR_EXEC_TIME_MIN, CLEAR_EXEC_TIME_MAX}
837 DoClientRPCStatsClear_parm_t;
839 struct rx_connection *conn;
841 afs_stat_source_t type;
844 afs_stat_type_t which;
845 afs_RPCStatsClearFlag_t flag = 0;
849 if (as->parms[PROCESS].items) {
850 typeIsValid = GetStatSourceFromString(as->parms[PROCESS].items->data,
854 if (as->parms[STAT_TYPE].items) {
855 which = GetStatTypeFromString(as->parms[STAT_TYPE].items->data);
858 if (as->parms[SERVER].items) {
860 if (!afsclient_RPCStatOpen(cellHandle,
861 as->parms[SERVER].items->data,
865 ERR_ST_EXT("afsclient_RPCStatOpen", st);
868 if (!afsclient_RPCStatOpenPort(cellHandle,
869 as->parms[SERVER].items->data,
873 ERR_ST_EXT("afsclient_RPCStatOpenPort", st);
878 if (as->parms[CLEAR_ALL].items) {
881 flag = AFS_RX_STATS_CLEAR_ALL;
884 if (as->parms[CLEAR_INVOCATIONS].items) {
886 ERR_EXT("cannot specify additional flags when "
887 "specifying clear_all");
890 flag |= AFS_RX_STATS_CLEAR_INVOCATIONS;
893 if (as->parms[CLEAR_BYTES_SENT].items) {
895 ERR_EXT("cannot specify additional flags when "
896 "specifying clear_all");
899 flag |= AFS_RX_STATS_CLEAR_BYTES_SENT;
902 if (as->parms[CLEAR_BYTES_RCVD].items) {
904 ERR_EXT("cannot specify additional flags when "
905 "specifying clear_all");
908 flag |= AFS_RX_STATS_CLEAR_BYTES_RCVD;
911 if (as->parms[CLEAR_QUEUE_TIME_SUM].items) {
913 ERR_EXT("cannot specify additional flags when "
914 "specifying clear_all");
917 flag |= AFS_RX_STATS_CLEAR_QUEUE_TIME_SUM;
920 if (as->parms[CLEAR_QUEUE_TIME_SQUARE].items) {
922 ERR_EXT("cannot specify additional flags when "
923 "specifying clear_all");
926 flag |= AFS_RX_STATS_CLEAR_QUEUE_TIME_SQUARE;
929 if (as->parms[CLEAR_QUEUE_TIME_MIN].items) {
931 ERR_EXT("cannot specify additional flags when "
932 "specifying clear_all");
935 flag |= AFS_RX_STATS_CLEAR_QUEUE_TIME_MIN;
938 if (as->parms[CLEAR_QUEUE_TIME_MAX].items) {
940 ERR_EXT("cannot specify additional flags when "
941 "specifying clear_all");
944 flag |= AFS_RX_STATS_CLEAR_QUEUE_TIME_MAX;
947 if (as->parms[CLEAR_EXEC_TIME_SUM].items) {
949 ERR_EXT("cannot specify additional flags when "
950 "specifying clear_all");
953 flag |= AFS_RX_STATS_CLEAR_EXEC_TIME_SUM;
956 if (as->parms[CLEAR_EXEC_TIME_SQUARE].items) {
958 ERR_EXT("cannot specify additional flags when "
959 "specifying clear_all");
962 flag |= AFS_RX_STATS_CLEAR_EXEC_TIME_SQUARE;
965 if (as->parms[CLEAR_EXEC_TIME_MIN].items) {
967 ERR_EXT("cannot specify additional flags when "
968 "specifying clear_all");
971 flag |= AFS_RX_STATS_CLEAR_EXEC_TIME_MIN;
974 if (as->parms[CLEAR_EXEC_TIME_MAX].items) {
976 ERR_EXT("cannot specify additional flags when "
977 "specifying clear_all");
980 flag |= AFS_RX_STATS_CLEAR_EXEC_TIME_MAX;
984 ERR_EXT("you must specify something to clear");
987 if (which == AFS_PEER_STATS) {
988 if (!util_RPCStatsClear(conn, RXSTATS_ClearPeerRPCStats, flag, &st)) {
989 ERR_ST_EXT("util_RPCStatsClear", st);
992 if (!util_RPCStatsClear(conn, RXSTATS_ClearProcessRPCStats, flag, &st)) {
993 ERR_ST_EXT("util_RPCStatsClear", st);
997 afsclient_RPCStatClose(conn, 0);
1003 DoClientRPCStatsVersionGet(struct cmd_syndesc *as, char *arock)
1005 typedef enum {SERVER, PROCESS}
1006 DoClientRPCStatsVersionGet_parm_t;
1007 afs_status_t st = 0;
1008 struct rx_connection *conn;
1009 afs_stat_source_t type;
1013 afs_RPCStatsVersion_t version;
1015 if (as->parms[PROCESS].items) {
1016 typeIsValid = GetStatSourceFromString(as->parms[PROCESS].items->data,
1020 if (as->parms[SERVER].items) {
1022 if (!afsclient_RPCStatOpen(cellHandle,
1023 as->parms[SERVER].items->data,
1027 ERR_ST_EXT("afsclient_RPCStatOpen", st);
1030 if (!afsclient_RPCStatOpenPort(cellHandle,
1031 as->parms[SERVER].items->data,
1035 ERR_ST_EXT("afsclient_RPCStatOpenPort", st);
1040 if (!util_RPCStatsVersionGet(conn, &version, &st)) {
1041 ERR_ST_EXT("util_RPCStatsVersionGet", st);
1044 printf("the rpc stat version number is %u\n", version);
1046 afsclient_RPCStatClose(conn, 0);
1052 Print_afs_CMServerPref_p(afs_CMServerPref_p pref)
1056 taddr = pref->ipAddr;
1057 printf("%d.%d.%d.%d\t\t\t%d\n",
1058 (taddr >> 24) & 0xff, (taddr >> 16) & 0xff,
1059 (taddr >> 8) & 0xff, taddr & 0xff, pref->ipRank);
1063 DoClientCMGetServerPrefs(struct cmd_syndesc *as, char *arock)
1065 afs_status_t st = 0;
1066 typedef enum {SERVER, PORT}
1067 DoClientCMGetServerPrefs_parm_t;
1068 struct rx_connection *conn;
1070 int srvrPort = AFSCONF_CALLBACKPORT;
1071 afs_CMServerPref_t prefs;
1075 (pthread_func_list_done || pthread_once(&pthread_func_list_once, cr_list));
1078 if (as->parms[PORT].items) {
1079 if (!GetStatPortFromString(as->parms[PORT].items->data, &srvrPort)) {
1080 ERR_EXT("Couldn't undertand port number");
1084 if (as->parms[SERVER].items) {
1085 if (!afsclient_CMStatOpenPort(cellHandle,
1086 as->parms[SERVER].items->data,
1090 ERR_ST_EXT("afsclient_CMStatOpenPort", st);
1094 if (!util_CMGetServerPrefsBegin(conn, &iter, &st)) {
1095 ERR_ST_EXT("util_CMGetServerPrefsBegin", st);
1098 printf("Listing CellServDB for %s at port %s:\n",
1099 as->parms[SERVER].items->data,
1100 as->parms[PORT].items->data);
1102 while (util_CMGetServerPrefsNext(iter, &prefs, &st)) {
1104 Print_afs_CMServerPref_p(&prefs);
1107 if (st != ADMITERATORDONE) {
1108 ERR_ST_EXT("util_CMGetServerPrefsNext", st);
1111 if (!util_CMGetServerPrefsDone(iter, &st)) {
1112 ERR_ST_EXT("util_CMGetServerPrefsDone", st);
1115 afsclient_CMStatClose(conn, 0);
1121 Print_afs_CMListCell_p(afs_CMListCell_p cellInfo)
1126 printf("Cell %s on hosts", cellInfo->cellname);
1127 for (i = 0 ; i < UTIL_MAX_CELL_HOSTS && cellInfo->serverAddr[i] ; i++) {
1128 taddr = cellInfo->serverAddr[i];
1129 printf(" %d.%d.%d.%d",
1130 (taddr >> 24) & 0xff, (taddr >> 16) & 0xff,
1131 (taddr >> 8) & 0xff, taddr & 0xff);
1137 DoClientCMListCells(struct cmd_syndesc *as, char *arock)
1139 afs_status_t st = 0;
1140 typedef enum {SERVER, PORT}
1141 DoClientCMListCells_parm_t;
1142 struct rx_connection *conn;
1144 int srvrPort = AFSCONF_CALLBACKPORT;
1145 afs_CMListCell_t cellInfo;
1149 (pthread_func_list_done || pthread_once(&pthread_func_list_once, cr_list));
1152 if (as->parms[PORT].items) {
1153 if (!GetStatPortFromString(as->parms[PORT].items->data, &srvrPort)) {
1154 ERR_EXT("Couldn't undertand port number");
1158 if (as->parms[SERVER].items) {
1159 if (!afsclient_CMStatOpenPort(cellHandle,
1160 as->parms[SERVER].items->data,
1164 ERR_ST_EXT("afsclient_CMStatOpenPort", st);
1168 if (!util_CMListCellsBegin(conn, &iter, &st)) {
1169 ERR_ST_EXT("util_CMListCellsBegin", st);
1172 printf("Listing CellServDB for %s at port %s:\n",
1173 as->parms[SERVER].items->data,
1174 as->parms[PORT].items->data);
1176 while (util_CMListCellsNext(iter, &cellInfo, &st)) {
1178 Print_afs_CMListCell_p(&cellInfo);
1181 if (st != ADMITERATORDONE) {
1182 ERR_ST_EXT("util_CMListCellsNext", st);
1185 if (!util_CMListCellsDone(iter, &st)) {
1186 ERR_ST_EXT("util_CMListCellsDone", st);
1189 afsclient_CMStatClose(conn, 0);
1195 DoClientCMLocalCell(struct cmd_syndesc *as, char *arock)
1197 afs_status_t st = 0;
1198 typedef enum {SERVER, PORT}
1199 DoClientCMLocalCell_parm_t;
1200 struct rx_connection *conn;
1202 int srvrPort = AFSCONF_CALLBACKPORT;
1203 afs_CMCellName_t cellname;
1206 (pthread_func_list_done || pthread_once(&pthread_func_list_once, cr_list));
1209 if (as->parms[PORT].items) {
1210 if (!GetStatPortFromString(as->parms[PORT].items->data, &srvrPort)) {
1211 ERR_EXT("Couldn't undertand port number");
1215 if (as->parms[SERVER].items) {
1216 if (!afsclient_CMStatOpenPort(cellHandle,
1217 as->parms[SERVER].items->data,
1221 ERR_ST_EXT("afsclient_CMStatOpenPort", st);
1225 if (!util_CMLocalCell(conn, cellname, &st)) {
1226 ERR_ST_EXT("util_CMLocalCell", st);
1229 printf("Client %s (port %s) is in cell %s\n",
1230 as->parms[SERVER].items->data,
1231 as->parms[PORT].items->data,
1234 afsclient_CMStatClose(conn, 0);
1240 Print_afs_ClientConfig_p(afs_ClientConfig_p config)
1242 printf(" clientVersion: %d\n", config->clientVersion);
1243 printf(" serverVersion: %d\n", config->serverVersion);
1244 printf(" nChunkFiles: %d\n", config->c.config_v1.nChunkFiles);
1245 printf(" nStatCaches: %d\n", config->c.config_v1.nStatCaches);
1246 printf(" nDataCaches: %d\n", config->c.config_v1.nDataCaches);
1247 printf(" nVolumeCaches: %d\n", config->c.config_v1.nVolumeCaches);
1248 printf(" firstChunkSize: %d\n", config->c.config_v1.firstChunkSize);
1249 printf(" otherChunkSize: %d\n", config->c.config_v1.otherChunkSize);
1250 printf(" cacheSize: %d\n", config->c.config_v1.cacheSize);
1251 printf(" setTime: %d\n", config->c.config_v1.setTime);
1252 printf(" memCache: %d\n", config->c.config_v1.memCache);
1257 DoClientCMClientConfig(struct cmd_syndesc *as, char *arock)
1259 afs_status_t st = 0;
1260 typedef enum {SERVER, PORT}
1261 DoClientCMLocalCell_parm_t;
1262 struct rx_connection *conn;
1264 int srvrPort = AFSCONF_CALLBACKPORT;
1265 afs_ClientConfig_t config;
1268 (pthread_func_list_done || pthread_once(&pthread_func_list_once, cr_list));
1271 if (as->parms[PORT].items) {
1272 if (!GetStatPortFromString(as->parms[PORT].items->data, &srvrPort)) {
1273 ERR_EXT("Couldn't undertand port number");
1277 if (as->parms[SERVER].items) {
1278 if (!afsclient_CMStatOpenPort(cellHandle,
1279 as->parms[SERVER].items->data,
1283 ERR_ST_EXT("afsclient_CMStatOpenPort", st);
1287 if (!util_CMClientConfig(conn, &config, &st)) {
1288 ERR_ST_EXT("util_CMClientConfig", st);
1291 printf("Cache configuration for client %s (port %s):\n\n",
1292 as->parms[SERVER].items->data,
1293 as->parms[PORT].items->data);
1295 Print_afs_ClientConfig_p(&config);
1299 afsclient_CMStatClose(conn, 0);
1305 SetupClientAdminCmd(void)
1307 struct cmd_syndesc *ts;
1309 ts = cmd_CreateSyntax("ClientLocalCellGet",
1310 DoClientLocalCellGet, 0,
1311 "get the name of this machine's cell");
1312 SetupCommonCmdArgs(ts);
1314 ts = cmd_CreateSyntax("ClientMountPointCreate",
1315 DoClientMountPointCreate, 0,
1316 "create a mount point");
1321 "directory where mount point will be created");
1326 "the name of the volume to mount");
1331 "mount a read write volume");
1336 "check that the volume exists before mounting");
1337 SetupCommonCmdArgs(ts);
1339 ts = cmd_CreateSyntax("ClientAFSServerGet",
1340 DoClientAFSServerGet, 0,
1341 "retrieve information about an afs server");
1347 SetupCommonCmdArgs(ts);
1349 ts = cmd_CreateSyntax("ClientAFSServerList",
1350 DoClientAFSServerList, 0,
1351 "retrieve information about all afs "
1352 "servers in a cell");
1357 "server where command will execute");
1362 "process to query <bosserver fileserver ptserver "
1363 "kaserver client vlserver volserver>");
1368 "stats to retrieve <peer or process>");
1369 SetupCommonCmdArgs(ts);
1371 ts = cmd_CreateSyntax("ClientRPCStatsStateGet",
1372 DoClientRPCStatsStateGet,
1374 "retrieve the rpc stat collection state");
1379 "server where command will execute");
1384 "process to query <bosserver fileserver ptserver "
1385 "kaserver client vlserver volserver>");
1390 "stats to retrieve <peer or process>");
1391 SetupCommonCmdArgs(ts);
1393 ts = cmd_CreateSyntax("ClientRPCStatsStateEnable",
1394 DoClientRPCStatsStateEnable,
1396 "set the rpc stat collection state to on");
1401 "server where command will execute");
1406 "process to query <bosserver fileserver ptserver "
1407 "kaserver client vlserver volserver>");
1412 "stats to retrieve <peer or process>");
1413 SetupCommonCmdArgs(ts);
1415 ts = cmd_CreateSyntax("ClientRPCStatsStateDisable",
1416 DoClientRPCStatsStateDisable,
1418 "set the rpc stat collection state to off");
1423 "server where command will execute");
1428 "process to query <bosserver fileserver ptserver "
1429 "kaserver client vlserver volserver>");
1434 "stats to retrieve <peer or process>");
1435 SetupCommonCmdArgs(ts);
1437 ts = cmd_CreateSyntax("ClientRPCStatsList",
1438 DoClientRPCStatsList,
1440 "list the rpc stats");
1445 "server where command will execute");
1450 "process to query <bosserver fileserver ptserver "
1451 "kaserver client vlserver volserver>");
1456 "stats to retrieve <peer or process>");
1457 SetupCommonCmdArgs(ts);
1459 ts = cmd_CreateSyntax("ClientRPCStatsClear",
1460 DoClientRPCStatsClear,
1462 "reset rpc stat counters");
1467 "server where command will execute");
1472 "process to query <bosserver fileserver ptserver "
1473 "kaserver client vlserver volserver>");
1478 "stats to retrieve <peer or process>");
1483 "clear all existing counters");
1485 "-clear_invocations",
1488 "clear invocation count");
1490 "-clear_bytes_sent",
1493 "clear bytes_sent count");
1495 "-clear_bytes_rcvd",
1498 "clear bytes_rcvd count");
1500 "-clear_queue_time_sum",
1503 "clear queue time sum");
1505 "-clear_queue_time_square",
1508 "clear queue time square");
1510 "-clear_queue_time_min",
1513 "clear queue time min");
1515 "-clear_queue_time_max",
1518 "clear queue time max");
1520 "-clear_exec_time_sum",
1523 "clear exec time sum");
1525 "-clear_exec_time_square",
1528 "clear exec time square");
1530 "-clear_exec_time_min",
1533 "clear exec time min");
1535 "-clear_exec_time_max",
1538 "clear exec time max");
1539 SetupCommonCmdArgs(ts);
1541 ts = cmd_CreateSyntax("ClientRPCStatsVersionGet",
1542 DoClientRPCStatsVersionGet,
1544 "list the server's rpc stats version");
1549 "server where command will execute");
1554 "process to query <bosserver fileserver ptserver "
1555 "kaserver client vlserver volserver>");
1556 SetupCommonCmdArgs(ts);
1558 ts = cmd_CreateSyntax("ClientCMGetServerPrefs",
1559 DoClientCMGetServerPrefs,
1561 "list a client's server preferences ");
1566 "server where command will execute");
1571 "UDP port to query");
1572 SetupCommonCmdArgs(ts);
1574 ts = cmd_CreateSyntax("ClientCMListCells",
1575 DoClientCMListCells,
1577 "list a client's CellServDB ");
1582 "server where command will execute");
1587 "UDP port to query");
1588 SetupCommonCmdArgs(ts);
1590 ts = cmd_CreateSyntax("ClientCMLocalCell",
1591 DoClientCMLocalCell,
1593 "get the name of the client's local cell");
1598 "server where command will execute");
1603 "UDP port to query");
1604 SetupCommonCmdArgs(ts);
1606 ts = cmd_CreateSyntax("ClientCMClientConfig",
1607 DoClientCMClientConfig,
1609 "get the client's cache configuration");
1614 "server where command will execute");
1619 "UDP port to query");
1620 SetupCommonCmdArgs(ts);