@@ -125,6 +125,7 @@ class VaultManager {
125125 protected vaultsDb : DBLevel ;
126126 protected vaultsNamesDbDomain : DBDomain = [ ...this . vaultsDbDomain , 'names' ] ;
127127 protected vaultsNamesDb : DBLevel ;
128+ protected vaultsNamesLock : RWLock = new RWLock ( ) ;
128129 // VaultId -> VaultMetadata
129130 protected vaultMap : VaultMap = new Map ( ) ;
130131 protected vaultKey : Buffer ;
@@ -307,22 +308,29 @@ class VaultManager {
307308
308309 @ready ( new vaultsErrors . ErrorVaultManagerNotRunning ( ) )
309310 public async createVault ( vaultName : VaultName ) : Promise < VaultId > {
310- // Check if the vault name already exists;
311- if ( ( await this . getVaultId ( vaultName ) ) != null ) {
312- throw new vaultsErrors . ErrorVaultsVaultDefined ( ) ;
313- }
311+ // Adding vault to name map
314312 const vaultId = await this . generateVaultId ( ) ;
315- const lock = new RWLock ( ) ;
316- const vaultIdString = vaultId . toString ( ) as VaultIdString ;
317- this . vaultMap . set ( vaultIdString , { lock } ) ;
318- return await withF ( [ this . getWriteLock ( vaultId ) ] , async ( ) => {
319- // Adding vault to name map
313+ await this . vaultsNamesLock . withWrite ( async ( ) => {
314+ const vaultIdBuffer = await this . db . get (
315+ this . vaultsNamesDbDomain ,
316+ vaultName ,
317+ true ,
318+ ) ;
319+ // Check if the vault name already exists;
320+ if ( vaultIdBuffer != null ) {
321+ throw new vaultsErrors . ErrorVaultsVaultDefined ( ) ;
322+ }
320323 await this . db . put (
321324 this . vaultsNamesDbDomain ,
322325 vaultName ,
323326 vaultId . toBuffer ( ) ,
324327 true ,
325328 ) ;
329+ } ) ;
330+ const lock = new RWLock ( ) ;
331+ const vaultIdString = vaultId . toString ( ) as VaultIdString ;
332+ this . vaultMap . set ( vaultIdString , { lock } ) ;
333+ return await withF ( [ this . getWriteLock ( vaultId ) ] , async ( ) => {
326334 // Creating vault
327335 const vault = await VaultInternal . createVaultInternal ( {
328336 vaultId,
@@ -394,7 +402,9 @@ class VaultManager {
394402 // Removing from map
395403 this . vaultMap . delete ( vaultIdString ) ;
396404 // Removing name->id mapping
397- await this . db . del ( this . vaultsNamesDbDomain , vaultName ) ;
405+ await this . vaultsNamesLock . withWrite ( async ( ) => {
406+ await this . db . del ( this . vaultsNamesDbDomain , vaultName ) ;
407+ } ) ;
398408 } ) ;
399409 this . logger . info ( `Destroyed Vault ${ vaultsUtils . encodeVaultId ( vaultId ) } ` ) ;
400410 }
@@ -425,12 +435,7 @@ class VaultManager {
425435 // Stream of vaultName VaultId key value pairs
426436 for await ( const vaultNameBuffer of this . vaultsNamesDb . createKeyStream ( ) ) {
427437 const vaultName = vaultNameBuffer . toString ( ) as VaultName ;
428- const vaultIdBuffer = await this . db . get (
429- this . vaultsNamesDbDomain ,
430- vaultNameBuffer ,
431- true ,
432- ) ;
433- const vaultId = IdInternal . fromBuffer < VaultId > ( vaultIdBuffer ! ) ;
438+ const vaultId = ( await this . getVaultId ( vaultName ) ) ! ;
434439 vaults . set ( vaultName , vaultId ) ;
435440 }
436441 return vaults ;
@@ -463,13 +468,15 @@ class VaultManager {
463468 ] ;
464469 await this . db . put ( vaultDbDomain , VaultInternal . nameKey , newVaultName ) ;
465470 // Updating name->id map
466- await this . db . del ( this . vaultsNamesDbDomain , oldVaultName ) ;
467- await this . db . put (
468- this . vaultsNamesDbDomain ,
469- newVaultName ,
470- vaultId . toBuffer ( ) ,
471- true ,
472- ) ;
471+ await this . vaultsNamesLock . withWrite ( async ( ) => {
472+ await this . db . del ( this . vaultsNamesDbDomain , oldVaultName ) ;
473+ await this . db . put (
474+ this . vaultsNamesDbDomain ,
475+ newVaultName ,
476+ vaultId . toBuffer ( ) ,
477+ true ,
478+ ) ;
479+ } ) ;
473480 } ) ;
474481 }
475482
@@ -478,13 +485,15 @@ class VaultManager {
478485 */
479486 @ready ( new vaultsErrors . ErrorVaultManagerNotRunning ( ) )
480487 public async getVaultId ( vaultName : VaultName ) : Promise < VaultId | undefined > {
481- const vaultIdBuffer = await this . db . get (
482- this . vaultsNamesDbDomain ,
483- vaultName ,
484- true ,
485- ) ;
486- if ( vaultIdBuffer == null ) return ;
487- return IdInternal . fromBuffer < VaultId > ( vaultIdBuffer ) ;
488+ return await this . vaultsNamesLock . withWrite ( async ( ) => {
489+ const vaultIdBuffer = await this . db . get (
490+ this . vaultsNamesDbDomain ,
491+ vaultName ,
492+ true ,
493+ ) ;
494+ if ( vaultIdBuffer == null ) return ;
495+ return IdInternal . fromBuffer < VaultId > ( vaultIdBuffer ) ;
496+ } ) ;
488497 }
489498
490499 /**
@@ -769,7 +778,6 @@ class VaultManager {
769778 }
770779
771780 @ready ( new vaultsErrors . ErrorVaultManagerNotRunning ( ) )
772- // TODO: write a test for this, check if it actually handles conflicts
773781 protected async generateVaultId ( ) : Promise < VaultId > {
774782 let vaultId = vaultsUtils . generateVaultId ( ) ;
775783 let i = 0 ;
0 commit comments