X-Git-Url: https://gerrit.fd.io/r/gitweb?a=blobdiff_plain;f=adapter%2Fvppapiclient%2Fstat_client.go;h=ac47339b5522465ff2a08271cb9a95ed762cb89a;hb=f614a0af720702c8db959b6641b4faea5f98c339;hp=a2a98262d23f298a570b441c7b296644a89eeb86;hpb=df1b888a2bfadefadc7dbfce59d34f811ff002ec;p=govpp.git diff --git a/adapter/vppapiclient/stat_client.go b/adapter/vppapiclient/stat_client.go index a2a9826..ac47339 100644 --- a/adapter/vppapiclient/stat_client.go +++ b/adapter/vppapiclient/stat_client.go @@ -24,7 +24,7 @@ package vppapiclient #include #include #include -#include +#include // VPP has to be installed! #include static int @@ -138,13 +138,13 @@ govpp_stat_segment_data_get_combined_counter_index_bytes(stat_segment_data_t *da static uint8_t** govpp_stat_segment_data_get_name_vector(stat_segment_data_t *data) { - return data->name_vector; + return data->name_vector; // VPP 19.04 is required! } static char* govpp_stat_segment_data_get_name_vector_index(stat_segment_data_t *data, int index) { - return data->name_vector[index]; + return data->name_vector[index]; // VPP 19.04 is required! } static void @@ -161,6 +161,7 @@ govpp_stat_segment_string_vector(uint8_t ** string_vector, char *string) */ import "C" import ( + "errors" "fmt" "os" "unsafe" @@ -168,6 +169,11 @@ import ( "git.fd.io/govpp.git/adapter" ) +var ( + ErrStatDirBusy = errors.New("stat dir busy") + ErrStatDumpBusy = errors.New("stat dump busy") +) + var ( // DefaultStatSocket is the default path for the VPP stat socket file. DefaultStatSocket = "/run/vpp/stats.sock" @@ -219,6 +225,9 @@ func (c *statClient) Disconnect() error { func (c *statClient) ListStats(patterns ...string) (stats []string, err error) { dir := C.govpp_stat_segment_ls(convertStringSlice(patterns)) + if dir == nil { + return nil, ErrStatDirBusy + } defer C.govpp_stat_segment_vec_free(unsafe.Pointer(dir)) l := C.govpp_stat_segment_vec_len(unsafe.Pointer(dir)) @@ -233,9 +242,15 @@ func (c *statClient) ListStats(patterns ...string) (stats []string, err error) { func (c *statClient) DumpStats(patterns ...string) (stats []*adapter.StatEntry, err error) { dir := C.govpp_stat_segment_ls(convertStringSlice(patterns)) + if dir == nil { + return nil, ErrStatDirBusy + } defer C.govpp_stat_segment_vec_free(unsafe.Pointer(dir)) dump := C.govpp_stat_segment_dump(dir) + if dump == nil { + return nil, ErrStatDumpBusy + } defer C.govpp_stat_segment_data_free(dump) l := C.govpp_stat_segment_vec_len(unsafe.Pointer(dump)) @@ -285,10 +300,11 @@ func (c *statClient) DumpStats(patterns ...string) (stats []*adapter.StatEntry, var vector []adapter.Name for k := 0; k < length; k++ { s := C.govpp_stat_segment_data_get_name_vector_index(&v, C.int(k)) - if s == nil { - continue + var name adapter.Name + if s != nil { + name = adapter.Name(C.GoString(s)) } - vector = append(vector, adapter.Name(C.GoString(s))) + vector = append(vector, name) } stat.Data = adapter.NameStat(vector)