From 7a4568e92d1e0f9edef7efb9f91f12e1c776bb80 Mon Sep 17 00:00:00 2001 From: Zoltan Date: Fri, 12 Aug 2016 01:57:51 +0200 Subject: [PATCH] Use maps instead of for loops to search in memdb for apps (#29) * Use maps instead of for loops to search in memdb for apps; use mutexes more efficiently by immediately unlocking when lock is no longer needed, not just at the end of the function via defer * Fixed assignment to entry in nil map * Minor impovements in source code --- ipe/db.go | 41 ++++++++++++++++++++++++++--------------- 1 file changed, 26 insertions(+), 15 deletions(-) diff --git a/ipe/db.go b/ipe/db.go index 48db3c6..ff8ec25 100644 --- a/ipe/db.go +++ b/ipe/db.go @@ -18,39 +18,50 @@ type db interface { AddApp(*app) error } -// memdb is a in memory implementation of db interface +// memdb is an in memory implementation of db interface type memdb struct { - sync.Mutex - Apps []*app + IdMutex sync.Mutex + KeyMutex sync.Mutex + AppsByAppID map[string]*app + AppsByKey map[string]*app } func newMemdb() *memdb { - return &memdb{} + return &memdb{ + AppsByAppID: make(map[string]*app), + AppsByKey: make(map[string]*app), + } } func (db *memdb) AddApp(a *app) error { - db.Lock() - db.Apps = append(db.Apps, a) - db.Unlock() + db.IdMutex.Lock() + db.AppsByAppID[a.AppID] = a + db.IdMutex.Unlock() + + db.KeyMutex.Lock() + db.AppsByKey[a.Key] = a + db.KeyMutex.Unlock() return nil } // GetAppByAppID returns an App with by appID func (db *memdb) GetAppByAppID(appID string) (*app, error) { - for _, a := range db.Apps { - if a.AppID == appID { - return a, nil - } + db.IdMutex.Lock() + a, ok := db.AppsByAppID[appID] + db.IdMutex.Unlock() + if ok { + return a, nil } return nil, errors.New("App not found") } // GetAppByKey returns an App with by key func (db *memdb) GetAppByKey(key string) (*app, error) { - for _, a := range db.Apps { - if a.Key == key { - return a, nil - } + db.KeyMutex.Lock() + a, ok := db.AppsByKey[key] + db.KeyMutex.Unlock() + if ok { + return a, nil } return nil, errors.New("App not found") }