For inboxes with SQLite enabled (all v2, and probably most v1); we can use the overview DB to get the timestamp of the latest message. It's faster than scanning git branches for commit times, but not always the same. --- OK, this is definitely the version I'll go with... st_mtime of msgmap.sqlite3 isn't right for mirrors with intermittent polling or even if the DB gets rebuilt. lib/PublicInbox/Inbox.pm | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/lib/PublicInbox/Inbox.pm b/lib/PublicInbox/Inbox.pm index cde4625..0d28dd0 100644 --- a/lib/PublicInbox/Inbox.pm +++ b/lib/PublicInbox/Inbox.pm @@ -333,4 +333,16 @@ sub recent { search($self)->{over_ro}->recent($opts, $after, $before); } +sub modified { + my ($self) = @_; + if (my $srch = search($self)) { + my $msgs = $srch->{over_ro}->recent({limit => 1}); + if (my $smsg = $msgs->[0]) { + return $smsg->{ts}; + } + return time; + } + git($self)->modified; # v1 +} + 1; -- EW
For inboxes with SQLite enabled (all v2, and probably most v1); stat-ing the msgmap.sqlite3 file is a much faster way of telling when an inbox is modified compared to scanning git branches. v2: use mtime instead of ctime for users who use generic tools to copy SQLite DBs. v3: avoid uninitialized field for v1 repos (and I'm not sure why I used the "->{version} || 1" idiom everywhere instead of unconditionally setting it in Inbox->new...) --- lib/PublicInbox/Inbox.pm | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/lib/PublicInbox/Inbox.pm b/lib/PublicInbox/Inbox.pm index cde4625..ba3d2c7 100644 --- a/lib/PublicInbox/Inbox.pm +++ b/lib/PublicInbox/Inbox.pm @@ -333,4 +333,20 @@ sub recent { search($self)->{over_ro}->recent($opts, $after, $before); } +sub modified { + my ($self) = @_; + my $dir = $self->{mainrepo}; + my @st; + if (($self->{version} || 1) >= 2) { + @st = stat("$dir/msgmap.sqlite3") + } elsif (-f "$dir/public-inbox/msgmap.sqlite3") { # v1 + @st = stat(_); + } else { # v1 repos did not need sqlite3 + return git($self)->modified; + } + # we favor 9/mtime over ctime since it should be possible to + # use generic tools such as atomic-rsync to copy SQLite DBs + @st ? $st[9] : time; +} + 1; -- EW
> but mtime may be worth considering over ctime, too... > (somebody could be using atomic-rsync on the SQLite and Xapian > stuff because indexing is slow) -------8<---------- Subject: [PATCH] inbox: add `modified' sub For inboxes with SQLite enabled (all v2, and probably most v1); stat-ing the msgmap.sqlite3 file is a much faster way of telling when an inbox is modified compared to scanning git branches. v2: use mtime instead of ctime for users who use generic tools to copy SQLite DBs. --- lib/PublicInbox/Inbox.pm | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/lib/PublicInbox/Inbox.pm b/lib/PublicInbox/Inbox.pm index cde4625..c004f25 100644 --- a/lib/PublicInbox/Inbox.pm +++ b/lib/PublicInbox/Inbox.pm @@ -333,4 +333,20 @@ sub recent { search($self)->{over_ro}->recent($opts, $after, $before); } +sub modified { + my ($self) = @_; + my $dir = $self->{mainrepo}; + my @st; + if ($self->{version} >= 2) { + @st = stat("$dir/msgmap.sqlite3") + } elsif (-f "$dir/public-inbox/msgmap.sqlite3") { # v1 + @st = stat(_); + } else { # v1 repos did not need sqlite3 + return git($self)->modified; + } + # we favor 9/mtime over ctime since it should be possible to + # use generic tools such as atomic-rsync to copy SQLite DBs + @st ? $st[9] : time; +} + 1; -- EW
For inboxes with SQLite enabled (all v2, and probably most v1); stat-ing the msgmap.sqlite3 file is a much faster way of telling when an inbox is modified compared to scanning git branches. --- RFC since I'm not so sure about this one. It's probably fine, but mtime may be worth considering over ctime, too... (somebody could be using atomic-rsync on the SQLite and Xapian stuff because indexing is slow) lib/PublicInbox/Inbox.pm | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/lib/PublicInbox/Inbox.pm b/lib/PublicInbox/Inbox.pm index cde4625..fa41ab6 100644 --- a/lib/PublicInbox/Inbox.pm +++ b/lib/PublicInbox/Inbox.pm @@ -333,4 +333,18 @@ sub recent { search($self)->{over_ro}->recent($opts, $after, $before); } +sub modified { + my ($self) = @_; + my $dir = $self->{mainrepo}; + my @st; + if ($self->{version} >= 2) { + @st = stat("$dir/msgmap.sqlite3") + } elsif (-f "$dir/public-inbox/msgmap.sqlite3") { # v1 + @st = stat(_); + } else { # v1 repos did not need sqlite3 + return git($self)->modified; + } + @st ? $st[10] : time; # 10: ctime +} + 1; -- EW