From f126af27766223aea63e37b98f66d02bedd66d4a Mon Sep 17 00:00:00 2001 From: Radu Ioan Fericean Date: Fri, 3 Aug 2012 14:42:16 +0300 Subject: [PATCH] try to reconnect to freeswitch --- sessionmanager/fssessionmanager.go | 25 ++++++++++++++++++------- sessionmanager/sessiondelegate.go | 1 + 2 files changed, 19 insertions(+), 7 deletions(-) diff --git a/sessionmanager/fssessionmanager.go b/sessionmanager/fssessionmanager.go index 5e944af2d..5c5dbdb0e 100644 --- a/sessionmanager/fssessionmanager.go +++ b/sessionmanager/fssessionmanager.go @@ -35,32 +35,38 @@ type FSSessionManager struct { sessions []*Session sessionDelegate *SessionDelegate postgresLogger *PostgresLogger + address, pass string + keepRunning bool } func NewFSSessionManager(db *sql.DB) *FSSessionManager { - return &FSSessionManager{postgresLogger: &PostgresLogger{db}} + return &FSSessionManager{postgresLogger: &PostgresLogger{db}, keepRunning: true} } // Connects to the freeswitch mod_event_socket server and starts // listening for events in json format. -func (sm *FSSessionManager) Connect(ed *SessionDelegate, address, pass string) { +func (sm *FSSessionManager) Connect(ed *SessionDelegate, address, pass string) error { if ed == nil { log.Fatal("Please provide a non nil SessionDelegate") } sm.sessionDelegate = ed + sm.address = address + sm.pass = pass conn, err := net.Dial("tcp", address) if err != nil { - log.Fatal("Could not connect to freeswitch server!") + log.Print("Could not connect to freeswitch server!") + return err } sm.conn = conn sm.buf = bufio.NewReaderSize(conn, 8192) fmt.Fprint(conn, fmt.Sprintf("auth %s\n\n", pass)) fmt.Fprint(conn, "event json all\n\n") go func() { - for { + for sm.keepRunning { sm.readNextEvent() } }() + return nil } // Reads from freeswitch server buffer until it encounters a '}', @@ -70,9 +76,14 @@ func (sm *FSSessionManager) readNextEvent() (ev Event) { body, err := sm.buf.ReadString('}') if err != nil { log.Print("Could not read from freeswitch connection!") - // wait until retrying to read - // TODO: maybe kill the manager? - time.Sleep(5 * time.Second) + // wait until a sec + time.Sleep(5 * time.Second) + // try to reconnect + err := sm.Connect(sm.sessionDelegate, sm.address, sm.pass) + if err == nil { + // the recconection was sucesfull you can stop trying + sm.keepRunning = false + } } ev = new(FSEvent).New(body) switch ev.GetName() { diff --git a/sessionmanager/sessiondelegate.go b/sessionmanager/sessiondelegate.go index 1e6087807..ed2123f34 100644 --- a/sessionmanager/sessiondelegate.go +++ b/sessionmanager/sessiondelegate.go @@ -150,6 +150,7 @@ func (rsd *SessionDelegate) LoopAction(s *Session, cd *timespans.CallDescriptor) err := rsd.Connector.Debit(*cd, cc) if err != nil { log.Printf("Could not complete debit opperation: %v", err) + // disconnect session s.sessionManager.DisconnectSession(s) } s.CallCosts = append(s.CallCosts, cc)