Ilya Zvyagin
2008-01-24 20:44:32 UTC
Hello, and first of all thank you for a good product.
I have a problem passing a long sequence of objects
to the client while shorter sequence works.
I use omniOrb 4.1.1 on Ubuntu Linux 2.6.22-14-generic x86.
I wrote a test application to test the idea we are going
to use in our future application a lot.
This is a CORBA server application which fetches some
dataset from database and builds a sequence of structures
(CORBA classes) representing each row of the dataset.
The sequence is returned then to the client application
as result of this method. This is an unbounded sequence.
This is the IDL:
#pragma prefix "util.rlisystems.ru"
module costress {
typedef string<21> datetime; // date in format 20011231 01:02:13:000
valuetype Itemser
{
public long long object_id;
public long long class_id;
public string name;
public string shortname;
public long long item_id;
public long long vat_id;
public boolean is_default;
public string barcode;
public long long lifetime_id;
public datetime created;
public long long usr_id;
public string login_name;
public string unit_name;
factory MakeItemser (in long long object_id,
in long long class_id,
in string name,
in string shortname,
in long long item_id,
in long long vat_id,
in boolean is_default,
in string barcode,
in long long lifetime_id,
in datetime created,
in long long usr_id,
in string login_name,
in string unit_name );
};
typedef sequence< Itemser > ItemserSet;
interface ICoStress {
ItemserSet allGet();
};
};
-----------------------------------------------------------------------------
The application seems to work well and returns needed
data to the client. But there is some problem as there
is a limit on the number of rows returned.
If I return up to 9019 rows, all goes fine, but if I try
to return 9020 rows or more, a GIOP protocol error exception
is raised and the call fails.
To find out this, I added a fetch limit parameter to the server
application and, after experiments, found this. Actually
the dataset contains something about 30,000 rows and my
final goal is to try to send even such bug results.
-r parameter of costress server app defines maximum number of rows
to fetch and return. -r 0 means "no limit".
This is the transcript:
*******************************************************************************
***@host:~$ dist/Debug/GNU-Linux-x86/costress -S srv -U usr -D database -P
****** -r 0 &
[1] 6122
***@host:~$ ../costress_client/dist/Debug/GNU-Linux-x86/costress_client `cat
costress.ior`
omniORB: To endpoint: giop:tcp:[::ffff:192.168.27.49]:43377. Send GIOP 1.2
MessageError because a protocol error has been detected. Connection is closed.
omniORB: From endpoint: giop:tcp:192.168.27.49:37010. Detected GIOP 1.2 protocol
error in input message. giopImpl12.cc:289. Connection is closed.
terminate called after throwing an instance of 'CORBA::COMM_FAILURE'
calling allGet() ... Aborted (core dumped)
***@host:~$ fg
dist/Debug/GNU-Linux-x86/costress -S roo -U sa -D POLYGON -P control -r 0
(C-c)
***@host:~$ dist/Debug/GNU-Linux-x86/costress -S srv -U usr -D database -P
****** -r 9019 &
[1] 6132
***@host:~$ ../costress_client/dist/Debug/GNU-Linux-x86/costress_client `cat
costress.ior`
calling allGet() ... allGet() call took 8 sec, size returned is 9019
*******************************************************************************
So the questions are:
0) Is there a limit on length of sequences returned either in CORBA spec.
or omniORB implementation ?
(I think there should not be any).
1) How can I further investigate and solve this problem ?
Thank you.
I have a problem passing a long sequence of objects
to the client while shorter sequence works.
I use omniOrb 4.1.1 on Ubuntu Linux 2.6.22-14-generic x86.
I wrote a test application to test the idea we are going
to use in our future application a lot.
This is a CORBA server application which fetches some
dataset from database and builds a sequence of structures
(CORBA classes) representing each row of the dataset.
The sequence is returned then to the client application
as result of this method. This is an unbounded sequence.
This is the IDL:
#pragma prefix "util.rlisystems.ru"
module costress {
typedef string<21> datetime; // date in format 20011231 01:02:13:000
valuetype Itemser
{
public long long object_id;
public long long class_id;
public string name;
public string shortname;
public long long item_id;
public long long vat_id;
public boolean is_default;
public string barcode;
public long long lifetime_id;
public datetime created;
public long long usr_id;
public string login_name;
public string unit_name;
factory MakeItemser (in long long object_id,
in long long class_id,
in string name,
in string shortname,
in long long item_id,
in long long vat_id,
in boolean is_default,
in string barcode,
in long long lifetime_id,
in datetime created,
in long long usr_id,
in string login_name,
in string unit_name );
};
typedef sequence< Itemser > ItemserSet;
interface ICoStress {
ItemserSet allGet();
};
};
-----------------------------------------------------------------------------
The application seems to work well and returns needed
data to the client. But there is some problem as there
is a limit on the number of rows returned.
If I return up to 9019 rows, all goes fine, but if I try
to return 9020 rows or more, a GIOP protocol error exception
is raised and the call fails.
To find out this, I added a fetch limit parameter to the server
application and, after experiments, found this. Actually
the dataset contains something about 30,000 rows and my
final goal is to try to send even such bug results.
-r parameter of costress server app defines maximum number of rows
to fetch and return. -r 0 means "no limit".
This is the transcript:
*******************************************************************************
***@host:~$ dist/Debug/GNU-Linux-x86/costress -S srv -U usr -D database -P
****** -r 0 &
[1] 6122
***@host:~$ ../costress_client/dist/Debug/GNU-Linux-x86/costress_client `cat
costress.ior`
omniORB: To endpoint: giop:tcp:[::ffff:192.168.27.49]:43377. Send GIOP 1.2
MessageError because a protocol error has been detected. Connection is closed.
omniORB: From endpoint: giop:tcp:192.168.27.49:37010. Detected GIOP 1.2 protocol
error in input message. giopImpl12.cc:289. Connection is closed.
terminate called after throwing an instance of 'CORBA::COMM_FAILURE'
calling allGet() ... Aborted (core dumped)
***@host:~$ fg
dist/Debug/GNU-Linux-x86/costress -S roo -U sa -D POLYGON -P control -r 0
(C-c)
***@host:~$ dist/Debug/GNU-Linux-x86/costress -S srv -U usr -D database -P
****** -r 9019 &
[1] 6132
***@host:~$ ../costress_client/dist/Debug/GNU-Linux-x86/costress_client `cat
costress.ior`
calling allGet() ... allGet() call took 8 sec, size returned is 9019
*******************************************************************************
So the questions are:
0) Is there a limit on length of sequences returned either in CORBA spec.
or omniORB implementation ?
(I think there should not be any).
1) How can I further investigate and solve this problem ?
Thank you.
--
----------------------
Ilya Zvyagin,
e-mail: masterziv AT gmail DOT com
ICQ# 29427861
Skype: masterziv1024
----------------------
Ilya Zvyagin,
e-mail: masterziv AT gmail DOT com
ICQ# 29427861
Skype: masterziv1024