Commit ba541ad4 authored by Jérome Perrin's avatar Jérome Perrin

upgrader: upgrade catalog schema right after installing BTs

93e30e5e introduce a  new `user` table that is listed as a *search table*, so until this table is created all catalog queries are failing, and alarm tool, which relies on catalog fail with such a traceback:

```
ERROR TimerService Process timer error
Traceback (most recent call last):
  File "parts/erp5/product/TimerService/TimerService.py", line 102, in process_timer
    DateTime(prev_tick), DateTime(next_tick))
  File "parts/erp5/product/ERP5/Tool/AlarmTool.py", line 175, in process_timer
    self.tic()
  File "parts/erp5/product/ERP5/Tool/AlarmTool.py", line 135, in tic
    for alarm in self.getAlarmList(to_active=1):
  File "parts/erp5/product/ERP5/Tool/AlarmTool.py", line 111, in getAlarmList
    alarm_date={'query':now,'range':'ngt'}
  File "parts/erp5/product/ERP5Catalog/CatalogTool.py", line 702, in unrestrictedSearchResults
    return ZCatalog.searchResults(self, **kw)
  File "parts/erp5/product/ZSQLCatalog/ZSQLCatalog.py", line 1091, in searchResults
    return catalog.searchResults(REQUEST, **kw)
  File "parts/erp5/product/ZSQLCatalog/SQLCatalog.py", line 2585, in searchResults
    **kw
  File "parts/erp5/product/ZSQLCatalog/SQLCatalog.py", line 2554, in queryResults
    **kw
  File "parts/erp5/product/ZSQLCatalog/SQLCatalog.py", line 2418, in buildSQLQuery
    ignore_unknown_columns=ignore_unknown_columns,
  File "parts/erp5/product/ZSQLCatalog/SQLCatalog.py", line 2394, in buildEntireQuery
    query=self.buildQuery(kw, ignore_empty_string=ignore_empty_string, ignore_unknown_columns=ignore_unknown_columns),
  File "parts/erp5/product/ZSQLCatalog/SQLCatalog.py", line 2295, in buildQuery
    result = self.buildSingleQuery(key, value)
  File "parts/erp5/product/ZSQLCatalog/SQLCatalog.py", line 2087, in buildSingleQuery
    search_key, related_key_definition = self.getColumnSearchKey(key, search_key_name)
  File "parts/erp5/product/ZSQLCatalog/SQLCatalog.py", line 2049, in getColumnSearchKey
    related_key_definition = self.getRelatedKeyDefinition(key)
  File "parts/erp5/product/ZSQLCatalog/SQLCatalog.py", line 1999, in getRelatedKeyDefinition
    for entire_definition in self.getSQLCatalogRelatedKeyList([key]):
  File "parts/erp5/product/ZSQLCatalog/SQLCatalog.py", line 1935, in getSQLCatalogRelatedKeyList
    column_map = self._getSQLCatalogRelatedKeySet()
  File "parts/erp5/product/ZSQLCatalog/SQLCatalog.py", line 130, in wrapper
    result = transactional_cache[cache_id] = method(wrapped_self)
  File "parts/erp5/product/ZSQLCatalog/SQLCatalog.py", line 1908, in _getSQLCatalogRelatedKeySet
    column_map = self.getColumnMap()
  File "parts/erp5/product/ZSQLCatalog/SQLCatalog.py", line 130, in wrapper
    result = transactional_cache[cache_id] = method(wrapped_self)
  File "parts/erp5/product/ZSQLCatalog/SQLCatalog.py", line 1146, in getColumnMap
    for field in table_dict[table]:
KeyError: 'user'
```

This means that even if upgrader's post upgrade constraint are supposed to fix this by calling `portal_catalog.upgradeSchema`, because this constraint rely on alarm tool, it's already too late.

The suggested way to fix this is to also call [`portal_catalog.upgradeSchema`](https://lab.nexedi.com/nexedi/erp5/blob/c99fb9163503c5afdef59ecb124b3060b05330a4/bt5/erp5_upgrader/SkinTemplateItem/portal_skins/erp5_upgrader/TemplateTool_checkTableConsistency.py#L7) in the same transaction that the transaction upgrading business templates.

I have not completely removed `TemplateToolTableConsistencyConstraint`, because maybe there will be cases where just call post upgrade alarm to execute data migration steps after installing a business template manually. But you guys think it's better to completely merge `TemplateToolTableConsistencyConstraint` with `TemplateToolBusinessTemplateInstallationConstraint` I would be OK with that too.

Of course, we cannot just make
`TemplateToolTableConsistencyConstraint` an `upgrade` constraint, because there would be no guarantee that it's called after `TemplateToolBusinessTemplateInstallationConstraint`.

Also, I have not considered making [`getColumnMap` and friends](https://lab.nexedi.com/nexedi/erp5/blob/master/product/ZSQLCatalog/SQLCatalog.py#L1142) resilient to the case where a table listed in search tables does not exist, because it's would just have been failing later anyway and it's better to fail early in such case.

cc: @vpelletier @jm @seb @tiwariayush @gabriel

/reviewed-on !247
parents f88d9684 4b15663c
bt5_list, keep_bt5_id_set = context.Base_getUpgradeBusinessTemplateList() bt5_list, keep_bt5_id_set = context.Base_getUpgradeBusinessTemplateList()
template_tool = context.getPortalObject().portal_templates template_tool = context.getPortalObject().portal_templates
return template_tool.upgradeSite(bt5_list,
# First, upgrade business templates
message_list = template_tool.upgradeSite(bt5_list,
delete_orphaned=True, delete_orphaned=True,
keep_bt5_id_set=keep_bt5_id_set, keep_bt5_id_set=keep_bt5_id_set,
dry_run=(not fixit)) dry_run=(not fixit))
if fixit:
# if We have installed some business templates, we must also update
# the catalog tables structures in the same transaction, because these tables
# might be required for alarm framework to work and we may not be able to
# execute the post upgrade alarm.
message_list.extend(
template_tool.TemplateTool_checkTableConsistency(fixit=fixit))
return message_list
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment