未验证 提交 911aac01 编写于 作者: S Sandy Xu 提交者: GitHub

cmd/dump&load: dump dentries in a map instead of a list (#529)

上级 d1575e3d
......@@ -23,7 +23,6 @@
"Sustained": [],
"DelFiles": [],
"FSTree": {
"name": "/",
"inode": 1,
"attr": {
"type": "directory",
......@@ -39,9 +38,8 @@
"nlink": 3,
"length": 0
},
"entries": [
{
"name": "d1",
"entries": {
"d1": {
"inode": 3,
"attr": {
"type": "directory",
......@@ -57,9 +55,8 @@
"nlink": 2,
"length": 0
},
"entries": [
{
"name": "f11",
"entries": {
"f11": {
"inode": 4,
"attr": {
"type": "regular",
......@@ -90,10 +87,9 @@
}
]
}
]
}
},
{
"name": "f1",
"f1": {
"inode": 2,
"attr": {
"type": "regular",
......@@ -144,8 +140,7 @@
}
]
},
{
"name": "l1",
"l1": {
"inode": 4,
"attr": {
"type": "regular",
......@@ -176,8 +171,7 @@
}
]
},
{
"name": "s1",
"s1": {
"inode": 5,
"attr": {
"type": "symlink",
......@@ -195,6 +189,6 @@
},
"symlink": "d1/f11"
}
]
}
}
}
......@@ -2736,9 +2736,9 @@ func (r *redisMeta) checkServerConfig() {
logger.Infof("Ping redis: %s", time.Since(start))
}
func (m *redisMeta) dumpEntry(name string, inode Ino) (*DumpedEntry, error) {
func (m *redisMeta) dumpEntry(inode Ino) (*DumpedEntry, error) {
ctx := Background
e := &DumpedEntry{Name: name, Inode: inode}
e := &DumpedEntry{Inode: inode}
st := m.txn(ctx, func(tx *redis.Tx) error {
a, err := tx.Get(ctx, m.inodeKey(inode)).Bytes()
if err != nil {
......@@ -2789,16 +2789,16 @@ func (m *redisMeta) dumpEntry(name string, inode Ino) (*DumpedEntry, error) {
}
}
func (m *redisMeta) dumpDir(inode Ino) ([]*DumpedEntry, error) {
func (m *redisMeta) dumpDir(inode Ino) (map[string]*DumpedEntry, error) {
ctx := Background
keys, err := m.rdb.HGetAll(ctx, m.entryKey(inode)).Result()
if err != nil {
return nil, err
}
entries := make([]*DumpedEntry, 0, len(keys))
entries := make(map[string]*DumpedEntry)
for k, v := range keys {
typ, inode := m.parseEntry([]byte(v))
entry, err := m.dumpEntry(k, inode)
entry, err := m.dumpEntry(inode)
if err != nil {
return nil, err
}
......@@ -2807,9 +2807,8 @@ func (m *redisMeta) dumpDir(inode Ino) ([]*DumpedEntry, error) {
return nil, err
}
}
entries = append(entries, entry)
entries[k] = entry
}
sort.Slice(entries, func(i, j int) bool { return entries[i].Name < entries[j].Name })
return entries, nil
}
......@@ -2830,7 +2829,7 @@ func (m *redisMeta) DumpMeta(w io.Writer) error {
dels = append(dels, &DumpedDelFile{Ino(inode), length, int64(z.Score)})
}
tree, err := m.dumpEntry("/", 1)
tree, err := m.dumpEntry(1)
if err != nil {
return err
}
......@@ -2916,7 +2915,8 @@ func collectEntry(e *DumpedEntry, entries map[Ino]*DumpedEntry) error {
e.Parent = 1
}
e.Attr.Nlink = 2
for _, child := range e.Entries {
for name, child := range e.Entries {
child.Name = name
child.Parent = e.Inode
if typeFromString(child.Attr.Type) == TypeDirectory {
e.Attr.Nlink++
......
......@@ -2304,8 +2304,8 @@ func (m *dbMeta) RemoveXattr(ctx Context, inode Ino, name string) syscall.Errno
}))
}
func (m *dbMeta) dumpEntry(name string, inode Ino) (*DumpedEntry, error) {
e := &DumpedEntry{Name: name, Inode: inode}
func (m *dbMeta) dumpEntry(inode Ino) (*DumpedEntry, error) {
e := &DumpedEntry{Inode: inode}
return e, m.txn(func(s *xorm.Session) error {
n := &node{Inode: inode}
ok, err := m.engine.Get(n)
......@@ -2361,14 +2361,14 @@ func (m *dbMeta) dumpEntry(name string, inode Ino) (*DumpedEntry, error) {
})
}
func (m *dbMeta) dumpDir(inode Ino) ([]*DumpedEntry, error) {
func (m *dbMeta) dumpDir(inode Ino) (map[string]*DumpedEntry, error) {
var edges []edge
if err := m.engine.Find(&edges, &edge{Parent: inode}); err != nil {
return nil, err
}
entries := make([]*DumpedEntry, 0, len(edges))
entries := make(map[string]*DumpedEntry)
for _, e := range edges {
entry, err := m.dumpEntry(e.Name, e.Inode)
entry, err := m.dumpEntry(e.Inode)
if err != nil {
return nil, err
}
......@@ -2377,9 +2377,8 @@ func (m *dbMeta) dumpDir(inode Ino) ([]*DumpedEntry, error) {
return nil, err
}
}
entries = append(entries, entry)
entries[e.Name] = entry
}
sort.Slice(entries, func(i, j int) bool { return entries[i].Name < entries[j].Name })
return entries, nil
}
......@@ -2393,7 +2392,7 @@ func (m *dbMeta) DumpMeta(w io.Writer) error {
dels = append(dels, &DumpedDelFile{row.Inode, row.Length, row.Expire})
}
tree, err := m.dumpEntry("/", 1)
tree, err := m.dumpEntry(1)
if err != nil {
return err
}
......
......@@ -70,14 +70,14 @@ type DumpedXattr struct {
}
type DumpedEntry struct {
Name string `json:"name"`
Inode Ino `json:"inode"`
Attr *DumpedAttr `json:"attr"`
Parent Ino `json:"-"`
Symlink string `json:"symlink,omitempty"`
Xattrs []*DumpedXattr `json:"xattrs,omitempty"`
Chunks []*DumpedChunk `json:"chunks,omitempty"`
Entries []*DumpedEntry `json:"entries,omitempty"`
Name string `json:"-"`
Inode Ino `json:"inode"`
Attr *DumpedAttr `json:"attr"`
Parent Ino `json:"-"`
Symlink string `json:"symlink,omitempty"`
Xattrs []*DumpedXattr `json:"xattrs,omitempty"`
Chunks []*DumpedChunk `json:"chunks,omitempty"`
Entries map[string]*DumpedEntry `json:"entries,omitempty"`
}
type DumpedMeta struct {
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册