maintenance: use random minute in launchctl scheduler

The get_random_minute() method was created to allow maintenance schedules to be fixed to a random minute of the hour. This randomness is only intended to spread out the load from a number of clients, but each client should have an hour between each maintenance cycle. Use get_random_minute() when constructing the schedules for launchctl. The format already includes a 'Minute' key which is modified from 0 to the random minute. Signed-off-by: Derrick Stolee <derrickstolee@github.com> Signed-off-by: Junio C Hamano <gitster@pobox.com>

Derrick Stolee committed Aug 10, 2023 at 20:39 UTC ec5d9d684c06130b9f4bf46bf9373104f79c6afe
1 file changed +12 -11
builtin/gc.c
+12 -11
@@ -1708,7 +1708,6 @@ static int get_schedule_cmd(const char **cmd, int *is_available)
1708 return 1;
1709 }
1710
1711 -MAYBE_UNUSED
1711 static int get_random_minute(void)
1712 {
1713 /* Use a static value when under tests. */
@@ -1830,6 +1829,7 @@ static int launchctl_schedule_plist(const char *exec_path, enum schedule_priorit
1829 struct strbuf plist = STRBUF_INIT, plist2 = STRBUF_INIT;
1830 struct stat st;
1831 const char *cmd = "launchctl";
1832 + int minute = get_random_minute();
1833
1834 get_schedule_cmd(&cmd, NULL);
1835 preamble = "<?xml version=\"1.0\"?>\n"
@@ -1855,29 +1855,30 @@ static int launchctl_schedule_plist(const char *exec_path, enum schedule_priorit
1855 case SCHEDULE_HOURLY:
1856 repeat = "<dict>\n"
1857 "<key>Hour</key><integer>%d</integer>\n"
1858 - "<key>Minute</key><integer>0</integer>\n"
1858 + "<key>Minute</key><integer>%d</integer>\n"
1859 "</dict>\n";
1860 for (i = 1; i <= 23; i++)
1861 - strbuf_addf(&plist, repeat, i);
1861 + strbuf_addf(&plist, repeat, i, minute);
1862 break;
1863
1864 case SCHEDULE_DAILY:
1865 repeat = "<dict>\n"
1866 "<key>Day</key><integer>%d</integer>\n"
1867 "<key>Hour</key><integer>0</integer>\n"
1868 - "<key>Minute</key><integer>0</integer>\n"
1868 + "<key>Minute</key><integer>%d</integer>\n"
1869 "</dict>\n";
1870 for (i = 1; i <= 6; i++)
1871 - strbuf_addf(&plist, repeat, i);
1871 + strbuf_addf(&plist, repeat, i, minute);
1872 break;
1873
1874 case SCHEDULE_WEEKLY:
1875 - strbuf_addstr(&plist,
1876 - "<dict>\n"
1877 - "<key>Day</key><integer>0</integer>\n"
1878 - "<key>Hour</key><integer>0</integer>\n"
1879 - "<key>Minute</key><integer>0</integer>\n"
1880 - "</dict>\n");
1875 + strbuf_addf(&plist,
1876 + "<dict>\n"
1877 + "<key>Day</key><integer>0</integer>\n"
1878 + "<key>Hour</key><integer>0</integer>\n"
1879 + "<key>Minute</key><integer>%d</integer>\n"
1880 + "</dict>\n",
1881 + minute);
1882 break;
1883
1884 default: