[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