Eduard Lebedyuk · Aug 2, 2022 go to post

Yes? Cubes need space to store thier copy of the facts and CPU is needed to build it all.

As I said above, using async reporting mirror for cubes would completely remove the impact on the patient index.

Eduard Lebedyuk · Jul 25, 2022 go to post

Yeah, the process had 64,5 Gb of virtual memory allocated and 40Gb actually used.

Not surprised OOM killed that.

Eduard Lebedyuk · Jul 25, 2022 go to post

That's InterSystems IRIS logs. You need OS logs, namely syslog (check /var/log/syslog or /var/log/messages). Search for log entries about the "killed process" around the time your process was killed.

To be extra sure run write $job before calling the query to get process id. It should match the id of a killed process.

After you establish that your process was killed by OOM you need to report that to WRC, as a fix probably requires if not access, then at least overview of the production configuration which causes it.

Eduard Lebedyuk · Jul 25, 2022 go to post

Let's see how much time does it take to run in a non web context. There would be no timeouts in that case.

Could you please run this in your interoperability namespace:

set start=$h,rs=##class(Ens.InterfaceMaps.Utils).EnumeratePathsFunc(),end=$h
write "Time in seconds: ", $p(end, ",", 2)-$p(start, ",", 2)

If you run the query in SMP with parameters set them here too. EnumeratePaths query docs.

Also after you obtain the result set, you can output it to a terminal using %Display method, or to a file using %DisplayFormatted method.

Eduard Lebedyuk · Jul 25, 2022 go to post

It's a windows box issue, not InterSystems IRIS issue. I've seen a few, easiest solution is to delete localised DLLs, which would make all text English. Not perfect, but better than the gibberish.

Eduard Lebedyuk · Jul 25, 2022 go to post

In your Business Service settings set ClassName to pacIPM.reqICNARC and ElementName to ADMISSION.

I think you set only ClassName and did not set ElementName. In that case interoperability tries to match root object - ICNARC in your case to pacIPM.reqICNARC, and it fails because pacIPM.reqICNARC class does not have ADMISSION property.

Eduard Lebedyuk · Jul 21, 2022 go to post

Is there a solution for latest?

Spent like half an hour on this puzzle with no results.

Eduard Lebedyuk · Jul 20, 2022 go to post

What particular question do you have? Please consider providing more information.

You get a callresponse from a BO, copy it (or copy id as you'd leave the stream immutable) and create a new callrequest to another BO.

Alternatively use ResponseClass to save results into persistent objects.

Eduard Lebedyuk · Jul 18, 2022 go to post

SAM gives you graphana/prometheus out-of-the-box and connected to IRIS, that would be the easiest solution to deploy.

Eduard Lebedyuk · Jul 16, 2022 go to post

Yes. Cube builds don't modify source data.

Cubes copy all source data into an entirely separate set of tables.

Eduard Lebedyuk · Jul 15, 2022 go to post

Absolutely not.

During SYNC or REBUILD events Data Quality Manager cubes would only read patient index linkage definition data.

There's no way for cubes to modify patient index linkage definition data.

That said, reads, cube data writes, and additional cpu load during SYNC or REBUILD events might impact the running system, since there's a limited amount of resources available. You might want to schedule SYNCs and especially REBUILDs for low-load times (at nights or weekends depending on your usage patterns).

Using async reporting mirror for cubes would completely remove the impact on the patient index.

Eduard Lebedyuk · Jul 15, 2022 go to post

I mean try executing something else using $zf(-1) to check if $zf(-1) fails entirely or only for this specific command.

Do you nave xargs and zip installed?

Eduard Lebedyuk · Jul 14, 2022 go to post
Replace hard delete with soft delete.

You soft delete by creating a new property, usually a DeletedOn timestamp. If it's empty then the record is not deleted.

Deletion now consists of setting DeletedOn property to a soft deletion timestamp.

As an additional precaution you can add a BEFORE DELETE trigger which always errors out, forbidding hard deletions. It would save you from every delete except for global kill.

Additionally, you can add versioning, check out this discussion.

Eduard Lebedyuk · Jul 14, 2022 go to post

Create a unified DELETE trigger (foreach row/object). It would catch both SQL and Object access.

That said I usually advise against hard delete. In virtually all cases soft delete is better.

You soft delete by creating a new property, usually a DeletedOn timestamp. If it's empty then the record is not deleted.

Deletion now consists of setting DeletedOn property to a soft deletion timestamp.

As an additional precaution you can add a BEFORE DELETE trigger which always errors out, forbidding hard deletions. It would save you from every delete except for global kill.

Eduard Lebedyuk · Jul 13, 2022 go to post

There seems to be different ways to approach declared IRIS state by codifying things, you can codify the exported objects and import them or like you mentioned, use the installer method that builds things as code....  

Indeed, there is a declarative approach and imperative code approach. And there are several declarative ways to populate the data. %Installer is excellent for the initial population, but the user must remember to check for the existence of items he's trying to create. That adds challenges for CI/CD in non-containerized environments.  

Eduard Lebedyuk · Jul 12, 2022 go to post

Ended up with this implementation:


Parameter NOSECTION = "DEFAULT";

/// do ##class().INIToLocal(,.ini)
ClassMethod INIToLocal(file, Output ini) As %Status
{
	#dim sc As %Status = $$$OK
	kill ini
	set stream = ##class(%Stream.FileCharacter).%New()
	do stream.LinkToFile(file)
	set section = ..#NOSECTION
	while 'stream.AtEnd {
		set line = stream.ReadLine()
		set line=$zstrip(line, "<>w")
		continue:($e(line)="#")||($l(line)<3)
		if $e(line)="[" {
			set section = $e(line, 2, *-1)
		} else {
			set key = $zstrip($p(line, "="), "<>w")
			set value = $zstrip($p(line, "=", 2, *), "<>w")
			set ini(section, key) = value
		}
	}
	
	kill stream
	quit sc
}

/// do ##class().LocalToINI(.ini)
ClassMethod LocalToINI(ByRef ini, file) As %Status
{
	merge iniTemp = ini
	#dim sc As %Status = $$$OK
	set stream = ##class(%Stream.FileCharacter).%New()
	do stream.LinkToFile(file)
	
	set section = ..#NOSECTION
	set key=$o(iniTemp(section, ""),1,value)
	while (key'="") {
		do stream.WriteLine(key _ "=" _ value)
		set key = $o(iniTemp(section, key),1,value)
	}	
	do stream.WriteLine()
	kill iniTemp(section)
	
	
	set section=$o(iniTemp(""))	
	while (section'="") {
		do stream.WriteLine("[" _ section _ "]")
		
		set key=$o(iniTemp(section, ""),1,value)
		while (key'="") {
			do stream.WriteLine(key _ "=" _ value)
			set key = $o(iniTemp(section, key),1,value)
		}
		
	 	set section = $o(iniTemp(section))
	 	do stream.WriteLine()
	}
	
	set sc = stream.%Save()	
	kill stream, iniTemp
	quit sc
}