deja-dup-team team mailing list archive
-
deja-dup-team team
-
Mailing list archive
-
Message #00555
[Merge] lp:~mterry/deja-dup/more-idle into lp:deja-dup
Michael Terry has proposed merging lp:~mterry/deja-dup/more-idle into lp:deja-dup.
Requested reviews:
Robert Bruce Park (robru)
For more details, see:
https://code.launchpad.net/~mterry/deja-dup/more-idle/+merge/154725
Newer versions of Linux support more aggressively idle states for processes.
In particular, non-root users can call "ionice -c3" in linux 2.6.25 and up. And "chrt --idle 0" is available in linux 2.6.23 and up.
So, we might as well use them, to reduce the strain of a backup on the system. Ideally the user never notices.
--
https://code.launchpad.net/~mterry/deja-dup/more-idle/+merge/154725
Your team Déjà Dup Developers is subscribed to branch lp:deja-dup.
=== modified file 'common/CommonUtils.vala'
--- common/CommonUtils.vala 2013-03-14 20:40:57 +0000
+++ common/CommonUtils.vala 2013-03-21 15:10:02 +0000
@@ -72,20 +72,61 @@
settings.apply();
}
+public bool parse_version(string version_string, out int major, out int minor,
+ out int micro)
+{
+ major = 0;
+ minor = 0;
+ micro = 0;
+
+ var ver_tokens = version_string.split(".");
+ if (ver_tokens == null || ver_tokens[0] == null)
+ return false;
+
+ major = int.parse(ver_tokens[0]);
+ // Don't error out if no minor or micro.
+ if (ver_tokens[1] != null) {
+ minor = int.parse(ver_tokens[1]);
+ if (ver_tokens[2] != null)
+ micro = int.parse(ver_tokens[2]);
+ }
+
+ return true;
+}
+
+public bool meets_version(int major, int minor, int micro,
+ int req_major, int req_minor, int req_micro)
+{
+ return (major > req_major) ||
+ (major == req_major && minor > req_minor) ||
+ (major == req_major && minor == req_minor && micro >= req_micro);
+}
+
public void run_deja_dup(string args, AppLaunchContext? ctx = null,
List<File>? files = null)
{
var cmd = "deja-dup %s".printf(args);
+ int major, minor, micro;
+ var utsname = Posix.utsname();
+ parse_version(utsname.release, out major, out minor, out micro);
+
// Check for ionice to be a good disk citizen
if (Environment.find_program_in_path("ionice") != null) {
- // lowest priority in best-effort class
- // (can't use idle class as normal user on <2.6.25)
- cmd = "ionice -c2 -n7 " + cmd;
+ // In Linux 2.6.25 and up, even normal users can request idle class
+ if (utsname.sysname == "Linux" && meets_version(major, minor, micro, 2, 6, 25))
+ cmd = "ionice -c3 " + cmd; // idle class
+ else
+ cmd = "ionice -c2 -n7 " + cmd; // lowest priority in best-effort class
}
- if (Environment.find_program_in_path("nice") != null)
- cmd = "nice " + cmd;
+ // chrt's idle class is more-idle than nice, so prefer it
+ if (utsname.sysname == "Linux" &&
+ meets_version(major, minor, micro, 2, 6, 23) &&
+ Environment.find_program_in_path("chrt") != null)
+ cmd = "chrt --idle 0 " + cmd;
+ else if (Environment.find_program_in_path("nice") != null)
+ cmd = "nice -n19 " + cmd;
var flags = AppInfoCreateFlags.SUPPORTS_STARTUP_NOTIFICATION |
AppInfoCreateFlags.SUPPORTS_URIS;
=== modified file 'tests/unit/unit-tests.vala'
--- tests/unit/unit-tests.vala 2012-12-04 16:08:06 +0000
+++ tests/unit/unit-tests.vala 2013-03-21 15:10:02 +0000
@@ -46,6 +46,38 @@
assert(DejaDup.parse_dir("file:VIDEOS").equal(File.parse_name("file:VIDEOS")));
}
+void parse_one_version(string str, int maj, int min, int mic)
+{
+ int pmaj, pmin, pmic;
+ assert(DejaDup.parse_version(str, out pmaj, out pmin, out pmic));
+ assert(pmaj == maj);
+ assert(pmin == min);
+ assert(pmic == mic);
+}
+
+void parse_bad_version(string str)
+{
+ int pmaj, pmin, pmic;
+ assert(!DejaDup.parse_version(str, out pmaj, out pmin, out pmic));
+ assert(pmaj == 0);
+ assert(pmin == 0);
+ assert(pmic == 0);
+}
+
+void parse_version()
+{
+ parse_bad_version("");
+ parse_one_version("a", 0, 0, 0);
+ parse_one_version("1", 1, 0, 0);
+ parse_one_version("1.2", 1, 2, 0);
+ parse_one_version("1.2.3", 1, 2, 3);
+ parse_one_version("1.2.3.4", 1, 2, 3);
+ parse_one_version("1.2.3a4", 1, 2, 3);
+ parse_one_version("1.2a3.4", 1, 2, 4);
+ parse_one_version("1.2 3.4", 1, 2, 4);
+ parse_one_version("1.2-3.4", 1, 2, 4);
+}
+
void setup()
{
}
@@ -64,6 +96,7 @@
var unit = new TestSuite("unit");
unit.add(new TestCase("parse-dir", setup, parse_dir, teardown));
+ unit.add(new TestCase("parse-version", setup, parse_version, teardown));
TestSuite.get_root().add_suite(unit);
return Test.run();
=== modified file 'tools/duplicity/DuplicityPlugin.vala'
--- tools/duplicity/DuplicityPlugin.vala 2013-01-23 22:04:16 +0000
+++ tools/duplicity/DuplicityPlugin.vala 2013-03-21 15:10:02 +0000
@@ -42,25 +42,11 @@
// First token is 'duplicity' and is ignorable. Second looks like '0.5.03'
var version_string = tokens[1].strip();
- var ver_tokens = version_string.split(".");
- if (ver_tokens == null || ver_tokens[0] == null)
+ int major, minor, micro;
+ if (!DejaDup.parse_version(version_string, out major, out minor, out micro))
throw new SpawnError.FAILED(_("Could not understand duplicity version ‘%s’.").printf(version_string));
- int major = 0;
- int minor = 0;
- int micro = 0;
- major = int.parse(ver_tokens[0]);
- // Don't error out if no minor or micro. Duplicity might not have them?
- if (ver_tokens[1] != null) {
- minor = int.parse(ver_tokens[1]);
- if (ver_tokens[2] != null)
- micro = int.parse(ver_tokens[2]);
- }
-
- var meets = (major > REQUIRED_MAJOR) ||
- (major == REQUIRED_MAJOR && minor > REQUIRED_MINOR) ||
- (major == REQUIRED_MAJOR && minor == REQUIRED_MINOR && micro >= REQUIRED_MICRO);
- if (!meets)
+ if (!DejaDup.meets_version(major, minor, micro, REQUIRED_MAJOR, REQUIRED_MINOR, REQUIRED_MICRO))
throw new SpawnError.FAILED(_("Déjà Dup Backup Tool requires at least version %d.%d.%.2d of duplicity, but only found version %d.%d.%.2d").printf(REQUIRED_MAJOR, REQUIRED_MINOR, REQUIRED_MICRO, major, minor, micro));
}
Follow ups