[Yum-devel] yum on an olpc machine (slooooooooooow)

Panu Matilainen pmatilai at laiskiainen.org
Sat Dec 16 13:56:36 UTC 2006


On Fri, 15 Dec 2006, seth vidal wrote:
>
> any other ideas of obvious things to look at and/or interesting
> optimization ideas?

While by no means a groundbreaking improvement, delaying db index creation 
to happen after the initial import shaves off some 0.1-0.2s per repository 
in makecache operation on my system. Amounts to roughly ~1s saving on 
makecache with all repositories enabled.

Quick hack of a patch attached (against yum-metadata-parser 1.0-8.fc6), 
haven't done any extensive testing but doesn't seem to break anything 
either, knock wood ;)

 	- Panu -
-------------- next part --------------
diff -uNr yum-metadata-parser-1.0/db.c yum-metadata-parser-1.0-hacked/db.c
--- yum-metadata-parser-1.0/db.c	2006-12-16 15:28:35.000000000 +0200
+++ yum-metadata-parser-1.0-hacked/db.c	2006-12-16 15:27:41.000000000 +0200
@@ -350,24 +350,6 @@
         return;
     }
 
-    sql = "CREATE INDEX packagename ON packages (name)";
-    rc = sqlite3_exec (db, sql, NULL, NULL, NULL);
-    if (rc != SQLITE_OK) {
-        g_set_error (err, YUM_DB_ERROR, YUM_DB_ERROR,
-                     "Can not create packagename index: %s",
-                     sqlite3_errmsg (db));
-        return;
-    }
-    
-    sql = "CREATE INDEX packageId ON packages (pkgId)";
-    rc = sqlite3_exec (db, sql, NULL, NULL, NULL);
-    if (rc != SQLITE_OK) {
-        g_set_error (err, YUM_DB_ERROR, YUM_DB_ERROR,
-                     "Can not create packageId index: %s",
-                     sqlite3_errmsg (db));
-        return;
-    }
-
     sql =
         "CREATE TABLE files ("
         "  name TEXT,"
@@ -406,15 +388,6 @@
         }
     }
 
-    sql = "CREATE INDEX providesname ON provides (name)";
-    rc = sqlite3_exec (db, sql, NULL, NULL, NULL);
-    if (rc != SQLITE_OK) {
-        g_set_error (err, YUM_DB_ERROR, YUM_DB_ERROR,
-                     "Can not create providesname index: %s",
-                     sqlite3_errmsg (db));
-        return;
-    }
-
     sql =
         "CREATE TRIGGER removals AFTER DELETE ON packages"
         "  BEGIN"
@@ -434,6 +407,88 @@
     }
 }
 
+void
+yum_db_create_primary_index (sqlite3 *db, GError **err)
+{
+    int rc;
+    const char *sql;
+
+    sql = "CREATE INDEX packagename ON packages (name)";
+    rc = sqlite3_exec (db, sql, NULL, NULL, NULL);
+    if (rc != SQLITE_OK) {
+        g_set_error (err, YUM_DB_ERROR, YUM_DB_ERROR,
+                     "Can not create packagename index: %s",
+                     sqlite3_errmsg (db));
+        return;
+    }
+    
+    sql = "CREATE INDEX packageId ON packages (pkgId)";
+    rc = sqlite3_exec (db, sql, NULL, NULL, NULL);
+    if (rc != SQLITE_OK) {
+        g_set_error (err, YUM_DB_ERROR, YUM_DB_ERROR,
+                     "Can not create packageId index: %s",
+                     sqlite3_errmsg (db));
+        return;
+    }
+    sql = "CREATE INDEX providesname ON provides (name)";
+    rc = sqlite3_exec (db, sql, NULL, NULL, NULL);
+    if (rc != SQLITE_OK) {
+        g_set_error (err, YUM_DB_ERROR, YUM_DB_ERROR,
+                     "Can not create providesname index: %s",
+                     sqlite3_errmsg (db));
+        return;
+    }
+}
+
+void
+yum_db_create_filelist_index (sqlite3 *db, GError **err)
+{
+    int rc;
+    const char *sql;
+
+    sql = "CREATE INDEX keyfile ON filelist (pkgKey)";
+    rc = sqlite3_exec (db, sql, NULL, NULL, NULL);
+    if (rc != SQLITE_OK) {
+        g_set_error (err, YUM_DB_ERROR, YUM_DB_ERROR,
+                     "Can not create keyfile index: %s",
+                     sqlite3_errmsg (db));
+        return;
+    }
+
+    sql = "CREATE INDEX pkgId ON packages (pkgId)";
+    rc = sqlite3_exec (db, sql, NULL, NULL, NULL);
+    if (rc != SQLITE_OK) {
+        g_set_error (err, YUM_DB_ERROR, YUM_DB_ERROR,
+                     "Can not create pkgId index: %s",
+                     sqlite3_errmsg (db));
+        return;
+    }
+}
+
+void
+yum_db_create_other_index (sqlite3 *db, GError **err)
+{
+    int rc;
+    const char *sql;
+
+    sql = "CREATE INDEX keychange ON changelog (pkgKey)";
+    rc = sqlite3_exec (db, sql, NULL, NULL, NULL);
+    if (rc != SQLITE_OK) {
+        g_set_error (err, YUM_DB_ERROR, YUM_DB_ERROR,
+                     "Can not create keychange index: %s",
+                     sqlite3_errmsg (db));
+        return;
+    }
+
+    sql = "CREATE INDEX pkgId ON packages (pkgId)";
+    rc = sqlite3_exec (db, sql, NULL, NULL, NULL);
+    if (rc != SQLITE_OK) {
+        g_set_error (err, YUM_DB_ERROR, YUM_DB_ERROR,
+                     "Can not create pkgId index: %s",
+                     sqlite3_errmsg (db));
+        return;
+    }
+}
 sqlite3_stmt *
 yum_db_package_prepare (sqlite3 *db, GError **err)
 {
@@ -629,24 +684,6 @@
         return;
     }
 
-    sql = "CREATE INDEX keyfile ON filelist (pkgKey)";
-    rc = sqlite3_exec (db, sql, NULL, NULL, NULL);
-    if (rc != SQLITE_OK) {
-        g_set_error (err, YUM_DB_ERROR, YUM_DB_ERROR,
-                     "Can not create keyfile index: %s",
-                     sqlite3_errmsg (db));
-        return;
-    }
-
-    sql = "CREATE INDEX pkgId ON packages (pkgId)";
-    rc = sqlite3_exec (db, sql, NULL, NULL, NULL);
-    if (rc != SQLITE_OK) {
-        g_set_error (err, YUM_DB_ERROR, YUM_DB_ERROR,
-                     "Can not create pkgId index: %s",
-                     sqlite3_errmsg (db));
-        return;
-    }
-
     sql =
         "CREATE TRIGGER remove_filelist AFTER DELETE ON packages"
         "  BEGIN"
@@ -795,24 +832,6 @@
         return;
     }
 
-    sql = "CREATE INDEX keychange ON changelog (pkgKey)";
-    rc = sqlite3_exec (db, sql, NULL, NULL, NULL);
-    if (rc != SQLITE_OK) {
-        g_set_error (err, YUM_DB_ERROR, YUM_DB_ERROR,
-                     "Can not create keychange index: %s",
-                     sqlite3_errmsg (db));
-        return;
-    }
-
-    sql = "CREATE INDEX pkgId ON packages (pkgId)";
-    rc = sqlite3_exec (db, sql, NULL, NULL, NULL);
-    if (rc != SQLITE_OK) {
-        g_set_error (err, YUM_DB_ERROR, YUM_DB_ERROR,
-                     "Can not create pkgId index: %s",
-                     sqlite3_errmsg (db));
-        return;
-    }
-
     sql =
         "CREATE TRIGGER remove_changelogs AFTER DELETE ON packages"
         "  BEGIN"
diff -uNr yum-metadata-parser-1.0/db.h yum-metadata-parser-1.0-hacked/db.h
--- yum-metadata-parser-1.0/db.h	2006-06-06 16:36:45.000000000 +0300
+++ yum-metadata-parser-1.0-hacked/db.h	2006-12-16 15:14:47.000000000 +0200
@@ -44,6 +44,7 @@
 /* Primary */
 
 void          yum_db_create_primary_tables  (sqlite3 *db, GError **err);
+void          yum_db_create_primary_index   (sqlite3 *db, GError **err);
 sqlite3_stmt *yum_db_package_prepare        (sqlite3 *db, GError **err);
 void          yum_db_package_write          (sqlite3 *db,
                                              sqlite3_stmt *handle,
@@ -66,6 +67,7 @@
 /* Filelists */
 
 void          yum_db_create_filelist_tables (sqlite3 *db, GError **err);
+void          yum_db_create_filelist_index  (sqlite3 *db, GError **err);
 sqlite3_stmt *yum_db_package_ids_prepare    (sqlite3 *db, GError **err);
 void          yum_db_package_ids_write      (sqlite3 *db,
                                              sqlite3_stmt *handle,
@@ -78,6 +80,7 @@
 
 /* Other */
 void          yum_db_create_other_tables    (sqlite3 *db, GError **err);
+void          yum_db_create_other_index     (sqlite3 *db, GError **err);
 sqlite3_stmt *yum_db_changelog_prepare      (sqlite3 *db, GError **err);
 void          yum_db_changelog_write        (sqlite3 *db,
                                              sqlite3_stmt *handle,
diff -uNr yum-metadata-parser-1.0/sqlitecache.c yum-metadata-parser-1.0-hacked/sqlitecache.c
--- yum-metadata-parser-1.0/sqlitecache.c	2006-12-16 15:28:35.000000000 +0200
+++ yum-metadata-parser-1.0-hacked/sqlitecache.c	2006-12-16 15:16:00.000000000 +0200
@@ -275,6 +275,8 @@
         goto cleanup;
     sqlite3_exec (update_info->db, "COMMIT", NULL, NULL, NULL);
 
+    yum_db_create_primary_index(update_info->db, err);
+
     update_info_remove_old_entries (update_info);
 
     yum_db_dbinfo_update (update_info->db, checksum, err);
@@ -374,6 +376,8 @@
         goto cleanup;
     sqlite3_exec (update_info->db, "COMMIT", NULL, NULL, NULL);
 
+    yum_db_create_filelist_index(update_info->db, err);
+
     update_info_remove_old_entries (update_info);
     yum_db_dbinfo_update (update_info->db, checksum, err);
 
@@ -475,6 +479,8 @@
         goto cleanup;
     sqlite3_exec (update_info->db, "COMMIT", NULL, NULL, NULL);
 
+    yum_db_create_other_index(update_info->db, err);
+
     update_info_remove_old_entries (update_info);
     yum_db_dbinfo_update (update_info->db, checksum, err);
 


More information about the Yum-devel mailing list