Question
Reden Rodriguez · Jan 26, 2021

How to fix <STORE> 15 ^%SYS.BINDSRV

Hi everyone, do you have any idea how to find this error or the meaning of this error 15 ^%SYS.BINDSRV i always get this once a week.

Product version:
Caché 2015.1
00
1 0 4 54

Replies

<STORE> error happens due to the memory limit exceeded in the process. Since 2012.2 memory limit is set as 256MB per process by default, you can increase it in System Management Portal on page Memory and Startup

Hi

Dimitry is correct in his reply that this is a memory issue. Every cache connection or ensemble production class as well as all of the system processes run in individual instances of cache.exe or iris.exe (in IRIS). Each of these processes is in effect an operating system process (or job) and when a new user process is created Cache allocates a certain amount of memory to that process. The memory is divided into chucks, there is a chunk of memory where the code being executed is stored, there is a chunk of memory where system variables and other process information is stored and then there is a chunk of memory that is used to store variables that are created by the code being executed. Whether it is a simple variable [variable1="123"] or a complex structure such as an object (which is basically a whole load of variables and arrays that are related together as the attributes of an object instance). If you are using Cache Objects then when you create variables or manipulate objects in a (class)method those variables are killed when the method quits. Another feature of Cache Objects is that if you open an instance of a very large object with lots of properties, some of which are embedded objects, collections, streams and relationships Cache does not load the entire object into memory. it just loads the basic object and then as you reference properties that are serial objects, collections and so on then only then does cache pull that data into your variable memory area. And in normal situations you can generally speaking create a lot of variables and open many objects and still have memory left over. However there are a couple of things that can mess with this memory management and they are:

1) Specifying variables used in a method as PUBLIC which means that once they are created they remain in memory until you either kill them or use the NEW command on them. Secondly, it is possible to write code that gets into a nested loop and within each loop more variables are created and more objects are created or opened and eventually you will run out of memory and a <STORE> error is generated. 

I did a quick check to see where %SYS.BNDSRV is referenced and there is one line of code in the %Library.RegisteredObject class in a method called %BindExport what calls a method in %SYS.BINDSRV. The documentation for %BindExport says the following:

/// This method is used by Language Binding Engine to
/// send the whole object and all objects it referes to
/// to the client.

So my guess is that you have a Java, .Net or some other binding and when %BindExport is called it is trying to pass the contents of your object (and any directly linked objects) to the client and that is filling up your variable memory and generating the store error. 

I also see that the %Atelier class is also referencing %SYS.BINDSRV. 

So to investigate further do you use Atelier and/or are you using class bindings (Java etc....)

If you are then something you are doing with Atelier or in you application is periodically trying to manipulate a lot of objects all at once and killing your process memory. You can increase the amount of memory allocated to cache processes but bear in mind that if you increase the process memory allocation then that setting will be applied to all cache processes. I suspect there may be a way of creating a cache process with a larger memory allocation for just that process but I have no idea if it is possible or how to do it.

It is quite likely that even if you increase the process memory it may not cure the problem in which case I would suggest that you contact WRC and log a call with them.

Nigel

Thanks for your well detailed explanation, since i don't have any authority to increase it's capacity or memory, the best thing i can do for now is to chop down in half the data that I'm generating to solve this issue.

Hi

One question I meant to ask is if you are building local arrays to store temporary data or similar and they are growing too large. That can quickly eat up all your memory if they are very large. It would be better to use ^CacheTemp($j,...) or replace $j with %session.SessionId if you are using a web service, or REST ($j is not reliable as $j will be the PID of the process that processes your CSP Request). In fact there are various ways of creating temporary globals which reside on disk rather than in your local variable partition. My previous reply focused on where the error was being reported but it occurred to me that there could be something else that the application code could be doing that is eating up your memory and effectively leave none for your BINDSRV.  But my gut instinct is that it is an issue with the objects being passed into the %BindExport method which if I remember correctly is passed $this, the current object instance