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
15 #include <afs/cellconfig.h>
16 #include <afs/bosint.h>
17 #include <rx/rxstat.h>
18 #include <afs/afsint.h>
19 #define FSINT_COMMON_XG
20 #include <afs/afscbint.h>
21 #include <afs/kauth.h>
22 #include <afs/kautils.h>
23 #include <afs/ptint.h>
24 #include <afs/ptserver.h>
25 #include <afs/vldbint.h>
26 #include <afs/volint.h>
27 #include <afs/volser.h>
35 extern int RXSTATS_RetrieveProcessRPCStats();
36 extern int RXSTATS_RetrievePeerRPCStats();
37 extern int RXSTATS_QueryProcessRPCStats();
38 extern int RXSTATS_QueryPeerRPCStats();
39 extern int RXSTATS_EnableProcessRPCStats();
40 extern int RXSTATS_EnablePeerRPCStats();
41 extern int RXSTATS_DisableProcessRPCStats();
42 extern int RXSTATS_DisablePeerRPCStats();
43 extern int RXSTATS_ClearProcessRPCStats();
44 extern int RXSTATS_ClearPeerRPCStats();
47 * This structure stores the client and server function lists.
48 * This is kept separate from the actual interface definitions
49 * since an rpc interface can be offered by several servers
50 * (e.g. ubik and rxstat)
52 * The purpose of these functions is to allow a mapping from interfaceId
53 * to text representations of server process names and function names.
57 const char **functionList;
58 size_t functionListLen;
59 } interface_function_list_t, *interface_function_list_p;
64 * On NT, you cannot define an array of character pointers in a dll
65 * and then access this array outside the dll via a global initialization
66 * because the msvc compiler will complain that the initializer is not
67 * a constant (i.e. C2099: initializer is not a constant). This is because
68 * the dllimport and dllexport c language extensions cause references
69 * to the character array to go through another level of indirection -
70 * and this indirection is unknown at compilation time.
72 * To get around this problem I hand initialize this array on NT only
75 static interface_function_list_t afs_server;
76 static interface_function_list_t afscb_server;
77 static interface_function_list_t bos_server;
78 static interface_function_list_t kauth_kaa_server;
79 static interface_function_list_t kauth_kam_server;
80 static interface_function_list_t kauth_kat_server;
81 static interface_function_list_t pts_server;
82 static interface_function_list_t rxstat_server;
83 static interface_function_list_t ubik_disk_server;
84 static interface_function_list_t ubik_vote_server;
85 static interface_function_list_t vl_server;
86 static interface_function_list_t vol_server;
87 static pthread_once_t pthread_func_list_once = PTHREAD_ONCE_INIT;
88 static int pthread_func_list_done;
90 static void cr_list(void) {
91 afs_server.functionList = RXAFS_function_names;
92 afs_server.functionListLen = RXAFS_NO_OF_STAT_FUNCS;
93 afscb_server.functionList = RXAFSCB_function_names;
94 afscb_server.functionListLen = RXAFSCB_NO_OF_STAT_FUNCS;
95 bos_server.functionList = BOZO_function_names;
96 bos_server.functionListLen = BOZO_NO_OF_STAT_FUNCS;
97 kauth_kaa_server.functionList = KAA_function_names;
98 kauth_kaa_server.functionListLen = KAA_NO_OF_STAT_FUNCS;
99 kauth_kam_server.functionList = KAM_function_names;
100 kauth_kam_server.functionListLen = KAM_NO_OF_STAT_FUNCS;
101 kauth_kat_server.functionList = KAT_function_names;
102 kauth_kat_server.functionListLen = KAT_NO_OF_STAT_FUNCS;
103 pts_server.functionList = PR_function_names;
104 pts_server.functionListLen = PR_NO_OF_STAT_FUNCS;
105 rxstat_server.functionList = RXSTATS_function_names;
106 rxstat_server.functionListLen = RXSTATS_NO_OF_STAT_FUNCS;
107 ubik_disk_server.functionList = DISK_function_names;
108 ubik_disk_server.functionListLen = DISK_NO_OF_STAT_FUNCS;
109 ubik_vote_server.functionList = VOTE_function_names;
110 ubik_vote_server.functionListLen = VOTE_NO_OF_STAT_FUNCS;
111 vl_server.functionList = VL_function_names;
112 vl_server.functionListLen = VL_NO_OF_STAT_FUNCS;
113 vol_server.functionList = AFSVolfunction_names;
114 vol_server.functionListLen = AFSVolNO_OF_STAT_FUNCS;
115 pthread_func_list_done = 1;
120 static interface_function_list_t afs_server = {
121 RXAFS_function_names,
122 RXAFS_NO_OF_STAT_FUNCS
125 static interface_function_list_t afscb_server = {
126 RXAFSCB_function_names,
127 RXAFSCB_NO_OF_STAT_FUNCS
130 static interface_function_list_t bos_server = {
132 BOZO_NO_OF_STAT_FUNCS
135 static interface_function_list_t kauth_kaa_server = {
140 static interface_function_list_t kauth_kam_server = {
145 static interface_function_list_t kauth_kat_server = {
150 static interface_function_list_t pts_server = {
155 static interface_function_list_t rxstat_server = {
156 RXSTATS_function_names,
157 RXSTATS_NO_OF_STAT_FUNCS
160 static interface_function_list_t ubik_disk_server = {
162 DISK_NO_OF_STAT_FUNCS,
165 static interface_function_list_t ubik_vote_server = {
167 VOTE_NO_OF_STAT_FUNCS,
170 static interface_function_list_t vl_server = {
175 static interface_function_list_t vol_server = {
176 AFSVolfunction_names,
177 AFSVolNO_OF_STAT_FUNCS
180 #endif /* AFS_NT40_ENV */
182 static interface_function_list_t unknown_server = {
188 afs_uint32 interfaceId;
189 const char *interfaceName;
190 interface_function_list_p functionList;
191 } interface_t, *interface_p;
193 interface_t int_list[] = {
243 * Note the code below assumes that the following entry is the last entry
247 { 0, "unknown", &unknown_server}
255 DoClientLocalCellGet(struct cmd_syndesc *as, char *arock)
258 char cellName[MAXCELLCHARS];
260 if (!afsclient_LocalCellGet(cellName,&st)) {
261 ERR_ST_EXT("afsclient_LocalCellGet", st);
264 printf("This machine belongs to cell: %s\n", cellName);
270 DoClientMountPointCreate(struct cmd_syndesc *as, char *arock)
272 typedef enum {DIRECTORY, VOLUME, READWRITE, CHECK}
273 DoClientMountPointCreate_parm_t;
275 const char *directory;
277 vol_type_t vol_type = READ_ONLY;
278 vol_check_t vol_check = DONT_CHECK_VOLUME;
280 if (as->parms[DIRECTORY].items) {
281 directory = as->parms[DIRECTORY].items->data;
284 if (as->parms[VOLUME].items) {
285 volume = as->parms[VOLUME].items->data;
288 if (as->parms[READWRITE].items) {
289 vol_type = READ_WRITE;
292 if (as->parms[CHECK].items) {
293 vol_check = CHECK_VOLUME;
296 if (!afsclient_MountPointCreate(cellHandle,
302 ERR_ST_EXT("afsclient_MountPointCreate", st);
309 Print_afs_serverEntry_p(afs_serverEntry_p serv, const char *prefix)
313 printf("%sInformation for server %s\n", prefix, serv->serverName);
314 if (serv->serverType & DATABASE_SERVER) {
315 printf("%s\tIt is a database server\n", prefix);
317 if (serv->serverType & FILE_SERVER) {
318 printf("%s\tIt is a file server\n", prefix);
320 printf("%s\tServer addresses:%s\n", prefix, serv->serverName);
321 while (serv->serverAddress[i] != 0) {
322 printf("\t\t%s%x\n", prefix, serv->serverAddress[i++]);
327 DoClientAFSServerGet(struct cmd_syndesc *as, char *arock)
329 typedef enum {SERVER}
330 DoClientAFSServerGet_parm_t;
333 afs_serverEntry_t entry;
335 if (as->parms[SERVER].items) {
336 server = as->parms[SERVER].items->data;
339 if (!afsclient_AFSServerGet(cellHandle,
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,
361 ERR_ST_EXT("afsclient_AFSServerGetBegin", st);
364 while(afsclient_AFSServerGetNext(iter, &entry, &st)) {
365 Print_afs_serverEntry_p(&entry, "");
368 if (st != ADMITERATORDONE) {
369 ERR_ST_EXT("afsclient_AFSServerGetNext", st);
372 if (!afsclient_AFSServerGetDone(iter, &st)) {
373 ERR_ST_EXT("afsclient_AFSServerGetDone", st);
381 Print_afs_RPCStatsState_p(
382 afs_RPCStatsState_p state,
385 printf("%sThe rpc stats state is: ", prefix);
387 case AFS_RPC_STATS_DISABLED:
388 printf("disabled\n");
390 case AFS_RPC_STATS_ENABLED:
398 afs_stat_source_t value;
399 } afs_type_map_t, *afs_type_map_p;
401 static afs_type_map_t map[] = {
402 {"bosserver", AFS_BOSSERVER},
403 {"fileserver", AFS_FILESERVER},
404 {"kaserver", AFS_KASERVER},
405 {"ptserver", AFS_PTSERVER},
406 {"volserver", AFS_VOLSERVER},
407 {"vlserver", AFS_VLSERVER},
408 {"client", AFS_CLIENT},
412 GetStatPortFromString(const char *type, int *port) {
417 tport = strtol(type, &end, 0);
418 if (tport == 0 || end == type || *end != '\0') {
427 GetStatSourceFromString(const char *type, afs_stat_source_t *src, int *port) {
429 size_t type_len = strlen(type);
431 for(i=0; (map[i].tag) && strncasecmp(type, map[i].tag, type_len); i++);
433 if (map[i].tag == 0) {
435 * Try to convert string to port number
437 if (GetStatPortFromString(type, port)) {
441 fprintf(stderr, "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) {
463 if (!strcmp(type, "peer")) {
465 } else if (!strcmp(type, "process")) {
466 rc = AFS_PROCESS_STATS;
468 ERR_EXT("stat_type must be process or peer");
475 DoClientRPCStatsStateGet(struct cmd_syndesc *as, char *arock)
477 typedef enum {SERVER, PROCESS, STAT_TYPE}
478 DoClientRPCStatsStateGet_parm_t;
480 struct rx_connection *conn;
482 afs_stat_source_t type;
485 afs_stat_type_t which;
486 afs_RPCStatsState_t state;
488 if (as->parms[PROCESS].items) {
489 typeIsValid = GetStatSourceFromString(as->parms[PROCESS].items->data,
493 if (as->parms[STAT_TYPE].items) {
494 which = GetStatTypeFromString(as->parms[STAT_TYPE].items->data);
497 if (as->parms[SERVER].items) {
499 if (!afsclient_RPCStatOpen(cellHandle,
500 as->parms[SERVER].items->data,
504 ERR_ST_EXT("afsclient_RPCStatOpen", st);
507 if (!afsclient_RPCStatOpenPort(cellHandle,
508 as->parms[SERVER].items->data,
512 ERR_ST_EXT("afsclient_RPCStatOpenPort", st);
517 if (which == AFS_PEER_STATS) {
518 if (!util_RPCStatsStateGet(conn, RXSTATS_QueryPeerRPCStats, &state, &st)) {
519 ERR_ST_EXT("util_RPCStatsStateGet", st);
522 if (!util_RPCStatsStateGet(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}
538 DoClientRPCStatsEnable_parm_t;
540 struct rx_connection *conn;
542 afs_stat_source_t type;
545 afs_stat_type_t which;
547 if (as->parms[PROCESS].items) {
548 typeIsValid = GetStatSourceFromString(as->parms[PROCESS].items->data,
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(cellHandle,
559 as->parms[SERVER].items->data,
563 ERR_ST_EXT("afsclient_RPCStatOpen", st);
566 if (!afsclient_RPCStatOpenPort(cellHandle,
567 as->parms[SERVER].items->data,
571 ERR_ST_EXT("afsclient_RPCStatOpenPort", st);
576 if (which == AFS_PEER_STATS) {
577 if (!util_RPCStatsStateEnable(conn, RXSTATS_EnablePeerRPCStats, &st)) {
578 ERR_ST_EXT("util_RPCStatsStateEnable", st);
581 if (!util_RPCStatsStateEnable(conn, RXSTATS_EnableProcessRPCStats, &st)) {
582 ERR_ST_EXT("util_RPCStatsStateEnable", st);
586 afsclient_RPCStatClose(conn, 0);
592 DoClientRPCStatsStateDisable(struct cmd_syndesc *as, char *arock)
594 typedef enum {SERVER, PROCESS, STAT_TYPE}
595 DoClientRPCStatsDisable_parm_t;
597 struct rx_connection *conn;
599 afs_stat_source_t type;
602 afs_stat_type_t which;
604 if (as->parms[PROCESS].items) {
605 typeIsValid = GetStatSourceFromString(as->parms[PROCESS].items->data,
609 if (as->parms[STAT_TYPE].items) {
610 which = GetStatTypeFromString(as->parms[STAT_TYPE].items->data);
613 if (as->parms[SERVER].items) {
615 if (!afsclient_RPCStatOpen(cellHandle,
616 as->parms[SERVER].items->data,
620 ERR_ST_EXT("afsclient_RPCStatOpen", st);
623 if (!afsclient_RPCStatOpenPort(cellHandle,
624 as->parms[SERVER].items->data,
628 ERR_ST_EXT("afsclient_RPCStatOpenPort", st);
633 if (which == AFS_PEER_STATS) {
634 if (!util_RPCStatsStateDisable(conn, RXSTATS_DisablePeerRPCStats, &st)) {
635 ERR_ST_EXT("util_RPCStatsStateDisable", st);
638 if (!util_RPCStatsStateDisable(conn, RXSTATS_DisableProcessRPCStats, &st)) {
639 ERR_ST_EXT("util_RPCStatsStateDisable", st);
643 afsclient_RPCStatClose(conn, 0);
649 Print_afs_RPCStats_p(
651 interface_function_list_p f_list,
654 afs_int32 index = stat->s.stats_v1.func_index;
656 if (index > ((afs_int32) f_list->functionListLen - 1)) {
657 printf("%sUnknown function ", prefix);
661 f_list->functionList[stat->s.stats_v1.func_index]);
664 if (!hiszero(stat->s.stats_v1.invocations)) {
665 printf("%sinvoc (%u.%u) bytes_sent (%u.%u) bytes_rcvd (%u.%u)\n",
666 prefix, hgethi(stat->s.stats_v1.invocations),
667 hgetlo(stat->s.stats_v1.invocations),
668 hgethi(stat->s.stats_v1.bytes_sent),
669 hgetlo(stat->s.stats_v1.bytes_sent),
670 hgethi(stat->s.stats_v1.bytes_rcvd),
671 hgetlo(stat->s.stats_v1.bytes_rcvd)
673 printf("\tqsum %d.%06d\tqsqr %d.%06d"
674 "\tqmin %d.%06d\tqmax %d.%06d\n",
675 stat->s.stats_v1.queue_time_sum.sec,
676 stat->s.stats_v1.queue_time_sum.usec,
677 stat->s.stats_v1.queue_time_sum_sqr.sec,
678 stat->s.stats_v1.queue_time_sum_sqr.usec,
679 stat->s.stats_v1.queue_time_min.sec,
680 stat->s.stats_v1.queue_time_min.usec,
681 stat->s.stats_v1.queue_time_max.sec,
682 stat->s.stats_v1.queue_time_max.usec
684 printf("\txsum %d.%06d\txsqr %d.%06d"
685 "\txmin %d.%06d\txmax %d.%06d\n",
686 stat->s.stats_v1.execution_time_sum.sec,
687 stat->s.stats_v1.execution_time_sum.usec,
688 stat->s.stats_v1.execution_time_sum_sqr.sec,
689 stat->s.stats_v1.execution_time_sum_sqr.usec,
690 stat->s.stats_v1.execution_time_min.sec,
691 stat->s.stats_v1.execution_time_min.usec,
692 stat->s.stats_v1.execution_time_max.sec,
693 stat->s.stats_v1.execution_time_max.usec
696 printf("never invoked\n");
701 DoClientRPCStatsList(struct cmd_syndesc *as, char *arock)
703 typedef enum {SERVER, PROCESS, STAT_TYPE}
704 DoClientRPCStatsList_parm_t;
706 struct rx_connection *conn;
708 afs_stat_source_t type;
711 afs_stat_type_t which;
712 afs_RPCStats_t stats;
717 (pthread_func_list_done || pthread_once(&pthread_func_list_once, cr_list));
720 if (as->parms[PROCESS].items) {
721 typeIsValid = GetStatSourceFromString(as->parms[PROCESS].items->data,
725 if (as->parms[STAT_TYPE].items) {
726 which = GetStatTypeFromString(as->parms[STAT_TYPE].items->data);
729 if (as->parms[SERVER].items) {
731 if (!afsclient_RPCStatOpen(cellHandle,
732 as->parms[SERVER].items->data,
736 ERR_ST_EXT("afsclient_RPCStatOpen", st);
739 if (!afsclient_RPCStatOpenPort(cellHandle,
740 as->parms[SERVER].items->data,
744 ERR_ST_EXT("afsclient_RPCStatOpenPort", st);
749 if (which == AFS_PEER_STATS) {
750 if (!util_RPCStatsGetBegin(conn, RXSTATS_RetrievePeerRPCStats, &iter, &st)) {
751 ERR_ST_EXT("util_RPCStatsGetBegin", st);
754 if (!util_RPCStatsGetBegin(conn, RXSTATS_RetrieveProcessRPCStats, &iter, &st)) {
755 ERR_ST_EXT("util_RPCStatsGetBegin", st);
759 printf("Listing rpc stats at server %s process %s:\n",
760 as->parms[SERVER].items->data,
761 as->parms[PROCESS].items->data);
763 while (util_RPCStatsGetNext(iter, &stats, &st)) {
766 * Print a new heading for each stat collection
769 if (stats.s.stats_v1.func_index == 0) {
774 * Look up the interface in our list
777 for(i=0;i<((sizeof(int_list)-1) / sizeof(interface_t));i++) {
778 if (stats.s.stats_v1.interfaceId == int_list[i].interfaceId) {
784 * Print out a meaningful header for each stat collection
787 if (which == AFS_PEER_STATS) {
789 ina.s_addr = htonl(stats.s.stats_v1.remote_peer);
791 printf("%s stats for remote peer located at %s port %u "
792 "%s %s as a %s via the %s interface\n",
793 as->parms[PROCESS].items->data,
795 stats.s.stats_v1.remote_port,
797 ((stats.s.stats_v1.remote_is_server) ?
798 "accessed by" : "accessing"),
800 as->parms[PROCESS].items->data,
802 ((stats.s.stats_v1.remote_is_server) ?
803 "client" : "server"),
804 int_list[i].interfaceName
807 printf("%s stats for the %s interface "
808 "accessed as a %s\n",
809 as->parms[PROCESS].items->data,
810 int_list[i].interfaceName,
812 ((stats.s.stats_v1.remote_is_server) ?
817 Print_afs_RPCStats_p(&stats, int_list[i].functionList, " ");
820 if (st != ADMITERATORDONE) {
821 ERR_ST_EXT("util_RPCStatsGetNext", st);
824 if (!util_RPCStatsGetDone(iter, &st)) {
825 ERR_ST_EXT("util_RPCStatsGetDone", st);
828 afsclient_RPCStatClose(conn, 0);
834 DoClientRPCStatsClear(struct cmd_syndesc *as, char *arock)
836 typedef enum {SERVER, PROCESS, STAT_TYPE, CLEAR_ALL, CLEAR_INVOCATIONS,
837 CLEAR_BYTES_SENT, CLEAR_BYTES_RCVD,
838 CLEAR_QUEUE_TIME_SUM, CLEAR_QUEUE_TIME_SQUARE,
839 CLEAR_QUEUE_TIME_MIN, CLEAR_QUEUE_TIME_MAX,
840 CLEAR_EXEC_TIME_SUM, CLEAR_EXEC_TIME_SQUARE,
841 CLEAR_EXEC_TIME_MIN, CLEAR_EXEC_TIME_MAX}
842 DoClientRPCStatsClear_parm_t;
844 struct rx_connection *conn;
846 afs_stat_source_t type;
849 afs_stat_type_t which;
850 afs_RPCStatsClearFlag_t flag = 0;
854 if (as->parms[PROCESS].items) {
855 typeIsValid = GetStatSourceFromString(as->parms[PROCESS].items->data,
859 if (as->parms[STAT_TYPE].items) {
860 which = GetStatTypeFromString(as->parms[STAT_TYPE].items->data);
863 if (as->parms[SERVER].items) {
865 if (!afsclient_RPCStatOpen(cellHandle,
866 as->parms[SERVER].items->data,
870 ERR_ST_EXT("afsclient_RPCStatOpen", st);
873 if (!afsclient_RPCStatOpenPort(cellHandle,
874 as->parms[SERVER].items->data,
878 ERR_ST_EXT("afsclient_RPCStatOpenPort", st);
883 if (as->parms[CLEAR_ALL].items) {
886 flag = AFS_RX_STATS_CLEAR_ALL;
889 if (as->parms[CLEAR_INVOCATIONS].items) {
891 ERR_EXT("cannot specify additional flags when "
892 "specifying clear_all");
895 flag |= AFS_RX_STATS_CLEAR_INVOCATIONS;
898 if (as->parms[CLEAR_BYTES_SENT].items) {
900 ERR_EXT("cannot specify additional flags when "
901 "specifying clear_all");
904 flag |= AFS_RX_STATS_CLEAR_BYTES_SENT;
907 if (as->parms[CLEAR_BYTES_RCVD].items) {
909 ERR_EXT("cannot specify additional flags when "
910 "specifying clear_all");
913 flag |= AFS_RX_STATS_CLEAR_BYTES_RCVD;
916 if (as->parms[CLEAR_QUEUE_TIME_SUM].items) {
918 ERR_EXT("cannot specify additional flags when "
919 "specifying clear_all");
922 flag |= AFS_RX_STATS_CLEAR_QUEUE_TIME_SUM;
925 if (as->parms[CLEAR_QUEUE_TIME_SQUARE].items) {
927 ERR_EXT("cannot specify additional flags when "
928 "specifying clear_all");
931 flag |= AFS_RX_STATS_CLEAR_QUEUE_TIME_SQUARE;
934 if (as->parms[CLEAR_QUEUE_TIME_MIN].items) {
936 ERR_EXT("cannot specify additional flags when "
937 "specifying clear_all");
940 flag |= AFS_RX_STATS_CLEAR_QUEUE_TIME_MIN;
943 if (as->parms[CLEAR_QUEUE_TIME_MAX].items) {
945 ERR_EXT("cannot specify additional flags when "
946 "specifying clear_all");
949 flag |= AFS_RX_STATS_CLEAR_QUEUE_TIME_MAX;
952 if (as->parms[CLEAR_EXEC_TIME_SUM].items) {
954 ERR_EXT("cannot specify additional flags when "
955 "specifying clear_all");
958 flag |= AFS_RX_STATS_CLEAR_EXEC_TIME_SUM;
961 if (as->parms[CLEAR_EXEC_TIME_SQUARE].items) {
963 ERR_EXT("cannot specify additional flags when "
964 "specifying clear_all");
967 flag |= AFS_RX_STATS_CLEAR_EXEC_TIME_SQUARE;
970 if (as->parms[CLEAR_EXEC_TIME_MIN].items) {
972 ERR_EXT("cannot specify additional flags when "
973 "specifying clear_all");
976 flag |= AFS_RX_STATS_CLEAR_EXEC_TIME_MIN;
979 if (as->parms[CLEAR_EXEC_TIME_MAX].items) {
981 ERR_EXT("cannot specify additional flags when "
982 "specifying clear_all");
985 flag |= AFS_RX_STATS_CLEAR_EXEC_TIME_MAX;
989 ERR_EXT("you must specify something to clear");
992 if (which == AFS_PEER_STATS) {
993 if (!util_RPCStatsClear(conn, RXSTATS_ClearPeerRPCStats, flag, &st)) {
994 ERR_ST_EXT("util_RPCStatsClear", st);
997 if (!util_RPCStatsClear(conn, RXSTATS_ClearProcessRPCStats, flag, &st)) {
998 ERR_ST_EXT("util_RPCStatsClear", st);
1002 afsclient_RPCStatClose(conn, 0);
1008 DoClientRPCStatsVersionGet(struct cmd_syndesc *as, char *arock)
1010 typedef enum {SERVER, PROCESS}
1011 DoClientRPCStatsVersionGet_parm_t;
1012 afs_status_t st = 0;
1013 struct rx_connection *conn;
1014 afs_stat_source_t type;
1018 afs_RPCStatsVersion_t version;
1020 if (as->parms[PROCESS].items) {
1021 typeIsValid = GetStatSourceFromString(as->parms[PROCESS].items->data,
1025 if (as->parms[SERVER].items) {
1027 if (!afsclient_RPCStatOpen(cellHandle,
1028 as->parms[SERVER].items->data,
1032 ERR_ST_EXT("afsclient_RPCStatOpen", st);
1035 if (!afsclient_RPCStatOpenPort(cellHandle,
1036 as->parms[SERVER].items->data,
1040 ERR_ST_EXT("afsclient_RPCStatOpenPort", st);
1045 if (!util_RPCStatsVersionGet(conn, &version, &st)) {
1046 ERR_ST_EXT("util_RPCStatsVersionGet", st);
1049 printf("the rpc stat version number is %u\n", version);
1051 afsclient_RPCStatClose(conn, 0);
1057 Print_afs_CMServerPref_p(afs_CMServerPref_p pref)
1061 taddr = pref->ipAddr;
1062 printf("%d.%d.%d.%d\t\t\t%d\n",
1063 (taddr >> 24) & 0xff, (taddr >> 16) & 0xff,
1064 (taddr >> 8) & 0xff, taddr & 0xff, pref->ipRank);
1068 DoClientCMGetServerPrefs(struct cmd_syndesc *as, char *arock)
1070 afs_status_t st = 0;
1071 typedef enum {SERVER, PORT}
1072 DoClientCMGetServerPrefs_parm_t;
1073 struct rx_connection *conn;
1075 int srvrPort = AFSCONF_CALLBACKPORT;
1076 afs_CMServerPref_t prefs;
1080 (pthread_func_list_done || pthread_once(&pthread_func_list_once, cr_list));
1083 if (as->parms[PORT].items) {
1084 if (!GetStatPortFromString(as->parms[PORT].items->data, &srvrPort)) {
1085 ERR_EXT("Couldn't undertand port number");
1089 if (as->parms[SERVER].items) {
1090 if (!afsclient_CMStatOpenPort(cellHandle,
1091 as->parms[SERVER].items->data,
1095 ERR_ST_EXT("afsclient_CMStatOpenPort", st);
1099 if (!util_CMGetServerPrefsBegin(conn, &iter, &st)) {
1100 ERR_ST_EXT("util_CMGetServerPrefsBegin", st);
1103 printf("Listing CellServDB for %s at port %s:\n",
1104 as->parms[SERVER].items->data,
1105 as->parms[PORT].items->data);
1107 while (util_CMGetServerPrefsNext(iter, &prefs, &st)) {
1109 Print_afs_CMServerPref_p(&prefs);
1112 if (st != ADMITERATORDONE) {
1113 ERR_ST_EXT("util_CMGetServerPrefsNext", st);
1116 if (!util_CMGetServerPrefsDone(iter, &st)) {
1117 ERR_ST_EXT("util_CMGetServerPrefsDone", st);
1120 afsclient_CMStatClose(conn, 0);
1126 Print_afs_CMListCell_p(afs_CMListCell_p cellInfo)
1131 printf("Cell %s on hosts", cellInfo->cellname);
1132 for (i = 0 ; i < UTIL_MAX_CELL_HOSTS && cellInfo->serverAddr[i] ; i++) {
1133 taddr = cellInfo->serverAddr[i];
1134 printf(" %d.%d.%d.%d",
1135 (taddr >> 24) & 0xff, (taddr >> 16) & 0xff,
1136 (taddr >> 8) & 0xff, taddr & 0xff);
1142 DoClientCMListCells(struct cmd_syndesc *as, char *arock)
1144 afs_status_t st = 0;
1145 typedef enum {SERVER, PORT}
1146 DoClientCMListCells_parm_t;
1147 struct rx_connection *conn;
1149 int srvrPort = AFSCONF_CALLBACKPORT;
1150 afs_CMListCell_t cellInfo;
1154 (pthread_func_list_done || pthread_once(&pthread_func_list_once, cr_list));
1157 if (as->parms[PORT].items) {
1158 if (!GetStatPortFromString(as->parms[PORT].items->data, &srvrPort)) {
1159 ERR_EXT("Couldn't undertand port number");
1163 if (as->parms[SERVER].items) {
1164 if (!afsclient_CMStatOpenPort(cellHandle,
1165 as->parms[SERVER].items->data,
1169 ERR_ST_EXT("afsclient_CMStatOpenPort", st);
1173 if (!util_CMListCellsBegin(conn, &iter, &st)) {
1174 ERR_ST_EXT("util_CMListCellsBegin", st);
1177 printf("Listing CellServDB for %s at port %s:\n",
1178 as->parms[SERVER].items->data,
1179 as->parms[PORT].items->data);
1181 while (util_CMListCellsNext(iter, &cellInfo, &st)) {
1183 Print_afs_CMListCell_p(&cellInfo);
1186 if (st != ADMITERATORDONE) {
1187 ERR_ST_EXT("util_CMListCellsNext", st);
1190 if (!util_CMListCellsDone(iter, &st)) {
1191 ERR_ST_EXT("util_CMListCellsDone", st);
1194 afsclient_CMStatClose(conn, 0);
1200 DoClientCMLocalCell(struct cmd_syndesc *as, char *arock)
1202 afs_status_t st = 0;
1203 typedef enum {SERVER, PORT}
1204 DoClientCMLocalCell_parm_t;
1205 struct rx_connection *conn;
1207 int srvrPort = AFSCONF_CALLBACKPORT;
1208 afs_CMCellName_t cellname;
1211 (pthread_func_list_done || pthread_once(&pthread_func_list_once, cr_list));
1214 if (as->parms[PORT].items) {
1215 if (!GetStatPortFromString(as->parms[PORT].items->data, &srvrPort)) {
1216 ERR_EXT("Couldn't undertand port number");
1220 if (as->parms[SERVER].items) {
1221 if (!afsclient_CMStatOpenPort(cellHandle,
1222 as->parms[SERVER].items->data,
1226 ERR_ST_EXT("afsclient_CMStatOpenPort", st);
1230 if (!util_CMLocalCell(conn, cellname, &st)) {
1231 ERR_ST_EXT("util_CMLocalCell", st);
1234 printf("Client %s (port %s) is in cell %s\n",
1235 as->parms[SERVER].items->data,
1236 as->parms[PORT].items->data,
1239 afsclient_CMStatClose(conn, 0);
1245 Print_afs_ClientConfig_p(afs_ClientConfig_p config)
1247 printf(" clientVersion: %d\n", config->clientVersion);
1248 printf(" serverVersion: %d\n", config->serverVersion);
1249 printf(" nChunkFiles: %d\n", config->c.config_v1.nChunkFiles);
1250 printf(" nStatCaches: %d\n", config->c.config_v1.nStatCaches);
1251 printf(" nDataCaches: %d\n", config->c.config_v1.nDataCaches);
1252 printf(" nVolumeCaches: %d\n", config->c.config_v1.nVolumeCaches);
1253 printf(" firstChunkSize: %d\n", config->c.config_v1.firstChunkSize);
1254 printf(" otherChunkSize: %d\n", config->c.config_v1.otherChunkSize);
1255 printf(" cacheSize: %d\n", config->c.config_v1.cacheSize);
1256 printf(" setTime: %d\n", config->c.config_v1.setTime);
1257 printf(" memCache: %d\n", config->c.config_v1.memCache);
1262 DoClientCMClientConfig(struct cmd_syndesc *as, char *arock)
1264 afs_status_t st = 0;
1265 typedef enum {SERVER, PORT}
1266 DoClientCMLocalCell_parm_t;
1267 struct rx_connection *conn;
1269 int srvrPort = AFSCONF_CALLBACKPORT;
1270 afs_ClientConfig_t config;
1273 (pthread_func_list_done || pthread_once(&pthread_func_list_once, cr_list));
1276 if (as->parms[PORT].items) {
1277 if (!GetStatPortFromString(as->parms[PORT].items->data, &srvrPort)) {
1278 ERR_EXT("Couldn't undertand port number");
1282 if (as->parms[SERVER].items) {
1283 if (!afsclient_CMStatOpenPort(cellHandle,
1284 as->parms[SERVER].items->data,
1288 ERR_ST_EXT("afsclient_CMStatOpenPort", st);
1292 if (!util_CMClientConfig(conn, &config, &st)) {
1293 ERR_ST_EXT("util_CMClientConfig", st);
1296 printf("Cache configuration for client %s (port %s):\n\n",
1297 as->parms[SERVER].items->data,
1298 as->parms[PORT].items->data);
1300 Print_afs_ClientConfig_p(&config);
1304 afsclient_CMStatClose(conn, 0);
1310 SetupClientAdminCmd(void)
1312 struct cmd_syndesc *ts;
1314 ts = cmd_CreateSyntax("ClientLocalCellGet",
1315 DoClientLocalCellGet, 0,
1316 "get the name of this machine's cell");
1317 SetupCommonCmdArgs(ts);
1319 ts = cmd_CreateSyntax("ClientMountPointCreate",
1320 DoClientMountPointCreate, 0,
1321 "create a mount point");
1326 "directory where mount point will be created");
1331 "the name of the volume to mount");
1336 "mount a read write volume");
1341 "check that the volume exists before mounting");
1342 SetupCommonCmdArgs(ts);
1344 ts = cmd_CreateSyntax("ClientAFSServerGet",
1345 DoClientAFSServerGet, 0,
1346 "retrieve information about an afs server");
1352 SetupCommonCmdArgs(ts);
1354 ts = cmd_CreateSyntax("ClientAFSServerList",
1355 DoClientAFSServerList, 0,
1356 "retrieve information about all afs "
1357 "servers in a cell");
1362 "server where command will execute");
1367 "process to query <bosserver fileserver ptserver "
1368 "kaserver client vlserver volserver>");
1373 "stats to retrieve <peer or process>");
1374 SetupCommonCmdArgs(ts);
1376 ts = cmd_CreateSyntax("ClientRPCStatsStateGet",
1377 DoClientRPCStatsStateGet,
1379 "retrieve the rpc stat collection state");
1384 "server where command will execute");
1389 "process to query <bosserver fileserver ptserver "
1390 "kaserver client vlserver volserver>");
1395 "stats to retrieve <peer or process>");
1396 SetupCommonCmdArgs(ts);
1398 ts = cmd_CreateSyntax("ClientRPCStatsStateEnable",
1399 DoClientRPCStatsStateEnable,
1401 "set the rpc stat collection state to on");
1406 "server where command will execute");
1411 "process to query <bosserver fileserver ptserver "
1412 "kaserver client vlserver volserver>");
1417 "stats to retrieve <peer or process>");
1418 SetupCommonCmdArgs(ts);
1420 ts = cmd_CreateSyntax("ClientRPCStatsStateDisable",
1421 DoClientRPCStatsStateDisable,
1423 "set the rpc stat collection state to off");
1428 "server where command will execute");
1433 "process to query <bosserver fileserver ptserver "
1434 "kaserver client vlserver volserver>");
1439 "stats to retrieve <peer or process>");
1440 SetupCommonCmdArgs(ts);
1442 ts = cmd_CreateSyntax("ClientRPCStatsList",
1443 DoClientRPCStatsList,
1445 "list the rpc stats");
1450 "server where command will execute");
1455 "process to query <bosserver fileserver ptserver "
1456 "kaserver client vlserver volserver>");
1461 "stats to retrieve <peer or process>");
1462 SetupCommonCmdArgs(ts);
1464 ts = cmd_CreateSyntax("ClientRPCStatsClear",
1465 DoClientRPCStatsClear,
1467 "reset rpc stat counters");
1472 "server where command will execute");
1477 "process to query <bosserver fileserver ptserver "
1478 "kaserver client vlserver volserver>");
1483 "stats to retrieve <peer or process>");
1488 "clear all existing counters");
1490 "-clear_invocations",
1493 "clear invocation count");
1495 "-clear_bytes_sent",
1498 "clear bytes_sent count");
1500 "-clear_bytes_rcvd",
1503 "clear bytes_rcvd count");
1505 "-clear_queue_time_sum",
1508 "clear queue time sum");
1510 "-clear_queue_time_square",
1513 "clear queue time square");
1515 "-clear_queue_time_min",
1518 "clear queue time min");
1520 "-clear_queue_time_max",
1523 "clear queue time max");
1525 "-clear_exec_time_sum",
1528 "clear exec time sum");
1530 "-clear_exec_time_square",
1533 "clear exec time square");
1535 "-clear_exec_time_min",
1538 "clear exec time min");
1540 "-clear_exec_time_max",
1543 "clear exec time max");
1544 SetupCommonCmdArgs(ts);
1546 ts = cmd_CreateSyntax("ClientRPCStatsVersionGet",
1547 DoClientRPCStatsVersionGet,
1549 "list the server's rpc stats version");
1554 "server where command will execute");
1559 "process to query <bosserver fileserver ptserver "
1560 "kaserver client vlserver volserver>");
1561 SetupCommonCmdArgs(ts);
1563 ts = cmd_CreateSyntax("ClientCMGetServerPrefs",
1564 DoClientCMGetServerPrefs,
1566 "list a client's server preferences ");
1571 "server where command will execute");
1576 "UDP port to query");
1577 SetupCommonCmdArgs(ts);
1579 ts = cmd_CreateSyntax("ClientCMListCells",
1580 DoClientCMListCells,
1582 "list a client's CellServDB ");
1587 "server where command will execute");
1592 "UDP port to query");
1593 SetupCommonCmdArgs(ts);
1595 ts = cmd_CreateSyntax("ClientCMLocalCell",
1596 DoClientCMLocalCell,
1598 "get the name of the client's local cell");
1603 "server where command will execute");
1608 "UDP port to query");
1609 SetupCommonCmdArgs(ts);
1611 ts = cmd_CreateSyntax("ClientCMClientConfig",
1612 DoClientCMClientConfig,
1614 "get the client's cache configuration");
1619 "server where command will execute");
1624 "UDP port to query");
1625 SetupCommonCmdArgs(ts);