> On Nov 6, 2018, at 2:50 AM, Geert Janssens <geert.gnuc...@kobaltwit.be> wrote: > > Op maandag 5 november 2018 17:07:25 CET schreef Robert Fewell: >> Hi, >> I was poking around with the CSV importer and I noticed the following, this >> may also be an issue with other importers on first use after creating a new >> file... >> With a new empty xml file, I used a one line transaction csv file with >> appropriate settings and the 'Account' set to 'Assets:Current >> Assets:Checking Account' and observed the following when I got to the match >> page... >> >> With the 'Checking Account' register open it would partly show the imported >> transactions, (this can be fixed by suspending GUI changes which I was >> going to propose in a PR) and the register would reload seven times. >> This reloading is caused by the triggering of the >> 'imap_convert_bayes_to_flat' function and as it is a new file you would not >> expect it to do any thing but it does. Adding a few print statements I get >> the following... >> >> matchmap_find_destination >> imap_convert_bayes_to_flat >> convert_imap_account_bayes_to_flat 'Assets' >> gnc_split_register_load called for account 'Assets:Current >> Assets:Checking Account' with list of 1 >> convert_imap_account_bayes_to_flat 'Current Assets' >> gnc_split_register_load called for account 'Assets:Current >> Assets:Checking Account' with list of 1 >> convert_imap_account_bayes_to_flat 'Checking Account' >> gnc_split_register_load called for account 'Assets:Current >> Assets:Checking Account' with list of 1 >> convert_imap_account_bayes_to_flat 'Liabilities' >> gnc_split_register_load called for account 'Assets:Current >> Assets:Checking Account' with list of 1 >> convert_imap_account_bayes_to_flat 'Income' >> gnc_split_register_load called for account 'Assets:Current >> Assets:Checking Account' with list of 1 >> convert_imap_account_bayes_to_flat 'Expenses' >> gnc_split_register_load called for account 'Assets:Current >> Assets:Checking Account' with list of 1 >> convert_imap_account_bayes_to_flat 'Equity' >> gnc_split_register_load called for account 'Assets:Current >> Assets:Checking Account' with list of 1 >> >> As you can see, seven accounts get updated forcing the register reload >> seven times, (not sure why those other accounts force a reload either), and >> this gets even worse if this first import is 100 transactions which would >> equate to 700 reloads. I have not worked out why all these accounts are >> updated or why after the first pass the converted flag is not set/noticed >> there by eliminating the convert for the rest of the transactions, it only >> seems to be noticed on subsequent imports. >> >> You also get this behaviour if you start the 'Import Map Dialogue' which >> may be the source of a report about that dialogue freezing but that needs >> more investigating. >> > This calls gnc_account_imap_get_info_bayes, which also calls > imap_convert_bayes_to_flat so the it will trigger the same account refreshes. > >> Any idea why these accounts are updated and why it runs on every import >> transaction row ? > > Why the accounts are updated: while only a run in the debugger will verify > it, > this is what I have gathered from reading the code: > > imap_convert_bayes_to_flat's sub functions will call xaccAccountBeginEdit and > xaccAccountCommitEdit at some point. This happens because it changes the > account's kvp frames that store the import maps. > > On the other side, the register code has set a watch on the register's > account(s) via the component manager. So each time the account signals a > change (or more precisely a successful run of xaccAccountCommitEdit) the > component manager will tell the register to refresh itself. > > As you suggest you can probably disable this by a call to > gnc_suspend_gui_refresh. > > Why it runs on every import transaction row ? I suspect this is because there > are no imap records stored yet and hence the feature flag that blocks the > conversion is not set yet. So for each transaction it will try to do the > conversion, find there's no converted imap record to store and skip setting > the feature flag. This will probably continue forever if the user doesn't use > bayesian matching at all. > This is a difficult issue to solve. We don't want to set the flat_bayes > conversion flag if there are no bayes maps because that would needlessly > break > backwards compatibility. We could make the conversion code more careful and > have it only commit to accounts if there really are changes to commit. And > add > a run time flag that signals the conversion has run already once. With that > conversion should only start if this flag is false AND the feature flag is > false. > However it may all be unnecessary and perhaps just blocking register updates > while the transaction matching (or the whole import code) is running may > eliminate the performance bottleneck already. > So I would start with that: block gui updates. > Then secondly, make the imap code more careful not to do unnecessary account > updates and lastly consider a run time flag. > > Like you though I suspect this may be at least one cause of the import issues > we see. Thanks for poking at it!
I think that we do want to set the feature flag in this case: The import map uses the flat layout and a pre-flat-bayes GnuCash won’t be able to read it, causing user frustration. That’s not to say that we shouldn’t also do everything we can to speed up the code--it’s really slow--and certainly suspending UI events while computing the import matches is a good idea. There’s something else going wrong, though: convert_imap_bayes_to_flat calls xaccAccountBeginEdit at the start and xaccAccountCommitEdit at the end. That should raise the edit level and prevent any interior calls to xaccAccountCommitEdit from doing anything. Regards, John Ralls _______________________________________________ gnucash-devel mailing list gnucash-devel@gnucash.org https://lists.gnucash.org/mailman/listinfo/gnucash-devel