[Gluster-devel] Some notes on libgfapi.so symbol versions in GlusterFS 3.6.1
Kaleb S. KEITHLEY
kkeithle at redhat.com
Fri Nov 7 15:14:53 UTC 2014
A little bit of background——
We started to track API/ABI changes to libgfapi.so by incrementing the
SO_NAME, e.g. libgfapi.so.0(.0.0). In the master branch it was
incremented to to '7' or libgfapi.so.7(.0.0) for the eventual glusterfs-3.7.
I believe, but I'm not entirely certain¹, that we were supposed to reset
this when we branched for release-3.6. Reset it to either '6' or '0',
but we didn't — apparently we forgot about it. In the 3.6.0 betas and if
you build the GA release of 3.6.0 you'll get a libgfapi.so.7(.0.0).
We didn't hear much, if anything about this until a few days before
3.6.0 was scheduled to GA, when we were 'reminded' that older versions
of applications like qemu, Samba, and more — linked against previous
versions of libgfapi.so — no longer worked after upgrading to the new
version of glusterfs.
We briefly experimented with adding a -compat package that installed a
symlink: libgfapi.so.0 -> libgfapi.so.7; but some thought this was too
much of a hack, and we abandoned that idea.
As a result we now have symbol versions in libgfapi.so. I've posted a
public spreadsheet with a table of the symbols and the versions of
glusterfs that they appear in at
https://docs.google.com/spreadsheets/d/1SKtzgEeVZbKFJgGGMdftf0p-AB5U7yyhVq1n2b6hBeQ/edit?usp=sharing
and also at
https://ethercalc.org/lrjvqrapzu
There are a few things to note about the symbol versions:
1) so far all the function signatures, i.e. number of parameters and
their types have not changed since libgfapi was introduced in 3.4.0.
That's a Good Thing.
2) the symbol versions are taken from the (community) glusterfs
release that they first appeared in.
3) there are two functions declared in glfs.h that do not have an
associated definition. So far it's not clear why.
4) there are two functions defined (in glfs-fops.c) that look like
they ought to have declarations in glfs.h. Perhaps this was an oversight
in the original implementation.
5)there are several (private?) functions in libgfapi that are not
declared in a public header that are used/referenced outside the
library. That's not a Bad Thing, per se, but it's also not a Good Thing.
It seems a bit strange for, e.g. glfs-heal and the nfs server xlator to
have to be linked against libgfapi.so. These functions should either be
made public or moved to another library, e.g. libglusterfs.so.
N.B. that 3, 4, and 5 are also noted in comments in the spreadsheets.
In parallel to all this, RHEL 6.6, RHEL 7.0, and the related CentOS
releases shipped updated RHS-GlusterFS client-side packages with version
3.6.0.X. This has resulted in confusion for many of the users of
Community GlusterFS who are having issues with upgrading their systems.
Earlier today (7 Nov, 2014) we released GlusterFS 3.6.1 to address and
hopefully mitigate the 3.6.0 upgrade issue _and_ fix the libgfapi.so
compatibility issue by reverting to the original SO_NAME
(libgfapi.so.0.0.0), now with symbol versions.
Knowing that we were going to quickly turn around GlusterFS 3.6.1 to
address these issues, and to save our community packagers some work and
to try to minimize confusion² we agreed in the community to not package
GlusterFS 3.6.0 for any of the Linux distributions.
We expect packages for 3.6.1 to be available soon on download.gluster.org.
And if anyone is looking for a nice Google Summer of Code project,
linking libglusterfs and the xlators with link maps — with or without
symbol versions — is an idea that I think has some merit.
HTH.
¹Not without slogging through a lot of old emails to reconstruct what we
originally intended.
²Then we don't have to explain why some Linux distributions have
community 3.6.0 packages and others have (only) 3.6.1.
--
Kaleb
More information about the Gluster-devel
mailing list