Merge branch 'fw42/uid_lookup_cache'

This commit is contained in:
Alexander Neumann 2015-05-02 00:18:04 +02:00
commit 9308f1493d

36
node.go
View file

@ -6,6 +6,7 @@ import (
"os" "os"
"os/user" "os/user"
"strconv" "strconv"
"sync"
"syscall" "syscall"
"time" "time"
@ -339,15 +340,41 @@ func (node *Node) fillUser(stat *syscall.Stat_t) error {
node.UID = stat.Uid node.UID = stat.Uid
node.GID = stat.Gid node.GID = stat.Gid
u, err := user.LookupId(strconv.Itoa(int(stat.Uid))) username, err := lookupUsername(strconv.Itoa(int(stat.Uid)))
if err != nil { if err != nil {
return err return err
} }
node.User = u.Username node.User = username
return nil return nil
} }
var (
uidLookupCache = make(map[string]string)
uidLookupCacheMutex = sync.RWMutex{}
)
func lookupUsername(uid string) (string, error) {
uidLookupCacheMutex.RLock()
value, ok := uidLookupCache[uid]
uidLookupCacheMutex.RUnlock()
if ok {
return value, nil
}
u, err := user.LookupId(uid)
if err != nil {
return "", err
}
uidLookupCacheMutex.Lock()
uidLookupCache[uid] = u.Username
uidLookupCacheMutex.Unlock()
return u.Username, nil
}
func (node *Node) fillExtra(path string, fi os.FileInfo) error { func (node *Node) fillExtra(path string, fi os.FileInfo) error {
stat, ok := fi.Sys().(*syscall.Stat_t) stat, ok := fi.Sys().(*syscall.Stat_t)
if !ok { if !ok {
@ -356,11 +383,14 @@ func (node *Node) fillExtra(path string, fi os.FileInfo) error {
node.Inode = stat.Ino node.Inode = stat.Ino
node.fillUser(stat)
node.fillTimes(stat) node.fillTimes(stat)
var err error var err error
if err = node.fillUser(stat); err != nil {
return err
}
switch node.Type { switch node.Type {
case "file": case "file":
node.Size = uint64(stat.Size) node.Size = uint64(stat.Size)