From a93b4607c01e3d7518176269d285500f5b04d49b Mon Sep 17 00:00:00 2001 From: Boris Sekachev Date: Mon, 21 Sep 2020 12:30:19 +0300 Subject: [PATCH] Fixed two issues #2053 and #2202 (#2203) * Fixed two issues #2053 and #2202 * Updated changelog, updated versions * Updated core version --- CHANGELOG.md | 2 ++ cvat-core/package-lock.json | 2 +- cvat-core/package.json | 2 +- cvat-core/src/log.js | 2 +- cvat-core/src/logger-storage.js | 29 +++++++++++++++++------ cvat-ui/src/actions/annotation-actions.ts | 9 +++---- 6 files changed, 32 insertions(+), 14 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 9c4debf7..3b7bfb24 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -36,6 +36,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Fixed Data is not getting cleared, even after deleting the Task from Django Admin App() - Fixed blinking message: "Some tasks have not been showed because they do not have any data" () - Fixed case when a task with 0 jobs is shown as "Completed" in UI () +- Fixed use case when UI throws exception: Cannot read property 'objectType' of undefined #2053 () +- Fixed use case when logs could be saved twice or more times #2202 () ### Security - diff --git a/cvat-core/package-lock.json b/cvat-core/package-lock.json index 5b0644a8..43cc3a58 100644 --- a/cvat-core/package-lock.json +++ b/cvat-core/package-lock.json @@ -1,6 +1,6 @@ { "name": "cvat-core", - "version": "3.7.0", + "version": "3.7.1", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/cvat-core/package.json b/cvat-core/package.json index 013ed713..4735233d 100644 --- a/cvat-core/package.json +++ b/cvat-core/package.json @@ -1,6 +1,6 @@ { "name": "cvat-core", - "version": "3.7.0", + "version": "3.7.1", "description": "Part of Computer Vision Tool which presents an interface for client-side integration", "main": "babel.config.js", "scripts": { diff --git a/cvat-core/src/log.js b/cvat-core/src/log.js index cf3df86d..95ee8e14 100644 --- a/cvat-core/src/log.js +++ b/cvat-core/src/log.js @@ -196,7 +196,7 @@ class LogWithExceptionInfo extends Log { dump() { let body = super.dump(); - const payload = body.payload; + const { payload } = body; const client = detect(); body = { ...body, diff --git a/cvat-core/src/logger-storage.js b/cvat-core/src/logger-storage.js index ca6860af..a4bc4d8e 100644 --- a/cvat-core/src/logger-storage.js +++ b/cvat-core/src/logger-storage.js @@ -14,6 +14,12 @@ const { LogType } = require('./enums'); const WORKING_TIME_THRESHOLD = 100000; // ms, 1.66 min +function sleep(ms) { + return new Promise((resolve) => { + setTimeout(resolve, ms); + }); +} + class LoggerStorage { constructor() { this.clientID = Date.now().toString().substr(-6); @@ -22,6 +28,7 @@ class LoggerStorage { this.collection = []; this.ignoreRules = {}; // by event this.isActiveChecker = null; + this.saving = false; this.ignoreRules[LogType.zoomImage] = { lastLog: null, @@ -146,6 +153,10 @@ LoggerStorage.prototype.log.implementation = function (logType, payload, wait) { }; LoggerStorage.prototype.save.implementation = async function () { + while (this.saving) { + await sleep(100); + } + const collectionToSend = [...this.collection]; const lastLog = this.collection[this.collection.length - 1]; @@ -164,14 +175,18 @@ LoggerStorage.prototype.save.implementation = async function () { const userActivityLog = logFactory(LogType.sendUserActivity, logPayload); collectionToSend.push(userActivityLog); - await serverProxy.logs.save(collectionToSend.map((log) => log.dump())); - - for (const rule of Object.values(this.ignoreRules)) { - rule.lastLog = null; + try { + this.saving = true; + await serverProxy.logs.save(collectionToSend.map((log) => log.dump())); + for (const rule of Object.values(this.ignoreRules)) { + rule.lastLog = null; + } + this.collection = []; + this.workingTime = 0; + this.lastLogTime = Date.now(); + } finally { + this.saving = false; } - this.collection = []; - this.workingTime = 0; - this.lastLogTime = Date.now(); }; module.exports = new LoggerStorage(); diff --git a/cvat-ui/src/actions/annotation-actions.ts b/cvat-ui/src/actions/annotation-actions.ts index 856427fd..0e4edbdf 100644 --- a/cvat-ui/src/actions/annotation-actions.ts +++ b/cvat-ui/src/actions/annotation-actions.ts @@ -1001,7 +1001,7 @@ export function getJobAsync( export function saveAnnotationsAsync(sessionInstance: any): ThunkAction { return async (dispatch: ActionCreator): Promise => { - const { filters, frame, showAllInterpolationTracks } = receiveAnnotationsParameters(); + const { filters, showAllInterpolationTracks } = receiveAnnotationsParameters(); dispatch({ type: AnnotationActionTypes.SAVE_ANNOTATIONS, @@ -1021,9 +1021,6 @@ ThunkAction { }, }); }); - - const states = await sessionInstance - .annotations.get(frame, showAllInterpolationTracks, filters); await saveJobEvent.close(); await sessionInstance.logger.log( LogType.sendTaskInfo, @@ -1031,6 +1028,10 @@ ThunkAction { ); dispatch(saveLogsAsync()); + const { frame } = receiveAnnotationsParameters(); + const states = await sessionInstance + .annotations.get(frame, showAllInterpolationTracks, filters); + dispatch({ type: AnnotationActionTypes.SAVE_ANNOTATIONS_SUCCESS, payload: {