@@ -388,102 +388,134 @@ export class FileShareAccessorHandle<Metadata> extends GenericFileAccessorHandle
388388 // On windows, we can assign the share to a drive letter, as that increases performance quite a lot:
389389 const windowsWorker = this . worker as WindowsWorker
390390
391+ const STORE_DRIVELETTERS = `fileShare_driveLetters_${ this . worker . agentAPI . location . localComputerId } `
391392 // Note: Use the mappedDriveLetters as a WorkerStorage, to avoid a potential issue where other workers
392393 // mess with the drive letter at the same time that we do, and we all end up to be unsynced with reality.
393- await this . worker . agentAPI . workerStorageWrite < MappedDriveLetters > (
394- `fileShare_driveLetters_${ this . worker . agentAPI . location . localComputerId } ` ,
395- PREPARE_FILE_ACCESS_TIMEOUT ,
396- async ( mappedDriveLetters0 ) : Promise < MappedDriveLetters > => {
397- const mappedDriveLetters : MappedDriveLetters = mappedDriveLetters0 ?? { }
398- // First we check if the drive letter has already been assigned in our cache:
399- let foundMappedDriveLetter : string | null = null
400- for ( const [ driveLetter , mountedPath ] of Object . entries ( mappedDriveLetters ) ) {
401- if ( mountedPath === folderPath ) {
402- foundMappedDriveLetter = driveLetter
403- }
404- }
405394
406- if ( foundMappedDriveLetter && forceRemount ) {
407- // Force a re-mount of the drive letter:
408- delete mappedDriveLetters [ foundMappedDriveLetter ]
409- await networkDrive . unmount ( foundMappedDriveLetter )
410- foundMappedDriveLetter = null
411- }
395+ if ( ! forceRemount ) {
396+ // Fast-path, just read the drive letter from the store:
397+ // Note: This is a fast path in the case of many jobs fired at several Workers simultaneously,
398+ // they can all read in parallel from the same store. When doing a .workerStorageWrite(), that is a single-threaded process.
412399
413- if ( foundMappedDriveLetter ) {
414- // It seems a drive letter is already mapped up.
415- this . actualFolderPath = `${ foundMappedDriveLetter } :\\`
416- handlingDone = true
400+ const mappedDriveLetters : MappedDriveLetters =
401+ ( await this . worker . agentAPI . workerStorageRead < MappedDriveLetters > ( STORE_DRIVELETTERS ) ) ?? { }
402+
403+ // Check if the drive letter has already been assigned in our cache:
404+ let foundMappedDriveLetter : string | null = null
405+ for ( const [ driveLetter , mountedPath ] of Object . entries ( mappedDriveLetters ) ) {
406+ if ( mountedPath === folderPath ) {
407+ foundMappedDriveLetter = driveLetter
417408 }
418- if ( ! handlingDone ) {
419- // Update our cache of mounted drive letters:
420- for ( const [ driveLetter , mountedPath ] of Object . entries ( await this . getMountedDriveLetters ( ) ) ) {
421- mappedDriveLetters [ driveLetter ] = mountedPath
422- // If the mounted path is the one we want, we don't have to mount a new one:
409+ }
410+ if ( foundMappedDriveLetter ) {
411+ // It seems a drive letter is already mapped up.
412+ this . actualFolderPath = `${ foundMappedDriveLetter } :\\`
413+ handlingDone = true
414+ }
415+ }
416+
417+ if ( ! handlingDone ) {
418+ await this . worker . agentAPI . workerStorageWrite < MappedDriveLetters > (
419+ STORE_DRIVELETTERS ,
420+ PREPARE_FILE_ACCESS_TIMEOUT ,
421+ async ( mappedDriveLetters0 ) : Promise < MappedDriveLetters > => {
422+ const mappedDriveLetters : MappedDriveLetters = mappedDriveLetters0 ?? { }
423+ // First we check if the drive letter has already been assigned in our cache:
424+ let foundMappedDriveLetter : string | null = null
425+ for ( const [ driveLetter , mountedPath ] of Object . entries ( mappedDriveLetters ) ) {
423426 if ( mountedPath === folderPath ) {
424427 foundMappedDriveLetter = driveLetter
425428 }
426429 }
430+
431+ if ( foundMappedDriveLetter && forceRemount ) {
432+ // Force a re-mount of the drive letter:
433+ delete mappedDriveLetters [ foundMappedDriveLetter ]
434+ await networkDrive . unmount ( foundMappedDriveLetter )
435+ foundMappedDriveLetter = null
436+ }
437+
427438 if ( foundMappedDriveLetter ) {
439+ // It seems a drive letter is already mapped up.
428440 this . actualFolderPath = `${ foundMappedDriveLetter } :\\`
429441 handlingDone = true
430442 }
431- }
432-
433- if ( ! handlingDone ) {
434- // Find next free drive letter:
435- const freeDriveLetter = windowsWorker . agentAPI . config . windowsDriveLetters ?. find (
436- ( driveLetter ) => ! mappedDriveLetters [ driveLetter ]
437- )
438-
439- if ( freeDriveLetter ) {
440- // Try to map the remote share onto a drive:
441-
442- try {
443- await networkDrive . mount (
444- folderPath ,
445- freeDriveLetter ,
446- this . accessor . userName ,
447- this . accessor . password
448- )
449- } catch ( e ) {
450- const errStr = `${ e } `
451- if (
452- errStr . match ( / i n v a l i d r e s p o n s e / i) ||
453- errStr . match ( / U g y l d i g s v a r / i) // "Invalid response" in Norvegian
454- ) {
455- // Temporary handling of the error
456-
457- const mappedDrives = await this . getMountedDriveLetters ( )
458-
459- if ( mappedDrives [ freeDriveLetter ] === folderPath ) {
460- this . worker . logger . warn ( `Supressed error: ${ errStr } ` )
461-
462- this . worker . logger . warn ( `Mapped drives: ${ Object . keys ( mappedDrives ) . join ( ',' ) } ` )
463- this . worker . logger . warn (
464- `${ freeDriveLetter } is currently mapped to ${ mappedDrives [ freeDriveLetter ] } `
465- )
466- } else {
467- this . worker . logger . warn ( `Mapped drives: ${ Object . keys ( mappedDrives ) . join ( ',' ) } ` )
468- this . worker . logger . warn (
469- `${ freeDriveLetter } is currently mapped to ${ mappedDrives [ freeDriveLetter ] } `
470- )
471- throw e
472- }
473- } else throw e
443+ if ( ! handlingDone ) {
444+ // Update our cache of mounted drive letters:
445+ for ( const [ driveLetter , mountedPath ] of Object . entries (
446+ await this . getMountedDriveLetters ( )
447+ ) ) {
448+ mappedDriveLetters [ driveLetter ] = mountedPath
449+ // If the mounted path is the one we want, we don't have to mount a new one:
450+ if ( mountedPath === folderPath ) {
451+ foundMappedDriveLetter = driveLetter
452+ }
474453 }
454+ if ( foundMappedDriveLetter ) {
455+ this . actualFolderPath = `${ foundMappedDriveLetter } :\\`
456+ handlingDone = true
457+ }
458+ }
475459
476- mappedDriveLetters [ freeDriveLetter ] = folderPath
477- this . actualFolderPath = `${ freeDriveLetter } :\\`
478- handlingDone = true
479- } else {
480- // Not able to find any free drive letters.
481- // Revert to direct access then
460+ if ( ! handlingDone ) {
461+ // Find next free drive letter:
462+ const freeDriveLetter = windowsWorker . agentAPI . config . windowsDriveLetters ?. find (
463+ ( driveLetter ) => ! mappedDriveLetters [ driveLetter ]
464+ )
465+
466+ if ( freeDriveLetter ) {
467+ // Try to map the remote share onto a drive:
468+
469+ try {
470+ await networkDrive . mount (
471+ folderPath ,
472+ freeDriveLetter ,
473+ this . accessor . userName ,
474+ this . accessor . password
475+ )
476+ } catch ( e ) {
477+ const errStr = `${ e } `
478+ if (
479+ errStr . match ( / i n v a l i d r e s p o n s e / i) ||
480+ errStr . match ( / U g y l d i g s v a r / i) // "Invalid response" in Norvegian
481+ ) {
482+ // Temporary handling of the error
483+
484+ const mappedDrives = await this . getMountedDriveLetters ( )
485+
486+ if ( mappedDrives [ freeDriveLetter ] === folderPath ) {
487+ this . worker . logger . warn ( `Supressed error: ${ errStr } ` )
488+
489+ this . worker . logger . warn (
490+ `Mapped drives: ${ Object . keys ( mappedDrives ) . join ( ',' ) } `
491+ )
492+ this . worker . logger . warn (
493+ `${ freeDriveLetter } is currently mapped to ${ mappedDrives [ freeDriveLetter ] } `
494+ )
495+ } else {
496+ this . worker . logger . warn (
497+ `Mapped drives: ${ Object . keys ( mappedDrives ) . join ( ',' ) } `
498+ )
499+ this . worker . logger . warn (
500+ `${ freeDriveLetter } is currently mapped to ${ mappedDrives [ freeDriveLetter ] } `
501+ )
502+ throw e
503+ }
504+ } else throw e
505+ }
506+
507+ mappedDriveLetters [ freeDriveLetter ] = folderPath
508+ this . actualFolderPath = `${ freeDriveLetter } :\\`
509+ handlingDone = true
510+ } else {
511+ // Not able to find any free drive letters.
512+ // Revert to direct access then
513+ }
482514 }
515+ return mappedDriveLetters
483516 }
484- return mappedDriveLetters
485- }
486- )
517+ )
518+ }
487519 }
488520
489521 if ( ! handlingDone ) {
0 commit comments