Commit d420d411 authored by Timo Teräs's avatar Timo Teräs

solver: non preferred actions are worse then non preferred pinning

Otherwise we might start to change packages unexpectedly when not
upgrading. This also fixes some other things the solver might've
decided to do.

Add also few test cases to detect bad behaviour.
parent e128c95f
...@@ -39,11 +39,13 @@ struct apk_score { ...@@ -39,11 +39,13 @@ struct apk_score {
struct { struct {
#if __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__ #if __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__
unsigned short preference; unsigned short preference;
unsigned short non_preferred_pinnings;
unsigned short non_preferred_actions; unsigned short non_preferred_actions;
unsigned int conflicts; unsigned short conflicts;
#elif __BYTE_ORDER__ == __ORDER_BIG_ENDIAN__ #elif __BYTE_ORDER__ == __ORDER_BIG_ENDIAN__
unsigned int conflicts; unsigned short conflicts;
unsigned short non_preferred_actions; unsigned short non_preferred_actions;
unsigned short non_preferred_pinnings;
unsigned short preference; unsigned short preference;
#else #else
#error Unknown endianess. #error Unknown endianess.
...@@ -53,8 +55,8 @@ struct apk_score { ...@@ -53,8 +55,8 @@ struct apk_score {
}; };
}; };
#define SCORE_FMT "{%d/%d/%d}" #define SCORE_FMT "{%d/%d/%d,%d}"
#define SCORE_PRINTF(s) (s)->conflicts, (s)->non_preferred_actions, (s)->preference #define SCORE_PRINTF(s) (s)->conflicts, (s)->non_preferred_actions, (s)->non_preferred_pinnings, (s)->preference
enum { enum {
DECISION_ASSIGN = 0, DECISION_ASSIGN = 0,
...@@ -382,13 +384,21 @@ static int get_topology_score( ...@@ -382,13 +384,21 @@ static int get_topology_score(
preferred_repos = get_pinning_mask_repos(ss->db, preferred_pinning); preferred_repos = get_pinning_mask_repos(ss->db, preferred_pinning);
if (!(repos & preferred_repos)) if (!(repos & preferred_repos))
score.non_preferred_actions++; score.non_preferred_pinnings++;
if (ns->locked || (ns->allowed_pinning | ns->maybe_pinning) == ns->allowed_pinning) { if (ns->locked || (ns->allowed_pinning | ns->maybe_pinning) == ns->allowed_pinning) {
allowed_pinning = ns->allowed_pinning | preferred_pinning | APK_DEFAULT_PINNING_MASK; allowed_pinning = ns->allowed_pinning | preferred_pinning | APK_DEFAULT_PINNING_MASK;
allowed_repos = get_pinning_mask_repos(ss->db, allowed_pinning); allowed_repos = get_pinning_mask_repos(ss->db, allowed_pinning);
if (!(repos & allowed_repos)) if (!(repos & allowed_repos))
score.non_preferred_actions+=2; score.non_preferred_pinnings += 16;
#if 0
if (allowed_pinning & ~APK_DEFAULT_PINNING_MASK)
fprintf(stdout, PKG_VER_FMT": allow: %x, in: %x, reallyin: %x. score="SCORE_FMT"\n",
PKG_VER_PRINTF(pkg),
allowed_repos, repos, pkg->repos,
SCORE_PRINTF(&score));
#endif
} else { } else {
score_locked = FALSE; score_locked = FALSE;
} }
......
C:Q1eVpkasfqZAukAXFYbgwt4xffZWU=
P:a
V:3
S:1
I:1
D:b
C:Q1hdUpqRv5mYgJEqW52UmVsv23ysE=
P:b
V:3
S:1
I:1
C:Q1eVpkasfqZAukAXFYbg324xAt4WU=
P:c
V:3
S:1
I:1
D:a>=3
@ARGS
--test-repo basic.repo
--test-repo testing:pinning.repo2
--test-instdb pinning.installed2
--test-world "c@testing"
upgrade -a
@EXPECT
(1/3) Downgrading b (3 -> 2)
(2/3) Upgrading a@testing (3 -> 3.1)
(3/3) Upgrading c@testing (3 -> 3.1)
OK: 0 MiB in 3 packages
@ARGS
--test-repo basic.repo
--test-repo testing:pinning.repo2
--test-instdb pinning.installed2
--test-world "c@testing"
add
@EXPECT
OK: 0 MiB in 3 packages
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment