Comments (20)
非常感谢,我刚已经拉取主分支重新测试了,问题已修复!
from gofs.
新增-copy_link
和-copy_unsafe_link
命令行参数支持在磁盘间进行同步时,控制是否同步软链接指向的真实文件。
为了保持代码的稳定性,目前这两个命令行参数只会在本地磁盘间同步时生效。
#231 已合并 @lemon65535
from gofs.
感谢反馈,文件路径中包含特殊字符会导致路径被截断,已修复,请拉取主分支最新代码重新编译试下 @lemon65535
Fixed by #221
from gofs.
我这边测试还发现一个问题,当原目录下存在软链时:
- 当软链指向的是一个不存在的地址时,目标不同步软链文件;
- 当软链指向的是一个存在的文件时,目标目录下会将该软链指向的文件重新复制一遍;
from gofs.
两种情况下,你期望的行为分别是什么呢?
from gofs.
- 当软链指向的是一个不存在的地址时,创建一个软链文件,指向该不存在的文件地址
- 当软链指向的是一个存在的文件时,目标目录下也对应创建一个软链文件,指向一个存在的文件(这样不需要再复制一遍源文件)
这样能够保证原始目录和目标目录的一致性,我这边用rsync做同步时也是这样的一个效果。
from gofs.
需要做一些测试来评估下,因为涉及到跨操作系统和存储目标非磁盘的情况,还有会对实时同步的逻辑造成影响。
第2种情况下重复复制确实是一个问题,需要一个解决方案来优化这个问题(覆盖全场景或者部分场景)。
from gofs.
我理解rpc可以通知出当前目录该软链的变更,至于是否进行处理,应该由client端自行决定。针对我说的这个场景,主要实现逻辑在sync/remote_client_sync.go这个文件中,是否可以考虑在remote_client_sync.go实现的时候进行优化?
from gofs.
嗯,针对这个具体的场景,你的思路是对的,细节上可能还会牵扯出更多的相关逻辑需要修改。
比如如果要支持软链接的下发与创建,就得考虑是否支持软链接的上传等等。同时也需要考虑是否会因为软链接导致source和dest目录之外的文件被恶意访问的问题,一些开放接口上就需要支持安全边界的检查和控制。
还有linux上的软链接同步到windows该如何处理。两者的软链接看起来好像并不兼容,而且windows上创建软链接貌似还需要管理员的权限,让软件的使用变得更加复杂。
另外除了这个场景之外,想要保持基本规则的统一,需要考虑与MinIO,SFTP等集成时如何处理软链接的问题。
from gofs.
可以先实验性的实现部分功能看看效果,以及评估对于现有代码会不会产生大的破坏。
目前来看,对于软链接,除了MinIO,其他场景理论上应该都是可以实现的。
对于MinIO,或许可以参考git对于软链接的实现,将其存储为一个特殊的文件来处理。
Features | Create | Remove | Read |
---|---|---|---|
Local Disk | ✅ | ✅ | ✅ |
Remote Disk Server | ✅ | ✅ | ✅ |
Remote Disk Client | ✅ | ✅ | ✅ |
Remote Push Server | ✅ | ✅ | ✅ |
Remote Push Client | ✅ | ✅ | ✅ |
SFTP Pull Client | ✅ | ✅ | ✅ |
SFTP Push Client | ✅ | ✅ | ✅ |
MinIO Pull Client | ❌ | ❌ | ❌ |
MinIO Push Client | ❌ | ❌ | ❌ |
File Server | ✅ | ✅ | ✅ |
from gofs.
另外对于软链接无法低成本的实现文件的实时同步,只能通过手动全量同步或者定时同步来实现同步软链接指向的真实内容,即软链接不支持实时同步。
对于软链接指向的文件在source目录之内和source目录之外,具体处理逻辑可能也会不同,出于安全因素,需要考虑是否允许同步链接到source目录之外的真实文件(在全量同步或定时同步的场景下)。
from gofs.
软连接不支持实时同步是因为什么原因呢?fsnotify能够识别出软连接文件的变更吗?
如果软连接指向的文件指向source之外,是否能通过参数让用户决定如何处理?
from gofs.
我试了下好像不能,我也查了下资料,软链接应该是只能触发Create与Remove这样的事件,应该是软链接的自身特性导致的,不是库的原因。
另外如果软链接指向了source目录下文件,并且假设软链接的文件内容变更也会触发相应事件,那此时可能会有两个协程同时对同一个文件进行更新(源文件和软链接触发了2个事件),也是存在一定矛盾的,软链接不支持实时同步反而可以规避这个问题。
第二个问题提供参数让用户参数控制也是可以的,但是会增加复杂度,需要验证和评估下。
from gofs.
针对第一点,照这个理解,确实不太适合做成实时同步。
定时同步以及手动全量同步能支持也可以理解,那照这样来看的话,干脆实时同步针对软链就不处理,软链的问题放在定时同步或全量同步中进行处理,能够更简单的实现功能。
from gofs.
赞同,以下是我的理解,是否和你的想法一致?
在实时同步场景下,软链接只处理Create与Remove事件,如果dest支持软链接则创建软链接,如果不支持软链接(如MinIO),则创建一个自定义的特殊文件来记录软链接信息,例如这个例子。
另外可以通过新增一个flag来支持同步软链接指向的真实文件,而不是链接本身,类似与rsync的-L
参数,因为软链接可能指向source目录外的文件,存在需要同步原始文件的需求。
考虑到安全问题,还需要新增一个flag来控制指向source目录之外的软链接的行为。
from gofs.
是的,如果能支持到这个功能就很棒了,非常感谢哈!
from gofs.
实现同步软链接本身作为默认行为,已合并 #230
from gofs.
实现同步软链接指向的真实文件,存在跨平台的兼容性,递归嵌套等问题,以及组合不同的使用方式很容易产生BUG,测试难度较大,目前开启一个实验性的PR #231
from gofs.
不好意思,最近几天比较忙。上上周我使用sersync2+rsync方式尝试同步目录的时候,就碰到了软链循环引用导致死循环的问题,这个确实需要考虑的。另外新feature是已经合并至master分支了吗?需要我本地拉下来build是吧。
from gofs.
目前主分支默认会同步软链接符号本身,并不会同步符号指向的内容。因为对于同步真实指向的文件还有一系列的问题没有解决,如你遇到的死循环问题等等。
目前在 #231 进行实验性的尝试,暂时不会合并
from gofs.
Related Issues (20)
- Found data race in the "Local Disk" mode HOT 1
- Found data race in the "Remote Disk Server" and "Remote Disk Client" mode HOT 1
- Found data race in the "tcpServer" HOT 1
- 重命名函数好像不大对劲 HOT 2
- How to use gofs as a library HOT 2
- Is gofs send all files or only the difference ? HOT 1
- Build Dockerfile successfully, but failed to run
- 实际使用方法 HOT 1
- 您好,这个是否支持增量同步呢
- 是否可以直接打包一个可执行文件 HOT 1
- Fix code scanning alert - Use of insecure HostKeyCallback implementation
- Fix code scanning alert - Arbitrary file write during zip extraction ("zip slip")
- Such a tool needs a feature to limit bandwidth HOT 6
- A suggestion about product design HOT 13
- Consider moving fsctl to a new standalone project HOT 1
- 删除文件的操作无法同步远程 HOT 5
- Relay HOT 3
- delete the source files and source directories HOT 2
- gofs\server\handler\file_api_handler.go 優化建議 HOT 1
Recommend Projects
-
React
A declarative, efficient, and flexible JavaScript library for building user interfaces.
-
Vue.js
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
-
Typescript
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
-
TensorFlow
An Open Source Machine Learning Framework for Everyone
-
Django
The Web framework for perfectionists with deadlines.
-
Laravel
A PHP framework for web artisans
-
D3
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
-
Recommend Topics
-
javascript
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
-
web
Some thing interesting about web. New door for the world.
-
server
A server is a program made to process requests and deliver data to clients.
-
Machine learning
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
-
Visualization
Some thing interesting about visualization, use data art
-
Game
Some thing interesting about game, make everyone happy.
Recommend Org
-
Facebook
We are working to build community through open source technology. NB: members must have two-factor auth.
-
Microsoft
Open source projects and samples from Microsoft.
-
Google
Google ❤️ Open Source for everyone.
-
Alibaba
Alibaba Open Source for everyone
-
D3
Data-Driven Documents codes.
-
Tencent
China tencent open source team.
from gofs.