Verbesserung
Top-Thema
Wichtig
Kleinigkeit
Wichtig
Folgende Situation: Eine Session befindet sich in r15. In einem "Live-Association-Cache", also in einem Cache, bei dem direkt die gecachte Liste geändert werden kann, wird eine Änderung vorgenommen (z.B. durch Umsortierung oder Hinzufügen). Der Lokale Cache wird angefordert. Vor dem Refetch im Commit wird in einer 2. Session ein neues Objekt hinzugefügt (in r16).
Jetzt schlägt das Commit (r17) fehl.
Ursache ist, dass zuerst der lokale !DBContext entfernt wird und dann die Association-Caches aktualisiert werden. Die Session ist aber noch nicht auf r17 aktualisiert, so das die neuen Objekte nicht mehr sichtbar sind (waren sie vorher weil sie über den DBContext sichtbar waren) und es so zu einem DeletedObjectAccess kommt.
Aufgefallen in Project
Bei der Umsortiertung der Projekte in Prime via Wartungsseite /com.top_logic.project.pos/webapp/jsp/administration/maintenance/SortProjects.jsp analog:
List childs = ProjectRoot::getChildren(); Collections.sort(childs); ProjectRoot::setValue(StructuredElement.CHILDREN_ATTR, childs);
Kam es im Commit zu folgendem Fehler bei der Aktualisierung / Publizierung der KB Caches:
2020-06-18 17:42:08,931 ERROR [Default Executor-thread-30]: c.i._._SortProjects -- Error: Failed to update project sort order. 2020-06-18 17:42:08,932 ERROR [Default Executor-thread-30]: c.i._._SortProjects -- com.top_logic.knowledge.service.db2.DeletedObjectAccess: Object hasStructureChild:7333763 already deleted. com.top_logic.knowledge.service.db2.DeletedObjectAccess: Object hasStructureChild:7333763 already deleted. at com.top_logic.knowledge.service.db2.DBKnowledgeItem.checkAlive(DBKnowledgeItem.java:836) at com.top_logic.knowledge.service.db2.DBKnowledgeItem.getAttributeValue(DBKnowledgeItem.java:175) at com.top_logic.knowledge.service.db2.DBKnowledgeItem.getAttributeValue(DBKnowledgeItem.java:169) at com.top_logic.knowledge.service.db2.DynamicKnowledgeItem.getAttributeValue(DynamicKnowledgeItem.java:101) at com.top_logic.knowledge.service.db2.DBKnowledgeItem.getAttributeValue(DBKnowledgeItem.java:125) at com.top_logic.knowledge.service.db2.AbstractDBKnowledgeItem.getAttributeValue(AbstractDBKnowledgeItem.java:298) at com.top_logic.knowledge.service.db2.LiveAssociationsList.getPosition(LiveAssociationsList.java:137) at com.top_logic.knowledge.service.db2.LiveAssociationsList.internalAdd(LiveAssociationsList.java:124) at com.top_logic.knowledge.service.db2.LiveAssociationsList.addLinkResolved(LiveAssociationsList.java:111) at com.top_logic.knowledge.service.db2.Associations.addLink(Associations.java:56) at com.top_logic.knowledge.service.db2.AssociationCache.createLocalCache(AssociationCache.java:286) at com.top_logic.knowledge.service.db2.AssociationCache.validateLocalCacheInCommit(AssociationCache.java:454) at com.top_logic.knowledge.service.db2.AssociationCache.internalCommit(AssociationCache.java:497) at com.top_logic.knowledge.service.db2.DefaultDBContext.publishAssociationCaches(DefaultDBContext.java:1063) at com.top_logic.knowledge.service.db2.DefaultDBContext.localCommit(DefaultDBContext.java:1056) at com.top_logic.knowledge.service.db2.DefaultDBContext.commitTransaction(DefaultDBContext.java:784) at com.top_logic.knowledge.service.db2.DefaultDBContext.commitAnonymous(DefaultDBContext.java:717) at com.top_logic.knowledge.service.db2.DBKnowledgeBase.commit(DBKnowledgeBase.java:2846) at com.top_logic.util.MaintenanceJspBase.commit(MaintenanceJspBase.java:294) at com.ibm._jsp._SortProjects.doWork(_SortProjects.java:100) at com.top_logic.util.MaintenanceJspBase.runWork(MaintenanceJspBase.java:317) at com.ibm._jsp._SortProjects._jspService(_SortProjects.java:389)
Test
TestAssociationCacheOrdered#testUpdateCacheOnConcurrentChange