Add statistics to client and command to view them
This commit is contained in:
parent
e375489cae
commit
11b57cda66
@ -8,6 +8,7 @@ import (
|
|||||||
"asink"
|
"asink"
|
||||||
"asink/util"
|
"asink/util"
|
||||||
"code.google.com/p/goconf/conf"
|
"code.google.com/p/goconf/conf"
|
||||||
|
"errors"
|
||||||
"flag"
|
"flag"
|
||||||
"fmt"
|
"fmt"
|
||||||
"io/ioutil"
|
"io/ioutil"
|
||||||
@ -124,6 +125,9 @@ func StartClient(args []string) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func ProcessLocalEvent(globals AsinkGlobals, event *asink.Event) {
|
func ProcessLocalEvent(globals AsinkGlobals, event *asink.Event) {
|
||||||
|
StatStartLocalUpdate()
|
||||||
|
defer StatStopLocalUpdate()
|
||||||
|
|
||||||
//make the path relative before we save/send it anywhere
|
//make the path relative before we save/send it anywhere
|
||||||
var err error
|
var err error
|
||||||
absolutePath := event.Path
|
absolutePath := event.Path
|
||||||
@ -190,7 +194,9 @@ func ProcessLocalEvent(globals AsinkGlobals, event *asink.Event) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
//upload file to remote storage
|
//upload file to remote storage
|
||||||
|
StatStartUpload()
|
||||||
err = globals.storage.Put(cachedFilename, event.Hash)
|
err = globals.storage.Put(cachedFilename, event.Hash)
|
||||||
|
StatStopUpload()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
panic(err)
|
panic(err)
|
||||||
}
|
}
|
||||||
@ -217,6 +223,8 @@ func ProcessLocalEvents(globals AsinkGlobals, eventChan chan *asink.Event) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func ProcessRemoteEvent(globals AsinkGlobals, event *asink.Event) {
|
func ProcessRemoteEvent(globals AsinkGlobals, event *asink.Event) {
|
||||||
|
StatStartRemoteUpdate()
|
||||||
|
defer StatStopRemoteUpdate()
|
||||||
latestLocal := LockPath(event.Path, true)
|
latestLocal := LockPath(event.Path, true)
|
||||||
defer UnlockPath(event)
|
defer UnlockPath(event)
|
||||||
|
|
||||||
@ -248,7 +256,9 @@ func ProcessRemoteEvent(globals AsinkGlobals, event *asink.Event) {
|
|||||||
}
|
}
|
||||||
tmpfilename := outfile.Name()
|
tmpfilename := outfile.Name()
|
||||||
outfile.Close()
|
outfile.Close()
|
||||||
|
StatStartDownload()
|
||||||
err = globals.storage.Get(tmpfilename, event.Hash)
|
err = globals.storage.Get(tmpfilename, event.Hash)
|
||||||
|
StatStopDownload()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
panic(err) //TODO handle sensibly
|
panic(err) //TODO handle sensibly
|
||||||
}
|
}
|
||||||
@ -307,7 +317,7 @@ func ProcessRemoteEvents(globals AsinkGlobals, eventChan chan *asink.Event) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func StopClient(args []string) {
|
func getSocketFromArgs(args []string) (string, error) {
|
||||||
const config_usage = "Config File to use"
|
const config_usage = "Config File to use"
|
||||||
userHomeDir := "~"
|
userHomeDir := "~"
|
||||||
|
|
||||||
@ -323,20 +333,46 @@ func StopClient(args []string) {
|
|||||||
|
|
||||||
config, err := conf.ReadConfigFile(globals.configFileName)
|
config, err := conf.ReadConfigFile(globals.configFileName)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
fmt.Println(err)
|
return "", err
|
||||||
fmt.Println("Error reading config file at ", globals.configFileName, ". Does it exist?")
|
|
||||||
return
|
|
||||||
}
|
}
|
||||||
|
|
||||||
rpcSock, err := config.GetString("local", "socket") //TODO make sure this exists
|
rpcSock, err := config.GetString("local", "socket")
|
||||||
if err != nil {
|
if err != nil {
|
||||||
fmt.Println("Error reading local.socket from config file at ", globals.configFileName)
|
return "", errors.New("Error reading local.socket from config file at " + globals.configFileName)
|
||||||
|
}
|
||||||
|
|
||||||
|
return rpcSock, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func StopClient(args []string) {
|
||||||
|
rpcSock, err := getSocketFromArgs(args)
|
||||||
|
if err != nil {
|
||||||
|
fmt.Println(err)
|
||||||
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
i := 99
|
i := 99
|
||||||
returnCode := 0
|
returnCode := 0
|
||||||
err = asink.RPCCall(rpcSock, "ClientStopper.StopClient", &returnCode, &i)
|
err = asink.RPCCall(rpcSock, "ClientAdmin.StopClient", &i, &returnCode)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
panic(err)
|
panic(err)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func GetStatus(args []string) {
|
||||||
|
var status string
|
||||||
|
|
||||||
|
rpcSock, err := getSocketFromArgs(args)
|
||||||
|
if err != nil {
|
||||||
|
fmt.Println(err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
i := 99
|
||||||
|
err = asink.RPCCall(rpcSock, "ClientAdmin.GetClientStatus", &i, &status)
|
||||||
|
if err != nil {
|
||||||
|
panic(err)
|
||||||
|
}
|
||||||
|
|
||||||
|
fmt.Println(status)
|
||||||
|
}
|
||||||
|
@ -27,17 +27,16 @@ var commands []Command = []Command{
|
|||||||
fn: StopClient,
|
fn: StopClient,
|
||||||
explanation: "Stop the client daemon",
|
explanation: "Stop the client daemon",
|
||||||
},
|
},
|
||||||
|
Command{
|
||||||
|
cmd: "status",
|
||||||
|
fn: GetStatus,
|
||||||
|
explanation: "Get a summary of the client's status",
|
||||||
|
},
|
||||||
Command{
|
Command{
|
||||||
cmd: "version",
|
cmd: "version",
|
||||||
fn: PrintVersion,
|
fn: PrintVersion,
|
||||||
explanation: "Display the current version",
|
explanation: "Display the current version",
|
||||||
},
|
},
|
||||||
/* Command{
|
|
||||||
cmd: "status",
|
|
||||||
fn: GetStatus,
|
|
||||||
explanation: "Get a summary of the client's status",
|
|
||||||
},
|
|
||||||
*/
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func main() {
|
func main() {
|
||||||
|
@ -11,19 +11,24 @@ import (
|
|||||||
"net/rpc"
|
"net/rpc"
|
||||||
)
|
)
|
||||||
|
|
||||||
type ClientStopper int
|
type ClientAdmin int
|
||||||
|
|
||||||
func (c *ClientStopper) StopClient(code *int, result *int) error {
|
func (c *ClientAdmin) StopClient(code *int, result *int) error {
|
||||||
asink.Exit(*code)
|
asink.Exit(*code)
|
||||||
*result = 0
|
*result = 0
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (c *ClientAdmin) GetClientStatus(code *int, result *string) error {
|
||||||
|
*result = GetStats()
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
func StartRPC(sock string, tornDown chan int) {
|
func StartRPC(sock string, tornDown chan int) {
|
||||||
defer func() { tornDown <- 0 }() //the main thread waits for this to ensure the socket is closed
|
defer func() { tornDown <- 0 }() //the main thread waits for this to ensure the socket is closed
|
||||||
|
|
||||||
clientstop := new(ClientStopper)
|
clientadmin := new(ClientAdmin)
|
||||||
rpc.Register(clientstop)
|
rpc.Register(clientadmin)
|
||||||
|
|
||||||
rpc.HandleHTTP()
|
rpc.HandleHTTP()
|
||||||
l, err := net.Listen("unix", sock)
|
l, err := net.Listen("unix", sock)
|
||||||
|
52
asink/status.go
Normal file
52
asink/status.go
Normal file
@ -0,0 +1,52 @@
|
|||||||
|
/*
|
||||||
|
Copyright (C) 2013 Aaron Lindsay <aaron@aclindsay.com>
|
||||||
|
*/
|
||||||
|
|
||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"sync/atomic"
|
||||||
|
)
|
||||||
|
|
||||||
|
var localUpdates int32 = 0
|
||||||
|
var remoteUpdates int32 = 0
|
||||||
|
var fileUploads int32 = 0
|
||||||
|
var fileDownloads int32 = 0
|
||||||
|
|
||||||
|
func GetStats() string {
|
||||||
|
local := atomic.LoadInt32(&localUpdates)
|
||||||
|
remote := atomic.LoadInt32(&remoteUpdates)
|
||||||
|
uploads := atomic.LoadInt32(&fileUploads)
|
||||||
|
downloads := atomic.LoadInt32(&fileDownloads)
|
||||||
|
|
||||||
|
return fmt.Sprintf(`Asink client statistics:
|
||||||
|
Processing %d file updates (%d local, %d remote)
|
||||||
|
Uploading %d files
|
||||||
|
Downloading %d files`, local + remote, local, remote, uploads, downloads)
|
||||||
|
}
|
||||||
|
|
||||||
|
func StatStartLocalUpdate() {
|
||||||
|
atomic.AddInt32(&localUpdates, 1)
|
||||||
|
}
|
||||||
|
func StatStopLocalUpdate() {
|
||||||
|
atomic.AddInt32(&localUpdates, -1)
|
||||||
|
}
|
||||||
|
func StatStartRemoteUpdate() {
|
||||||
|
atomic.AddInt32(&remoteUpdates, 1)
|
||||||
|
}
|
||||||
|
func StatStopRemoteUpdate() {
|
||||||
|
atomic.AddInt32(&remoteUpdates, -1)
|
||||||
|
}
|
||||||
|
func StatStartUpload() {
|
||||||
|
atomic.AddInt32(&fileUploads, 1)
|
||||||
|
}
|
||||||
|
func StatStopUpload() {
|
||||||
|
atomic.AddInt32(&fileUploads, -1)
|
||||||
|
}
|
||||||
|
func StatStartDownload() {
|
||||||
|
atomic.AddInt32(&fileDownloads, 1)
|
||||||
|
}
|
||||||
|
func StatStopDownload() {
|
||||||
|
atomic.AddInt32(&fileDownloads, -1)
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user