Fix device.getDrive returning incorrect promise
rolled back change in useradmin/view drivepull/4/head
parent
6a229eadb0
commit
0fa15ee61c
|
@ -193,7 +193,8 @@ async function getDrives(dongleId, includeDeleted, includeMeta) {
|
|||
}
|
||||
|
||||
async function getDrive(dongleId, identifier) {
|
||||
const drive = orm.models.drives.findOne({ where: { identifier, dongle_id: dongleId } });
|
||||
const drive = await orm.models.drives.findOne({ where: { identifier, dongle_id: dongleId } });
|
||||
console.log(drive);
|
||||
|
||||
if (drive.dataValues) return drive.dataValues;
|
||||
return null;
|
||||
|
|
|
@ -573,65 +573,64 @@ router.get('/useradmin/drive/:dongleId/:driveIdentifier', runAsyncWrapper(async
|
|||
<table border=1 cellpadding=2 cellspacing=2>
|
||||
<tr><th>segment</th><th>qcamera</th><th>qlog</th><th>fcamera</th><th>rlog</th><th>dcamera</th><th>processed</th><th>stalled</th></tr>`;
|
||||
|
||||
const directoryTree = dirTree(`${config.storagePath + device.dongle_id}/${dongleIdHash}/${driveIdentifierHash}/${drive.identifier}`);
|
||||
|
||||
const directoryTree = dirTree(config.storagePath + device.dongle_id + "/" + dongleIdHash + "/" + driveIdentifierHash + "/" + drive.identifier);
|
||||
const directorySegments = {};
|
||||
await Promise.all(directoryTree.children
|
||||
for (var i in directoryTree.children) {
|
||||
// skip any non-directory entries (for example m3u8 file in the drive directory)
|
||||
.filter((file) => file.type === 'directory')
|
||||
.map(async (directory) => {
|
||||
const segment = directory.name;
|
||||
if (directoryTree.children[i].type != 'directory') continue;
|
||||
|
||||
// generate file links
|
||||
const files = {
|
||||
qcamera: '--',
|
||||
fcamera: '--',
|
||||
dcamera: '--',
|
||||
qlog: '--',
|
||||
rlog: '--',
|
||||
};
|
||||
directory.children
|
||||
.filter((file) => file.name in files)
|
||||
.forEach((file) => {
|
||||
files[file.name] = `<a target="_blank" href="${driveUrl}${segment}/${file.name}">${file.name}</a>`;
|
||||
});
|
||||
var segment = directoryTree.children[i].name;
|
||||
|
||||
// get processed/stalled status
|
||||
let isProcessed = '?';
|
||||
let isStalled = '?';
|
||||
const driveSegment = await deviceController.getDriveSegment(device.dongle_id, drive.identifier, parseInt(segment, 10));
|
||||
|
||||
if (driveSegment) {
|
||||
isProcessed = driveSegment.is_processed;
|
||||
isStalled = driveSegment.is_stalled;
|
||||
}
|
||||
|
||||
directorySegments[`seg-${segment}`] = `<tr>
|
||||
<td>${segment}</td>
|
||||
<td>${files.qcamera}</td>
|
||||
<td>${files.qlog}</td>
|
||||
<td>${files.fcamera}</td>
|
||||
<td>${files.rlog}</td>
|
||||
<td>${files.dcamera}</td>
|
||||
<td>${isProcessed}</td>
|
||||
<td>${isStalled}</td>
|
||||
</tr>`;
|
||||
}));
|
||||
|
||||
for (let i = 0; i <= drive.max_segment; i++) {
|
||||
if (directorySegments[`seg-${i}`]) {
|
||||
response += directorySegments[`seg-${i}`];
|
||||
} else {
|
||||
response += `<tr><td>${i}</td><td>--</td><td>--</td><td>--</td><td>--</td><td>--</td><td>?</td><td>?</td></tr>`;
|
||||
var qcamera = '--';
|
||||
var fcamera = '--';
|
||||
var dcamera = '--';
|
||||
var qlog = '--';
|
||||
var rlog = '--';
|
||||
for (var c in directoryTree.children[i].children) {
|
||||
if (directoryTree.children[i].children[c].name == 'fcamera.hevc') fcamera = '<a target="_blank" href="' + driveUrl + segment + '/' + directoryTree.children[i].children[c].name + '">' + directoryTree.children[i].children[c].name + '</a>';
|
||||
if (directoryTree.children[i].children[c].name == 'dcamera.hevc') fcamera = '<a target="_blank" href="' + driveUrl + segment + '/' + directoryTree.children[i].children[c].name + '">' + directoryTree.children[i].children[c].name + '</a>';
|
||||
if (directoryTree.children[i].children[c].name == 'qcamera.ts') qcamera = '<a target="_blank" href="' + driveUrl + segment + '/' + directoryTree.children[i].children[c].name + '">' + directoryTree.children[i].children[c].name + '</a>';
|
||||
if (directoryTree.children[i].children[c].name == 'qlog.bz2') qlog = '<a target="_blank" href="' + driveUrl + segment + '/' + directoryTree.children[i].children[c].name + '">' + directoryTree.children[i].children[c].name + '</a>';
|
||||
if (directoryTree.children[i].children[c].name == 'rlog.bz2') rlog = '<a target="_blank" href="' + driveUrl + segment + '/' + directoryTree.children[i].children[c].name + '">' + directoryTree.children[i].children[c].name + '</a>';
|
||||
}
|
||||
}
|
||||
|
||||
response += `</table>
|
||||
<br><br>
|
||||
<hr/>
|
||||
<a href="/useradmin/signout">Sign Out</a></body></html>`;
|
||||
var isProcessed = '?';
|
||||
var isStalled = '?';
|
||||
|
||||
return res.status(200).send(response);
|
||||
}));
|
||||
const drive_segment = await models.__db.get('SELECT * FROM drive_segments WHERE segment_id = ? AND drive_identifier = ? AND dongle_id = ?', parseInt(segment), drive.identifier, device.dongle_id);
|
||||
|
||||
if (drive_segment) {
|
||||
isProcessed = drive_segment.is_processed;
|
||||
isStalled = drive_segment.is_stalled;
|
||||
}
|
||||
|
||||
directorySegments["seg-" + segment] = '<tr><td>' + segment + '</td><td>' + qcamera + '</td><td>' + qlog + '</td><td>' + fcamera + '</td><td>' + rlog + '</td><td>' + dcamera + '</td><td>' + isProcessed + '</td><td>' + isStalled + '</td></tr>';
|
||||
}
|
||||
|
||||
var qcamera = '--';
|
||||
var fcamera = '--';
|
||||
var dcamera = '--';
|
||||
var qlog = '--';
|
||||
var rlog = '--';
|
||||
var isProcessed = '?';
|
||||
var isStalled = '?';
|
||||
|
||||
for (var i = 0; i <= drive.max_segment; i++) {
|
||||
if (directorySegments["seg-" + i] == undefined) {
|
||||
response += '<tr><td>' + i + '</td><td>' + qcamera + '</td><td>' + qlog + '</td><td>' + fcamera + '</td><td>' + rlog + '</td><td>' + dcamera + '</td><td>' + isProcessed + '</td><td>' + isStalled + '</td></tr>';
|
||||
} else
|
||||
response += directorySegments["seg-" + i];
|
||||
}
|
||||
|
||||
response += `</table>
|
||||
<br><br>
|
||||
<hr/>
|
||||
<a href="/useradmin/signout">Sign Out</a></body></html>`;
|
||||
|
||||
res.status(200);
|
||||
res.send(response);
|
||||
|
||||
}))
|
||||
|
||||
export default router;
|
||||
|
|
80
worker.js
80
worker.js
|
@ -14,6 +14,7 @@ import { execSync } from 'child_process';
|
|||
import Reader from '@commaai/log_reader';
|
||||
import ffprobe from 'ffprobe';
|
||||
import ffprobeStatic from 'ffprobe-static';
|
||||
import orm from './models/index.model'
|
||||
|
||||
var db = null;
|
||||
|
||||
|
@ -366,19 +367,15 @@ function processSegmentsRecursive() {
|
|||
(async () => {
|
||||
logger.info(`processSegmentsRecursive ${segment.dongle_id} ${segment.drive_identifier} ${segment.segment_id} internal gps: ${Math.round(rlog_totalDistInternal * 100) / 100}m, external gps: ${Math.round(rlog_totalDistExternal * 100) / 100}m, duration: ${qcamera_duration}s`);
|
||||
|
||||
const driveSegmentResult = await dbProtectedRun(
|
||||
'UPDATE drive_segments SET duration = ?, distance_meters = ?, is_processed = ?, upload_complete = ?, is_stalled = ? WHERE id = ?',
|
||||
qcamera_duration,
|
||||
const driveSegmentResult = await orm.models.drive_segments.update({
|
||||
duration: qcamera_duration,
|
||||
distance_meters: Math.round(Math.max(rlog_totalDistInternal, rlog_totalDistExternal) * 10) / 10,
|
||||
is_processed: true,
|
||||
upload_complete: uploadComplete,
|
||||
is_stalled: false
|
||||
|
||||
Math.round(Math.max(rlog_totalDistInternal, rlog_totalDistExternal) * 10) / 10,
|
||||
}, {where: {id: segment.id}})
|
||||
|
||||
true,
|
||||
|
||||
uploadComplete,
|
||||
|
||||
false,
|
||||
segment.id
|
||||
);
|
||||
|
||||
if (driveSegmentResult === null) // if the update failed, stop right here with segment processing and try to update the drives at least
|
||||
{
|
||||
|
@ -517,12 +514,12 @@ async function updateDevices() {
|
|||
.toString()) / 1024);
|
||||
logger.info(`updateDevices device ${dongleId} has an updated storage_used of: ${deviceQuotaMb} MB`);
|
||||
|
||||
const deviceResult = await dbProtectedRun(
|
||||
'UPDATE devices SET storage_used = ? WHERE dongle_id = ?',
|
||||
deviceQuotaMb,
|
||||
const deviceResult = await orm.models.drives.update(
|
||||
{storage_used: deviceQuotaMb},
|
||||
{where: {dongle_id: device.dongle_id}}
|
||||
)
|
||||
|
||||
|
||||
device.dongle_id
|
||||
);
|
||||
}
|
||||
affectedDevices = [];
|
||||
}
|
||||
|
@ -534,9 +531,9 @@ async function updateDrives() {
|
|||
var dongleId,
|
||||
driveIdentifier;
|
||||
[dongleId, driveIdentifier] = key.split('|');
|
||||
const drive = await dbProtectedGet('SELECT * FROM drives WHERE identifier = ? AND dongle_id = ?', driveIdentifier, dongleId);
|
||||
let drive = await orm.models.drives({where: {driveIdentifier: driveIdentifier, dongleId: dongleId}})
|
||||
if (drive == null) continue;
|
||||
|
||||
drive = drive.dataValues;
|
||||
var dongleIdHash = crypto.createHmac('sha256', config.applicationSalt)
|
||||
.update(drive.dongle_id)
|
||||
.digest('hex');
|
||||
|
@ -553,7 +550,16 @@ async function updateDrives() {
|
|||
var totalDurationSeconds = 0;
|
||||
var playlistSegmentStrings = '';
|
||||
|
||||
const drive_segments = await dbProtectedAll('SELECT * FROM drive_segments WHERE drive_identifier = ? AND dongle_id = ? ORDER BY segment_id ASC', driveIdentifier, dongleId);
|
||||
const drive_segments= await orm.models.drive_segments.findAll({
|
||||
where: {
|
||||
drive_identifier: driveIdentifier,
|
||||
dongle_id: dongleId
|
||||
},
|
||||
order: [
|
||||
sequelize.fn('ASC', sequelize.col('segment_id')),
|
||||
]
|
||||
})
|
||||
|
||||
if (drive_segments != null) {
|
||||
for (var t = 0; t < drive_segments.length; t++) {
|
||||
if (!drive_segments[t].upload_complete) uploadComplete = false;
|
||||
|
@ -600,22 +606,17 @@ async function updateDrives() {
|
|||
|
||||
logger.info(`updateDrives drive ${dongleId} ${driveIdentifier} uploadComplete: ${uploadComplete}`);
|
||||
|
||||
const driveResult = await dbProtectedRun(
|
||||
'UPDATE drives SET distance_meters = ?, duration = ?, upload_complete = ?, is_processed = ?, filesize = ?, metadata = ? WHERE id = ?',
|
||||
Math.round(totalDistanceMeters),
|
||||
const driveResult = await orm.models.drives.update(
|
||||
{distance_meters: Math.round(totalDistanceMeters),
|
||||
duration: totalDurationSeconds,
|
||||
upload_complete: uploadComplete,
|
||||
is_processed: isProcessed,
|
||||
filesize,
|
||||
metadata:JSON.stringify(metadata)
|
||||
},
|
||||
{where: {id: drive.id}}
|
||||
)
|
||||
|
||||
totalDurationSeconds,
|
||||
|
||||
uploadComplete,
|
||||
|
||||
isProcessed,
|
||||
|
||||
filesize,
|
||||
|
||||
JSON.stringify(metadata),
|
||||
|
||||
drive.id
|
||||
);
|
||||
|
||||
affectedDevices[dongleId] = true;
|
||||
|
||||
|
@ -646,12 +647,11 @@ async function deleteExpiredDrives() {
|
|||
if (expiredDrives != null) {
|
||||
for (var t = 0; t < expiredDrives.length; t++) {
|
||||
logger.info(`deleteExpiredDrives drive ${expiredDrives[t].dongle_id} ${expiredDrives[t].identifier} is older than ${config.deviceDriveExpirationDays} days, set is_deleted=true`);
|
||||
const driveResult = await dbProtectedRun(
|
||||
'UPDATE drives SET is_deleted = ? WHERE id = ?',
|
||||
true,
|
||||
|
||||
expiredDrives[t].id
|
||||
);
|
||||
const driveResult = await orm.models.drives.update({
|
||||
is_deleted: true
|
||||
},
|
||||
{where: {id: expiredDrives[t].id}})
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue