[
http://tracker.firebirdsql.org/browse/DNET-275?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
]
Jiri Cincura reopened DNET-275:
-------------------------------
> Send op_disconnect
> ------------------
>
> Key: DNET-275
> URL: http://tracker.firebirdsql.org/browse/DNET-275
> Project: .NET Data provider
> Issue Type: Bug
> Components: ADO.NET Provider
> Affects Versions: 2.5.1
> Reporter: Dmitry Yemanov
> Assignee: Jiri Cincura
> Fix For: 2.6.1
>
>
> Jiri,
> As far as I remember, the .NET provider doesn't send op_disconnect to the
> server either. Could you please check whether it's true and fix the code
> appropriately?
> This is indirectly related to CORE-2462 where both main and event ports are
> disconnected only forcibly via the socket shutdown and the server sometimes
> has problems with that.
> Dmitry
> -------- Original Message --------
> Subject: [Firebird-checkins] CVS:
> Date: Tue, 29 Sep 2009 06:31:54 +0000 (UTC)
> From: [email protected] ("Roman Rokytskyy")
> Organization: Firebird and InterBase Community Site
> To: [email protected]
> Newsgroups: sourceforge.firebird-checkins
> Update of
> /cvsroot/firebird/client-java/src/main/org/firebirdsql/gds/impl/wire
> In directory
> fdv4jf1.ch3.sourceforge.com:/tmp/cvs-serv13506/src/main/org/firebirdsql/gds/impl/wire
> Modified Files:
> AbstractJavaGDSImpl.java
> Log Message:
> Jaybird was not sending op_disconnect on isc_database_detach and
> isc_service_detach and there was no op_connect on isc_service_attach
> Index: AbstractJavaGDSImpl.java
> ===================================================================
> RCS file:
> /cvsroot/firebird/client-java/src/main/org/firebirdsql/gds/impl/wire/AbstractJavaGDSImpl.java,v
> retrieving revision 1.23
> retrieving revision 1.24
> diff -b -U3 -r1.23 -r1.24
> --- AbstractJavaGDSImpl.java 18 Sep 2009 08:12:25 -0000 1.23
> +++ AbstractJavaGDSImpl.java 29 Sep 2009 06:58:33 -0000 1.24
> @@ -643,6 +643,7 @@
> log.debug("op_detach ");
> db.out.writeInt(op_detach);
> db.out.writeInt(db.getRdb_id());
> + db.out.writeInt(op_disconnect);
> db.out.flush();
> if (debug)
> log.debug("sent");
> @@ -1170,12 +1171,12 @@
> stmt.notifyOpenResultSet();
> if (debug)
> log.debug("sent");
> - int op = nextOperation(db);
> + int op = nextOperation(db.in);
> if (op == op_sql_response) {
> // this would be an Execute procedure
> stmt.ensureCapacity(1);
> receiveSqlResponse(db, out_xsqlda,
> stmt);
> - op = nextOperation(db);
> + op = nextOperation(db.in);
> stmt.setAllRowsFetched(true);
> stmt.setSingletonResult(true);
> } else {
> @@ -1283,10 +1284,10 @@
> if (debug)
> log.debug("sent");
> - int op = nextOperation(db);
> + int op = nextOperation(db.in);
> if (op == op_sql_response) {
> receiveSqlResponse(db, out_xsqlda,
> null);
> - op = nextOperation(db);
> + op = nextOperation(db.in);
> }
> receiveResponse(db, op);
> } catch (IOException ex) {
> @@ -1331,7 +1332,7 @@
> if (debug)
> log.debug("sent");
> - int op = nextOperation(db);
> + int op = nextOperation(db.in);
> stmt.notifyOpenResultSet();
> if (op == op_fetch_response) {
> @@ -1345,7 +1346,7 @@
> if (sqldata_messages > 0 &&
> sqldata_status == 0) {
>
> in.readSQLData(xsqlda.ioLength, stmt);
> do {
> - op =
> nextOperation(db);
> + op =
> nextOperation(db.in);
> if (op ==
> op_response) {
>
> receiveResponse(db, op);
>
> continue;
> @@ -1925,6 +1926,7 @@
> protected void connect(isc_db_handle_impl db, DbAttachInfo dbai,
> DatabaseParameterBuffer databaseParameterBuffer)
> throws GDSException {
> +
> boolean debug = log != null && log.isDebugEnabled();
> int socketBufferSize = -1;
> @@ -1949,10 +1951,41 @@
> try {
> openSocket(db, dbai, debug, socketBufferSize);
> + XdrOutputStream out = db.out;
> + XdrInputStream in = db.in;
> + String fileName = dbai.getFileName();
> +
> + int nextOperation = sendConnectPacket(out, in,
> fileName);
> +
> + if (nextOperation == op_accept) {
> + db.setProtocol(in.readInt()); // Protocol
> version number
> + int arch = in.readInt(); // Architecture for
> protocol
> + int min = in.readInt(); // Minimum type
> + if (debug)
> + log.debug("received");
> + } else {
> + disconnect(db);
> + if (debug)
> + log.debug("not received");
> + throw new
> GDSException(ISCConstants.isc_connect_reject);
> + }
> + } catch (IOException ex) {
> + if (debug)
> + log.debug("IOException while trying to connect
> to db:", ex);
> + throw new GDSException(ISCConstants.isc_arg_gds,
> + ISCConstants.isc_network_error,
> dbai.getServer());
> + }
> + }
> +
> + protected int sendConnectPacket(XdrOutputStream out, XdrInputStream in,
> + String fileName) throws IOException {
> +
> + boolean debug = log != null && log.isDebugEnabled();
> +
> // Here we identify the user to the engine. This may or
> may not be
> - // used
> - // as login info to a database.
> + // used as login info to a database.
> String user = System.getProperty("user.name");
> +
> if (debug)
> log.debug("user.name: " + user);
>
> @@ -1994,44 +2027,29 @@
> if (debug)
> log.debug("op_connect ");
> - db.out.writeInt(op_connect);
> - db.out.writeInt(op_attach);
> - db.out.writeInt(2); // CONNECT_VERSION2
> - db.out.writeInt(1); // arch_generic
> + out.writeInt(op_connect);
> + out.writeInt(op_attach);
> + out.writeInt(2); // CONNECT_VERSION2
> + out.writeInt(1); // arch_generic
> // db.out.writeString(file_name); // p_cnct_file
> - db.out.writeString(dbai.getFileName()); // p_cnct_file
> - db.out.writeInt(1); // p_cnct_count
> - db.out.writeBuffer(user_id); // p_cnct_user_id
> -
> - db.out.writeInt(10); // PROTOCOL_VERSION10
> - db.out.writeInt(1); // arch_generic
> - db.out.writeInt(2); // ptype_rpc
> - db.out.writeInt(3); // ptype_batch_send
> - db.out.writeInt(2);
> - db.out.flush();
> + out.writeString(fileName); // p_cnct_file
> + out.writeInt(1); // p_cnct_count
> + out.writeBuffer(user_id); // p_cnct_user_id
> +
> + out.writeInt(10); // PROTOCOL_VERSION10
> + out.writeInt(1); // arch_generic
> + out.writeInt(2); // ptype_rpc
> + out.writeInt(3); // ptype_batch_send
> + out.writeInt(2);
> + out.flush();
> if (debug)
> log.debug("sent");
> if (debug)
> log.debug("op_accept ");
> - if (nextOperation(db) == op_accept) {
> - db.setProtocol(db.in.readInt()); // Protocol
> version number
> - int arch = db.in.readInt(); // Architecture for
> protocol
> - int min = db.in.readInt(); // Minimum type
> - if (debug)
> - log.debug("received");
> - } else {
> - disconnect(db);
> - if (debug)
> - log.debug("not received");
> - throw new
> GDSException(ISCConstants.isc_connect_reject);
> - }
> - } catch (IOException ex) {
> - if (debug)
> - log.debug("IOException while trying to connect
> to db:", ex);
> - throw new GDSException(ISCConstants.isc_arg_gds,
> - ISCConstants.isc_network_error,
> dbai.getServer());
> - }
> +
> + int nextOperation = nextOperation(in);
> + return nextOperation;
> }
> /**
> @@ -2115,7 +2133,7 @@
> // when used directly
> try {
> if (op == -1)
> - op = nextOperation(db);
> + op = nextOperation(db.in);
> if (debug)
> log.debug("op_response ");
> if (op == op_response) {
> @@ -2157,11 +2175,11 @@
> }
> }
> - protected int nextOperation(isc_db_handle_impl db) throws IOException {
> + protected int nextOperation(XdrInputStream in) throws IOException {
> boolean debug = log != null && log.isDebugEnabled();
> int op = 0;
> do {
> - op = db.in.readInt();
> + op = in.readInt();
> if (debug) {
> if (op == op_dummy) {
> log.debug("op_dummy received");
> @@ -2704,7 +2722,7 @@
> synchronized (svc) {
> try {
> try {
> - svc.socket = new Socket(host, port);
> + svc.socket = getSocket(host, port);
> svc.socket.setTcpNoDelay(true);
> // if (socketBufferSize != -1) {
> @@ -2724,6 +2742,22 @@
> svc.out = new
> XdrOutputStream(svc.socket.getOutputStream());
> svc.in = new
> XdrInputStream(svc.socket.getInputStream());
> + int nextOperation = sendConnectPacket(svc.out,
> svc.in,
> +serviceMgrStr);
> +
> + if (nextOperation == op_accept) {
> + svc.in.readInt(); // Protocol version
> number
> + svc.in.readInt(); // Architecture for
> protocol
> + svc.in.readInt(); // Minimum type
> + if (debug)
> + log.debug("received");
> + } else {
> + svc.invalidate();
> + if (debug)
> + log.debug("not received");
> + throw new
> GDSException(ISCConstants.isc_connect_reject);
> + }
> +
> +
> if (debug)
> log.debug("op_service_attach ");
> svc.out.writeInt(op_service_attach);
> @@ -2761,7 +2795,7 @@
> // when used directly
> try {
> if (op == -1)
> - op = nextOperation(svc);
> + op = nextOperation(svc.in);
> if (debug)
> log.debug("op_response ");
> if (op == op_response) {
> @@ -2791,20 +2825,6 @@
> }
> }
> - protected int nextOperation(isc_svc_handle_impl svc) throws IOException
> {
> - boolean debug = log != null && log.isDebugEnabled();
> - int op = 0;
> - do {
> - op = svc.in.readInt();
> - if (debug) {
> - if (op == op_dummy) {
> - log.debug("op_dummy received");
> - }
> - }
> - } while (op == op_dummy);
> - return op;
> - }
> -
> private void readStatusVector(isc_svc_handle_impl svc) throws
> GDSException {
> boolean debug = log != null && log.isDebugEnabled();
> try {
> @@ -2907,6 +2927,7 @@
> try {
> svc.out.writeInt(op_service_detach);
> svc.out.writeInt(svc.getHandle());
> + svc.out.writeInt(op_disconnect);
> svc.out.flush();
> receiveResponse(svc, -1);
> @@ -3014,7 +3035,7 @@
> db.out.writeInt(0);
> db.out.flush();
> - nextOperation(db);
> + nextOperation(db.in);
> int auxHandle = db.in.readInt();
> // garbage
> @@ -3145,7 +3166,7 @@
> public void run(){
> try {
> while (running){
> - int op = nextOperation(db);
> + int op = nextOperation(db.in);
> switch (op){
> case op_response:
> receiveResponse(db, op);
--
This message is automatically generated by JIRA.
-
If you think it was sent incorrectly contact one of the administrators:
http://tracker.firebirdsql.org/secure/Administrators.jspa
-
For more information on JIRA, see: http://www.atlassian.com/software/jira
------------------------------------------------------------------------------
Xperia(TM) PLAY
It's a major breakthrough. An authentic gaming
smartphone on the nation's most reliable network.
And it wants your games.
http://p.sf.net/sfu/verizon-sfdev
_______________________________________________
Firebird-net-provider mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/firebird-net-provider