go to post Norman W. Freeman · Nov 10 I don't know if it's same case as OP but I got "ERROR #5001: Create Directory failed: _err" as well when the method System.OBJ.ExportUDL() is called in parallel. Looks like there is a race condition. Create directory might fail is another process is already creating or has created that directory.
go to post Norman W. Freeman · Oct 28 Thanks for the suggestion. I have tried to group CLS files to be loaded into clusters of 256 items, each cluster is then sent to a worker (instead of worker getting one CLS at a time). This increase chance of worker working exclusively on one package. In the end it's roughly same time. I don't wanna load them by package as packages are not balanced (some have 10 classes, some 500).
go to post Norman W. Freeman · Oct 27 I tried that and what happen is weird : the CPU usage of IRISDB.exe processes (4 of them used as workers) fall back to 0-1% while before it was peaking 25% (on a 4 cores machine, so 100% of the CPU was used). Despite this, it takes as much time as before, if not even more. There might be some bottleneck. I don't think it's I/O because importing MAC file is definitely faster (and they just as big as CLS files).
go to post Norman W. Freeman · Oct 16 Do you know if its needed to stop the IRIS instance/service before running the installer again ?
go to post Norman W. Freeman · Oct 9 Thanks for clarification. I see your point. I didn't know IRIS would optimize and encode Unicode characters on 8-bit when possible (when it fits Latin 1), as explained by Steven. It's different from UTF-8.
go to post Norman W. Freeman · Oct 8 This is because first 0-255 characters of Unicode are same as Latin1 charset, therefore no conversion is needed. Are you sure about that ? AFAIK it's true for the first 128 characters, but not the ones above. Characters with accents are encoded with two characters in Unicode while it's only one character in Latin1. If it works out of the box (no conversion is needed, only mounting database back on a Unicode system), this means system must be doing heavy work in the background. EDIT : It's possible because IRIS can encode a string using 8 bit per character if that string contains only Unicode positions between 0-255 (Latin 1 charset). When not possible, chars are encoded with UTF-16. It's not same as UTF-8 (which encode chars on 1 byte if code is 0-128 and use up to 4 bytes otherwise).
go to post Norman W. Freeman · Oct 2 In other words, once the instance where the remote DBs are located has it's lock table full, any other server requiring a lock on a database hosted by this instance will be in trouble, is this right ? Eg: FOO and BAR database are located on an instance where the lock table is fullBAZ database is located on an instance where the lock table is almost empty Application Server A lock on FOO.X denied Application Server B lock on FOO.X denied Application Server C lock on BAR.X denied Application Server D lock on BAZ.X OK Increasing gmheap : yes this might help but it you have some dummy process that enter a loop and create many many lock in a short amount of time, it's only delaying the issue (it will occur at some point no matter what)
go to post Norman W. Freeman · Aug 28 I found this command too, but it does not work, I got : ERROR #921: Operation requires %DB_IRISSYS:WRITE privilege
go to post Norman W. Freeman · Aug 17 Thanks for your reply. I didn't know you could run code in database. My guess is that in this context you can only access database globals, not the routines/classes, am I right ?
go to post Norman W. Freeman · Jun 27 The solution I found is to create a new static method that creates an instance and returns it : Class Foo Extends %Exception.AbstractException { ClassMethod Create(arg1 As %String, arg2 As %String, arg3 As %String, arg4 As %String, arg5 As %String) As %Status { quit ..%New("some message") } } Before : throw ##class(Foo).%New("args1", "args2", "args3", ...) After : throw ##class(Foo).Create("args1", "args2", "args3", ...)
go to post Norman W. Freeman · May 7 Classes (which are high level) are converted to INT modules. INT and MAC files are compiled into OBJ. This is binary data (similar to Java bytecode) that will be interpreted using some kind of virtual machine/interpreter. A "+" sign appears in Studio when the modified date of a MAC or INT module is different than the related OBJ. You can take a look at ^rMAC, ^rOBJ and ^ROUTINE globals for more details.
go to post Norman W. Freeman · Feb 1 Thanks. I tried it and it works great most the time. However, I got a few cases where the IsUpToDate() returns 0 while the class does not show any "+" sign in Studio. I tried different values for "type" parameter but it does not help. The error reported is as such : ERROR: ^oddCOM(cls,timechanged) does not exist I checked and indeed there is no TimeChanged or TimeCreated in the class compiled global. Seems Studio is happy with that.
go to post Norman W. Freeman · Dec 28, 2023 Thanks for the code. The pound symbol is indeed the entry U+00A3 in the Unicode table, but it's always encoded as 0xc2 0xa3 in UTF-8. See this page. In UTF-8, anything above U+007F will be encoded with 2 bytes. When you see \xc2 inside CSP gateway logs, you have now clue if it was originally 0xc2 or if it was already \xc2 (0x5c 0x78 0x63 0x32 in hexa) because there is no escaping made. Apache will instead double the backslash (\\xc2) so you know it was originally \xc2 and not 0xc2.
go to post Norman W. Freeman · Dec 20, 2023 I would like to get back to record the HTTPS requests sent to a server in their RAW format (which is exactly what "V9r" is doing. There is probably other ways (eg: using packet dumper or apache module) but this is the only working one I have found so far. The other methods have also their own disadvantages and quirks.
go to post Norman W. Freeman · Oct 30, 2023 Thanks Dimitry for clarifications. I did not know about $this syntax. This is indeed explained here.
go to post Norman W. Freeman · Oct 30, 2023 This will call the child/extended method and the superclass method, I want to bypass that and call base/super method directly.
go to post Norman W. Freeman · Oct 10, 2023 Can you provide a link to the documentation (or an example) that show how to use the classes you mention in Ensemble ? EDIT : is this what you are talking about when referencing "pool sizes" : https://docs.intersystems.com/latest/csp/docbook/DocBook.UI.Page.cls?KEY=ECONFIG_PoolSize
go to post Norman W. Freeman · Aug 31, 2023 I have enabled the logs and here is what I got (several times) : Initialization Apache Worker Process Initialization: PID=11330; Configuration=0x7fe92f816000; Establish a new connection Connection-No=156:0; Gateway PID=11330; InterSystems IRIS Server=IRIS (xxx.xxx.xxx.xxx:56773); InterSystems IRIS PID=31932 (...) Close Down Apache Worker Process Close Down: PID=11330; Configuration=0x7fe92f816000; This is on the non working server. The other one does not have such events, unless Apache is restarted (since there is no need to recreate new connections every time). mpm module: MaxConnectionsPerChild (also named MaxRequestsPerChild in older versions) is set to 0. According to Apache docs, this means the process should never expire (but it does as seen in the logs). This is also the recommended setting from the InterSystems page you mentioned. MaxSpareThreads is not set on both servers (unlike what is recommended by InterSystems). Intersystems page also recommend to use a "NSD based Gateway configuration" if needed. That's not what I use. Both servers load the /opt/webgateway/bin/CSPa24.so module, not the mod_csp24.so one. Also: I have notified a difference in Apache version. The non working server use an older one. I will try upgrading it.