On Aug 13, 2013, at 7:47 AM, Jacek Konieczny wrote:

> 
> Hi,
> 
> Trying to debug my package installation 'LOOP:' problems I have
> instrumented the RPM source code with many 'rpmlog(RPMLOG_DEBUG, ...)',
> so I could understand what is happening there.
> 
> After hours of such debugging I found out what is going on: for each
> dependency rpmalSatisfiesDepend() is called from order.c to build the
> dependency graph. There, for every file dependency (package requires
> '/something') rpmalAllFileSatisfiesDepend() is called which finds out
> what packages provide the required file. And here is the problem:
> rpmalAllFileSatisfiesDepend() uses a Bloom filter look-up to find out
> if a package contain a file. But Bloom filter, to its very nature, gives
> false positives, which are not verified further. So, it can happen that
> rpmalSatisfiesDepend() returns wrong package for a required file or
> directory, which adds an extra edge to the dependency graph. RPM reports
> this as a 'LOOP' problem and tries to work-around it by changing the
> installation order, which totally breaks the order for me.
> 

I see you had some fun. ;-)

Just in case:
        This isn't pleasant code to debug: your analysis is largely correct,
        and the patch is mostly convincing.

(aside)
        You should be calling rpmfiFree(alp->fi) but all objects have a common 
refcount
        so the patch happens to work.

However the whole point of using a Bloom filter is/was to increase performance,
and reduce memory, with some acceptable risk of false positives.

FWIW, the file names are sorted, so a binary search could be done, if you 
absolutely
insist on removing false positives. The linear search was attempted in 
rpm-3.0.4, rather slow.

Meanwhile the simpler fix is to adjust the Bloom filter parameters to decrease 
the probability
of a false positive.

This can be done like so:

Index: rpmfi.c
===================================================================
RCS file: /v/rpm/cvs/rpm/lib/rpmfi.c,v
retrieving revision 2.160.4.4
diff -p -u -w -r2.160.4.4 rpmfi.c
--- rpmfi.c     4 Jun 2012 15:10:11 -0000       2.160.4.4
+++ rpmfi.c     13 Aug 2013 14:35:13 -0000
@@ -184,7 +184,7 @@ void * rpmfiFNBF(rpmfi fi)
     if (fi != NULL) {
        if (fi->_fnbf == NULL) {
            char * fn = (char *) alloca(fi->fnlen + 1);
-           static double e = 1.0e-4;
+           static double e = 1.0e-5;
            size_t n = (fi->fc > 10 ? fi->fc : 10);
            size_t m = 0;
            size_t k = 0;

That reduces the probability of false positives from one in 10,000 to one in 
100,000
and SHOULD fix your issue. One might also increase the estimated population "n"
by 5-10%, but I would change "e" first as the intent is clearer.

There is also some modest increase in memory used by the Bloom filter.

See if that fixes your problem please.

> The attached patch is a quick fix to the problem: after rpmbfChk()
> states a file is provided by a package, its answer is additionally
> verified by scanning the file index of the package.
> 
> I am sure this can be implemented in a more elegant way, but I don't
> know the internal RPM architecture well enough and I cannot spend much
> more time on fixing this problem.
> 

You pretty much know all there is to know once you have debugged
a loop ordering issue like this ;-)

73 de Jeff

_______________________________________________
pld-devel-en mailing list
pld-devel-en@lists.pld-linux.org
http://lists.pld-linux.org/mailman/listinfo/pld-devel-en

Reply via email to