Login
[x]
Log in using an account from:
Fedora Account System
Red Hat Associate
Red Hat Customer
Or login using a Red Hat Bugzilla account
Forgot Password
Login:
Hide Forgot
Create an Account
Red Hat Bugzilla – Attachment 930985 Details for
Bug 1128726
Evolution freeze during migration of pre-2.24 mails
[?]
New
Simple Search
Advanced Search
My Links
Browse
Requests
Reports
Current State
Search
Tabular reports
Graphical reports
Duplicates
Other Reports
User Changes
Plotly Reports
Bug Status
Bug Severity
Non-Defaults
|
Product Dashboard
Help
Page Help!
Bug Writing Guidelines
What's new
Browser Support Policy
5.0.4.rh83 Release notes
FAQ
Guides index
User guide
Web Services
Contact
Legal
This site requires JavaScript to be enabled to function correctly, please enable it.
[patch]
eds patch
eds.patch (text/plain), 13.97 KB, created by
Milan Crha
on 2014-08-26 13:40:32 UTC
(
hide
)
Description:
eds patch
Filename:
MIME Type:
Creator:
Milan Crha
Created:
2014-08-26 13:40:32 UTC
Size:
13.97 KB
patch
obsolete
>Index: camel/camel-vee-folder.c >=================================================================== >--- camel/camel-vee-folder.c (revision 23) >+++ camel/camel-vee-folder.c (working copy) >@@ -564,7 +564,7 @@ folder_changed_change (CamelSession *ses > > parent_store = camel_folder_get_parent_store (folder); > full_name = camel_folder_get_full_name (folder); >- unm_full_name = camel_folder_get_full_name (CAMEL_FOLDER (folder_unmatched)); >+ unm_full_name = folder_unmatched ? camel_folder_get_full_name (CAMEL_FOLDER (folder_unmatched)) : NULL; > > camel_db_begin_transaction (parent_store->cdb_w, NULL); > >@@ -572,10 +572,12 @@ folder_changed_change (CamelSession *ses > vfolder_add_remove_transaction (parent_store, full_name, &m_added_l, TRUE, NULL); > if (m_removed_l) > vfolder_add_remove_transaction (parent_store, full_name, &m_removed_l, FALSE, NULL); >- if (unm_added_l) >- vfolder_add_remove_transaction (parent_store, unm_full_name, &unm_added_l, TRUE, NULL); >- if (unm_removed_l) >- vfolder_add_remove_transaction (parent_store, unm_full_name, &unm_removed_l, FALSE, NULL); >+ if (unm_full_name) { >+ if (unm_added_l) >+ vfolder_add_remove_transaction (parent_store, unm_full_name, &unm_added_l, TRUE, NULL); >+ if (unm_removed_l) >+ vfolder_add_remove_transaction (parent_store, unm_full_name, &unm_removed_l, FALSE, NULL); >+ } > > camel_db_end_transaction (parent_store->cdb_w, NULL); > } >Index: camel/camel-folder-search.c >=================================================================== >--- camel/camel-folder-search.c (revision 18) >+++ camel/camel-folder-search.c (working copy) >@@ -698,7 +698,8 @@ camel_folder_search_search (CamelFolderS > /* Suppress no such table */ > g_clear_error (&local_error); > } >- g_propagate_error (error, local_error); >+ if (local_error) >+ g_propagate_error (error, local_error); > } > g_free (tmp); > >Index: camel/camel-db.c >=================================================================== >--- camel/camel-db.c (revision 23) >+++ camel/camel-db.c (working copy) >@@ -41,12 +41,6 @@ > /* how long to wait before invoking sync on the file */ > #define SYNC_TIMEOUT_SECONDS 5 > >-#define READER_LOCK(cdb) g_static_rw_lock_reader_lock (&cdb->priv->rwlock) >-#define READER_UNLOCK(cdb) g_static_rw_lock_reader_unlock (&cdb->priv->rwlock) >-#define WRITER_LOCK(cdb) g_static_rw_lock_writer_lock (&cdb->priv->rwlock) >-#define WRITER_UNLOCK(cdb) g_static_rw_lock_writer_unlock (&cdb->priv->rwlock) >- >- > static sqlite3_vfs *old_vfs = NULL; > > typedef struct { >@@ -361,7 +355,9 @@ struct _CamelDBPrivate { > GTimer *timer; > GStaticRWLock rwlock; > gchar *file_name; >- gboolean transaction_is_on; >+ GMutex *transaction_lock; >+ GThread *transaction_thread; >+ guint32 transaction_level; > }; > > /** >@@ -452,6 +448,120 @@ cdb_match_func (sqlite3_context *ctx, gi > sqlite3_result_int (ctx, matches ? 1 : 0); > } > >+static void >+cdb_writer_lock (CamelDB *cdb) >+{ >+ g_return_if_fail (cdb != NULL); >+ g_return_if_fail (cdb->priv->transaction_lock != NULL); >+ >+ g_mutex_lock (cdb->priv->transaction_lock); >+ if (cdb->priv->transaction_thread != g_thread_self ()) { >+ g_mutex_unlock (cdb->priv->transaction_lock); >+ >+ g_static_rw_lock_writer_lock (&cdb->priv->rwlock); >+ >+ g_mutex_lock (cdb->priv->transaction_lock); >+ >+ g_warn_if_fail (cdb->priv->transaction_thread == NULL); >+ g_warn_if_fail (cdb->priv->transaction_level == 0); >+ >+ cdb->priv->transaction_thread = g_thread_self (); >+ } >+ >+ cdb->priv->transaction_level++; >+ >+ g_mutex_unlock (cdb->priv->transaction_lock); >+} >+ >+static void >+cdb_writer_unlock (CamelDB *cdb) >+{ >+ g_return_if_fail (cdb != NULL); >+ g_return_if_fail (cdb->priv->transaction_lock != NULL); >+ >+ g_mutex_lock (cdb->priv->transaction_lock); >+ >+ g_warn_if_fail (cdb->priv->transaction_thread == g_thread_self ()); >+ g_warn_if_fail (cdb->priv->transaction_level > 0); >+ >+ cdb->priv->transaction_level--; >+ >+ if (!cdb->priv->transaction_level) { >+ cdb->priv->transaction_thread = NULL; >+ g_mutex_unlock (cdb->priv->transaction_lock); >+ >+ g_static_rw_lock_writer_unlock (&cdb->priv->rwlock); >+ } else { >+ g_mutex_unlock (cdb->priv->transaction_lock); >+ } >+} >+ >+static void >+cdb_reader_lock (CamelDB *cdb) >+{ >+ g_return_if_fail (cdb != NULL); >+ g_return_if_fail (cdb->priv->transaction_lock != NULL); >+ >+ g_mutex_lock (cdb->priv->transaction_lock); >+ if (cdb->priv->transaction_thread == g_thread_self ()) { >+ /* already holding write lock */ >+ g_mutex_unlock (cdb->priv->transaction_lock); >+ } else { >+ g_mutex_unlock (cdb->priv->transaction_lock); >+ >+ g_static_rw_lock_reader_lock (&cdb->priv->rwlock); >+ } >+} >+ >+static void >+cdb_reader_unlock (CamelDB *cdb) >+{ >+ g_return_if_fail (cdb != NULL); >+ g_return_if_fail (cdb->priv->transaction_lock != NULL); >+ >+ g_mutex_lock (cdb->priv->transaction_lock); >+ if (cdb->priv->transaction_thread == g_thread_self ()) { >+ /* already holding write lock */ >+ g_mutex_unlock (cdb->priv->transaction_lock); >+ } else { >+ g_mutex_unlock (cdb->priv->transaction_lock); >+ >+ g_static_rw_lock_reader_unlock (&cdb->priv->rwlock); >+ } >+} >+ >+static gboolean >+cdb_is_in_transaction (CamelDB *cdb) >+{ >+ gboolean res; >+ >+ g_return_val_if_fail (cdb != NULL, FALSE); >+ g_return_val_if_fail (cdb->priv->transaction_lock != NULL, FALSE); >+ >+ g_mutex_lock (cdb->priv->transaction_lock); >+ res = cdb->priv->transaction_level > 0 && cdb->priv->transaction_thread == g_thread_self (); >+ g_mutex_unlock (cdb->priv->transaction_lock); >+ >+ return res; >+} >+ >+static gchar * >+cdb_construct_transaction_stmt (CamelDB *cdb, >+ const gchar *prefix) >+{ >+ gchar *name; >+ >+ g_return_val_if_fail (cdb != NULL, NULL); >+ g_return_val_if_fail (cdb->priv->transaction_lock != NULL, NULL); >+ >+ g_mutex_lock (cdb->priv->transaction_lock); >+ g_warn_if_fail (cdb->priv->transaction_thread == g_thread_self ()); >+ name = g_strdup_printf ("%sTN%d", prefix ? prefix : "", cdb->priv->transaction_level); >+ g_mutex_unlock (cdb->priv->transaction_lock); >+ >+ return name; >+} >+ > /** > * camel_db_open: > * >@@ -492,8 +602,11 @@ camel_db_open (const gchar *path, > > cdb = g_new (CamelDB, 1); > cdb->db = db; >- cdb->priv = g_new (CamelDBPrivate, 1); >+ cdb->priv = g_new0 (CamelDBPrivate, 1); > cdb->priv->file_name = g_strdup (path); >+ cdb->priv->transaction_lock = g_mutex_new (); >+ cdb->priv->transaction_thread = NULL; >+ cdb->priv->transaction_level = 0; > g_static_rw_lock_init (&cdb->priv->rwlock); > cdb->priv->timer = NULL; > d(g_print ("\nDatabase succesfully opened \n")); >@@ -545,6 +658,7 @@ camel_db_close (CamelDB *cdb) > if (cdb) { > sqlite3_close (cdb->db); > g_static_rw_lock_free (&cdb->priv->rwlock); >+ g_mutex_free (cdb->priv->transaction_lock); > g_free (cdb->priv->file_name); > g_free (cdb->priv); > g_free (cdb); >@@ -565,11 +679,11 @@ camel_db_set_collate (CamelDB *cdb, cons > if (!cdb) > return 0; > >- WRITER_LOCK (cdb); >+ cdb_writer_lock (cdb); > d(g_print("Creating Collation %s on %s with %p\n", collate, col, (gpointer) func)); > if (collate && func) > ret = sqlite3_create_collation (cdb->db, collate, SQLITE_UTF8, NULL, func); >- WRITER_UNLOCK (cdb); >+ cdb_writer_unlock (cdb); > > return ret; > } >@@ -589,13 +703,13 @@ camel_db_command (CamelDB *cdb, > if (!cdb) > return TRUE; > >- WRITER_LOCK (cdb); >+ cdb_writer_lock (cdb); > > START (stmt); > ret = cdb_sql_exec (cdb->db, stmt, NULL, NULL, error); > END; > >- WRITER_UNLOCK (cdb); >+ cdb_writer_unlock (cdb); > > > return ret; >@@ -610,15 +724,21 @@ gint > camel_db_begin_transaction (CamelDB *cdb, > GError **error) > { >+ gchar *stmt; >+ gint res; >+ > if (!cdb) > return -1; > >- WRITER_LOCK (cdb); >- STARTTS("BEGIN"); >+ cdb_writer_lock (cdb); >+ >+ stmt = cdb_construct_transaction_stmt (cdb, "SAVEPOINT "); > >- cdb->priv->transaction_is_on = TRUE; >+ STARTTS (stmt); >+ res = cdb_sql_exec (cdb->db, stmt, NULL, NULL, error); >+ g_free (stmt); > >- return (cdb_sql_exec (cdb->db, "BEGIN", NULL, NULL, error)); >+ return res; > } > > /** >@@ -630,15 +750,18 @@ gint > camel_db_end_transaction (CamelDB *cdb, > GError **error) > { >+ gchar *stmt; > gint ret; >+ > if (!cdb) > return -1; > >- ret = cdb_sql_exec (cdb->db, "COMMIT", NULL, NULL, error); >- cdb->priv->transaction_is_on = FALSE; >- >+ stmt = cdb_construct_transaction_stmt (cdb, "RELEASE SAVEPOINT "); >+ ret = cdb_sql_exec (cdb->db, stmt, NULL, NULL, error); >+ g_free (stmt); >+ > ENDTS; >- WRITER_UNLOCK (cdb); >+ cdb_writer_unlock (cdb); > CAMEL_DB_RELEASE_SQLITE_MEMORY; > > return ret; >@@ -653,12 +776,14 @@ gint > camel_db_abort_transaction (CamelDB *cdb, > GError **error) > { >+ gchar *stmt; > gint ret; > >- ret = cdb_sql_exec (cdb->db, "ROLLBACK", NULL, NULL, error); >- cdb->priv->transaction_is_on = FALSE; >+ stmt = cdb_construct_transaction_stmt (cdb, "ROLLBACK TO SAVEPOINT "); >+ ret = cdb_sql_exec (cdb->db, stmt, NULL, NULL, error); >+ g_free (stmt); > >- WRITER_UNLOCK (cdb); >+ cdb_writer_unlock (cdb); > CAMEL_DB_RELEASE_SQLITE_MEMORY; > > return ret; >@@ -677,7 +802,7 @@ camel_db_add_to_transaction (CamelDB *cd > if (!cdb) > return -1; > >- g_assert (cdb->priv->transaction_is_on == TRUE); >+ g_return_val_if_fail (cdb_is_in_transaction (cdb), -1); > > return (cdb_sql_exec (cdb->db, stmt, NULL, NULL, error)); > } >@@ -692,19 +817,19 @@ camel_db_transaction_command (CamelDB *c > GSList *qry_list, > GError **error) > { >+ gboolean in_transaction = FALSE; > gint ret; > const gchar *query; > > if (!cdb) > return -1; > >- WRITER_LOCK (cdb); >- >- STARTTS("BEGIN"); >- ret = cdb_sql_exec (cdb->db, "BEGIN", NULL, NULL, error); >+ ret = camel_db_begin_transaction (cdb, error); > if (ret) > goto end; > >+ in_transaction = TRUE; >+ > while (qry_list) { > query = qry_list->data; > ret = cdb_sql_exec (cdb->db, query, NULL, NULL, error); >@@ -713,10 +838,12 @@ camel_db_transaction_command (CamelDB *c > qry_list = g_slist_next (qry_list); > } > >- ret = cdb_sql_exec (cdb->db, "COMMIT", NULL, NULL, error); >- ENDTS; >+ ret = camel_db_end_transaction (cdb, error); >+ in_transaction = FALSE; > end: >- WRITER_UNLOCK (cdb); >+ if (in_transaction) >+ ret = camel_db_abort_transaction (cdb, error); >+ > return ret; > } > >@@ -748,13 +875,13 @@ camel_db_count_message_info (CamelDB *cd > gint ret = -1; > > >- READER_LOCK (cdb); >+ cdb_reader_lock (cdb); > > START (query); > ret = cdb_sql_exec (cdb->db, query, count_cb, count, error); > END; > >- READER_UNLOCK (cdb); >+ cdb_reader_unlock (cdb); > > CAMEL_DB_RELEASE_SQLITE_MEMORY; > >@@ -955,13 +1082,13 @@ camel_db_select (CamelDB *cdb, > return ret; > > d(g_print ("\n%s:\n%s \n", G_STRFUNC, stmt)); >- READER_LOCK (cdb); >+ cdb_reader_lock (cdb); > > START (stmt); > ret = cdb_sql_exec (cdb->db, stmt, callback, data, error); > END; > >- READER_UNLOCK (cdb); >+ cdb_reader_unlock (cdb); > CAMEL_DB_RELEASE_SQLITE_MEMORY; > > return ret; >@@ -1477,7 +1604,10 @@ camel_db_migrate_folder_prepare (CamelDB > > /* Migration stage one: storing the old data */ > >- if (version < 1) { >+ if (version < 0) { >+ ret = camel_db_create_message_info_table (cdb, folder_name, error); >+ g_clear_error (error); >+ } else if (version < 1) { > > /* Between version 0-1 the following things are changed > * ADDED: created: time >@@ -1488,18 +1618,22 @@ camel_db_migrate_folder_prepare (CamelDB > table_creation_query = sqlite3_mprintf ("DROP TABLE IF EXISTS 'mem.%q'", folder_name); > ret = camel_db_add_to_transaction (cdb, table_creation_query, error); > sqlite3_free (table_creation_query); >+ g_clear_error (error); > > table_creation_query = sqlite3_mprintf ("CREATE TEMP TABLE IF NOT EXISTS 'mem.%q' ( uid TEXT PRIMARY KEY , flags INTEGER , msg_type INTEGER , read INTEGER , deleted INTEGER , replied INTEGER , important INTEGER , junk INTEGER , attachment INTEGER , dirty INTEGER , size INTEGER , dsent NUMERIC , dreceived NUMERIC , subject TEXT , mail_from TEXT , mail_to TEXT , mail_cc TEXT , mlist TEXT , followup_flag TEXT , followup_completed_on TEXT , followup_due_by TEXT , part TEXT , labels TEXT , usertags TEXT , cinfo TEXT , bdata TEXT, created TEXT, modified TEXT )", folder_name); > ret = camel_db_add_to_transaction (cdb, table_creation_query, error); > sqlite3_free (table_creation_query); >+ g_clear_error (error); > > table_creation_query = sqlite3_mprintf ("INSERT INTO 'mem.%q' SELECT uid , flags , msg_type , read , deleted , replied , important , junk , attachment , msg_security , size , dsent , dreceived , subject , mail_from , mail_to , mail_cc , mlist , followup_flag , followup_completed_on , followup_due_by , part , labels , usertags , cinfo , bdata , strftime(\"%%s\", 'now'), strftime(\"%%s\", 'now') FROM %Q", folder_name, folder_name); > ret = camel_db_add_to_transaction (cdb, table_creation_query, error); > sqlite3_free (table_creation_query); >+ g_clear_error (error); > > table_creation_query = sqlite3_mprintf ("DROP TABLE IF EXISTS %Q", folder_name); > ret = camel_db_add_to_transaction (cdb, table_creation_query, error); > sqlite3_free (table_creation_query); >+ g_clear_error (error); > > ret = camel_db_create_message_info_table (cdb, folder_name, error); > g_clear_error (error); >@@ -1645,6 +1779,7 @@ camel_db_prepare_message_info_table (Cam > GError **error) > { > gint ret, current_version; >+ gboolean in_transaction = TRUE; > GError *err = NULL; > > /* Make sure we have the table already */ >@@ -1654,11 +1789,17 @@ camel_db_prepare_message_info_table (Cam > goto exit; > > camel_db_end_transaction (cdb, &err); >+ in_transaction = FALSE; > > /* Migration stage zero: version fetch */ > current_version = camel_db_get_folder_version (cdb, folder_name, &err); >+ if (err && err->message && strstr (err->message, "no such table") != NULL) { >+ g_clear_error (&err); >+ current_version = -1; >+ } > > camel_db_begin_transaction (cdb, &err); >+ in_transaction = TRUE; > > /* Migration stage one: storing the old data if necessary */ > ret = camel_db_migrate_folder_prepare (cdb, folder_name, current_version, &err); >@@ -1676,9 +1817,10 @@ camel_db_prepare_message_info_table (Cam > goto exit; > > camel_db_end_transaction (cdb, &err); >+ in_transaction = FALSE; > > exit: >- if (err && cdb->priv->transaction_is_on) >+ if (err && in_transaction) > camel_db_abort_transaction (cdb, NULL); > > if (err)
You cannot view the attachment while viewing its details because your browser does not support IFRAMEs.
View the attachment on a separate page
.
View Attachment As Diff
View Attachment As Raw
Actions:
View
|
Diff
Attachments on
bug 1128726
:
925717
| 930985