)]}'
{
  "commit": "d7f6681cbe673bfa7fc0b54cc34252ef031584ec",
  "tree": "f25989285d1c42741b03e89b9b758a68f360f776",
  "parents": [
    "32cdc8c0833f7ea7355b90e226d0eced2620cf6f"
  ],
  "author": {
    "name": "David Ostrovsky",
    "email": "david@ostrovsky.org",
    "time": "Thu Oct 08 08:37:08 2026 +0200"
  },
  "committer": {
    "name": "David Ostrovsky",
    "email": "david@ostrovsky.org",
    "time": "Thu Oct 08 10:08:35 2026 +0200"
  },
  "message": "Make fsTick() robust to coarse on-write timestamps\n\nRepositoryTestCase.fsTick() advanced its probe file with\nFileUtils.touch(), which ends by setting the modification time\nexplicitly via utimensat. On a filesystem whose kernel assigns coarse\n(for example ~1 ms) timestamps on real writes, such as ext4 with\nCONFIG_HZ\u003d1000, that explicit set can report an advance the next\nordinary write does not honor: the write lands in the same coarse tick\nas the reference, so an index entry written after fsTick() is not\nstrictly newer than the work file and racy-git smudges it to length 0.\n\nThe flaw is pre-existing. On the measured Linux host, sub-millisecond\nThread.sleep() returned much sooner with Java 21 and 25 than with Java\n17: Java 17\u0027s longer sleep happened to cross a coarse tick and mask the\nrace, while the shorter sleeps on Java 21 and 25 return within the same\ntick and expose it reliably. This surfaces four timestamp-sensitive\ncore tests (RacyGitTests, FilterCommandsTest, GcPruneNonReferencedTest,\nFSTest) as failures under Java 25 on ext4.\n\nAdvance the probe with a genuine non-empty write instead, polling until\nthe filesystem\u0027s own modification time exceeds the reference. This\nobserves the real on-write granularity and holds the \"strictly newer\"\ncontract on coarse and fine filesystems alike, independent of\nThread.sleep() granularity.\n\nExercised under Java 17, 21 and 25 on Ubuntu 24.04.5 LTS (kernel\n6.8.0-138-generic, ext4), the real-write polling produced a strictly\nnewer on-write timestamp on every trial. The four affected tests pass\nunder Java 25.\n\nChange-Id: I546b3595b46500cd7ed1ce1e216439817014e078\n",
  "tree_diff": [
    {
      "type": "modify",
      "old_id": "3a283ce10dd71537fc359fa148b1150538acf29c",
      "old_mode": 33188,
      "old_path": "org.eclipse.jgit.junit/src/org/eclipse/jgit/junit/RepositoryTestCase.java",
      "new_id": "690ce00831f03fc9de9195b341b52c376728f1a9",
      "new_mode": 33188,
      "new_path": "org.eclipse.jgit.junit/src/org/eclipse/jgit/junit/RepositoryTestCase.java"
    }
  ]
}
