Definitely, something wrong in the configuration. Code in InterSystems in fact is no different from any other data stored there. So, you may have some wrong mappings, or store some of your code in %SYS. 

I have a configuration with mirroring + ECP, and it works perfectly, I don't even care which of the nodes is primary, and can switch it any time, with no issues. And I have even more than one Code databases, and more than 20 Data databases. Mirroring Nodes works on 2018.1 while ECP Application Servers on 2012.2, with no issues.

If you have some doubts about your configuration, you can ask for help through WRC, or we can help you with it, we can review your settings, and say what actually happened and how to solve it

I would suggest a few points, how to catch what's going on wrong with the unexpected growth of databases, it's not actually really matter iristemp/cachetemp or some other.

  • zn "%SYS" Do ^GLOBUFF - will show you the biggest globals in the Global Buffer, useful tool to inspect slowness as well. If you see that some global from iristemp uses too much of global buffer, you can use it to investigate further
  • Integrity check for growing database, if the size not too big, it's the simplest way to understand the sizes of globals in the database.

When you found exact global name, you now have a point where to start an investigation.

If you stopped IRIS, you can just delete IRISTEMP, it will be recreated as a new in any way, after the start.

Sorry for that, could you please fill the issue here? This check needed to be sure, that file on the server has not been updated while edited in VSCode. And may not work perfectly, yet, unfortunately.

As a workaround, I would suggest using import right in Caché/IRIS with a common way through $system.OBJ.Load/ImportDir

It's In fact not a common task for an editor, to import big amounts of files. So, the best behavior you'll get if you compile it separately from the editor.

I have not been worked with Visual Studio, so, have no idea how it works there. But Instead of Studio, I would recommend using VSCode, of course, it already supports debugging, for sure you can watch variables (and expressions) as well as hovering variables. It does not support objects in a some readable way but supports it as an expression, so obj.property will work.

Unfortunately, for some reasons some systems may not use the latest versions of InterSystems products. While Integrity checks in some cases can be used on lower versions. And from the other side, for some systems reversing the system to some backup can be used as only last chance to restore the data, due to the sensitivity of stored data and the impossibility to restore data since the latest backup. So, If I would find database degradation I would better attempt to recover it, fortunately, I have an experience, and possibly lose some data, but the amount of lost data will be significantly less then when I would use a backup. Around 100 hundred GB journals per day, with tens of terabytes of data supposed for backup, make the task to restore system quickly as impossible for a system that has to be available with no downtime.

In that particular case, we have 16k blocks, due to the past issues with caching big string blocks over the ECP. 

But I think, there are a few ways how integrity can be improved, for such cases. I see at least two reasons why we should check integrity periodically.

  •  We don't have any errors in the database, which may cause to a system failure.
  • We don't have any issues in the database, and we ensure that our data is completely available.

I'm faced with an issue when error on a pointer level causes issues with WriteDaemon, and our system just died, when the application tried to get access to the data. And it took some time to figure out why it has happened, even when we did not have any issues with database at all, just only with ECP. That happened in the version 2012.2. And I'm thinking I would be able to set how deeply I could scan blocks, let's say, don't care about data blocks, just scan only pointers blocks. I don't have proportions, but I'm sure that in most cases we would have much more data blocks than pointers blocks. So, it would make integrity check give some results faster.

I know quite well how the database looks inside. But I did not manage, yet to look at how database backups work, and mostly interesting incremental backups. As I know backup works with blocks, so, maybe there is a way to make incremental integrity checks as well. It will not help to find the issues that happened in unchangeable blocks due to hardware issues but could say, that lately changed data is Ok.

To find a good replacement, the most important to know is a reason, why you need this information in the browser?

The first sample looks like you are looking for a default printer in the system.

And the second one, looking for a specific disk drive, with the letter U, and it should be network drive.

How are you going to use this information after that? Maybe the best way will be to completely change the way how you doing it or just forget about it.

Anyway, this happens due to a wish from browsers vendors, to increase a security level, so, they completely declined to use NPAPI and ActiveX. And as a side-effect of it, it's now impossible to use Java applets as well. And usually, to fix it, the simplest way was to create own simple application, which has to be installed on the users machine, and web-application application was able to connect to locally installed application through WebSockets or simple rest API in that application. 

ps. I can help you with development if you need any help.

menu.mac

ROUTINE menu
menu(routine) {
  Set rtn = ##class(%RoutineMgr).%OpenId(routine_".mac")
  Quit:'$IsObject(rtn)
  Set menu = ""
  While 'rtn.Code.AtEnd {
    Set line = rtn.Code.ReadLine()
    Continue:$Char(9,32,35)[$Extract(line)
    Continue:line'[" ; "
    Set label = $Piece($Piece(line, " "), "(")
    Set title = $Piece(line, " ; ", 2, *)
    Set menu = menu _ $Listbuild($Listbuild(label, title))
  }
  Quit menu
}
asLine(menu, pos) public {
  Set menuItem = $Listget(menu, pos)
  Quit:menuItem="" """"""
  Set $Listbuild(label,title) = menuItem
  Quit "$Char(13,10)_""" _ $Justify(pos, 4) _ ". " _ title_ """"
}

menu.inc

ROUTINE menu [Type=INC]

#Execute Set menu = $$^menu(rtname)

  Write !,"--------Menu---------"
  write ##Expression($$asLine^menu(menu,$Increment(menuLineNum)))
  write ##Expression($$asLine^menu(menu,$Increment(menuLineNum)))
  write ##Expression($$asLine^menu(menu,$Increment(menuLineNum)))
  write ##Expression($$asLine^menu(menu,$Increment(menuLineNum)))
  write ##Expression($$asLine^menu(menu,$Increment(menuLineNum)))
  write ##Expression($$asLine^menu(menu,$Increment(menuLineNum)))
  write ##Expression($$asLine^menu(menu,$Increment(menuLineNum)))
  write ##Expression($$asLine^menu(menu,$Increment(menuLineNum)))
  write ##Expression($$asLine^menu(menu,$Increment(menuLineNum)))
  write ##Expression($$asLine^menu(menu,$Increment(menuLineNum)))
  write ##Expression($$asLine^menu(menu,$Increment(menuLineNum)))
  write ##Expression($$asLine^menu(menu,$Increment(menuLineNum)))
  write ##Expression($$asLine^menu(menu,$Increment(menuLineNum)))
  write ##Expression($$asLine^menu(menu,$Increment(menuLineNum)))
  write ##Expression($$asLine^menu(menu,$Increment(menuLineNum)))
  write ##Expression($$asLine^menu(menu,$Increment(menuLineNum)))
  write ##Expression($$asLine^menu(menu,$Increment(menuLineNum)))
  write ##Expression($$asLine^menu(menu,$Increment(menuLineNum)))

  Write !!
  do {
    Write $Char(13),"Option? ",*27,"[0K"
    Read menuOption
    Quit:menuOption=""
    Quit:"qQ"[$Extract(menuOption)
    Quit:$Listget(menu,+menuOption)'=""
  } while 1
  Write !
  if (+menuOption) {
    Set label = $Listget($Listget(menu, menuOption))
    Do @label
  }
  Quit 

And some routine which will have to have menu

ROUTINE test
#; just include menu, at the place where you need it
#Include menu
  quit

task1 ; Task 1
  Write !,"Some work 1"
  quit
task2 ; Task 2
  Write !,"Some work 2"
  quit
task3 ; Task 3
  Write !,"Some work 3"
  quit
task4 ; Task 4
  Write !,"Some work 4"
  quit
task5 ; Task 5
  Write !,"Some work 5"
  quit
task6 ; Task 6
  Write !,"Some work 6"
  quit
task7 ; Task 7
  Write !,"Some work 7"
  quit
task8 ; Task 8
  Write !,"Some work 8"
  quit
task9 ; Task 9
  Write !,"Some work 9"
  quit
task10 ; Task 10
  Write !,"Some work 10"
  quit

and call it

USER>d ^test

--------Menu---------
   1. Task 1
   2. Task 2
   3. Task 3
   4. Task 4
   5. Task 5
   6. Task 6
   7. Task 7
   8. Task 8
   9. Task 9
  10. Task 10

Option? 1

Some work 1

Menu list changed after compile, but routine should be saved as MAC.
The final INT code contains the generated menu.