Skip to content

Commit 7b43edb

Browse files
fix comments
1 parent db929e5 commit 7b43edb

File tree

5 files changed

+50
-48
lines changed

5 files changed

+50
-48
lines changed

pkg/meta/base.go

Lines changed: 38 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -115,7 +115,7 @@ type engine interface {
115115
doLink(ctx Context, inode, parent Ino, name string, attr *Attr) syscall.Errno
116116
doUnlink(ctx Context, parent Ino, name string, attr *Attr, skipCheckTrash ...bool) syscall.Errno
117117
doRmdir(ctx Context, parent Ino, name string, inode *Ino, attr *Attr, skipCheckTrash ...bool) syscall.Errno
118-
doEmptyDir(ctx Context, parent Ino, entries []*Entry, length *int64, space *int64, inodes *int64, userGroupQuotas *[]UserGroupQuotaDelta, skipCheckTrash ...bool) (errno syscall.Errno)
118+
doBatchUnlink(ctx Context, parent Ino, entries []*Entry, length *int64, space *int64, inodes *int64, userGroupQuotas *[]UserGroupQuotaDelta, skipCheckTrash ...bool) (errno syscall.Errno)
119119
doReadlink(ctx Context, inode Ino, noatime bool) (int64, []byte, error)
120120
doReaddir(ctx Context, inode Ino, plus uint8, entries *[]*Entry, limit int) syscall.Errno
121121
doRename(ctx Context, parentSrc Ino, nameSrc string, parentDst Ino, nameDst string, flags uint32, inode, tinode *Ino, attr, tattr *Attr) syscall.Errno
@@ -1462,6 +1462,43 @@ func (m *baseMeta) Rmdir(ctx Context, parent Ino, name string, skipCheckTrash ..
14621462
return st
14631463
}
14641464

1465+
func (m *baseMeta) BatchUnlink(ctx Context, parent Ino, entries []Entry, count *uint64, skipCheckTrash ...bool) syscall.Errno {
1466+
var length int64
1467+
var space int64
1468+
var inodes int64
1469+
var userGroupQuotas []UserGroupQuotaDelta
1470+
st := m.en.doBatchUnlink(ctx, parent, entries, &length, &space, &inodes, &userGroupQuotas, skipCheckTrash)
1471+
if st == 0 {
1472+
m.updateDirStat(ctx, parent, -length, -space, -inodes)
1473+
if !parent.IsTrash() {
1474+
m.updateDirQuota(ctx, parent, -space, -inodes)
1475+
for _, quota := range userGroupQuotas {
1476+
m.updateUserGroupQuota(ctx, quota.Uid, quota.Gid, -quota.Space, -quota.Inodes)
1477+
}
1478+
}
1479+
if count != nil && len(entries) > 0 {
1480+
atomic.AddUint64(count, uint64(len(entries)))
1481+
}
1482+
} else if st == syscall.ENOTSUP {
1483+
for _, e := range entries {
1484+
if e.Attr.Typ == TypeDirectory {
1485+
continue
1486+
}
1487+
if ctx.Canceled() {
1488+
return syscall.EINTR
1489+
}
1490+
if st := m.Unlink(ctx, parent, string(e.Name), skipCheckTrash); st != 0 && st != syscall.ENOENT {
1491+
return st
1492+
}
1493+
if count != nil {
1494+
atomic.AddUint64(count, 1)
1495+
}
1496+
}
1497+
} else if st != 0 {
1498+
return st
1499+
}
1500+
}
1501+
14651502
func (m *baseMeta) Rename(ctx Context, parentSrc Ino, nameSrc string, parentDst Ino, nameDst string, flags uint32, inode *Ino, attr *Attr) syscall.Errno {
14661503
if parentSrc == RootInode && nameSrc == TrashName || parentDst == RootInode && nameDst == TrashName {
14671504
return syscall.EPERM

pkg/meta/redis.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1666,7 +1666,7 @@ func (m *redisMeta) doUnlink(ctx Context, parent Ino, name string, attr *Attr, s
16661666
return errno(err)
16671667
}
16681668

1669-
func (m *redisMeta) doEmptyDir(ctx Context, parent Ino, entries []*Entry, length *int64, space *int64, inodes *int64, userGroupQuotas *[]UserGroupQuotaDelta, skipCheckTrash ...bool) syscall.Errno {
1669+
func (m *redisMeta) doBatchUnlink(ctx Context, parent Ino, entries []*Entry, length *int64, space *int64, inodes *int64, userGroupQuotas *[]UserGroupQuotaDelta, skipCheckTrash ...bool) syscall.Errno {
16701670
return syscall.ENOTSUP
16711671
}
16721672

pkg/meta/sql.go

Lines changed: 6 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -2610,7 +2610,7 @@ func recordDeletionStats(
26102610
}
26112611
}
26122612

2613-
func (m *dbMeta) doEmptyDir(ctx Context, parent Ino, entries []*Entry, length *int64, space *int64, inodes *int64, userGroupQuotas *[]UserGroupQuotaDelta, skipCheckTrash ...bool) syscall.Errno {
2613+
func (m *dbMeta) doBatchUnlink(ctx Context, parent Ino, entries []*Entry, length *int64, space *int64, inodes *int64, userGroupQuotas *[]UserGroupQuotaDelta, skipCheckTrash ...bool) syscall.Errno {
26142614
if len(entries) == 0 {
26152615
return 0
26162616
}
@@ -2630,13 +2630,11 @@ func (m *dbMeta) doEmptyDir(ctx Context, parent Ino, entries []*Entry, length *i
26302630
trashName string
26312631
lastLink bool
26322632
}
2633-
26342633
var entryInfos []entryInfo
26352634
var totalLength, totalSpace, totalInodes int64
26362635
if userGroupQuotas != nil {
26372636
*userGroupQuotas = make([]UserGroupQuotaDelta, 0, len(entries))
26382637
}
2639-
26402638
err := m.txn(func(s *xorm.Session) error {
26412639
pn := node{Inode: parent}
26422640
ok, err := s.Get(&pn)
@@ -2700,28 +2698,27 @@ func (m *dbMeta) doEmptyDir(ctx Context, parent Ino, entries []*Entry, length *i
27002698
entryInfos = append(entryInfos, info)
27012699
}
27022700

2703-
seen := make(map[Ino]int)
2701+
seen := make(map[Ino]uint32)
27042702
for i := range entryInfos {
27052703
info := &entryInfos[i]
27062704
if info.e.Type == TypeDirectory {
27072705
continue
27082706
}
2709-
original := int64(info.n.Nlink)
2710-
processed := seen[info.e.Inode]
2711-
finalNlink := original - int64(processed+1)
2707+
processed := seen[info.e.Inode] + 1
2708+
finalNlink := info.n.Nlink - processed
27122709
if finalNlink < 0 {
27132710
finalNlink = 0
27142711
}
27152712
// If trash is enabled and this would be the last link, keep one link by moving it into trash.
2716-
if info.trash > 0 && finalNlink == 0 && info.e.Type != TypeDirectory {
2713+
if info.trash > 0 && finalNlink == 0 {
27172714
finalNlink = 1
27182715
}
27192716
info.lastLink = (info.trash == 0 && finalNlink == 0)
27202717
if info.lastLink && info.e.Type == TypeFile && m.sid > 0 {
27212718
info.opened = m.of.IsOpen(info.e.Inode)
27222719
}
27232720
info.n.Nlink = uint32(finalNlink)
2724-
seen[info.e.Inode] = processed + 1
2721+
seen[info.e.Inode] = processed
27252722
}
27262723

27272724
trashInserted := make(map[Ino]bool)

pkg/meta/tkv.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1427,7 +1427,7 @@ func (m *kvMeta) doUnlink(ctx Context, parent Ino, name string, attr *Attr, skip
14271427
return errno(err)
14281428
}
14291429

1430-
func (m *kvMeta) doEmptyDir(ctx Context, parent Ino, entries []*Entry, length *int64, space *int64, inodes *int64, userGroupQuotas *[]UserGroupQuotaDelta, skipCheckTrash ...bool) syscall.Errno {
1430+
func (m *kvMeta) doBatchUnlink(ctx Context, parent Ino, entries []*Entry, length *int64, space *int64, inodes *int64, userGroupQuotas *[]UserGroupQuotaDelta, skipCheckTrash ...bool) syscall.Errno {
14311431
return syscall.ENOTSUP
14321432
}
14331433

pkg/meta/utils.go

Lines changed: 4 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -278,7 +278,7 @@ func (m *baseMeta) emptyDir(ctx Context, inode Ino, skipCheckTrash bool, count *
278278
var wg sync.WaitGroup
279279
var status syscall.Errno
280280
var nonDirEntries []*Entry
281-
for _, e := range entries {
281+
for i, e := range entries {
282282
if e.Attr.Typ == TypeDirectory {
283283
select {
284284
case concurrent <- 1:
@@ -303,45 +303,13 @@ func (m *baseMeta) emptyDir(ctx Context, inode Ino, skipCheckTrash bool, count *
303303
if ctx.Canceled() {
304304
return syscall.EINTR
305305
}
306-
306+
entries[i] = nil // release memory
307307
}
308308
wg.Wait()
309309

310-
var length int64
311-
var space int64
312-
var inodes int64
313-
var userGroupQuotas []UserGroupQuotaDelta
314-
st := m.en.doEmptyDir(ctx, inode, nonDirEntries, &length, &space, &inodes, &userGroupQuotas, skipCheckTrash)
315-
if st == 0 {
316-
m.updateDirStat(ctx, inode, -length, -space, -inodes)
317-
if !inode.IsTrash() {
318-
m.updateDirQuota(ctx, inode, -space, -inodes)
319-
for _, quota := range userGroupQuotas {
320-
m.updateUserGroupQuota(ctx, quota.Uid, quota.Gid, -quota.Space, -quota.Inodes)
321-
}
322-
}
323-
if count != nil && len(nonDirEntries) > 0 {
324-
atomic.AddUint64(count, uint64(len(nonDirEntries)))
325-
}
326-
} else if st == syscall.ENOTSUP {
327-
for _, e := range entries {
328-
if e.Attr.Typ == TypeDirectory {
329-
continue
330-
}
331-
if ctx.Canceled() {
332-
return syscall.EINTR
333-
}
334-
if st := m.Unlink(ctx, inode, string(e.Name), skipCheckTrash); st != 0 && st != syscall.ENOENT {
335-
return st
336-
}
337-
if count != nil {
338-
atomic.AddUint64(count, 1)
339-
}
340-
}
341-
} else if st != 0 {
342-
return st
310+
if status == 0 {
311+
status = m.BatchUnlink(ctx, inode, nonDirEntries, count, skipCheckTrash, )
343312
}
344-
entries = nil
345313

346314
if status != 0 || inode == TrashInode { // try only once for .trash
347315
return status

0 commit comments

Comments
 (0)