From: Eric Wong <e@80x24.org>
To: meta@public-inbox.org
Subject: [PATCH] pop3d: support fcntl locks on OpenBSD i386
Date: Thu, 1 Feb 2024 00:12:19 +0000 [thread overview]
Message-ID: <20240201001219.1314010-1-e@80x24.org> (raw)
The packaged Perl on OpenBSD i386 supports 64-bit file offsets
but not 64-bit integer support for 'q' and 'Q' with `pack'.
Since servers aren't likely to require lock files larger than
2 GB (we'd need an inbox with >2 billion messages), we can
workaround the Perl build limitation with explicit padding.
AFAIK File::FcntlLock isn't packaged for OpenBSD, but I can
test i386 OpenBSD on an extremely slow VM.
Big endian support can be done, too, but I have no idea if
there's 32-bit BE users around nowadays...
---
MANIFEST | 1 +
lib/PublicInbox/POP3D.pm | 28 +++++++++++++++++++++-------
t/pop3d_lock.t | 16 ++++++++++++++++
3 files changed, 38 insertions(+), 7 deletions(-)
create mode 100644 t/pop3d_lock.t
diff --git a/MANIFEST b/MANIFEST
index 2223cfb4..4c974338 100644
--- a/MANIFEST
+++ b/MANIFEST
@@ -575,6 +575,7 @@ t/plack-qp.eml
t/plack.t
t/pop3d-limit.t
t/pop3d.t
+t/pop3d_lock.t
t/precheck.t
t/psgi_attach.eml
t/psgi_attach.t
diff --git a/lib/PublicInbox/POP3D.pm b/lib/PublicInbox/POP3D.pm
index 38e982ee..9c868cfb 100644
--- a/lib/PublicInbox/POP3D.pm
+++ b/lib/PublicInbox/POP3D.pm
@@ -18,18 +18,32 @@ my ($FLOCK_TMPL, @FLOCK_ORDER);
if ($^O =~ /\A(?:linux|dragonfly)\z/ || $^O =~ /bsd/) {
require Config;
my $off_t;
+ my @LE_pad = ('', '');
my $sz = $Config::Config{lseeksize};
-
- if ($sz == 8 && eval('length(pack("q", 1)) == 8')) { $off_t = 'q' }
- elsif ($sz == 4) { $off_t = 'l' }
- else { warn "sizeof(off_t)=$sz requires File::FcntlLock\n" }
-
+ if ($sz == 8) {
+ if (eval('length(pack("q", 1)) == 8')) {
+ $off_t = 'q';
+ } elsif ($Config::Config{byteorder} == 1234) { # OpenBSD i386
+ $off_t = 'l';
+ @LE_pad = ('@8', '@16');
+ } else { # I have no 32-bit BE machine to test on...
+ warn <<EOM;
+Perl built with 64-bit file support but not 64-bit int (pack("q") support)
+byteorder=$Config::Config{byteorder}
+EOM
+ }
+ } elsif ($sz == 4) {
+ $off_t = 'l';
+ } else {
+ warn "sizeof(off_t)=$sz requires File::FcntlLock\n"
+ }
if (defined($off_t)) {
if ($^O eq 'linux') {
- $FLOCK_TMPL = "ss\@8$off_t$off_t\@32";
+ $FLOCK_TMPL = 'ss@8'.$off_t.$LE_pad[0].$off_t.'@32';
@FLOCK_ORDER = qw(l_type l_whence l_start l_len);
} else { # *bsd including dragonfly
- $FLOCK_TMPL = "${off_t}${off_t}lss\@256";
+ $FLOCK_TMPL = $off_t.$LE_pad[0].$off_t.$LE_pad[1].
+ 'lss@256';
@FLOCK_ORDER = qw(l_start l_len l_pid l_type l_whence);
}
}
diff --git a/t/pop3d_lock.t b/t/pop3d_lock.t
new file mode 100644
index 00000000..fb305f96
--- /dev/null
+++ b/t/pop3d_lock.t
@@ -0,0 +1,16 @@
+# Copyright (C) all contributors <meta@public-inbox.org>
+# License: AGPL-3.0+ <https://www.gnu.org/licenses/agpl-3.0.txt>
+use v5.12;
+use PublicInbox::TestCommon;
+require_mods(qw(DBD::SQLite Net::POP3 :fcntl_lock));
+use autodie;
+my $tmpdir = tmpdir;
+require_ok 'PublicInbox::POP3D';
+my $pop3d = bless {}, 'PublicInbox::POP3D';
+open $pop3d->{txn_fh}, '+>>', "$tmpdir/txn.lock";
+use Fcntl qw(F_SETLK F_UNLCK F_WRLCK);
+
+ok $pop3d->_setlk(l_type => F_WRLCK, l_start => 9, l_len => 1),
+ 'locked file (check with ktrace/strace)';
+
+done_testing;
next reply other threads:[~2024-02-01 0:12 UTC|newest]
Thread overview: 3+ messages / expand[flat|nested] mbox.gz Atom feed top
2024-02-01 0:12 Eric Wong [this message]
2024-02-01 10:15 ` [PATCH] pop3d: support fcntl locks on OpenBSD i386 Štěpán Němec
2024-02-01 20:59 ` [PATCH v2] " Eric Wong
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
List information: https://public-inbox.org/README
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20240201001219.1314010-1-e@80x24.org \
--to=e@80x24.org \
--cc=meta@public-inbox.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).