Opened 3 years ago

Closed 3 years ago

#22037 closed enhancement (fixed)

Upgrade to Python 2.7.13

Reported by: jdemeyer Owned by:
Priority: blocker Milestone: sage-7.5
Component: packages: standard Keywords:
Cc: SimonKing, hivert, slelievre, charpent Merged in:
Authors: Jeroen Demeyer Reviewers: Volker Braun
Report Upstream: N/A Work issues:
Branch: 5aeaf5c (Commits) Commit: 5aeaf5c9f396c297dbd1c1c9b60d0bf5a972e0c9
Dependencies: Stopgaps:

Attachments (3)

example.tar.gz (8.5 KB) - added by thansen 3 years ago.
This is a small example showing how the ClasscallMetaclass? leads to the error.
python2-2.7.13.p0.log.gz (205.5 KB) - added by charpent 3 years ago.
First attempt at installing Python 2.7.13
ptestlong.log.gz (44.8 KB) - added by charpent 3 years ago.
result of make ptestlong, first attempt on 2.7.13

Download all attachments as: .zip

Change History (69)

comment:1 Changed 3 years ago by thansen

  • Description modified (diff)

comment:2 Changed 3 years ago by thansen

  • Description modified (diff)

comment:3 Changed 3 years ago by jdemeyer

  • Description modified (diff)

Changed 3 years ago by thansen

This is a small example showing how the ClasscallMetaclass? leads to the error.

comment:4 follow-ups: Changed 3 years ago by thansen

So we have

class UniqueRepresentation(CachedRepresentation, WithEqualityById)

where CachedRepresentation uses ClasscallMetaclass and WithEqualityById is a cdef class.

If I change that to

class UniqueRepresentation(WithEqualityById, CachedRepresentation)

the error goes away. I don't know if that would be a correct fix though.

Last edited 3 years ago by thansen (previous) (diff)

comment:5 in reply to: ↑ 4 Changed 3 years ago by nthiery

Replying to thansen:

So we have

class UniqueRepresentation(CachedRepresentation, WithEqualityById)

where CachedRepresentation uses ClasscallMetaclass and WithEqualityById is a cdef class.

If I change that to

class UniqueRepresentation(WithEqualityById, CachedRepresentation)

the error goes away. I don't know if that would be a correct fix though.

In principle, the features provided by the two super classes are orthogonal (equality vs construction). Right now, I don't remember enough the details to see whether there could be subtleties due to one class being cdef. I'll dig further.

Simon, any opinion?

Cheers,

Nicolas

comment:6 Changed 3 years ago by nthiery

  • Cc SimonKing added

comment:7 Changed 3 years ago by nthiery

  • Description modified (diff)

comment:8 Changed 3 years ago by thansen

Indeed Juliens example from https://bugs.python.org/issue25731 also exposes this issue:

$ cat foo.pxd 
cdef class B:
    cdef object b
$ cat foo.pyx 
cdef class A:
    pass

cdef class B:
    def __init__(self, b):
        self.b = b
$ cat bar.py
from foo import A, B

class C(A, B):
    def __init__(self):
        B.__init__(self, 1)

C()
$ cython foo.pyx && gcc -I/usr/include/python2.7 -Wall -shared -fPIC -o foo.so foo.c
$ python -c 'import bar'
Traceback (most recent call last):
  File "<string>", line 1, in <module>
  File "bar.py", line 7, in <module>
    C()
TypeError: foo.A.__new__(C) is not safe, use foo.B.__new__()

comment:9 in reply to: ↑ 4 Changed 3 years ago by nthiery

Replying to thansen:

So we have

class UniqueRepresentation(CachedRepresentation, WithEqualityById)

where CachedRepresentation uses ClasscallMetaclass and WithEqualityById is a cdef class.

If I change that to

class UniqueRepresentation(WithEqualityById, CachedRepresentation)

the error goes away. I don't know if that would be a correct fix though.

Looking back at the code, this still feels rather harmless.

I ran all long Sage tests; beside trivial doctests failures due to mro printouts, the only errors all boil down to the following:

sage -t --long src/sage/combinat/root_system/cartan_type.py
**********************************************************************
File "src/sage/combinat/root_system/cartan_type.py", line 2999, in sage.combinat.root_system.cartan_type.CartanType_simple_finite.__setstate__
Failed example:
    unpickle_build(si1, {'tools':pg_unpickleModule('sage.combinat.root_system.type_A'), 't':['A', si2], 'letter':'A', 'n':si2})
Exception raised:
    Traceback (most recent call last):
      File "/opt/sage-git2/local/lib/python2.7/site-packages/sage/combinat/root_system/cartan_type.py", line 3014, in __setstate__
        self.__class__ = T.__class__
    TypeError: __class__ assignment: 'CartanType_simple_finite' object layout differs from 'CartanType'

This is in a stub class whose only purpose is to support unpickling rather old pickles (Sage <= 4.0). It's a stub for an old class that does not exist anymore; upon unpickling an object, the set_state method substitutes its stub class by the appropriate new class. This is unsurprisingly fragile. I am unsure why it did not fail before and fails now.

In any cases, making the stub class derive from UniqueRepresentation ensures that the two classes have the same layout, which is slightly cleaner than it was earlier. So that sounds like an acceptable fix.

I am about to push a branch with this fix and trivially updated doctests where needed. Let's see if the patchbot confirms that all test pass.

Still would be happy to have feedback from Simon.

Cheers,

Nicolas

comment:10 Changed 3 years ago by nthiery

  • Branch set to u/nthiery/upgrade_to_python_2_7_13

comment:11 Changed 3 years ago by nthiery

  • Commit set to b7bd4597e18af490dd9e6225e47b16d5ec8d79dc

Note: not being super familiar with the process, the above branch does *not* do the upgrade to Python 2.7.13; just the workaround suggested by Tobbias.


New commits:

896831422037: switch order of the bases of the class UniqueRepresentation
b7bd45922037: more robust backward-compatibility stub class CartanType_simple_finite
Last edited 3 years ago by nthiery (previous) (diff)

comment:12 Changed 3 years ago by thansen

There are several places that need to be changed. The problem is that the errors are discovered one by one. Is there a standard way to rebuild just a single .pyx file? Right now I have to do a rebuild of sagelib everytime I change one. This is my patch right now, and there are still new errors coming up:

--- a/src/sage/structure/unique_representation.py
+++ b/src/sage/structure/unique_representation.py
@@ -1176,7 +1176,7 @@
     return cls(*args, **keywords)
 
 
-class UniqueRepresentation(CachedRepresentation, WithEqualityById):
+class UniqueRepresentation(WithEqualityById, CachedRepresentation):
     r"""
     Classes derived from UniqueRepresentation inherit a unique
     representation behavior for their instances.
--- a/src/sage/categories/cartesian_product.py
+++ b/src/sage/categories/cartesian_product.py
@@ -18,7 +18,7 @@
 
 native_python_containers   = set([tuple, list, set, frozenset])
 
-class CartesianProductFunctor(CovariantFunctorialConstruction, MultivariateConstructionFunctor):
+class CartesianProductFunctor(MultivariateConstructionFunctor, CovariantFunctorialConstruction):
     """
     A singleton class for the Cartesian product functor.
 
--- a/src/sage/rings/infinity.py
+++ b/src/sage/rings/infinity.py
@@ -544,7 +544,7 @@
 
 
 class UnsignedInfinityRing_class(Singleton, Ring):
-
+    __new__ = Ring.__new__
     def __init__(self):
         """
         Initialize ``self``.
@@ -950,6 +950,7 @@
     pass
 
 class InfinityRing_class(Singleton, Ring):
+    __new__ = Ring.__new__
     def __init__(self):
         """
         Initialize ``self``.
--- a/src/sage/structure/formal_sum.py
+++ b/src/sage/structure/formal_sum.py
@@ -314,7 +314,7 @@
             w.append((coeff,last))
         self._data = w
 
-class FormalSums(UniqueRepresentation, Module):
+class FormalSums(Module, UniqueRepresentation):
     """
     The R-module of finite formal sums with coefficients in some ring R.
 
--- a/src/sage/misc/inherit_comparison.pyx
+++ b/src/sage/misc/inherit_comparison.pyx
@@ -83,5 +83,5 @@
                 t.tp_compare = b.tp_compare
         super(InheritComparisonMetaclass, self).__init__(*args)
 
-class InheritComparisonClasscallMetaclass(InheritComparisonMetaclass, ClasscallMetaclass):
+class InheritComparisonClasscallMetaclass(ClasscallMetaclass, InheritComparisonMetaclass):
     pass
--- a/src/sage/rings/polynomial/polynomial_ring.py
+++ b/src/sage/rings/polynomial/polynomial_ring.py
@@ -1439,7 +1439,7 @@
             return self._monics_max( max_degree )
         raise ValueError("you should pass exactly one of of_degree and max_degree")
 
-class PolynomialRing_commutative(PolynomialRing_general, commutative_algebra.CommutativeAlgebra):
+class PolynomialRing_commutative(commutative_algebra.CommutativeAlgebra, PolynomialRing_general):
     """
     Univariate polynomial ring over a commutative ring.
     """
--- a/src/sage/rings/real_arb.pyx
+++ b/src/sage/rings/real_arb.pyx
@@ -355,7 +355,7 @@
     if _do_sig(myprec): sig_off()
     return 0
 
-class RealBallField(UniqueRepresentation, Field):
+class RealBallField(Field, UniqueRepresentation):
     r"""
     An approximation of the field of real numbers using mid-rad intervals, also
     known as balls.

comment:13 follow-up: Changed 3 years ago by nthiery

Ouch, this is getting more annoying. Let's see how big the list grows. It's more worrying to have to move UniqueRepresentation? to second place.

sage -b rebuilds just the Sage library. This is usually good enough when only a single pyx file needs to be rebuilt.

Have a good night,

comment:14 Changed 3 years ago by thansen

Is better not to change the order of base classes and instead just define __new__ everywhere like I did for example for InfinityRing_class?

comment:15 Changed 3 years ago by nthiery

Ah, I had missed that. If this works, this would be acceptable as a temporary workaround. My first guess is that this would break the CachedRepresentation?; but I'll give it a try.

Anyone available for making a branch with Python 2.7.13, so that we can all easilly experiment with it? Otherwise, I'll try to squeeze this sometime today, but really no promise.

Thanks Tobias for investigating this hard!

comment:16 Changed 3 years ago by nthiery

  • Cc hivert added

comment:17 Changed 3 years ago by slelievre

  • Cc slelievre added
  • Description modified (diff)

#19735 "Upgrade to Python 2.7.12" was just closed.

comment:18 in reply to: ↑ 13 Changed 3 years ago by jdemeyer

Replying to nthiery:

sage -b rebuilds just the Sage library. This is usually good enough when only a single pyx file needs to be rebuilt.

Although it should be said that sage -b should be used only if you "know what you are doing". It's safer to run make sagelib (build Sage library) or make build (build all Sage packages) or plain make (build Sage + documentation). The make commands have dependency checking, so an outdated library will be rebuilt if needed. When you only run sage -b, you might get into trouble when switching branches because some dependencies might not be updated.

comment:19 Changed 3 years ago by thansen

Thanks. I'm using Debian packages for the dependencies so I'm just rebuilding sagelib anyway. I was asking if it was possible to rebuild just a single .pyx file.

Meanwhile the patch is getting bigger and bigger. I think I need to add __new__ = Parent.__new__ to all classes that have the base classes "Uniquerepresentation, Parent", which are many. And others. At least now sage starts and one can run the tests to uncover more errors. Should I keep going on with this?

--- a/src/sage/structure/unique_representation.py
+++ b/src/sage/structure/unique_representation.py
@@ -1342,3 +1342,4 @@
         ....:
         sage: b = bla()
     """
+    __new__ = object.__new__
--- a/src/sage/categories/cartesian_product.py
+++ b/src/sage/categories/cartesian_product.py
@@ -105,6 +105,7 @@
     :class:`CartesianProductsCategory`.
 
     """
+    __new__ = MultivariateConstructionFunctor.__new__
     _functor_name = "cartesian_product"
     _functor_category = "CartesianProducts"
     symbol = " (+) "
--- a/src/sage/rings/infinity.py
+++ b/src/sage/rings/infinity.py
@@ -544,7 +544,7 @@
 
 
 class UnsignedInfinityRing_class(Singleton, Ring):
-
+    __new__ = Ring.__new__
     def __init__(self):
         """
         Initialize ``self``.
@@ -950,6 +950,7 @@
     pass
 
 class InfinityRing_class(Singleton, Ring):
+    __new__ = Ring.__new__
     def __init__(self):
         """
         Initialize ``self``.
--- a/src/sage/structure/formal_sum.py
+++ b/src/sage/structure/formal_sum.py
@@ -336,6 +336,7 @@
         sage: TestSuite(FormalSums(QQ)).run()
 
     """
+    __new__ = Module.__new__
     Element = FormalSum
     @staticmethod
     def __classcall__(cls, base_ring = ZZ):
--- a/src/sage/misc/inherit_comparison.pyx
+++ b/src/sage/misc/inherit_comparison.pyx
@@ -84,4 +84,5 @@
         super(InheritComparisonMetaclass, self).__init__(*args)
 
 class InheritComparisonClasscallMetaclass(InheritComparisonMetaclass, ClasscallMetaclass):
+    __new__ = ClasscallMetaclass.__new__
     pass
--- a/src/sage/rings/polynomial/polynomial_ring.py
+++ b/src/sage/rings/polynomial/polynomial_ring.py
@@ -1443,6 +1443,7 @@
     """
     Univariate polynomial ring over a commutative ring.
     """
+    __new__ = commutative_algebra.CommutativeAlgebra.__new__
     def __init__(self, base_ring, name=None, sparse=False, element_class=None, category=None):
         if base_ring not in _CommutativeRings:
             raise TypeError("Base ring %s must be a commutative ring."%repr(base_ring))
--- a/src/sage/rings/real_arb.pyx
+++ b/src/sage/rings/real_arb.pyx
@@ -398,6 +398,7 @@
         sage: RBF.zero()
         0
     """
+    __new__ = Field.__new__
     Element = RealBall
 
     @staticmethod
--- a/src/sage/structure/dynamic_class.py
+++ b/src/sage/structure/dynamic_class.py
@@ -460,6 +460,7 @@
     pass
 
 class DynamicInheritComparisonMetaclass(DynamicMetaclass, InheritComparisonMetaclass):
+    __new__ = type.__new__
     pass
 
 class DynamicInheritComparisonClasscallMetaclass(DynamicMetaclass, InheritComparisonClasscallMetaclass):
--- a/src/sage/rings/complex_arb.pyx
+++ b/src/sage/rings/complex_arb.pyx
@@ -234,6 +234,7 @@
         ...
         ValueError: Precision must be at least 2.
     """
+    __new__ = Field.__new__
     Element = ComplexBall
 
     @staticmethod
--- a/src/sage/rings/pari_ring.py
+++ b/src/sage/rings/pari_ring.py
@@ -165,6 +165,7 @@
         sage: loads(R.dumps()) is R
         True
     """
+    __new__ = ring.Ring.__new__
     Element = Pari
 
     def __init__(self):
--- a/src/sage/rings/contfrac.py
+++ b/src/sage/rings/contfrac.py
@@ -78,6 +78,7 @@
         sage: CFF.category()
         Category of fields
     """
+    __new__ = Field.__new__
     class Element(ContinuedFraction_periodic,FieldElement):
         r"""
         A continued fraction of a rational number.
--- a/src/sage/rings/number_field/number_field.py
+++ b/src/sage/rings/number_field/number_field.py
@@ -1264,6 +1264,7 @@
         ....:         assert elt.is_integral()
 
     """
+    __new__ = number_field_base.NumberField.__new__
     def __init__(self, polynomial, name, latex_name,
                  check=True, embedding=None, category=None,
                  assume_disc_small=False, maximize_at_primes=None, structure=None):
--- a/src/sage/matrix/matrix_space.py
+++ b/src/sage/matrix/matrix_space.py
@@ -137,6 +137,7 @@
         ...
         ValueError: number of rows and columns may be at most...
     """
+    __new__ = parent_gens.ParentWithGens.__new__
     _no_generic_basering_coercion = True
 
     @staticmethod
--- a/src/sage/schemes/generic/scheme.py
+++ b/src/sage/schemes/generic/scheme.py
@@ -791,6 +791,7 @@
         :class:`sage.schemes.generic.algebraic_scheme.AffineSpace`.
 
     """
+    __new__ = Scheme.__new__
     def __init__(self, R, S=None, category=None):
         """
         Construct the affine scheme with coordinate ring `R`.
--- a/src/sage/combinat/partition.py
+++ b/src/sage/combinat/partition.py
@@ -5061,6 +5061,7 @@
         sage: P.list()
         [[3, 2]]
     """
+    __new__ = Parent.__new__
     @staticmethod
     def __classcall_private__(cls, n=None, **kwargs):
         """
--- a/src/sage/sets/non_negative_integers.py
+++ b/src/sage/sets/non_negative_integers.py
@@ -67,7 +67,7 @@
     TODO: do not use ``NN`` any more in the doctests for
     ``NonNegativeIntegers``.
     """
-
+    __new__ = Parent.__new__
     def __init__(self, category=None):
         """
         TESTS::
--- a/src/sage/structure/sequence.py
+++ b/src/sage/structure/sequence.py
@@ -410,6 +410,7 @@
         Finite Field of size 5
 
     """
+    __new__ = list.__new__
     def __init__(self, x, universe=None, check=True, immutable=False,
                  cr=False, cr_str=None, use_sage_types=False):
         """
--- a/src/sage/structure/list_clone_demo.pyx
+++ b/src/sage/structure/list_clone_demo.pyx
@@ -61,7 +61,7 @@
         sage: IncreasingArrays().element_class
         <type 'sage.structure.list_clone_demo.IncreasingArray'>
     """
-
+    __new__ = Parent.__new__
     def __init__(self):
         """
         TESTS::
--- a/src/sage/sets/finite_enumerated_set.py
+++ b/src/sage/sets/finite_enumerated_set.py
@@ -80,7 +80,7 @@
         sage: S.first().parent()
         Integer Ring
     """
-
+    __new__ = Parent.__new__
     @staticmethod
     def __classcall__(cls, iterable):
         """
--- a/src/sage/combinat/derangements.py
+++ b/src/sage/combinat/derangements.py
@@ -130,6 +130,7 @@
         sage: D2.random_element() # random
         [2, 3, 1, 3, 1, 2]
     """
+    __new__ = Parent.__new__
     @staticmethod
     def __classcall_private__(cls, x):
         """
--- a/src/sage/combinat/permutation.py
+++ b/src/sage/combinat/permutation.py
@@ -5003,6 +5003,7 @@
         sage: p.random_element()
         [5, 1, 2, 4, 3]
     """
+    __new__ = Parent.__new__
     @staticmethod
     def __classcall_private__(cls, n=None, k=None, **kwargs):
         """
--- a/src/sage/categories/examples/infinite_enumerated_sets.py
+++ b/src/sage/categories/examples/infinite_enumerated_sets.py
@@ -73,7 +73,7 @@
         running ._test_pickling() . . . pass
         running ._test_some_elements() . . . pass
     """
-
+    __new__ = Parent.__new__
     def __init__(self):
         """
         TESTS::
--- a/src/sage/categories/examples/sets_with_grading.py
+++ b/src/sage/categories/examples/sets_with_grading.py
@@ -23,6 +23,7 @@
         sage: E.graded_component(100)
         {100}
     """
+    __new__ = Parent.__new__
     def __init__(self):
         r"""
         TESTS::
--- a/src/sage/sets/cartesian_product.py
+++ b/src/sage/sets/cartesian_product.py
@@ -53,6 +53,7 @@
 
     .. automethod:: _cartesian_product_of_elements
     """
+    __new__ = Parent.__new__
     def __init__(self, sets, category, flatten=False):
         r"""
         INPUT:

comment:20 Changed 3 years ago by jdemeyer

  • Description modified (diff)

comment:21 Changed 3 years ago by jdemeyer

  • Branch changed from u/nthiery/upgrade_to_python_2_7_13 to u/jdemeyer/upgrade_to_python_2_7_13

comment:22 Changed 3 years ago by jdemeyer

  • Commit changed from b7bd4597e18af490dd9e6225e47b16d5ec8d79dc to ba486e12515ad417e2aa747dc5e525e0bedd3d4d

This branch now contains both the upgrade to Python 2.7.13rc1 as well as the commits by Nicolas.


New commits:

c35ea3cUpgrade python2 to 2.7.12 and update tinfo and uuid patches
85e931bfix sage_timeit and word.py for python 2.7.12
a119bf7Upgrade to Python 2.7.13rc1
a735fa522037: switch order of the bases of the class UniqueRepresentation
ba486e122037: more robust backward-compatibility stub class CartanType_simple_finite

comment:23 follow-ups: Changed 3 years ago by thansen

I now have a patch that changes more than 100 files and that's still not all. I don't think fixing this case-by-case in this way is viable. In any case this would be just a temporary fix. If we could find a simpler workaround in Sage that would be great, otherwise we'll have to try to get the Python change reverted I guess.

comment:24 in reply to: ↑ 23 ; follow-up: Changed 3 years ago by jdemeyer

Replying to thansen:

we'll have to try to get the Python change reverted I guess.

I have no idea how feasible that is, but that would be the best solution. There is clearly a backwards-incompatible change being done, so that would be a good argument to revert the change.

comment:25 in reply to: ↑ 23 ; follow-up: Changed 3 years ago by nthiery

Replying to thansen:

I now have a patch that changes more than 100 files and that's still not all. I don't think fixing this case-by-case in this way is viable.

Sounds like it indeed.

In any case this would be just a temporary fix. If we could find a simpler workaround in Sage that would be great, otherwise we'll have to try to get the Python change reverted I guess.

I assume you have tried to do this xxx.__new__ change in the UniqueRepresentation base class, and that did not work, right? Plausibly because which xxx shall be used depends from one case to the other. Maybe the ClassCallMetaclass.__init__ method could handle this upon class creation, figuring out the proper xxx to use.

I am currently recompiling Sage with the new branch (thanks Jeroen), and will try to look at this later tonight.

I tchated with Florent earlier today; he was sitting next to Julien last Spring when they investigated this. He will have a look as well and try to remember and post the details.

comment:26 in reply to: ↑ 24 Changed 3 years ago by nthiery

Replying to jdemeyer:

Replying to thansen:

we'll have to try to get the Python change reverted I guess.

I have no idea how feasible that is, but that would be the best solution. There is clearly a backwards-incompatible change being done, so that would be a good argument to revert the change.

+1

(revert or possibly ammend the change so that it would not break the backward compatibility, but still achieve the desired feature they wanted)

comment:27 Changed 3 years ago by thansen

If we can revert this in the Python package in Debian in time depends on what the maintainer thinks and if he responds quickly.

It would help if the change would break another software that is already in Debian. In that case the bug would have a higher severity (RC bug) and that would force the maintainer to do something or allow us to upload a change. I already rebuilt some packages to see if they are affected (numpy, scipy, etc) but they all seem to be fine. If someone knows software that uses inheritance with cdef classes and is in Debian let me know.

comment:28 follow-up: Changed 3 years ago by jdemeyer

Here is a more minimal breaking example:

obj.pyx:

cdef class OBJ(object):
    pass

Compile this (within Sage) with

./sage --sh -c "cython obj.pyx && gcc -Ilocal/include/python2.7 -Wall -shared -fPIC obj.c -o obj.so"

With Python 2.7.13rc1, this gives

In [1]: from obj import OBJ

In [2]: class X(OBJ, dict):
   ...:     pass
   ...: 

In [3]: X()
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-3-a7d4f7b89654> in <module>()
----> 1 X()

TypeError: obj.OBJ.__new__(X) is not safe, use dict.__new__()

comment:29 in reply to: ↑ 28 Changed 3 years ago by hivert

Replying to jdemeyer:

Here is a more minimal breaking example:

Hi there,

Here is what I understand:

  • When creating a class, Python has to decide which function needs to be called to allocate (__new__ method) an object. As the C-level, the function is put in a particular field called tp_new of the C-struct corresponding to the class.
  • In case of multiple inheritance, this is only possible if the two classes has a compatible memory layout. In this case, if one of the class has a specific extra C-attribute, its __new__ must be called (if both classes have extra attributes then they are not layout compatible).
  • Before the change of https://bugs.python.org/issue25731, CPython had a slow way to determine which must be called (see comment at https://hg.python.org/cpython/rev/e7062dd9085e/). When trying to optimize that, they introduced a bug, which Julien investigate with my help. As a consequence the change was reverted.
  • In https://hg.python.org/cpython/rev/a37cc3d926ec, they reintroduced the fast method issuing a warning if the wrong __new__ is called. As far as I understand, this means that in case of multiple inheritance with Cython code, only the first class can extend the C-struct.

Note that I have to investigate further to be sure of this last point.

Last edited 3 years ago by jdemeyer (previous) (diff)

comment:30 in reply to: ↑ 25 ; follow-up: Changed 3 years ago by nthiery

Replying to nthiery:

I assume you have tried to do this xxx.__new__ change in the UniqueRepresentation base class, and that did not work, right? Plausibly because which xxx shall be used depends from one case to the other. Maybe the ClassCallMetaclass.__init__ method could handle this upon class creation, figuring out the proper xxx to use.

I investigated this a bit further. First I believe we don't override object.__new__ in any of our Cython classes, and in only very few of our Python classes:

mistral-/opt/sage/src/sage>grep "def __new__" **/*.py*
combinat/shard_order.py:    def __new__(cls, p):
combinat/words/alphabet.py:    def __new__(self, alphabet=None, name=None):
combinat/words/finite_word.py:    def __new__(cls, words):
misc/classcall_metaclass.pyx:        def __new__(*args):
misc/classcall_metaclass.pyx:            ....:     def __new__(cls):
misc/sage_input.py:    def __new__(cls, cmds, expr, locals=None):
misc/six.py:        def __new__(cls, name, _, __dict__):
rings/infinity.py:    def __new__(cls, *args):
rings/qqbar.py:    def __new__(cls):
rings/qqbar.py:    def __new__(cls):
rings/qqbar.py:    def __new__(self, generator, value):
rings/qqbar.py:    def __new__(self, a, b):
rings/rational_field.py:    def __new__(cls):

Therefore, resetting cls.__new__ to be just object.__new__ for all our classes in the ClassCallMetaclass should be safe. So I added just that at the end of ClassCallMetaclass.__init__:

     self.__new__ = object.__new__

This seems to do the job for e.g. Unknown and a couple others.

However this does not seem to be quite what we want: it sounds like object.__new__ is "bound" to the class object, and I believe that's what forced Tobias to use e.g. __new__ = Functor.__new__ in his patch. Instead, what we would want to do is the analog of plain Python's

    self.__new__ = object.__new__.im_func

to make sure that self.__new__ is bound to self and not to object. I have tried to play around with what we do in a similar context in sage.structure.misc.getattr_from_other_class, but did not quite manage to. Trying to fetch object.__new__.__get__ with Py_TYPE(attribute).tp_descr_get returns null.

Florent, Jeroen, or anyone with good knowledge of the CPython API, could you have a look? At the end of the day, this is all probably emulating the proper initialization of the tp_new attribute that's been broken by Python's change. Maybe it's in fact just enough to emulate this initialization for the WithEqualityById class. Or just define a trivial WithEqualityById.__new__?

Florent: will you be at LRI tomorrow? If yes, we can have a sprint together on this.

While I am fairly optimistic on having a workaround soon, it still would be good to investigate in parallel getting this fixed / patched in Python.

Tobias: to answer your question, on my side, I haven't heard of other soft using inheritance from multiple Cython classes.

Cheers,

Nicolas

comment:31 in reply to: ↑ 30 Changed 3 years ago by jdemeyer

Replying to nthiery:

First I believe we don't override object.__new__ in any of our Cython classes

Not in the literal sense. However, Cython always implements a custom tp_new (which is the C version of __new__) for any cdef class. So effectively, we are overriding __new__ in every cdef class.

Therefore, resetting cls.__new__ to be just object.__new__ for all our classes in the ClassCallMetaclass should be safe.

Because of the above, I am afraid this is not true.

comment:32 follow-up: Changed 3 years ago by jdemeyer

As I mentioned in https://bugs.python.org/issue5322, I think that breaking multiple inheritance of __new__ is a side-effect of the fix and not a fundamental feature needed to fix that bug. So there might be some hope of fixing https://bugs.python.org/issue5322 without breaking multiple inheritance of __new__.

comment:33 Changed 3 years ago by nthiery

Florent: for whatever it's worth (not much) I pushed some changes I experimented with using ClassCallMetaclass.__init__:

https://git.sagemath.org/sage.git/log/?h=u/nthiery/22037/upgrade_to_python_2_7_13_classcall_workaround

comment:34 in reply to: ↑ 32 ; follow-up: Changed 3 years ago by nthiery

Replying to jdemeyer:

As I mentioned in https://bugs.python.org/issue5322, I think that breaking multiple inheritance of __new__ is a side-effect of the fix and not a fundamental feature needed to fix that bug. So there might be some hope of fixing https://bugs.python.org/issue5322 without breaking multiple inheritance of __new__.

That would be the ideal solution indeed!

Am I interpreting it correctly that the hunk causing trouble for us as just been reverted?

https://bugs.python.org/issue5322#msg283170

If yes, does that resolve our issue for the Debian packaging?

comment:35 Changed 3 years ago by nthiery

Otherwise, worst comes to worst, we could consider the following tentative workaround: making WithEqualityById into a plain Cython class. This should be easy and only result in a speed regression, presumably not critical.

Cheers,

comment:36 in reply to: ↑ 34 Changed 3 years ago by thansen

Replying to nthiery:

Replying to jdemeyer:

As I mentioned in https://bugs.python.org/issue5322, I think that breaking multiple inheritance of __new__ is a side-effect of the fix and not a fundamental feature needed to fix that bug. So there might be some hope of fixing https://bugs.python.org/issue5322 without breaking multiple inheritance of __new__.

That would be the ideal solution indeed!

Am I interpreting it correctly that the hunk causing trouble for us as just been reverted?

https://bugs.python.org/issue5322#msg283170

If yes, does that resolve our issue for the Debian packaging?

Yes it has been reverted upstream. It probably solves the problem. The maintainer of the Python package said he hopes a new Python version will be released this weekend and in this case he will upload it quickly to Debian. If no new Python is released we don't have a statement from him but I hope he would apply a patch to revert the change then.

comment:37 Changed 3 years ago by nthiery

Nice! Crossing my fingers ...

comment:38 Changed 3 years ago by nthiery

Just for the record: in the meantime, I had made a quick experiment with WithEqualityById as plain Python class, and got confused, as I still get the same error as before:

    Unknown = UnknownClass()
    ...
    TypeError: sage.structure.sage_object.SageObject.__new__(UnknownClass) is not safe, use object.__new__()

whereas UnknowClass now has only one Cython base class; here is its mro:

(<class 'sage.misc.unknown.UnknownClass'>, <class 'sage.structure.unique_representation.UniqueRepresentation'>, <class 'sage.structure.unique_representation.CachedRepresentation'>, <class 'sage.misc.fast_methods.WithEqualityById'>, <type 'sage.structure.sage_object.SageObject'>, <type 'object'>)

comment:39 Changed 3 years ago by thansen

Python 2.7.13 was released without this change that breaks Sage, and already uploaded to Debian. So this is no longer an issue, unless Python really applies this change in a major version update one day. Thanks everybody for helping on this unexpected last minute obstruction!

BTW, Sage just hit Debian experimental today and we will upload it to unstable probably Wednesday or so. Cross your fingers!

comment:40 follow-up: Changed 3 years ago by charpent

  • Cc charpent added

I'd like to point people following this ticket to this thread which explains that the present ticket has some urgency. I attempted a workaround in #22089 and failed miserably.

Could you let us know what remains to be done to have this ticket completed ?

comment:41 in reply to: ↑ 40 Changed 3 years ago by jdemeyer

Replying to charpent:

Could you let us know what remains to be done to have this ticket completed ?

Nothing special, just do the upgrade.

Last edited 3 years ago by jdemeyer (previous) (diff)

comment:42 Changed 3 years ago by jdemeyer

  • Authors set to Jeroen Demeyer
  • Dependencies #19735 deleted
  • Description modified (diff)

OK, I'll work on this.

comment:43 Changed 3 years ago by git

  • Commit changed from ba486e12515ad417e2aa747dc5e525e0bedd3d4d to 5aeaf5c9f396c297dbd1c1c9b60d0bf5a972e0c9

Branch pushed to git repo; I updated commit sha1. This was a forced push. New commits:

5aeaf5cUpgrade to Python 2.7.13

comment:44 follow-up: Changed 3 years ago by embray

Ah, I think Florent was telling me about this a couple weeks ago. Wish I had been CC'd on this--I've spent a lot of time in Python's class initialization code and probably could have helped. Let me know if I can still help on this.

(Ah, I see now the issue was fixed upstream too--funny that Armin raised this issue back in 2009 and *now* it gets fixed :)

Last edited 3 years ago by embray (previous) (diff)

comment:45 Changed 3 years ago by jdemeyer

My first impression is that this new version of Python is significantly slower than 2.7.12: I'm seeing several doctest timeouts on a system where I usually don't get any. Granted, my system is loaded from doing things so it might be a false positive. Need to check...

comment:46 in reply to: ↑ 44 Changed 3 years ago by jdemeyer

Replying to embray:

Ah, I think Florent was telling me about this a couple weeks ago. Wish I had been CC'd on this--I've spent a lot of time in Python's class initialization code and probably could have helped. Let me know if I can still help on this.

The main question remains: did they break tp_new on other Python versions? The patch got reverted for 2.7.13 but it's not clear whether or not it was applied to some 3.y.x version.

comment:47 Changed 3 years ago by jdemeyer

It worries me that nothing in the Python docs nor in any PEP describes how tp_new is inherited. In my opinion, https://bugs.python.org/issue5322 makes a significant change which should be subject to a PEP. However, neither the old nor new behaviour is described anywhere. This makes it harder to argue which behaviour is correct.

comment:48 Changed 3 years ago by embray

Part of the problem is that tp_new is a detail of the CPython API, and while there are PEPs that deal with CPython there aren't many (not enough IMO given that it is the reference implementation). Point being though, this code is very particular to the C API and doesn't particularly impact how Python should work from a pure language design perspective. But I agree, this should be better documented.

My guess is just that in the wild there aren't that many hand-written C types outside of Numpy and ones generated by Cython. And it's even less common for them to be used in a multiple inheritance scenario. But just because it isn't common doesn't mean it should be broken or undocumented, so I completely agree. After all this problem was pointed out in 2009 so it's not exactly unheard of.

comment:49 Changed 3 years ago by embray

FWIW the most relevant PEP to this https://www.python.org/dev/peps/pep-0253/, but I haven't read it in a long time so I forget whether or not it addresses this specific issue, especially given:

The PEP no longer accurately describes the implementation.

Last edited 3 years ago by embray (previous) (diff)

comment:50 Changed 3 years ago by jdemeyer

Yes, I found that PEP when the discussion about https://bugs.python.org/issue5322 started but it doesn't answer that specific question.

comment:51 Changed 3 years ago by embray

Ah, okay. Not surprising--it also says in the PEP:

While the details of initializing a PyTypeObject? structure haven't been documented as such, they are easily gleaned from the examples in the source code, and I am assuming that the reader is sufficiently familiar with the traditional way of creating new Python types in C.

In fairness, those details predate the PEP process in the first place so it's not surprising that there's no PEP for it. But it would be nice to have something better documented in the C-API docs. It should be part of the API.

comment:52 Changed 3 years ago by jdemeyer

  • Status changed from new to needs_review

Changed 3 years ago by charpent

First attempt at installing Python 2.7.13

comment:53 follow-up: Changed 3 years ago by charpent

No good, alas... After merging the relevant branch in my current branch (containing R 3.3.2 and the necessary helper packages for xz and pcre), I tried time ./sage -i -c python2. This took a long time, mostly spent on waiting on failing tests :

real	48m11,852s
user	6m46,312s
sys	1m12,012s

At the end of the log file (see attached file), I get :

353 tests OK.
6 tests failed:
    test_gdb test_site test_ssl test_sysconfig test_urllib2
    test_urllib2_localnet
1 test altered the execution environment:
    test_import
41 tests skipped:
    test_aepack test_al test_applesingle test_bsddb test_bsddb185
    test_bsddb3 test_cd test_cl test_codecmaps_cn test_codecmaps_hk
    test_codecmaps_jp test_codecmaps_kr test_codecmaps_tw test_curses
    test_dbm test_dl test_gdbm test_gl test_imageop test_imgfile
    test_kqueue test_linuxaudiodev test_macos test_macostools
    test_msilib test_ossaudiodev test_pep277 test_scriptpackages
    test_smtpnet test_socketserver test_startfile test_sunaudiodev
    test_timeout test_tk test_ttk_guionly test_unicode_file
    test_urllib2net test_urllibnet test_winreg test_winsound
    test_zipfile64
4 skips unexpected on linux2:
    test_bsddb test_bsddb3 test_dbm test_gdbm
Makefile:877: recipe for target 'test' failed

Curiously, notwhithstanding the reported problems on the ssl module, pip seems to be able to function somehow :

charpent@asus16-ec:/usr/local/sage-7$ sage -pip search tralala
You are using pip version 8.1.2, however version 9.0.1 is available.
You should consider upgrading via the 'pip install --upgrade pip' command.
charpent@asus16-ec:/usr/local/sage-7$ sage -pip search terminado
terminado (0.6)  - Terminals served to term.js using Tornado websockets
  INSTALLED: 0.6 (latest)
You are using pip version 8.1.2, however version 9.0.1 is available.
You should consider upgrading via the 'pip install --upgrade pip' command.

(and I get pip advertisements again, source of pseudo-failures in tests...)

I doubt that it is worth make ptestlong (which monopolizes my machine for a long nice hour, nowadays...).

I do not know enough about the specifics of Python in Sage to fel justified in positioning ths ticket as needs_wokj, but I'm sorely tempted.

I'll keep my branch in this tate for a while to see what may crop up.

HTH,

comment:54 in reply to: ↑ 53 ; follow-up: Changed 3 years ago by jdemeyer

Replying to charpent:

I do not know enough about the specifics of Python in Sage to fel justified in positioning ths ticket as needs_wokj, but I'm sorely tempted.

Please elaborate. Does this ticket break anything?

comment:55 in reply to: ↑ 54 Changed 3 years ago by charpent

Replying to jdemeyer:

Replying to charpent:

I do not know enough about the specifics of Python in Sage to fel justified in positioning ths ticket as needs_wokj, but I'm sorely tempted.

Please elaborate. Does this ticket break anything?

A cursory, extremely superficial, test(a couple lines in Sage, a bit more in IPython + sympy) didn't show major immediate problems shuch as a crash. But the six bailed test units make me wary.

I just launched make ptestlong and I see sage recompiling python2 and brial. Answer in a couple of hours...

Last edited 3 years ago by charpent (previous) (diff)

comment:56 follow-up: Changed 3 years ago by jhpalmieri

At some times in the past, the python2 package has not passed its test suite. Does the current version pass? That is, are you seeing a regression or the status quo?

comment:57 Changed 3 years ago by charpent

It might be a regression, but I'm not sure :

make ptestlong is currently stalled, with a suspicious number of defunct (zombie) subprocesses. From ps axf, I get (extract) :

26497 ?        Ssl    1:03  \_ /usr/lib/gnome-terminal/gnome-terminal-server
14353 pts/3    Ss     0:00  |   \_ bash
20219 pts/3    S+     0:00  |   |   \_ make ptestlong
 3447 pts/3    S+     0:34  |   |       \_ python /usr/local/sage-7/src/bin/sage-runtests -p --all --long --logfile=logs/ptestlong.log
 3486 pts/3    S+     0:01  |   |           \_ python /usr/local/sage-7/src/bin/sage-cleaner
15843 pts/3    S      0:01  |   |           \_ python /usr/local/sage-7/src/bin/sage-runtests -p --all --long --logfile=logs/ptestlong.log
15844 pts/0    Ssl+   0:06  |   |               \_ /usr/local/sage-7/local/bin/giac --sage
15845 pts/3    Z      0:00  |   |               \_ [python] <defunct>
16021 ?        Zs     0:00  |   |               \_ [giac] <defunct>
16022 pts/3    Z      0:00  |   |               \_ [python] <defunct>
16032 pts/3    Z      0:00  |   |               \_ [python] <defunct>
16033 ?        Zs     0:00  |   |               \_ [giac] <defunct>
16034 pts/3    Z      0:00  |   |               \_ [python] <defunct>
16043 pts/3    Z      0:00  |   |               \_ [python] <defunct>
17896 pts/4    Ss     0:00  |   \_ bash
25263 pts/4    R+     0:00  |       \_ ps axf

I'll let it go for a while, and kill it, say, tomorrow morning (it's about 22:05 locally).

But this smells. A look at the log (from another terminal) gives me some known bugs, and some new :

File "src/sage/rings/polynomial/multi_polynomial_ideal.py", line 3532, in sage.r
ings.polynomial.multi_polynomial_ideal.NCPolynomialIdeal.groebner_basis
Failed example:
    ideal(J.transformed_basis()).change_ring(P).interreduced_basis()  # optional - giacpy_sage
Expected:
    [a - 60*c^3 + 158/7*c^2 + 8/7*c - 1, b + 30*c^3 - 79/7*c^2 + 3/7*c, c^4 - 10/21*c^3 + 1/84*c^2 + 1/84*c]
Got:
    [7*a - 420*c^3 + 158*c^2 + 8*c - 7, 7*b + 210*c^3 - 79*c^2 + 3*c, 84*c^4 - 40*c^3 + c^2 + c]

This one is already known.

File "src/sage/homology/simplicial_complex.py", line 2812, in sage.homology.simp
licial_complex.SimplicialComplex.is_cohen_macaulay
Failed example:
    X.is_cohen_macaulay(ZZ)
Expected:
    False
Got:
    [Errno 2] No such file or directory: '/home/charpent/.sage/temp/asus16-ec/17311/dir_ZhULbV/17421.out'
    False

Might be a race condition : from yet another terminal :

charpent@asus16-ec:/usr/local/sage-7$ sage -t --long --warn-long 109.9 src/sage/homology/simplicial_complex.py
Running doctests with ID 2017-01-04-22-08-34-3e41af20.
Git branch: testR
Using --optional=database_gap,giacpy_sage,mpir,python2,sage,xz
Doctesting 1 file.
sage -t --long --warn-long 109.9 src/sage/homology/simplicial_complex.py
    [588 tests, 3.25 s]
----------------------------------------------------------------------
All tests passed!
----------------------------------------------------------------------
Total time for all tests: 3.4 seconds
    cpu time: 3.0 seconds
    cumulative wall time: 3.3 seconds
sage -t --long --warn-long 109.9 src/sage/combinat/root_system/cartan_type.py
    Bad exit: 2
**********************************************************************
Tests run before process (pid=17761) failed:
sage: T = CartanType(['A', 4]) ## line 18 ##
sage: T ## line 19 ##
['A', 4]
sage: DynkinDiagram(T) ## line 24 ##
O---O---O---O
1   2   3   4   
A4
sage: DynkinDiagram(['A',4]) ## line 33 ##
O---O---O---O
1   2   3   4   
A4
sage: DynkinDiagram('A4') ## line 37 ##
O---O---O---O
1   2   3   4   
A4
sage: T.dynkin_diagram() ## line 41 ##
O---O---O---O
1   2   3   4   
A4
sage: RootSystem(T) ## line 52 ##
Root system of type ['A', 4]
sage: W = WeylGroup(T) ## line 57 ##

This one is new to me. But again, it might be a race condition :

charpent@asus16-ec:/usr/local/sage-7$ sage -t --long --warn-long 109.9 src/sage/combinat/root_system/cartan_type.py
Running doctests with ID 2017-01-04-22-10-59-8ee52f1c.
Git branch: testR
Using --optional=database_gap,giacpy_sage,mpir,python2,sage,xz
Doctesting 1 file.
sage -t --long --warn-long 109.9 src/sage/combinat/root_system/cartan_type.py
    [446 tests, 1.36 s]
----------------------------------------------------------------------
All tests passed!
----------------------------------------------------------------------
Total time for all tests: 1.5 seconds
    cpu time: 1.1 seconds
    cumulative wall time: 1.4 seconds

And that's all for now. But make ptestlong is still stalled at :

sage -t --long --warn-long 109.9 local/lib/python2.7/site-packages/sagenb/testing/selenium/__init__.py
    [0 tests, 0.00 s]
sage -t --long --warn-long 109.9 src/sage/interfaces/giac.py

If you feel it useful, I'll attach the resulting ptestlong.log after tomorrow's kill.

comment:58 in reply to: ↑ 56 ; follow-up: Changed 3 years ago by charpent

Replying to jhpalmieri:

At some times in the past, the python2 package has not passed its test suite. Does the current version pass?

No. Six test units failed (see above) .

That is, are you seeing a regression or the status quo?

I don't know if these test units used to pass before...

HTH,

Changed 3 years ago by charpent

result of make ptestlong, first attempt on 2.7.13

comment:59 Changed 3 years ago by charpent

New data point : after about 1 hour, the test of giac inteface timed out, liberating the whole thing (the zombie processes disappeared).

The resulting ptestlong.log has been attached, just in case...

Interestingly, this may be a race condition : the very same test passes standalone in about 1.33 seconds :

charpent@asus16-ec:/usr/local/sage-7$ sage -t --long --warn-long 109.9 src/sage/interfaces/giac.py
Running doctests with ID 2017-01-04-22-51-02-b275d916.
Git branch: testR
Using --optional=database_gap,giacpy_sage,mpir,python2,sage,xz
Doctesting 1 file.
sage -t --long --warn-long 109.9 src/sage/interfaces/giac.py
    [157 tests, 1.33 s]
----------------------------------------------------------------------
All tests passed!
----------------------------------------------------------------------
Total time for all tests: 6.4 seconds
    cpu time: 0.6 seconds
    cumulative wall time: 1.3 seconds

So we have two, possibly three problems :

  • failed test units in Python's own test suite ;
  • transient errors (race conditions) in ptestlong ;
  • an unfixed known "error" (not mathematically an error, bit, asufar as I understand, a different expression of the same result).

Advice ?

comment:60 in reply to: ↑ 58 ; follow-up: Changed 3 years ago by jhpalmieri

Replying to charpent:

Replying to jhpalmieri:

At some times in the past, the python2 package has not passed its test suite. Does the current version pass?

No. Six test units failed (see above) .

I meant, do the unit tests pass for 2.7.10 (= the current version)?

comment:61 in reply to: ↑ 60 ; follow-up: Changed 3 years ago by charpent

Replying to jhpalmieri:

[ Snip...]

I meant, do the unit tests pass for 2.7.10 (= the current version)?

Current is 2.7.12 (since 7.5rc0).

354 tests OK.
5 tests failed:
    test_gdb test_site test_sysconfig test_urllib2
    test_urllib2_localnet
42 tests skipped:
    test_aepack test_al test_applesingle test_bsddb test_bsddb185
    test_bsddb3 test_cd test_cl test_codecmaps_cn test_codecmaps_hk
    test_codecmaps_jp test_codecmaps_kr test_codecmaps_tw test_curses
    test_dbm test_dl test_gdbm test_gl test_imageop test_imgfile
    test_kqueue test_linuxaudiodev test_macos test_macostools
    test_msilib test_ossaudiodev test_pep277 test_scriptpackages
    test_smtpnet test_socketserver test_ssl test_startfile
    test_sunaudiodev test_timeout test_tk test_ttk_guionly
    test_unicode_file test_urllib2net test_urllibnet test_winreg
    test_winsound test_zipfile64
5 skips unexpected on linux2:
    test_bsddb test_bsddb3 test_dbm test_gdbm test_ssl

So there is more lossage (test_ssl passed in 2.7.12).

comment:62 in reply to: ↑ 61 Changed 3 years ago by charpent

Replying to charpent:

Going back to 7.5beta6 (which had 2.7.10, I get :

4 tests failed:
    test_gdb test_site test_sysconfig test_urllib2_localnet
42 tests skipped:
    test_aepack test_al test_applesingle test_bsddb test_bsddb185
    test_bsddb3 test_cd test_cl test_codecmaps_cn test_codecmaps_hk
    test_codecmaps_jp test_codecmaps_kr test_codecmaps_tw test_curses
    test_dbm test_dl test_gdbm test_gl test_imageop test_imgfile
    test_kqueue test_linuxaudiodev test_macos test_macostools
    test_msilib test_ossaudiodev test_pep277 test_scriptpackages
    test_smtpnet test_socketserver test_ssl test_startfile
    test_sunaudiodev test_timeout test_tk test_ttk_guionly
    test_unicode_file test_urllib2net test_urllibnet test_winreg
    test_winsound test_zipfile64
5 skips unexpected on linux2:
    test_bsddb test_bsddb3 test_dbm test_gdbm test_ssl

So test_urllib2 was lost between 2.7.10 and 2.7.12. And, BTW, test_ssl didn't pass in 2.7.12 : it was marked as unexpected.

HTH,

comment:63 Changed 3 years ago by jdemeyer

There is some significant speed regression going from 2.7.12 to 2.7.13.

I doctested the directory src/sage/manifolds` 3 times with each Python version on an otherwise idle system.

With 2.7.12, I got

manifolds-2.7.12.log:Total time for all tests: 619.3 seconds
manifolds-2.7.12.log:Total time for all tests: 625.6 seconds
manifolds-2.7.12.log:Total time for all tests: 616.8 seconds

With 2.7.13:

manifolds-2.7.13.log:Total time for all tests: 645.1 seconds
manifolds-2.7.13.log:Total time for all tests: 640.7 seconds
manifolds-2.7.13.log:Total time for all tests: 646.0 seconds

I don't know what to think of this...

Version 0, edited 3 years ago by jdemeyer (next)

comment:64 Changed 3 years ago by jdemeyer

  • Priority changed from critical to blocker

Blocker because of #22147.

comment:65 Changed 3 years ago by vbraun

  • Reviewers set to Volker Braun
  • Status changed from needs_review to positive_review

Since we need this to compile on OSX...

remaining issues should be moved to separate tickets.

comment:66 Changed 3 years ago by vbraun

  • Branch changed from u/jdemeyer/upgrade_to_python_2_7_13 to 5aeaf5c9f396c297dbd1c1c9b60d0bf5a972e0c9
  • Resolution set to fixed
  • Status changed from positive_review to closed
Note: See TracTickets for help on using tickets.