Skip to content
Snippets Groups Projects
Commit 62a6c73f authored by gmantele's avatar gmantele
Browse files

[TAP] Fix unterminated thread after a failed UPLOAD. This bug happened when an...

[TAP] Fix unterminated thread after a failed UPLOAD. This bug happened when an uploaded VOTable reading was interrupted by an exception (like a ParseException)....the streaming thread was not stopped and was still waiting for a notification in order to read the next row.
parent cb6eff4e
No related branches found
No related tags found
No related merge requests found
package tap.data; package tap.data;
/*
* This file is part of TAPLibrary.
*
* TAPLibrary is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* TAPLibrary is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with TAPLibrary. If not, see <http://www.gnu.org/licenses/>.
*
* Copyright 2015 - Astronomisches Rechen Institut (ARI)
*/
import java.io.IOException; import java.io.IOException;
import java.io.InputStream; import java.io.InputStream;
import java.util.NoSuchElementException; import java.util.NoSuchElementException;
...@@ -23,11 +42,14 @@ import adql.db.DBType; ...@@ -23,11 +42,14 @@ import adql.db.DBType;
* <p>{@link #getColType()} will return TAP type based on the type declared in the VOTable metadata part.</p> * <p>{@link #getColType()} will return TAP type based on the type declared in the VOTable metadata part.</p>
* *
* @author Gr&eacute;gory Mantelet (ARI) * @author Gr&eacute;gory Mantelet (ARI)
* @version 2.0 (02/2015) * @version 2.0 (04/2015)
* @since 2.0 * @since 2.0
*/ */
public class VOTableIterator implements TableIterator { public class VOTableIterator implements TableIterator {
/** Message of the IOException sent when the streaming is aborted. */
protected static final String STREAM_ABORTED_MESSAGE = "Streaming aborted!";
/** /**
* <p>This class lets consume the metadata and rows of a VOTable document.</p> * <p>This class lets consume the metadata and rows of a VOTable document.</p>
* *
...@@ -42,7 +64,7 @@ public class VOTableIterator implements TableIterator { ...@@ -42,7 +64,7 @@ public class VOTableIterator implements TableIterator {
* </p> * </p>
* *
* @author Gr&eacute;gory Mantelet (ARI) * @author Gr&eacute;gory Mantelet (ARI)
* @version 2.0 (01/2015) * @version 2.0 (04/2015)
* @since 2.0 * @since 2.0
*/ */
protected static class StreamVOTableSink implements TableSink { protected static class StreamVOTableSink implements TableSink {
...@@ -102,7 +124,7 @@ public class VOTableIterator implements TableIterator { ...@@ -102,7 +124,7 @@ public class VOTableIterator implements TableIterator {
* (because endRows() is always called after acceptRow()...so, it means the iteration has been aborted before the end) * (because endRows() is always called after acceptRow()...so, it means the iteration has been aborted before the end)
* and so the stream reading should be interrupted: */ * and so the stream reading should be interrupted: */
if (endReached) if (endReached)
throw new IOException("Streaming aborted!"); throw new IOException(STREAM_ABORTED_MESSAGE);
// Otherwise, keep the given row: // Otherwise, keep the given row:
pendingRow = row; pendingRow = row;
...@@ -336,7 +358,7 @@ public class VOTableIterator implements TableIterator { ...@@ -336,7 +358,7 @@ public class VOTableIterator implements TableIterator {
try{ try{
tb.streamStarTable(input, sink, null); tb.streamStarTable(input, sink, null);
}catch(IOException e){ }catch(IOException e){
if (e.getMessage() != null && !e.getMessage().equals("Reading interrupted!")) if (e.getMessage() != null && !e.getMessage().equals(STREAM_ABORTED_MESSAGE))
e.printStackTrace(); e.printStackTrace();
} }
} }
......
...@@ -16,7 +16,7 @@ package tap.upload; ...@@ -16,7 +16,7 @@ package tap.upload;
* You should have received a copy of the GNU Lesser General Public License * You should have received a copy of the GNU Lesser General Public License
* along with TAPLibrary. If not, see <http://www.gnu.org/licenses/>. * along with TAPLibrary. If not, see <http://www.gnu.org/licenses/>.
* *
* Copyright 2012-2014 - UDS/Centre de Données astronomiques de Strasbourg (CDS), * Copyright 2012-2015 - UDS/Centre de Données astronomiques de Strasbourg (CDS),
* Astronomisches Rechen Institut (ARI) * Astronomisches Rechen Institut (ARI)
*/ */
...@@ -51,7 +51,7 @@ import com.oreilly.servlet.multipart.ExceededSizeException; ...@@ -51,7 +51,7 @@ import com.oreilly.servlet.multipart.ExceededSizeException;
* </p> * </p>
* *
* @author Gr&eacute;gory Mantelet (CDS;ARI) * @author Gr&eacute;gory Mantelet (CDS;ARI)
* @version 2.0 (01/2015) * @version 2.0 (04/2015)
* *
* @see LimitedTableIterator * @see LimitedTableIterator
* @see VOTableIterator * @see VOTableIterator
...@@ -148,6 +148,7 @@ public class Uploader { ...@@ -148,6 +148,7 @@ public class Uploader {
* @see DBConnection#addUploadedTable(TAPTable, tap.data.TableIterator) * @see DBConnection#addUploadedTable(TAPTable, tap.data.TableIterator)
*/ */
public TAPSchema upload(final DALIUpload[] uploads) throws TAPException{ public TAPSchema upload(final DALIUpload[] uploads) throws TAPException{
TableIterator dataIt = null;
InputStream votable = null; InputStream votable = null;
String tableName = null; String tableName = null;
try{ try{
...@@ -159,7 +160,7 @@ public class Uploader { ...@@ -159,7 +160,7 @@ public class Uploader {
votable = upl.open(); votable = upl.open();
// Start reading the VOTable (with the identified limit, if any): // Start reading the VOTable (with the identified limit, if any):
TableIterator dataIt = new LimitedTableIterator(VOTableIterator.class, votable, limitUnit, limit); dataIt = new LimitedTableIterator(VOTableIterator.class, votable, limitUnit, limit);
// Define the table to upload: // Define the table to upload:
TAPColumn[] columns = dataIt.getMetadata(); TAPColumn[] columns = dataIt.getMetadata();
...@@ -175,6 +176,7 @@ public class Uploader { ...@@ -175,6 +176,7 @@ public class Uploader {
dbConn.addUploadedTable(table, dataIt); dbConn.addUploadedTable(table, dataIt);
// Close the VOTable stream: // Close the VOTable stream:
dataIt.close();
votable.close(); votable.close();
votable = null; votable = null;
} }
...@@ -189,6 +191,8 @@ public class Uploader { ...@@ -189,6 +191,8 @@ public class Uploader {
throw new TAPException("URI error while trying to open the VOTable of \"" + tableName + "\"!", e); throw new TAPException("URI error while trying to open the VOTable of \"" + tableName + "\"!", e);
}finally{ }finally{
try{ try{
if (dataIt != null)
dataIt.close();
if (votable != null) if (votable != null)
votable.close(); votable.close();
}catch(IOException ioe){ }catch(IOException ioe){
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment