XFS、GlusterFS v5.5 和 2038 年问题

XFS、GlusterFS v5.5 和 2038 年问题

我尝试了默认保留期,例如将保留日期设置为 2071。当我执行 WORMing 时,一切似乎都正常。从 FUSE 以及砖级来看,所有节点上的保留设置为 2071。此外,我启用了该storage.ctime选项,以便时间戳 mdata xattr也存储在 中。但过了一段时间我观察到,在 Brick-Level atime(存储保留)被切换到 1934:

stat /gluster/brick1/glusterbrick/data/file3.txt
  File: /gluster/brick1/glusterbrick/data/file3.txt
  Size: 5             Blocks: 16         IO Block: 4096   regular file
Device: 830h/2096d    Inode: 115         Links: 2
Access: (0544/-r-xr--r--)  Uid: ( 2000/    gluster)   Gid: ( 2000/
gluster)
Access: 1934-12-13 20:45:51.000000000 +0000
Modify: 2019-04-10 09:50:09.000000000 +0000
Change: 2019-04-10 10:13:39.703623917 +0000
 Birth: -

从 FUSE 我得到正确的 atime:\

stat /gluster/volume1/data/file3.txt
  File: /gluster/volume1/data/file3.txt
  Size: 5             Blocks: 1          IO Block: 131072 regular file
Device: 2eh/46d    Inode: 10812026387234582248  Links: 1
Access: (0544/-r-xr--r--)  Uid: ( 2000/    gluster)   Gid: ( 2000/
gluster)
Access: 2071-01-19 03:14:07.000000000 +0000
Modify: 2019-04-10 09:50:09.000000000 +0000
Change: 2019-04-10 10:13:39.705341476 +0000
 Birth: -

我发现 XFS 仅支持 32 位时间戳值。所以在我的预期中应该不可能设置atime为2071。但一开始是2071,后来由于YEAR-2038问题改成了1934。我问自己:
1. 为什么XFS可以设置atime大于2038?
2. 为什么atime一段时间后会切换到 1970 年以下的时间?

我在 SLES15 机器上完成了所有操作。 xfsprogs 是版本 4.15,Gluster 是 v5.5

答案1

可能解释为什么 LastAccess 日期在块级别更改以及为什么 XFS 可以有一个日期,例如可以在 INT32 字段中存储 2070:

令人惊奇的是,您可以将 atime 的时间戳设置为远高于 2038,并且这些时间戳也可以通过常用的系统工具显示。一段时间后,观察到值发生变化并映射到 1902-1969 之间的范围。我怀疑最初成功设置的远超过 2038 个固定 atime 对应于在记忆中时间戳的表示。这似乎允许设置超过 2038。磁盘上另一方面,XFS 的表示只允许最大值 2038,上面的值则映射到范围 1902-1969,这是有符号 int32 的负数范围。这是我从该线程中获取的内容: https://lkml.org/lkml/2014/6/1/240

相关内容