diff options
| author | Richard Purdie <richard.purdie@linuxfoundation.org> | 2011-12-18 23:54:30 +0000 |
|---|---|---|
| committer | Richard Purdie <richard.purdie@linuxfoundation.org> | 2011-12-19 09:29:16 +0000 |
| commit | f4c80d646f633215ba8341c389875b99f7f526e6 (patch) | |
| tree | cd1140081fc6b8bc7f69bcbf18f7943c0eb38046 | |
| parent | b281fd127bac9ba77ab63a5c2b812ddd5d56df37 (diff) | |
| download | poky-f4c80d646f633215ba8341c389875b99f7f526e6.tar.gz | |
opkg: Add logic to detect and creak circular dependencies
This addresses some of the concerns about the previous opkg changes
allowing it to break out of circular dependency loops with just a notice
in the logs rather than effectively going OOM.
(From OE-Core rev: 5a2b67b8faad3dd5417ba89d8e82ca564753ccc9)
Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
| -rw-r--r-- | meta/recipes-devtools/opkg/opkg/track_parents.patch | 99 | ||||
| -rw-r--r-- | meta/recipes-devtools/opkg/opkg_svn.bb | 3 |
2 files changed, 101 insertions, 1 deletions
diff --git a/meta/recipes-devtools/opkg/opkg/track_parents.patch b/meta/recipes-devtools/opkg/opkg/track_parents.patch new file mode 100644 index 0000000000..1f54256c2d --- /dev/null +++ b/meta/recipes-devtools/opkg/opkg/track_parents.patch | |||
| @@ -0,0 +1,99 @@ | |||
| 1 | Add logic to detect circular dependencies. If we see any dependency from any | ||
| 2 | given parent twice, ignore it the second time and print a notice message | ||
| 3 | that we did so. | ||
| 4 | |||
| 5 | Upstream-Status: Pending | ||
| 6 | RP 2011/12/18 | ||
| 7 | |||
| 8 | Index: trunk/libopkg/opkg_install.c | ||
| 9 | =================================================================== | ||
| 10 | --- trunk.orig/libopkg/opkg_install.c 2011-12-18 11:15:17.320725365 +0000 | ||
| 11 | +++ trunk/libopkg/opkg_install.c 2011-12-18 12:38:54.980609225 +0000 | ||
| 12 | @@ -84,8 +84,14 @@ | ||
| 13 | /* The package was uninstalled when we started, but another | ||
| 14 | dep earlier in this loop may have depended on it and pulled | ||
| 15 | it in, so check first. */ | ||
| 16 | + if (is_pkg_in_pkg_vec(dep->wanted_by, pkg)) { | ||
| 17 | + opkg_msg(NOTICE,"Breaking cicular dependency on %s for %s.\n", pkg->name, dep->name); | ||
| 18 | + continue; | ||
| 19 | + } | ||
| 20 | if ((dep->state_status != SS_INSTALLED) && (dep->state_status != SS_UNPACKED)) { | ||
| 21 | opkg_msg(DEBUG2,"Calling opkg_install_pkg.\n"); | ||
| 22 | + if (!is_pkg_in_pkg_vec(dep->wanted_by, pkg)) | ||
| 23 | + pkg_vec_insert(dep->wanted_by, pkg); | ||
| 24 | err = opkg_install_pkg(dep, 0); | ||
| 25 | /* mark this package as having been automatically installed to | ||
| 26 | * satisfy a dependancy */ | ||
| 27 | @@ -115,6 +121,8 @@ | ||
| 28 | /* The package was uninstalled when we started, but another | ||
| 29 | dep earlier in this loop may have depended on it and pulled | ||
| 30 | it in, so check first. */ | ||
| 31 | + if (!is_pkg_in_pkg_vec(dep->wanted_by, pkg)) | ||
| 32 | + pkg_vec_insert(dep->wanted_by, pkg); | ||
| 33 | if ((dep->state_status != SS_INSTALLED) | ||
| 34 | && (dep->state_status != SS_UNPACKED)) { | ||
| 35 | opkg_msg(DEBUG2,"Calling opkg_install_pkg.\n"); | ||
| 36 | Index: trunk/libopkg/pkg.c | ||
| 37 | =================================================================== | ||
| 38 | --- trunk.orig/libopkg/pkg.c 2011-12-18 11:12:39.976729002 +0000 | ||
| 39 | +++ trunk/libopkg/pkg.c 2011-12-18 11:22:34.528715535 +0000 | ||
| 40 | @@ -86,6 +86,7 @@ | ||
| 41 | pkg->section = NULL; | ||
| 42 | pkg->description = NULL; | ||
| 43 | pkg->state_want = SW_UNKNOWN; | ||
| 44 | + pkg->wanted_by = pkg_vec_alloc(); | ||
| 45 | pkg->state_flag = SF_OK; | ||
| 46 | pkg->state_status = SS_NOT_INSTALLED; | ||
| 47 | pkg->depends_str = NULL; | ||
| 48 | @@ -191,6 +192,7 @@ | ||
| 49 | pkg->description = NULL; | ||
| 50 | |||
| 51 | pkg->state_want = SW_UNKNOWN; | ||
| 52 | + pkg_vec_free(pkg->wanted_by); | ||
| 53 | pkg->state_flag = SF_OK; | ||
| 54 | pkg->state_status = SS_NOT_INSTALLED; | ||
| 55 | |||
| 56 | Index: trunk/libopkg/pkg.h | ||
| 57 | =================================================================== | ||
| 58 | --- trunk.orig/libopkg/pkg.h 2011-12-18 11:12:37.120728742 +0000 | ||
| 59 | +++ trunk/libopkg/pkg.h 2011-12-18 11:15:39.080725150 +0000 | ||
| 60 | @@ -129,6 +129,7 @@ | ||
| 61 | char *description; | ||
| 62 | char *tags; | ||
| 63 | pkg_state_want_t state_want; | ||
| 64 | + pkg_vec_t *wanted_by; | ||
| 65 | pkg_state_flag_t state_flag; | ||
| 66 | pkg_state_status_t state_status; | ||
| 67 | char **depends_str; | ||
| 68 | Index: trunk/libopkg/pkg_depends.c | ||
| 69 | =================================================================== | ||
| 70 | --- trunk.orig/libopkg/pkg_depends.c 2011-12-18 11:14:24.464726569 +0000 | ||
| 71 | +++ trunk/libopkg/pkg_depends.c 2011-12-18 11:30:32.516704127 +0000 | ||
| 72 | @@ -30,7 +30,6 @@ | ||
| 73 | static depend_t * depend_init(void); | ||
| 74 | static char ** add_unresolved_dep(pkg_t * pkg, char ** the_lost, int ref_ndx); | ||
| 75 | static char ** merge_unresolved(char ** oldstuff, char ** newstuff); | ||
| 76 | -static int is_pkg_in_pkg_vec(pkg_vec_t * vec, pkg_t * pkg); | ||
| 77 | |||
| 78 | static int pkg_installed_and_constraint_satisfied(pkg_t *pkg, void *cdata) | ||
| 79 | { | ||
| 80 | @@ -531,7 +530,7 @@ | ||
| 81 | return 0; | ||
| 82 | } | ||
| 83 | |||
| 84 | -static int is_pkg_in_pkg_vec(pkg_vec_t * vec, pkg_t * pkg) | ||
| 85 | +int is_pkg_in_pkg_vec(pkg_vec_t * vec, pkg_t * pkg) | ||
| 86 | { | ||
| 87 | int i; | ||
| 88 | pkg_t ** pkgs = vec->pkgs; | ||
| 89 | Index: trunk/libopkg/pkg_depends.h | ||
| 90 | =================================================================== | ||
| 91 | --- trunk.orig/libopkg/pkg_depends.h 2011-12-18 11:28:51.960706484 +0000 | ||
| 92 | +++ trunk/libopkg/pkg_depends.h 2011-12-18 11:29:19.400705862 +0000 | ||
| 93 | @@ -87,5 +87,6 @@ | ||
| 94 | int pkg_dependence_satisfiable(depend_t *depend); | ||
| 95 | int pkg_dependence_satisfied(depend_t *depend); | ||
| 96 | const char* constraint_to_str(enum version_constraint c); | ||
| 97 | +int is_pkg_in_pkg_vec(pkg_vec_t * vec, pkg_t * pkg); | ||
| 98 | |||
| 99 | #endif | ||
diff --git a/meta/recipes-devtools/opkg/opkg_svn.bb b/meta/recipes-devtools/opkg/opkg_svn.bb index 2645d52c81..dbdfc7e82b 100644 --- a/meta/recipes-devtools/opkg/opkg_svn.bb +++ b/meta/recipes-devtools/opkg/opkg_svn.bb | |||
| @@ -15,13 +15,14 @@ SRC_URI = "svn://opkg.googlecode.com/svn;module=trunk;proto=http \ | |||
| 15 | file://fix_installorder.patch \ | 15 | file://fix_installorder.patch \ |
| 16 | file://offline_postinstall.patch\ | 16 | file://offline_postinstall.patch\ |
| 17 | file://offlineroot_varname.patch \ | 17 | file://offlineroot_varname.patch \ |
| 18 | file://track_parents.patch \ | ||
| 18 | " | 19 | " |
| 19 | 20 | ||
| 20 | S = "${WORKDIR}/trunk" | 21 | S = "${WORKDIR}/trunk" |
| 21 | 22 | ||
| 22 | SRCREV = "633" | 23 | SRCREV = "633" |
| 23 | PV = "0.1.8+svnr${SRCPV}" | 24 | PV = "0.1.8+svnr${SRCPV}" |
| 24 | PR = "r2" | 25 | PR = "r3" |
| 25 | 26 | ||
| 26 | PACKAGES =+ "libopkg${PKGSUFFIX}-dev libopkg${PKGSUFFIX} update-alternatives-cworth${PKGSUFFIX}" | 27 | PACKAGES =+ "libopkg${PKGSUFFIX}-dev libopkg${PKGSUFFIX} update-alternatives-cworth${PKGSUFFIX}" |
| 27 | 28 | ||
