为什么在使用DFSR进行复制之后,文件最终会被空字节填满?

我们正在使用Microsoft的分布式文件系统进行复制。 在我们的场景中,我们有一个创build/覆盖/删除文件和多个分布式读取器的作者。 作者正在运行Windows Server 2008 R2企业版x64 SP 1,读者运行的是Windows Server 2003 R2标准版x86 SP 2.某些读者运行版本5.2.3790.4656的DFSR和其他一些版本为5.2.3790.4799的版本。

文件使用System.IO.File.WriteAllText写入,并且可以在同一个文件上快速连续地写入。

大多数情况下,复制工作正常,但有时候复制后文件最终会被空字节填充。 我们检查了所有相关机器上的DFSR日志,发现了以下types的usn日志条目报告:

 20150302 11:05:00.498 2512 USNC 2202 UsnConsumer::UpdateIdRecord ID record updated from USN_RECORD: + USN_RECORD: + RecordLength: 80 + MajorVersion: 2 + MinorVersion: 0 + FileRefNumber: 0x800000000f7c8 + ParentFileRefNumber: 0x31000000152806 + USN: 0x872e876720 + TimeStamp: 20150302 11:05:00.498 CET + Reason: Basic Info Change Close Rename New Name + SourceInfo: 0x4 + SecurityId: 0xebe + FileAttributes: 0x2220 + FileNameLength: 18 + FileNameOffset: 60 + FileName: xyz.txt 

我们想知道的是,根本就有美国的日记条目报告(读者只能阅读而不能修改任何东西),而且稀疏属性被设置。

为了找出是否有某个进程执行了意外的写入或做了可疑的事情,我们用Process Monitor来监视文件系统活动。 读者的下一个空字节文件的发生得到了以下结果:

 10:59:55,2311121 Dfsr.exe 1584 760 IRP_MJ_CREATE path\to\xyz.txt-{GUID}-vVERSION SUCCESS Desired Access: Generic Read/Write/Execute, Write DAC, Write Owner, Access System Security, Disposition: Create, Options: Sequential Access, Synchronous IO Non-Alert, Complete If Oplocked, Open For Backup, Open No Recall, Attributes: N, ShareMode: Read, Write, Delete, AllocationSize: 0, OpenResult: Created 10:59:55,2312485 Dfsr.exe 1584 760 IRP_MJ_CLEANUP path\to\xyz.txt-{GUID}-vVERSION SUCCESS 10:59:55,2313007 Dfsr.exe 1584 760 IRP_MJ_CLOSE path\to\xyz.txt-{GUID}-vVERSION SUCCESS 10:59:55,2314394 Dfsr.exe 1584 760 IRP_MJ_CREATE path\to\xyz.txt-{GUID}-vVERSION SUCCESS Desired Access: Read Attributes, Write Attributes, Synchronize, Disposition: Open, Options: Sequential Access, Synchronous IO Non-Alert, Open For Backup, Open Reparse Point, Open No Recall, Attributes: N, ShareMode: Read, Write, Delete, AllocationSize: n/a, OpenResult: Opened 10:59:55,2314626 Dfsr.exe 1584 760 IRP_MJ_FILE_SYSTEM_CONTROL path\to\xyz.txt-{GUID}-vVERSION SUCCESS Control: FSCTL_MARK_HANDLE 10:59:55,2314780 Dfsr.exe 1584 760 IRP_MJ_QUERY_INFORMATION path\to\xyz.txt-{GUID}-vVERSION SUCCESS Type: QueryNameInformationFile, Name: path\to\xyz.txt-{GUID}-vVERSION 10:59:55,2314996 Dfsr.exe 1584 760 FASTIO_QUERY_INFORMATION path\to\xyz.txt-{GUID}-vVERSION SUCCESS Type: QueryBasicInformationFile, CreationTime: 10.03.2015 10:59:55, LastAccessTime: 10.03.2015 10:59:55, LastWriteTime: 10.03.2015 10:59:55, ChangeTime: 10.03.2015 10:59:55, FileAttributes: ANCI 10:59:55,2315081 Dfsr.exe 1584 760 IRP_MJ_QUERY_INFORMATION path\to\xyz.txt-{GUID}-vVERSION SUCCESS Type: QueryAttributeTagFile, Attributes: ANCI, ReparseTag: 0x0 10:59:55,2315194 Dfsr.exe 1584 760 IRP_MJ_QUERY_INFORMATION path\to\xyz.txt-{GUID}-vVERSION SUCCESS Type: QueryCompressionInformationFile 10:59:55,2315391 Dfsr.exe 1584 760 IRP_MJ_QUERY_VOLUME_INFORMATION path\to\xyz.txt-{GUID}-vVERSION BUFFER OVERFLOW Type: QueryInformationVolume, VolumeCreationTime: 14.07.2014 14:59:54, VolumeSerialNumber: 88F0-15DC, SupportsObjects: True, VolumeLabel: uvw 10:59:55,2315481 Dfsr.exe 1584 760 IRP_MJ_QUERY_INFORMATION path\to\xyz.txt-{GUID}-vVERSION BUFFER OVERFLOW Type: QueryAllInformationFile, CreationTime: 10.03.2015 10:59:55, LastAccessTime: 10.03.2015 10:59:55, LastWriteTime: 10.03.2015 10:59:55, ChangeTime: 10.03.2015 10:59:55, FileAttributes: ANCI, AllocationSize: 0, EndOfFile: 0, NumberOfLinks: 1, DeletePending: False, Directory: False, IndexNumber: 0xe00000001589e, EaSize: 0, Access: Read Attributes, Write Attributes, Synchronize, Position: 0, Mode: Sequential Access, Synchronous IO Non-Alert, AlignmentRequirement: Long 10:59:55,2316459 Dfsr.exe 1584 760 IRP_MJ_CREATE path\to\xyz.txt-{GUID}-vVERSION SUCCESS Desired Access: Generic Read/Write/Execute, Write DAC, Write Owner, Access System Security, Disposition: Open, Options: Sequential Access, Synchronous IO Non-Alert, Complete If Oplocked, Open For Backup, Open No Recall, Attributes: N, ShareMode: Read, Write, Delete, AllocationSize: n/a, OpenResult: Opened 10:59:55,2316691 Dfsr.exe 1584 760 IRP_MJ_FILE_SYSTEM_CONTROL path\to\xyz.txt-{GUID}-vVERSION SUCCESS Control: FSCTL_MARK_HANDLE 10:59:55,2316796 Dfsr.exe 1584 760 IRP_MJ_CLEANUP path\to\xyz.txt-{GUID}-vVERSION SUCCESS 10:59:55,2316876 Dfsr.exe 1584 760 IRP_MJ_CLOSE path\to\xyz.txt-{GUID}-vVERSION SUCCESS 10:59:55,2317891 Dfsr.exe 1584 760 IRP_MJ_SET_SECURITY path\to\xyz.txt-{GUID}-vVERSION SUCCESS Information: Owner, Group, DACL 10:59:55,2318748 Dfsr.exe 1584 760 IRP_MJ_FILE_SYSTEM_CONTROL path\to\xyz.txt-{GUID}-vVERSION SUCCESS Control: FSCTL_SET_SPARSE 10:59:55,2319307 Dfsr.exe 1584 760 IRP_MJ_WRITE path\to\xyz.txt-{GUID}-vVERSION SUCCESS Offset: 0, Length: 0 10:59:55,2319442 Dfsr.exe 1584 760 IRP_MJ_SET_INFORMATION path\to\xyz.txt-{GUID}-vVERSION SUCCESS Type: SetEndOfFileInformationFile, EndOfFile: 240 10:59:55,2320066 Dfsr.exe 1584 760 IRP_MJ_SET_INFORMATION path\to\xyz.txt-{GUID}-vVERSION SUCCESS Type: SetAllocationInformationFile, AllocationSize: 240 10:59:55,2320382 Dfsr.exe 1584 760 IRP_MJ_WRITE path\to\xyz.txt-{GUID}-vVERSION SUCCESS Offset: 240, Length: 0 10:59:55,2320505 Dfsr.exe 1584 760 IRP_MJ_SET_INFORMATION path\to\xyz.txt-{GUID}-vVERSION SUCCESS Type: SetBasicInformationFile, CreationTime: 16.12.2013 10:57:23, LastAccessTime: 19.02.2015 11:00:25, LastWriteTime: 10.03.2015 10:59:55, ChangeTime: 10.03.2015 10:59:55, FileAttributes: ANCI 10:59:55,2320688 Dfsr.exe 1584 760 IRP_MJ_FILE_SYSTEM_CONTROL path\to\xyz.txt-{GUID}-vVERSION SUCCESS Control: FSCTL_WRITE_USN_CLOSE_RECORD 10:59:55,2321256 Dfsr.exe 1584 760 IRP_MJ_CLEANUP path\to\xyz.txt-{GUID}-vVERSION SUCCESS 10:59:55,2321506 Dfsr.exe 1584 760 IRP_MJ_CLOSE path\to\xyz.txt-{GUID}-vVERSION SUCCESS 

通过这个观察,看起来DFSR就是生产它们的那个。 为什么这样做? 此外,为什么它将文件标记为稀疏? 除了使用上面描述的技术编写文件之外,作者不会混淆文件。 请注意,EOF标记移动的偏移量与作者创build的文件大小相匹配。

到目前为止,我们无法可靠地重现问题。 有没有人有一个想法是什么造成这一点,更重要的是,如何解决它?

您的DFS-R临时区域与DFS-R文件夹位于同一个卷上吗? 出于性能原因,应该是。 如果没有,那么DFS-R不得不将文件从临时卷复制到目标卷,而不是直接移动。

这里是推测的地方。可能是在这个复制操作过程中,DFS-R正在创build一个稀疏文件,然后填充块,并在完成时“解除”它。 如果某些事情中断了这个过程(比如防病毒,取消删除或其他一些文件filter驱动程序扫描DfsrPrivate文件夹),那么你最终可能会得到一个临时稀疏文件,而不会被其内容填充。

您可以使用进程监视器对正在复制的文件进行testing,并查看它们是否在进程中的任何位置被标记为/未标记为稀疏文件。

当谈到DFS-R时,我不喜欢混合2008年和2003年。 我非常高兴能够从我们的DFS树上得到最后一台2003年的机器。

将读者升级到最新版本的DFSR 2008 R2只是减less了问题的发生,但没有完全解决。 在将读取器另外configuration为写保护之后 ,再次没有观察到问题(自上次升级半年以来)。