Skip to content

Conversation

@jenken827
Copy link
Contributor

Description / 描述

使用webdav上传文件,触发报错,日志记录(省略连trace)如下

panicmakeslicelen: panic(errorString("makeslice: len out of range"))

定位到是在创建缓存文件的时候报错的。之前用着没问题,但是随着文件大小增加(目前是2.21KB),出现了报错的情况。

Why is this change required? What problem does it solve?

为什么需要此更改?它解决了什么问题?

打印日志发现在webdav处理入口handlePut方法获取文件大小为-1(官方注释说明这种情况下是unknown),接着会获取请求头“X-File-Size”,仍然获取失败(这个请求头只有针对openlist的webdav服务编程才可以,不具有通用性),后续所有通过f.GetSize()获取到的大小都是-1。
有些存储上传需要文件hash值,这就要先把文件缓存下来,缓存时,会先根据文件大小来判定使用内存缓存还是文件缓存,而文件大小是-1,不大于设定的阈值,导致判定为使用内存缓存,紧接着根据文件大小-1来创建内存缓存,直接panic

本次修改,优化了判定逻辑,在文件大小是-1(unknown)或大于设定的阈值的时候,都使用文件缓存。

@j2rong4cn
Copy link
Member

怎么触发这个bug?

@j2rong4cn
Copy link
Member

按理说GetSize不会返回-1

OpenList/internal/op/fs.go

Lines 633 to 638 in d465da4

// 如果小于0,则通过缓存获取完整大小,可能发生于流式上传
if file.GetSize() < 0 {
log.Warnf("file size < 0, try to get full size from cache")
file.CacheFullAndWriter(nil, nil)
}
switch s := storage.(type) {

@jenken827
Copy link
Contributor Author

按理说GetSize不会返回-1

OpenList/internal/op/fs.go

Lines 633 to 638 in d465da4

// 如果小于0,则通过缓存获取完整大小,可能发生于流式上传
if file.GetSize() < 0 {
log.Warnf("file size < 0, try to get full size from cache")
file.CacheFullAndWriter(nil, nil)
}
switch s := storage.(type) {

不好意思,这个问题在最新版本(v4.1.3)已经修复了,我还没来及更新。下次一定注意!
相关PR:fix(stream): http chucked upload issue

image

@jenken827 jenken827 closed this Sep 29, 2025
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants