CMDBuild Forum

Bug in history card view for double update in the same time

Dears,

I have some automated processing which performs twice update of a card during one transaction. The reason is to log two changes (two steps of some processing made out of CMDBuild and reported by one WS call to CMDBuild) into the card history. 

The result is that I have following rows in for one card:

(SELECT "Id", "BeginDate", NULL AS "EndDate" FROM "Asset" WHERE "Id" = 100316173 

UNION 

SELECT "Id", "BeginDate", "EndDate" FROM "Asset_history" WHERE "CurrentId" = 100316173)

ORDER BY "BeginDate" DESC, "EndDate" DESC, "Id" DESC;

    Id     |         BeginDate          |          EndDate

-----------+----------------------------+----------------------------

 100316173 | 2016-09-12 15:08:24.569755 |

 102981049 | 2016-09-12 15:08:24.569755 | 2016-09-12 15:08:24.569755

 102981046 | 2016-07-16 01:32:59.9333   | 2016-09-12 15:08:24.569755

 100820717 | 2016-07-16 01:31:49.828393 | 2016-07-16 01:32:59.9333

 100819387 | 2016-07-01 10:53:02.715633 | 2016-07-16 01:31:49.828393

 100325055 | 2016-07-01 10:51:47.541019 | 2016-07-01 10:53:02.715633

 100324134 | 2016-07-01 10:50:07.833976 | 2016-07-01 10:51:47.541019

It means I have two rows with identical BeginDates (actual and the first in the history).

The history card view in CMDBuild presents these rows in bad order:

1.) The history row with Id = 102981049 

2.) The actual row with Id = 100316173 

3.) The history row with Id = 102981046 

4.) Other rows are in good order. 

When I want to view the detail of the first history row the next error appears:

Call: services/json/management/modcard/gethistoriccard
-------------------------------------------------------
Error: org.cmdbuild.exception.NotFoundException: CARD_NOTFOUND Asset HISTORY
	at org.cmdbuild.exception.NotFoundException$NotFoundExceptionType.createException(NotFoundException.java:20)
	at org.cmdbuild.logic.data.access.DefaultDataAccessLogic.fetchCMCard(DefaultDataAccessLogic.java:427)
	at org.cmdbuild.logic.data.access.DefaultDataAccessLogic.fetchHistoricCard(DefaultDataAccessLogic.java:236)
	at org.cmdbuild.servlets.json.management.ModCard.getHistoricCard(ModCard.java:595)
	at sun.reflect.GeneratedMethodAccessor507.invoke(Unknown Source)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.lang.reflect.Method.invoke(Method.java:498)
	at org.cmdbuild.servlets.JSONDispatcher.dispatch(JSONDispatcher.java:107)
	at org.cmdbuild.servlets.JSONDispatcher.doPost(JSONDispatcher.java:67)
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:648)
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:729)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:292)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:207)
	at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:240)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:207)
	at org.cmdbuild.filters.AuthFilter.doFilter(AuthFilter.java:158)
	at org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:346)
	at org.springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:262)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:240)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:207)
	at org.cmdbuild.filters.PatchManagerFilter.doFilter(PatchManagerFilter.java:48)
	at org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:346)
	at org.springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:262)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:240)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:207)
	at org.cmdbuild.filters.ConfCheckFilter.doFilter(ConfCheckFilter.java:31)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:240)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:207)
	at org.cmdbuild.filters.TranslationFilter.doFilter(TranslationFilter.java:52)
	at org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:346)
	at org.springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:262)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:240)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:207)
	at org.cmdbuild.filters.LocalizationFilter.doFilter(LocalizationFilter.java:127)
	at org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:346)
	at org.springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:262)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:240)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:207)
	at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:212)
	at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:106)
	at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:502)
	at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:141)
	at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:79)
	at org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:616)
	at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:88)
	at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:522)
	at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1095)
	at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:672)
	at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1502)
	at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.run(NioEndpoint.java:1458)
	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
	at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
	at java.lang.Thread.run(Thread.java:745)

 

I have tried to insert sleep for 1 second between the two updates, but it has no effect, it seems the times are set into rows at the end of the transaction. 

When I make another update (for example manually) in later time, everything is OK. 

So, it seems to me as a bug in CMDBuild: not able to solve the begin time duplicity between actual and last historical row properly. 

Best regards, 

Jiří