forked from TrueCloudLab/restic
Merge branch 'fw42/uid_lookup_cache'
This commit is contained in:
commit
9308f1493d
1 changed files with 33 additions and 3 deletions
36
node.go
36
node.go
|
@ -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)
|
||||||
|
|
Loading…
Reference in a new issue