Merge "Drop support for liberasurecode<1.4.0"
This commit is contained in:
@@ -10,6 +10,8 @@
|
|||||||
- openstack-tox-py35:
|
- openstack-tox-py35:
|
||||||
vars:
|
vars:
|
||||||
tox_envlist: py35-compilelibs
|
tox_envlist: py35-compilelibs
|
||||||
|
tox_environment:
|
||||||
|
LIBERASURECODE_REF: '1.4.0'
|
||||||
- openstack-tox-py36
|
- openstack-tox-py36
|
||||||
- openstack-tox-py37
|
- openstack-tox-py37
|
||||||
- openstack-tox-py38
|
- openstack-tox-py38
|
||||||
@@ -29,6 +31,8 @@
|
|||||||
- openstack-tox-py35:
|
- openstack-tox-py35:
|
||||||
vars:
|
vars:
|
||||||
tox_envlist: py35-compilelibs
|
tox_envlist: py35-compilelibs
|
||||||
|
tox_environment:
|
||||||
|
LIBERASURECODE_REF: '1.4.0'
|
||||||
- openstack-tox-py36
|
- openstack-tox-py36
|
||||||
- openstack-tox-py37
|
- openstack-tox-py37
|
||||||
- openstack-tox-py38
|
- openstack-tox-py38
|
||||||
|
@@ -24,7 +24,7 @@ Installation
|
|||||||
Install pre-requisites:
|
Install pre-requisites:
|
||||||
|
|
||||||
* Python 2.6, 2.7 or 3.x (including development packages), argparse, setuptools
|
* Python 2.6, 2.7 or 3.x (including development packages), argparse, setuptools
|
||||||
* liberasurecode v1.3.1 or greater [3]
|
* liberasurecode v1.4.0 or greater [3]
|
||||||
* Erasure code backend libraries, gf-complete and Jerasure [1],[2], ISA-L [4], etc
|
* Erasure code backend libraries, gf-complete and Jerasure [1],[2], ISA-L [4], etc
|
||||||
|
|
||||||
Install dependencies:
|
Install dependencies:
|
||||||
@@ -44,7 +44,6 @@ If you want to confirm all dependency packages installed successfully, try::
|
|||||||
|
|
||||||
$ sudo bindep -f bindep.txt
|
$ sudo bindep -f bindep.txt
|
||||||
|
|
||||||
*Note*: Currently, for Ubuntu, liberasurecode-dev in package repo is older than v1.2.0.
|
|
||||||
For CentOS, make sure to install the latest Openstack Cloud SIG repo
|
For CentOS, make sure to install the latest Openstack Cloud SIG repo
|
||||||
to be able to install the latest available version of liberasurecode-devel.
|
to be able to install the latest available version of liberasurecode-devel.
|
||||||
|
|
||||||
|
@@ -30,39 +30,17 @@ from pyeclib_c import get_liberasurecode_version
|
|||||||
|
|
||||||
import warnings
|
import warnings
|
||||||
|
|
||||||
import logging
|
|
||||||
from logging.handlers import SysLogHandler
|
|
||||||
logger = logging.getLogger('pyeclib')
|
|
||||||
syslog_handler = SysLogHandler()
|
|
||||||
logger.addHandler(syslog_handler)
|
|
||||||
|
|
||||||
|
|
||||||
def check_backend_available(backend_name):
|
def check_backend_available(backend_name):
|
||||||
try:
|
from pyeclib_c import check_backend_available
|
||||||
from pyeclib_c import check_backend_available
|
|
||||||
|
|
||||||
if backend_name.startswith('flat_xor_hd'):
|
if backend_name.startswith('flat_xor_hd'):
|
||||||
int_type = PyECLib_EC_Types.get_by_name('flat_xor_hd')
|
int_type = PyECLib_EC_Types.get_by_name('flat_xor_hd')
|
||||||
else:
|
else:
|
||||||
int_type = PyECLib_EC_Types.get_by_name(backend_name)
|
int_type = PyECLib_EC_Types.get_by_name(backend_name)
|
||||||
if not int_type:
|
if not int_type:
|
||||||
return False
|
return False
|
||||||
return check_backend_available(int_type.value)
|
return check_backend_available(int_type.value)
|
||||||
except ImportError:
|
|
||||||
# check_backend_available has been supported since
|
|
||||||
# liberasurecode>=1.2.0 so we need to define the func for older
|
|
||||||
# liberasurecode version
|
|
||||||
|
|
||||||
# select available k, m values
|
|
||||||
if backend_name.startswith('flat_xor_hd'):
|
|
||||||
k, m = (10, 5)
|
|
||||||
else:
|
|
||||||
k, m = (10, 4)
|
|
||||||
try:
|
|
||||||
ECDriver(ec_type=backend_name, k=k, m=m)
|
|
||||||
except ECDriverError:
|
|
||||||
return False
|
|
||||||
return True
|
|
||||||
|
|
||||||
|
|
||||||
def PyECLibVersion(z, y, x):
|
def PyECLibVersion(z, y, x):
|
||||||
@@ -566,25 +544,10 @@ VALID_EC_TYPES = _PyECLibValidECTypes()
|
|||||||
|
|
||||||
def _liberasurecode_version():
|
def _liberasurecode_version():
|
||||||
version_int = get_liberasurecode_version()
|
version_int = get_liberasurecode_version()
|
||||||
version_hex_str = hex(version_int)
|
major = (version_int >> 16) & 0xff
|
||||||
version_hex_str = version_hex_str.lstrip('0x')
|
minor = (version_int >> 8) & 0xff
|
||||||
major = str(int(version_hex_str[-6:-4]))
|
rev = (version_int >> 0) & 0xff
|
||||||
minor = str(int(version_hex_str[-4:-2]))
|
return '%d.%d.%d' % (major, minor, rev)
|
||||||
rev = str(int(version_hex_str[-2:]))
|
|
||||||
version_str = '.'.join([major, minor, rev])
|
|
||||||
|
|
||||||
# liberasurecode < 1.3.1 should be incompatible but
|
|
||||||
# just warn until packagers build the required version
|
|
||||||
# See https://bugs.launchpad.net/swift/+bug/1639691 in detail
|
|
||||||
required_version = ((1 << 16) + (3 << 8) + 1)
|
|
||||||
if version_int < required_version:
|
|
||||||
logger.warning(
|
|
||||||
'DEPRECATED WARNING: your liberasurecode '
|
|
||||||
'%s will be deprecated in the near future because of the issue '
|
|
||||||
'https://bugs.launchpad.net/swift/+bug/1639691; '
|
|
||||||
'Please upgrade to >=1.3.1 and rebuild pyeclib to suppress '
|
|
||||||
'this message' % version_str)
|
|
||||||
return version_str
|
|
||||||
|
|
||||||
|
|
||||||
LIBERASURECODE_VERSION = _liberasurecode_version()
|
LIBERASURECODE_VERSION = _liberasurecode_version()
|
||||||
|
@@ -34,10 +34,6 @@
|
|||||||
#include <bytesobject.h>
|
#include <bytesobject.h>
|
||||||
#include <liberasurecode/erasurecode.h>
|
#include <liberasurecode/erasurecode.h>
|
||||||
|
|
||||||
#if ( LIBERASURECODE_VERSION < _VERSION(1,1,0) )
|
|
||||||
#include <liberasurecode/erasurecode_helpers.h>
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* Compat layer for python <= 2.6 */
|
/* Compat layer for python <= 2.6 */
|
||||||
#include "capsulethunk.h"
|
#include "capsulethunk.h"
|
||||||
|
|
||||||
@@ -1189,32 +1185,7 @@ pyeclib_c_check_backend_available(PyObject *self, PyObject *args)
|
|||||||
|
|
||||||
static PyObject*
|
static PyObject*
|
||||||
pyeclib_c_liberasurecode_version(PyObject *self, PyObject *args) {
|
pyeclib_c_liberasurecode_version(PyObject *self, PyObject *args) {
|
||||||
void *hLib;
|
return Py_BuildValue("k", liberasurecode_get_version());
|
||||||
char *err;
|
|
||||||
uint32_t (*hGetVersion)(void);
|
|
||||||
|
|
||||||
dlerror();
|
|
||||||
hLib = dlopen("liberasurecode.so", RTLD_LAZY);
|
|
||||||
/* It's important that we clear the last error before calling dysym */
|
|
||||||
err = dlerror();
|
|
||||||
if (err) {
|
|
||||||
/* This should never actually get hit; since we're using various
|
|
||||||
symbols already, liberasurecode.so should *already* be loaded. */
|
|
||||||
return PyInt_FromLong(LIBERASURECODE_VERSION);
|
|
||||||
}
|
|
||||||
|
|
||||||
hGetVersion = dlsym(hLib, "liberasurecode_get_version");
|
|
||||||
err = dlerror();
|
|
||||||
if (err) {
|
|
||||||
/* This is the important bit. Old version, doesn't have get_version
|
|
||||||
support; fall back to old behavior. */
|
|
||||||
dlclose(hLib);
|
|
||||||
return PyInt_FromLong(LIBERASURECODE_VERSION);
|
|
||||||
}
|
|
||||||
|
|
||||||
uint32_t version = (*hGetVersion)();
|
|
||||||
dlclose(hLib);
|
|
||||||
return Py_BuildValue("k", version);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static PyMethodDef PyECLibMethods[] = {
|
static PyMethodDef PyECLibMethods[] = {
|
||||||
@@ -1227,9 +1198,7 @@ static PyMethodDef PyECLibMethods[] = {
|
|||||||
{"get_metadata", pyeclib_c_get_metadata, METH_VARARGS, "Get the integrity checking metadata for a fragment"},
|
{"get_metadata", pyeclib_c_get_metadata, METH_VARARGS, "Get the integrity checking metadata for a fragment"},
|
||||||
{"check_metadata", pyeclib_c_check_metadata, METH_VARARGS, "Check the integrity checking metadata for a set of fragments"},
|
{"check_metadata", pyeclib_c_check_metadata, METH_VARARGS, "Check the integrity checking metadata for a set of fragments"},
|
||||||
{"get_liberasurecode_version", pyeclib_c_liberasurecode_version, METH_NOARGS, "Get libersaurecode version in use"},
|
{"get_liberasurecode_version", pyeclib_c_liberasurecode_version, METH_NOARGS, "Get libersaurecode version in use"},
|
||||||
#if ( LIBERASURECODE_VERSION >= _VERSION(1,2,0) )
|
|
||||||
{"check_backend_available", pyeclib_c_check_backend_available, METH_VARARGS, "Check if a backend is available"},
|
{"check_backend_available", pyeclib_c_check_backend_available, METH_VARARGS, "Check if a backend is available"},
|
||||||
#endif
|
|
||||||
{NULL, NULL, 0, NULL} /* Sentinel */
|
{NULL, NULL, 0, NULL} /* Sentinel */
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@@ -29,7 +29,6 @@ import sys
|
|||||||
import tempfile
|
import tempfile
|
||||||
import unittest
|
import unittest
|
||||||
|
|
||||||
from distutils.version import StrictVersion
|
|
||||||
from itertools import combinations
|
from itertools import combinations
|
||||||
|
|
||||||
import six
|
import six
|
||||||
@@ -46,8 +45,6 @@ from pyeclib.ec_iface import PyECLib_EC_Types
|
|||||||
from pyeclib.ec_iface import ALL_EC_TYPES
|
from pyeclib.ec_iface import ALL_EC_TYPES
|
||||||
from pyeclib.ec_iface import VALID_EC_TYPES
|
from pyeclib.ec_iface import VALID_EC_TYPES
|
||||||
|
|
||||||
from pyeclib.ec_iface import LIBERASURECODE_VERSION
|
|
||||||
|
|
||||||
|
|
||||||
if sys.version < '3':
|
if sys.version < '3':
|
||||||
def b2i(b):
|
def b2i(b):
|
||||||
@@ -691,11 +688,6 @@ class TestPyECLibDriver(unittest.TestCase):
|
|||||||
(first_fragment_to_corrupt + i) % len(fragments)
|
(first_fragment_to_corrupt + i) % len(fragments)
|
||||||
for i in range(num_to_corrupt)]
|
for i in range(num_to_corrupt)]
|
||||||
|
|
||||||
if StrictVersion(LIBERASURECODE_VERSION) < \
|
|
||||||
StrictVersion('1.2.0'):
|
|
||||||
# if liberasurecode is older than the version supports
|
|
||||||
# fragment integrity check, skip following test
|
|
||||||
continue
|
|
||||||
i = 0
|
i = 0
|
||||||
for fragment in fragments:
|
for fragment in fragments:
|
||||||
if i in fragments_to_corrupt:
|
if i in fragments_to_corrupt:
|
||||||
|
Reference in New Issue
Block a user