teiid SVN: r3559 - in branches/as7: admin/src/main/java/org/teiid/adminapi/impl and 11 other directories.
by teiid-commits@lists.jboss.org
Author: rareddy
Date: 2011-10-18 11:56:08 -0400 (Tue, 18 Oct 2011)
New Revision: 3559
Added:
branches/as7/jboss-integration/src/main/java/org/teiid/jboss/CSRReferenceFactoryService.java
branches/as7/jboss-integration/src/main/java/org/teiid/jboss/TeiidAdd.java
branches/as7/jboss-integration/src/main/java/org/teiid/jboss/TeiidOperationHandler.java
branches/as7/jboss-integration/src/test/java/org/teiid/jboss/TestTeiidOperations.java
branches/as7/jboss-integration/src/test/resources/bqt.vdb
Removed:
branches/as7/jboss-integration/src/main/java/org/teiid/jboss/ClientServiceRegistryReferenceFactoryService.java
branches/as7/jboss-integration/src/main/java/org/teiid/jboss/QueryEngineOperationHandler.java
branches/as7/jboss-integration/src/main/java/org/teiid/jboss/TeiidBootServicesAdd.java
branches/as7/jboss-integration/src/test/java/org/teiid/jboss/TestTeiidAdminOperations.java
Modified:
branches/as7/admin/src/main/java/org/teiid/adminapi/AdminFactory.java
branches/as7/admin/src/main/java/org/teiid/adminapi/impl/VDBMetadataMapper.java
branches/as7/admin/src/test/resources/vdb-describe.txt
branches/as7/engine/src/main/java/org/teiid/dqp/service/SessionService.java
branches/as7/engine/src/test/java/org/teiid/common/buffer/impl/TestFileStoreCache.java
branches/as7/jboss-integration/pom.xml
branches/as7/jboss-integration/src/main/java/org/teiid/jboss/Element.java
branches/as7/jboss-integration/src/main/java/org/teiid/jboss/TeiidExtension.java
branches/as7/jboss-integration/src/main/java/org/teiid/jboss/TeiidSubsystemDescribe.java
branches/as7/jboss-integration/src/main/java/org/teiid/jboss/TeiidSubsystemParser.java
branches/as7/jboss-integration/src/main/java/org/teiid/jboss/TranslatorAdd.java
branches/as7/jboss-integration/src/main/java/org/teiid/jboss/Transport.java
branches/as7/jboss-integration/src/main/java/org/teiid/jboss/TransportAdd.java
branches/as7/jboss-integration/src/main/java/org/teiid/jboss/deployers/RuntimeEngineDeployer.java
branches/as7/jboss-integration/src/main/resources/org/teiid/jboss/i18n.properties
branches/as7/jboss-integration/src/test/resources/teiid-model-config.txt
branches/as7/jboss-integration/src/test/resources/teiid-model-json.txt
branches/as7/jboss-integration/src/test/resources/teiid-sample-config.xml
branches/as7/runtime/src/main/java/org/teiid/services/SessionServiceImpl.java
branches/as7/test-integration/common/pom.xml
Log:
TEIID-1720: Minor updates
Modified: branches/as7/admin/src/main/java/org/teiid/adminapi/AdminFactory.java
===================================================================
--- branches/as7/admin/src/main/java/org/teiid/adminapi/AdminFactory.java 2011-10-18 15:46:00 UTC (rev 3558)
+++ branches/as7/admin/src/main/java/org/teiid/adminapi/AdminFactory.java 2011-10-18 15:56:08 UTC (rev 3559)
@@ -332,6 +332,7 @@
return builder.buildRequest();
}
+ //add
ModelNode composite = new ModelNode();
composite.get("operation").set("composite");
composite.get("address").setEmptyList();
Modified: branches/as7/admin/src/main/java/org/teiid/adminapi/impl/VDBMetadataMapper.java
===================================================================
--- branches/as7/admin/src/main/java/org/teiid/adminapi/impl/VDBMetadataMapper.java 2011-10-18 15:46:00 UTC (rev 3558)
+++ branches/as7/admin/src/main/java/org/teiid/adminapi/impl/VDBMetadataMapper.java 2011-10-18 15:56:08 UTC (rev 3559)
@@ -56,7 +56,6 @@
if (vdb == null) {
return null;
}
- node.get(ModelNodeConstants.TYPE).set(ModelType.OBJECT);
node.get(VDBNAME).set(vdb.getName());
node.get(CONNECTIONTYPE).set(vdb.getConnectionType().toString());
@@ -182,7 +181,6 @@
}
public ModelNode describe(ModelNode node) {
- node.get(TYPE).set(ModelType.OBJECT);
addAttribute(node, VDBNAME, ModelType.STRING, true);
ModelNode connectionsAllowed = new ModelNode();
@@ -239,7 +237,6 @@
if (model == null) {
return null;
}
- node.get(TYPE).set(ModelType.OBJECT);
node.get(MODEL_NAME).set(model.getName());
if (model.getDescription() != null) {
@@ -332,8 +329,6 @@
}
public ModelNode describe(ModelNode node) {
- node.get(TYPE).set(ModelType.OBJECT);
-
ModelNode modelTypes = new ModelNode();
modelTypes.add(Model.Type.PHYSICAL.toString());
modelTypes.add(Model.Type.VIRTUAL.toString());
@@ -378,7 +373,6 @@
return null;
}
- node.get(TYPE).set(ModelType.OBJECT);
if (error.getPath() != null) {
node.get(ERROR_PATH).set(error.getPath());
}
@@ -407,7 +401,6 @@
}
public ModelNode describe(ModelNode node) {
- node.get(TYPE).set(ModelType.OBJECT);
addAttribute(node, ERROR_PATH, ModelType.STRING, false);
addAttribute(node, SEVERITY, ModelType.STRING, true);
addAttribute(node, MESSAGE, ModelType.STRING, true);
@@ -430,8 +423,6 @@
return null;
}
- node.get(TYPE).set(ModelType.OBJECT);
-
node.get(SOURCE_NAME).set(source.getName());
node.get(JNDI_NAME).set(source.getConnectionJndiName());
node.get(TRANSLATOR_NAME).set(source.getTranslatorName());
@@ -456,7 +447,6 @@
}
public ModelNode describe(ModelNode node) {
- node.get(TYPE).set(ModelType.OBJECT);
addAttribute(node, SOURCE_NAME, ModelType.STRING, true);
addAttribute(node, JNDI_NAME, ModelType.STRING, true);
addAttribute(node, TRANSLATOR_NAME, ModelType.STRING, true);
@@ -481,7 +471,6 @@
if (translator == null) {
return null;
}
- node.get(TYPE).set(ModelType.OBJECT);
node.get(TRANSLATOR_NAME).set(translator.getName());
if (translator.getType() != null) {
@@ -536,7 +525,6 @@
}
public ModelNode describe(ModelNode node) {
- node.get(TYPE).set(ModelType.OBJECT);
addAttribute(node, TRANSLATOR_NAME, ModelType.STRING, true);
addAttribute(node, BASETYPE, ModelType.STRING, true);
addAttribute(node, DESCRIPTION, ModelType.STRING, false);
@@ -562,7 +550,6 @@
if (property == null) {
return null;
}
- node.get(ModelNodeConstants.TYPE).set(ModelType.OBJECT);
node.get(PROPERTY_NAME).set(property.getName());
node.get(PROPERTY_VALUE).set(property.getValue());
@@ -585,7 +572,6 @@
}
public ModelNode describe(ModelNode node) {
- node.get(TYPE).set(ModelType.OBJECT);
addAttribute(node, PROPERTY_NAME, ModelType.STRING, true);
addAttribute(node, PROPERTY_VALUE, ModelType.STRING, true);
return node;
@@ -614,8 +600,7 @@
if (policy == null) {
return null;
}
- node.get(ModelNodeConstants.TYPE).set(ModelType.OBJECT);
-
+
node.get(POLICY_NAME).set(policy.getName());
if (policy.getDescription() != null) {
node.get(DESCRIPTION).set(policy.getDescription());
@@ -684,7 +669,6 @@
}
public ModelNode describe(ModelNode node) {
- node.get(TYPE).set(ModelType.OBJECT);
addAttribute(node, POLICY_NAME, ModelType.STRING, true);
addAttribute(node, DESCRIPTION, ModelType.STRING, false);
addAttribute(node, ALLOW_CREATE_TEMP_TABLES, ModelType.BOOLEAN, false);
@@ -736,8 +720,6 @@
return null;
}
- node.get(ModelNodeConstants.TYPE).set(ModelType.OBJECT);
-
node.get(RESOURCE_NAME).set(permission.getResourceName());
if (permission.getAllowCreate() != null) {
node.get(ALLOW_CREATE).set(permission.getAllowCreate().booleanValue());
@@ -812,8 +794,6 @@
if (object == null)
return null;
- node.get(ModelNodeConstants.TYPE).set(ModelType.OBJECT);
-
node.get(TOTAL_ENTRIES).set(object.getTotalEntries());
node.get(HITRATIO).set(object.getHitRatio());
node.get(REQUEST_COUNT).set(object.getRequestCount());
@@ -833,7 +813,6 @@
}
public ModelNode describe(ModelNode node) {
- node.get(TYPE).set(ModelType.OBJECT);
addAttribute(node, TOTAL_ENTRIES, ModelType.STRING, true);
addAttribute(node, HITRATIO, ModelType.STRING, true);
addAttribute(node, REQUEST_COUNT, ModelType.STRING, true);
@@ -858,7 +837,6 @@
if (request == null) {
return null;
}
- node.get(ModelNodeConstants.TYPE).set(ModelType.OBJECT);
node.get(EXECUTION_ID).set(request.getExecutionId());
node.get(SESSION_ID).set(request.getSessionId());
@@ -898,7 +876,6 @@
}
public ModelNode describe(ModelNode node) {
- node.get(TYPE).set(ModelType.OBJECT);
addAttribute(node, EXECUTION_ID, ModelType.LONG, true);
addAttribute(node, SESSION_ID, ModelType.STRING, true);
addAttribute(node, START_TIME, ModelType.LONG, true);
@@ -931,7 +908,6 @@
if (session == null) {
return null;
}
- node.get(ModelNodeConstants.TYPE).set(ModelType.OBJECT);
if (session.getApplicationName() != null) {
node.get(APPLICATION_NAME).set(session.getApplicationName());
@@ -979,7 +955,6 @@
}
public ModelNode describe(ModelNode node) {
- node.get(TYPE).set(ModelType.OBJECT);
addAttribute(node, APPLICATION_NAME, ModelType.STRING, false);
addAttribute(node, CREATED_TIME, ModelType.LONG, true);
addAttribute(node, CLIENT_HOST_NAME, ModelType.LONG, true);
@@ -1006,7 +981,6 @@
if (object == null)
return null;
- transaction.get(ModelNodeConstants.TYPE).set(ModelType.OBJECT);
transaction.get(ASSOCIATED_SESSION).set(object.getAssociatedSession());
transaction.get(CREATED_TIME).set(object.getCreatedTime());
transaction.get(SCOPE).set(object.getScope());
@@ -1028,7 +1002,6 @@
}
public ModelNode describe(ModelNode node) {
- node.get(TYPE).set(ModelType.OBJECT);
addAttribute(node, ASSOCIATED_SESSION, ModelType.STRING, true);
addAttribute(node, CREATED_TIME, ModelType.LONG, true);
addAttribute(node, SCOPE, ModelType.LONG, true);
@@ -1052,7 +1025,6 @@
public ModelNode wrap(WorkerPoolStatisticsMetadata stats, ModelNode node) {
if (stats == null)
return null;
- node.get(ModelNodeConstants.TYPE).set(ModelType.OBJECT);
node.get(ACTIVE_THREADS).set(stats.getActiveThreads());
node.get(HIGHEST_ACTIVE_THREADS).set(stats.getHighestActiveThreads());
@@ -1083,7 +1055,6 @@
}
public ModelNode describe(ModelNode node) {
- node.get(TYPE).set(ModelType.OBJECT);
addAttribute(node, ACTIVE_THREADS, ModelType.INT, true);
addAttribute(node, HIGHEST_ACTIVE_THREADS, ModelType.INT, true);
addAttribute(node, TOTAL_COMPLETED, ModelType.LONG, true);
Modified: branches/as7/admin/src/test/resources/vdb-describe.txt
===================================================================
--- branches/as7/admin/src/test/resources/vdb-describe.txt 2011-10-18 15:46:00 UTC (rev 3558)
+++ branches/as7/admin/src/test/resources/vdb-describe.txt 2011-10-18 15:56:08 UTC (rev 3559)
@@ -1,7 +1,4 @@
{
- "type" : {
- "TYPE_MODEL_VALUE" : "OBJECT"
- },
"attributes" : {
"vdb-name" : {
"type" : {
@@ -60,9 +57,6 @@
"children" : {
"properties" : {
"description" : "properties",
- "type" : {
- "TYPE_MODEL_VALUE" : "OBJECT"
- },
"attributes" : {
"property-name" : {
"type" : {
@@ -81,9 +75,6 @@
}
},
"models" : {
- "type" : {
- "TYPE_MODEL_VALUE" : "OBJECT"
- },
"attributes" : {
"model-name" : {
"type" : {
@@ -130,9 +121,6 @@
"children" : {
"properties" : {
"description" : "properties",
- "type" : {
- "TYPE_MODEL_VALUE" : "OBJECT"
- },
"attributes" : {
"property-name" : {
"type" : {
@@ -152,9 +140,6 @@
},
"source-mappings" : {
"description" : "Model to source mapping",
- "type" : {
- "TYPE_MODEL_VALUE" : "OBJECT"
- },
"attributes" : {
"source-name" : {
"type" : {
@@ -181,9 +166,6 @@
},
"validity-errors" : {
"description" : "Model validation errors",
- "type" : {
- "TYPE_MODEL_VALUE" : "OBJECT"
- },
"attributes" : {
"error-path" : {
"type" : {
@@ -214,9 +196,6 @@
},
"override-translators" : {
"description" : "Overridden translators for the Virtual Database",
- "type" : {
- "TYPE_MODEL_VALUE" : "OBJECT"
- },
"attributes" : {
"translator-name" : {
"type" : {
@@ -249,9 +228,6 @@
},
"children" : {"properties" : {
"description" : "properties",
- "type" : {
- "TYPE_MODEL_VALUE" : "OBJECT"
- },
"attributes" : {
"property-name" : {
"type" : {
@@ -272,9 +248,6 @@
},
"data-policies" : {
"description" : "Data access policies defined for the Virtual Database",
- "type" : {
- "TYPE_MODEL_VALUE" : "OBJECT"
- },
"attributes" : {
"policy-name" : {
"type" : {
Modified: branches/as7/engine/src/main/java/org/teiid/dqp/service/SessionService.java
===================================================================
--- branches/as7/engine/src/main/java/org/teiid/dqp/service/SessionService.java 2011-10-18 15:46:00 UTC (rev 3558)
+++ branches/as7/engine/src/main/java/org/teiid/dqp/service/SessionService.java 2011-10-18 15:56:08 UTC (rev 3559)
@@ -101,7 +101,7 @@
* @return The collection of MetaMatrixSessionInfo objects of active users on
* the system - possibly empty, never null.
*/
- Collection<SessionMetadata> getActiveSessions() throws SessionServiceException;
+ Collection<SessionMetadata> getActiveSessions();
/**
* Get the number of active user sessions on the system.
Modified: branches/as7/engine/src/test/java/org/teiid/common/buffer/impl/TestFileStoreCache.java
===================================================================
--- branches/as7/engine/src/test/java/org/teiid/common/buffer/impl/TestFileStoreCache.java 2011-10-18 15:46:00 UTC (rev 3558)
+++ branches/as7/engine/src/test/java/org/teiid/common/buffer/impl/TestFileStoreCache.java 2011-10-18 15:56:08 UTC (rev 3559)
@@ -74,7 +74,7 @@
fsc.setStorageManager(ssm);
fsc.initialize();
- UnitTestUtil.enableTraceLogging("org.teiid"); //$NON-NLS-1$
+ //UnitTestUtil.enableTraceLogging("org.teiid"); //$NON-NLS-1$
CacheEntry ce = new CacheEntry(2l);
Serializer<Integer> s = new SimpleSerializer();
Modified: branches/as7/jboss-integration/pom.xml
===================================================================
--- branches/as7/jboss-integration/pom.xml 2011-10-18 15:46:00 UTC (rev 3558)
+++ branches/as7/jboss-integration/pom.xml 2011-10-18 15:56:08 UTC (rev 3559)
@@ -209,6 +209,13 @@
<type>test-jar</type>
<scope>test</scope>
</dependency>
+ <dependency>
+ <groupId>org.jboss.teiid.connectors</groupId>
+ <artifactId>translator-jdbc</artifactId>
+ <version>${version}</version>
+ <scope>test</scope>
+ </dependency>
+
</dependencies>
</project>
Copied: branches/as7/jboss-integration/src/main/java/org/teiid/jboss/CSRReferenceFactoryService.java (from rev 3548, branches/as7/jboss-integration/src/main/java/org/teiid/jboss/ClientServiceRegistryReferenceFactoryService.java)
===================================================================
--- branches/as7/jboss-integration/src/main/java/org/teiid/jboss/CSRReferenceFactoryService.java (rev 0)
+++ branches/as7/jboss-integration/src/main/java/org/teiid/jboss/CSRReferenceFactoryService.java 2011-10-18 15:56:08 UTC (rev 3559)
@@ -0,0 +1,62 @@
+/*
+ * JBoss, Home of Professional Open Source.
+ * Copyright 2011, Red Hat, Inc., and individual contributors
+ * as indicated by the @author tags. See the copyright.txt file in the
+ * distribution for a full listing of individual contributors.
+ *
+ * This 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 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software 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 this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+
+package org.teiid.jboss;
+
+import org.jboss.as.naming.ManagedReference;
+import org.jboss.as.naming.ManagedReferenceFactory;
+import org.jboss.as.naming.ValueManagedReference;
+import org.jboss.msc.inject.Injector;
+import org.jboss.msc.service.Service;
+import org.jboss.msc.service.StartContext;
+import org.jboss.msc.service.StartException;
+import org.jboss.msc.service.StopContext;
+import org.jboss.msc.value.ImmediateValue;
+import org.jboss.msc.value.InjectedValue;
+import org.teiid.transport.ClientServiceRegistry;
+
+
+class CSRReferenceFactoryService implements Service<ManagedReferenceFactory>, ManagedReferenceFactory {
+ private final InjectedValue<ClientServiceRegistry> csrInjector = new InjectedValue<ClientServiceRegistry>();
+
+ private ManagedReference reference;
+
+ public synchronized void start(StartContext startContext) throws StartException {
+ reference = new ValueManagedReference(new ImmediateValue<Object>(csrInjector.getValue()));
+ }
+
+ public synchronized void stop(StopContext stopContext) {
+ reference = null;
+ }
+
+ public synchronized ManagedReferenceFactory getValue() throws IllegalStateException, IllegalArgumentException {
+ return this;
+ }
+
+ public synchronized ManagedReference getReference() {
+ return reference;
+ }
+
+ public Injector<ClientServiceRegistry> getCSRInjector() {
+ return csrInjector;
+ }
+}
Property changes on: branches/as7/jboss-integration/src/main/java/org/teiid/jboss/CSRReferenceFactoryService.java
___________________________________________________________________
Added: svn:mime-type
+ text/plain
Deleted: branches/as7/jboss-integration/src/main/java/org/teiid/jboss/ClientServiceRegistryReferenceFactoryService.java
===================================================================
--- branches/as7/jboss-integration/src/main/java/org/teiid/jboss/ClientServiceRegistryReferenceFactoryService.java 2011-10-18 15:46:00 UTC (rev 3558)
+++ branches/as7/jboss-integration/src/main/java/org/teiid/jboss/ClientServiceRegistryReferenceFactoryService.java 2011-10-18 15:56:08 UTC (rev 3559)
@@ -1,62 +0,0 @@
-/*
- * JBoss, Home of Professional Open Source.
- * Copyright 2011, Red Hat, Inc., and individual contributors
- * as indicated by the @author tags. See the copyright.txt file in the
- * distribution for a full listing of individual contributors.
- *
- * This 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 2.1 of
- * the License, or (at your option) any later version.
- *
- * This software 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 this software; if not, write to the Free
- * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
- * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
- */
-
-package org.teiid.jboss;
-
-import org.jboss.as.naming.ManagedReference;
-import org.jboss.as.naming.ManagedReferenceFactory;
-import org.jboss.as.naming.ValueManagedReference;
-import org.jboss.msc.inject.Injector;
-import org.jboss.msc.service.Service;
-import org.jboss.msc.service.StartContext;
-import org.jboss.msc.service.StartException;
-import org.jboss.msc.service.StopContext;
-import org.jboss.msc.value.ImmediateValue;
-import org.jboss.msc.value.InjectedValue;
-import org.teiid.transport.ClientServiceRegistry;
-
-
-class ClientServiceRegistryReferenceFactoryService implements Service<ManagedReferenceFactory>, ManagedReferenceFactory {
- private final InjectedValue<ClientServiceRegistry> csrInjector = new InjectedValue<ClientServiceRegistry>();
-
- private ManagedReference reference;
-
- public synchronized void start(StartContext startContext) throws StartException {
- reference = new ValueManagedReference(new ImmediateValue<Object>(csrInjector.getValue()));
- }
-
- public synchronized void stop(StopContext stopContext) {
- reference = null;
- }
-
- public synchronized ManagedReferenceFactory getValue() throws IllegalStateException, IllegalArgumentException {
- return this;
- }
-
- public synchronized ManagedReference getReference() {
- return reference;
- }
-
- public Injector<ClientServiceRegistry> getCSRInjector() {
- return csrInjector;
- }
-}
Modified: branches/as7/jboss-integration/src/main/java/org/teiid/jboss/Element.java
===================================================================
--- branches/as7/jboss-integration/src/main/java/org/teiid/jboss/Element.java 2011-10-18 15:46:00 UTC (rev 3558)
+++ branches/as7/jboss-integration/src/main/java/org/teiid/jboss/Element.java 2011-10-18 15:56:08 UTC (rev 3559)
@@ -78,7 +78,6 @@
PREPAREDPLAN_CACHE_ELEMENT("preparedplan-cache"),
PPC_MAX_ENTRIES_ATTRIBUTE("max-entries", "preparedplan-cache-max-entries", ModelType.INT, false, "512"),
PPC_MAX_AGE_IN_SECS_ATTRIBUTE("max-age-in-seconds", "preparedplan-cache-max-age-in-seconds", ModelType.INT, false, "28800"),
- PPC_MAX_STALENESS_ATTRIBUTE("max-staleness", "preparedplan-cache-max-staleness", ModelType.INT, false, "0"),
// Object Replicator
OBJECT_REPLICATOR_ELEMENT("object-replicator"),
Deleted: branches/as7/jboss-integration/src/main/java/org/teiid/jboss/QueryEngineOperationHandler.java
===================================================================
--- branches/as7/jboss-integration/src/main/java/org/teiid/jboss/QueryEngineOperationHandler.java 2011-10-18 15:46:00 UTC (rev 3558)
+++ branches/as7/jboss-integration/src/main/java/org/teiid/jboss/QueryEngineOperationHandler.java 2011-10-18 15:56:08 UTC (rev 3559)
@@ -1,1194 +0,0 @@
-/*
- * JBoss, Home of Professional Open Source.
- * Copyright 2011, Red Hat, Inc., and individual contributors
- * as indicated by the @author tags. See the copyright.txt file in the
- * distribution for a full listing of individual contributors.
- *
- * This 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 2.1 of
- * the License, or (at your option) any later version.
- *
- * This software 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 this software; if not, write to the Free
- * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
- * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
- */
-package org.teiid.jboss;
-
-import static org.jboss.as.controller.descriptions.ModelDescriptionConstants.DESCRIPTION;
-import static org.jboss.as.controller.descriptions.ModelDescriptionConstants.REPLY_PROPERTIES;
-import static org.jboss.as.controller.descriptions.ModelDescriptionConstants.REQUEST_PROPERTIES;
-import static org.jboss.as.controller.descriptions.ModelDescriptionConstants.REQUIRED;
-import static org.jboss.as.controller.descriptions.ModelDescriptionConstants.TYPE;
-
-import java.io.IOException;
-import java.math.BigDecimal;
-import java.math.BigInteger;
-import java.sql.Blob;
-import java.sql.Clob;
-import java.sql.SQLException;
-import java.sql.SQLXML;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Collection;
-import java.util.List;
-import java.util.ResourceBundle;
-import java.util.concurrent.Callable;
-import java.util.concurrent.Future;
-import java.util.concurrent.TimeUnit;
-
-import javax.xml.stream.XMLStreamException;
-
-import org.jboss.as.controller.OperationContext;
-import org.jboss.as.controller.OperationFailedException;
-import org.jboss.as.controller.PathAddress;
-import org.jboss.dmr.ModelNode;
-import org.jboss.dmr.ModelType;
-import org.jboss.msc.service.ServiceController;
-import org.jboss.msc.service.ServiceName;
-import org.teiid.adminapi.Admin;
-import org.teiid.adminapi.AdminException;
-import org.teiid.adminapi.AdminProcessingException;
-import org.teiid.adminapi.impl.*;
-import org.teiid.adminapi.impl.VDBMetadataMapper.TransactionMetadataMapper;
-import org.teiid.adminapi.impl.VDBMetadataMapper.VDBTranslatorMetaDataMapper;
-import org.teiid.client.RequestMessage;
-import org.teiid.client.ResultsMessage;
-import org.teiid.client.security.SessionToken;
-import org.teiid.client.util.ResultsFuture;
-import org.teiid.core.TeiidComponentException;
-import org.teiid.deployers.VDBRepository;
-import org.teiid.dqp.internal.datamgr.TranslatorRepository;
-import org.teiid.dqp.internal.process.DQPCore;
-import org.teiid.dqp.internal.process.DQPWorkContext;
-import org.teiid.dqp.internal.process.SessionAwareCache;
-import org.teiid.logging.LogConstants;
-import org.teiid.logging.LogManager;
-
-abstract class QueryEngineOperationHandler extends BaseOperationHandler<DQPCore> {
- List<Transport> transports = new ArrayList<Transport>();
- protected VDBRepository vdbRepo;
- protected DQPCore engine;
-
- protected QueryEngineOperationHandler(String operationName){
- super(operationName);
- }
-
- @Override
- protected DQPCore getService(OperationContext context, PathAddress pathAddress, ModelNode operation) throws OperationFailedException {
- List<ServiceName> services = context.getServiceRegistry(false).getServiceNames();
- for (ServiceName name:services) {
- if (name.isParentOf(TeiidServiceNames.TRANSPORT_BASE)) {
- ServiceController<?> transport = context.getServiceRegistry(false).getService(name);
- if (transport != null) {
- this.transports.add(Transport.class.cast(transport.getValue()));
- }
- }
- }
- ServiceController<?> repo = context.getServiceRegistry(false).getRequiredService(TeiidServiceNames.VDB_REPO);
- if (repo != null) {
- this.vdbRepo = VDBRepository.class.cast(repo.getValue());
- }
-
- ServiceController<?> sc = context.getServiceRegistry(false).getRequiredService(TeiidServiceNames.ENGINE);
- if (sc != null) {
- this.engine = DQPCore.class.cast(sc.getValue());
- }
- return this.engine;
- }
-}
-
-abstract class TranslatorOperationHandler extends BaseOperationHandler<TranslatorRepository> {
-
- protected TranslatorOperationHandler(String operationName){
- super(operationName);
- }
-
- @Override
- public TranslatorRepository getService(OperationContext context, PathAddress pathAddress, ModelNode operation) throws OperationFailedException {
- ServiceController<?> sc = context.getServiceRegistry(false).getRequiredService(TeiidServiceNames.TRANSLATOR_REPO);
- return TranslatorRepository.class.cast(sc.getValue());
- }
-}
-
-class GetRuntimeVersion extends QueryEngineOperationHandler{
- protected GetRuntimeVersion(String operationName) {
- super(operationName);
- }
- @Override
- protected void executeOperation(OperationContext context, DQPCore engine, ModelNode operation) throws OperationFailedException{
- context.getResult().set(engine.getRuntimeVersion());
- }
- protected void describeParameters(ModelNode operationNode, ResourceBundle bundle) {
- operationNode.get(REPLY_PROPERTIES).set(ModelType.STRING);
- }
-}
-
-class GetActiveSessionsCount extends QueryEngineOperationHandler{
- protected GetActiveSessionsCount(String operationName) {
- super(operationName);
- }
- @Override
- protected void executeOperation(OperationContext context, DQPCore engine, ModelNode operation) throws OperationFailedException{
- try {
- int count = 0;
- for (Transport t: this.transports) {
- count += t.getActiveSessionsCount();
- }
- context.getResult().set(String.valueOf(count));
- } catch (AdminException e) {
- throw new OperationFailedException(new ModelNode().set(e.getMessage()));
- }
- }
- protected void describeParameters(ModelNode operationNode, ResourceBundle bundle) {
- operationNode.get(REPLY_PROPERTIES).set(ModelType.INT);
- }
-}
-
-class ListSessions extends QueryEngineOperationHandler{
- protected ListSessions() {
- super("list-sessions"); //$NON-NLS-1$
- }
- @Override
- protected void executeOperation(OperationContext context, DQPCore engine, ModelNode operation) throws OperationFailedException{
- try {
- ModelNode result = context.getResult();
- for (Transport t: this.transports) {
- Collection<SessionMetadata> sessions = t.getActiveSessions();
- for (SessionMetadata session:sessions) {
- VDBMetadataMapper.SessionMetadataMapper.INSTANCE.wrap(session, result.add());
- }
- }
- } catch (AdminException e) {
- throw new OperationFailedException(new ModelNode().set(e.getMessage()));
- }
- }
-
- protected void describeParameters(ModelNode operationNode, ResourceBundle bundle) {
- operationNode.get(REPLY_PROPERTIES).add(VDBMetadataMapper.SessionMetadataMapper.INSTANCE.describe(new ModelNode()));
- }
-}
-
-class RequestsPerSession extends QueryEngineOperationHandler{
- protected RequestsPerSession() {
- super("requests-per-session"); //$NON-NLS-1$
- }
- @Override
- protected void executeOperation(OperationContext context, DQPCore engine, ModelNode operation) throws OperationFailedException{
- if (!operation.hasDefined(OperationsConstants.SESSION)) {
- throw new OperationFailedException(new ModelNode().set(IntegrationPlugin.Util.getString(OperationsConstants.SESSION+MISSING)));
- }
- ModelNode result = context.getResult();
- List<RequestMetadata> requests = engine.getRequestsForSession(operation.get(OperationsConstants.SESSION).asString());
- for (RequestMetadata request:requests) {
- VDBMetadataMapper.RequestMetadataMapper.INSTANCE.wrap(request, result.add());
- }
- }
-
- protected void describeParameters(ModelNode operationNode, ResourceBundle bundle) {
- operationNode.get(REQUEST_PROPERTIES, OperationsConstants.SESSION, TYPE).set(ModelType.STRING);
- operationNode.get(REQUEST_PROPERTIES, OperationsConstants.SESSION, REQUIRED).set(true);
- operationNode.get(REQUEST_PROPERTIES, OperationsConstants.SESSION, DESCRIPTION).set(getParameterDescription(bundle, OperationsConstants.SESSION));
-
- operationNode.get(REPLY_PROPERTIES).add(VDBMetadataMapper.RequestMetadataMapper.INSTANCE.describe(new ModelNode()));
- }
-}
-
-class ListRequests extends QueryEngineOperationHandler{
- protected ListRequests() {
- super("list-requests"); //$NON-NLS-1$
- }
- @Override
- protected void executeOperation(OperationContext context, DQPCore engine, ModelNode operation) throws OperationFailedException{
- ModelNode result = context.getResult();
- List<RequestMetadata> requests = engine.getRequests();
- for (RequestMetadata request:requests) {
- VDBMetadataMapper.RequestMetadataMapper.INSTANCE.wrap(request, result.add());
- }
- }
- protected void describeParameters(ModelNode operationNode, ResourceBundle bundle) {
- operationNode.get(REPLY_PROPERTIES).add(VDBMetadataMapper.RequestMetadataMapper.INSTANCE.describe(new ModelNode()));
- }
-}
-
-class RequestsPerVDB extends QueryEngineOperationHandler{
- protected RequestsPerVDB() {
- super("requests-per-vdb"); //$NON-NLS-1$
- }
- @Override
- protected void executeOperation(OperationContext context, DQPCore engine, ModelNode operation) throws OperationFailedException{
- try {
-
- if (!operation.hasDefined(OperationsConstants.VDB_NAME)) {
- throw new OperationFailedException(new ModelNode().set(IntegrationPlugin.Util.getString(OperationsConstants.VDB_NAME+MISSING)));
- }
- if (!operation.hasDefined(OperationsConstants.VDB_VERSION)) {
- throw new OperationFailedException(new ModelNode().set(IntegrationPlugin.Util.getString(OperationsConstants.VDB_VERSION+MISSING)));
- }
-
- ModelNode result = context.getResult();
- String vdbName = operation.get(OperationsConstants.VDB_NAME).asString();
- int vdbVersion = operation.get(OperationsConstants.VDB_VERSION).asInt();
- for (Transport t: this.transports) {
- List<RequestMetadata> requests = t.getRequestsUsingVDB(vdbName,vdbVersion);
- for (RequestMetadata request:requests) {
- VDBMetadataMapper.RequestMetadataMapper.INSTANCE.wrap(request, result.add());
- }
- }
- } catch (AdminException e) {
- throw new OperationFailedException(e, new ModelNode().set(e.getMessage()));
- }
- }
-
- protected void describeParameters(ModelNode operationNode, ResourceBundle bundle) {
- operationNode.get(REQUEST_PROPERTIES, OperationsConstants.VDB_NAME, TYPE).set(ModelType.STRING);
- operationNode.get(REQUEST_PROPERTIES, OperationsConstants.VDB_NAME, REQUIRED).set(true);
- operationNode.get(REQUEST_PROPERTIES, OperationsConstants.VDB_NAME, DESCRIPTION).set(getParameterDescription(bundle, OperationsConstants.VDB_NAME));
-
- operationNode.get(REQUEST_PROPERTIES, OperationsConstants.VDB_VERSION, TYPE).set(ModelType.INT);
- operationNode.get(REQUEST_PROPERTIES, OperationsConstants.VDB_VERSION, REQUIRED).set(true);
- operationNode.get(REQUEST_PROPERTIES, OperationsConstants.VDB_VERSION, DESCRIPTION).set(getParameterDescription(bundle, OperationsConstants.VDB_VERSION));
-
- operationNode.get(REPLY_PROPERTIES).add(VDBMetadataMapper.RequestMetadataMapper.INSTANCE.describe(new ModelNode()));
- }
-}
-
-class GetLongRunningQueries extends QueryEngineOperationHandler{
- protected GetLongRunningQueries() {
- super("long-running-queries"); //$NON-NLS-1$
- }
- @Override
- protected void executeOperation(OperationContext context, DQPCore engine, ModelNode operation) throws OperationFailedException{
- ModelNode result = context.getResult();
- List<RequestMetadata> requests = engine.getLongRunningRequests();
- for (RequestMetadata request:requests) {
- VDBMetadataMapper.RequestMetadataMapper.INSTANCE.wrap(request, result.add());
- }
- }
- protected void describeParameters(ModelNode operationNode, ResourceBundle bundle) {
- operationNode.get(REPLY_PROPERTIES).add(VDBMetadataMapper.RequestMetadataMapper.INSTANCE.describe(new ModelNode()));
- }
-}
-
-class TerminateSession extends QueryEngineOperationHandler{
- protected TerminateSession() {
- super("terminate-session"); //$NON-NLS-1$
- }
- @Override
- protected void executeOperation(OperationContext context, DQPCore engine, ModelNode operation) throws OperationFailedException{
- if (!operation.hasDefined(OperationsConstants.SESSION)) {
- throw new OperationFailedException(new ModelNode().set(IntegrationPlugin.Util.getString(OperationsConstants.SESSION+MISSING)));
- }
- for (Transport t: this.transports) {
- t.terminateSession(operation.get(OperationsConstants.SESSION).asString());
- }
- }
-
- protected void describeParameters(ModelNode operationNode, ResourceBundle bundle) {
- operationNode.get(REQUEST_PROPERTIES, OperationsConstants.SESSION, TYPE).set(ModelType.STRING);
- operationNode.get(REQUEST_PROPERTIES, OperationsConstants.SESSION, REQUIRED).set(true);
- operationNode.get(REQUEST_PROPERTIES, OperationsConstants.SESSION, DESCRIPTION).set(getParameterDescription(bundle, OperationsConstants.SESSION));
- }
-}
-
-class CancelRequest extends QueryEngineOperationHandler{
- protected CancelRequest() {
- super("cancel-request"); //$NON-NLS-1$
- }
- @Override
- protected void executeOperation(OperationContext context, DQPCore engine, ModelNode operation) throws OperationFailedException{
- try {
- if (!operation.hasDefined(OperationsConstants.SESSION)) {
- throw new OperationFailedException(new ModelNode().set(IntegrationPlugin.Util.getString(OperationsConstants.SESSION+MISSING)));
- }
- if (!operation.hasDefined(OperationsConstants.EXECUTION_ID)) {
- throw new OperationFailedException(new ModelNode().set(IntegrationPlugin.Util.getString(OperationsConstants.EXECUTION_ID+MISSING)));
- }
- boolean pass = engine.cancelRequest(operation.get(OperationsConstants.SESSION).asString(), operation.get(OperationsConstants.EXECUTION_ID).asLong());
- ModelNode result = context.getResult();
- result.set(pass);
- } catch (TeiidComponentException e) {
- throw new OperationFailedException(e, new ModelNode().set(e.getMessage()));
- }
- }
-
- protected void describeParameters(ModelNode operationNode, ResourceBundle bundle) {
- operationNode.get(REQUEST_PROPERTIES, OperationsConstants.SESSION, TYPE).set(ModelType.STRING);
- operationNode.get(REQUEST_PROPERTIES, OperationsConstants.SESSION, REQUIRED).set(true);
- operationNode.get(REQUEST_PROPERTIES, OperationsConstants.SESSION, DESCRIPTION).set(getParameterDescription(bundle, OperationsConstants.SESSION));
-
- operationNode.get(REQUEST_PROPERTIES, OperationsConstants.EXECUTION_ID, TYPE).set(ModelType.LONG);
- operationNode.get(REQUEST_PROPERTIES, OperationsConstants.EXECUTION_ID, REQUIRED).set(true);
- operationNode.get(REQUEST_PROPERTIES, OperationsConstants.EXECUTION_ID, DESCRIPTION).set(getParameterDescription(bundle, OperationsConstants.EXECUTION_ID));
-
- operationNode.get(REPLY_PROPERTIES).set(ModelType.BOOLEAN);
- }
-}
-
-abstract class BaseCachehandler extends BaseOperationHandler<SessionAwareCache>{
- BaseCachehandler(String operationName){
- super(operationName);
- }
-
- @Override
- protected SessionAwareCache getService(OperationContext context, PathAddress pathAddress, ModelNode operation) throws OperationFailedException {
- String cacheType = Admin.Cache.QUERY_SERVICE_RESULT_SET_CACHE.name();
-
- if (operation.hasDefined(OperationsConstants.CACHE_TYPE)) {
- cacheType = operation.get(OperationsConstants.CACHE_TYPE).asString();
- //throw new OperationFailedException(new ModelNode().set(IntegrationPlugin.Util.getString(OperationsConstants.CACHE_TYPE+MISSING)));
- }
-
- ServiceController<?> sc;
- if (SessionAwareCache.isResultsetCache(cacheType)) {
- sc = context.getServiceRegistry(false).getRequiredService(TeiidServiceNames.CACHE_RESULTSET);
- }
- else {
- sc = context.getServiceRegistry(false).getRequiredService(TeiidServiceNames.CACHE_PREPAREDPLAN);
- }
-
- return SessionAwareCache.class.cast(sc.getValue());
- }
-}
-
-
-class CacheTypes extends BaseCachehandler {
- protected CacheTypes() {
- super("cache-types"); //$NON-NLS-1$
- }
-
- @Override
- protected void executeOperation(OperationContext context, SessionAwareCache cache, ModelNode operation) throws OperationFailedException {
- ModelNode result = context.getResult();
- Collection<String> types = SessionAwareCache.getCacheTypes();
- for (String type:types) {
- result.add(type);
- }
- }
-
- protected void describeParameters(ModelNode operationNode, ResourceBundle bundle) {
- ModelNode node = new ModelNode();
- node.get(OperationsConstants.CACHE_TYPE, TYPE).set(ModelType.STRING);
- node.get(OperationsConstants.CACHE_TYPE, REQUIRED).set(true);
- node.get(OperationsConstants.CACHE_TYPE, DESCRIPTION).set(getParameterDescription(bundle, OperationsConstants.CACHE_TYPE));
- operationNode.get(REPLY_PROPERTIES).add(node);
- }
-}
-
-class ClearCache extends BaseCachehandler {
-
- protected ClearCache() {
- super("clear-cache"); //$NON-NLS-1$
- }
-
- @Override
- protected void executeOperation(OperationContext context, SessionAwareCache cache, ModelNode operation) throws OperationFailedException {
- if (operation.hasDefined(OperationsConstants.CACHE_TYPE)) {
- throw new OperationFailedException(new ModelNode().set(IntegrationPlugin.Util.getString(OperationsConstants.CACHE_TYPE+MISSING)));
- }
-
- String cacheType = operation.get(OperationsConstants.CACHE_TYPE).asString();
- if (operation.hasDefined(OperationsConstants.VDB_NAME) && operation.hasDefined(OperationsConstants.VDB_VERSION)) {
- String vdbName = operation.get(OperationsConstants.VDB_NAME).asString();
- int vdbVersion = operation.get(OperationsConstants.VDB_VERSION).asInt();
- LogManager.logInfo(LogConstants.CTX_DQP, IntegrationPlugin.Util.getString("clearing_cache_vdb", cacheType, vdbName, vdbVersion)); //$NON-NLS-1$
- cache.clearForVDB(vdbName, vdbVersion);
- }
- else {
- LogManager.logInfo(LogConstants.CTX_DQP, IntegrationPlugin.Util.getString("clearing_cache", cacheType)); //$NON-NLS-1$
- cache.clearAll();
- }
- }
-
- protected void describeParameters(ModelNode operationNode, ResourceBundle bundle) {
- operationNode.get(REQUEST_PROPERTIES, OperationsConstants.CACHE_TYPE, TYPE).set(ModelType.STRING);
- operationNode.get(REQUEST_PROPERTIES, OperationsConstants.CACHE_TYPE, REQUIRED).set(true);
- operationNode.get(REQUEST_PROPERTIES, OperationsConstants.CACHE_TYPE, DESCRIPTION).set(getParameterDescription(bundle, OperationsConstants.CACHE_TYPE));
-
- operationNode.get(REQUEST_PROPERTIES, OperationsConstants.VDB_NAME, TYPE).set(ModelType.STRING);
- operationNode.get(REQUEST_PROPERTIES, OperationsConstants.VDB_NAME, REQUIRED).set(false);
- operationNode.get(REQUEST_PROPERTIES, OperationsConstants.VDB_NAME, DESCRIPTION).set(getParameterDescription(bundle, OperationsConstants.VDB_NAME));
-
- operationNode.get(REQUEST_PROPERTIES, OperationsConstants.VDB_VERSION, TYPE).set(ModelType.INT);
- operationNode.get(REQUEST_PROPERTIES, OperationsConstants.VDB_VERSION, REQUIRED).set(false);
- operationNode.get(REQUEST_PROPERTIES, OperationsConstants.VDB_VERSION, DESCRIPTION).set(getParameterDescription(bundle, OperationsConstants.VDB_VERSION));
-
- }
-}
-
-class CacheStatistics extends BaseCachehandler {
-
- protected CacheStatistics() {
- super("cache-statistics"); //$NON-NLS-1$
- }
-
- @Override
- protected void executeOperation(OperationContext context, SessionAwareCache cache, ModelNode operation) throws OperationFailedException {
- if (!operation.hasDefined(OperationsConstants.CACHE_TYPE)) {
- throw new OperationFailedException(new ModelNode().set(IntegrationPlugin.Util.getString(OperationsConstants.CACHE_TYPE+MISSING)));
- }
- ModelNode result = context.getResult();
- String cacheType = operation.get(OperationsConstants.CACHE_TYPE).asString();
- CacheStatisticsMetadata stats = buildCacheStats(cacheType, cache);
- VDBMetadataMapper.CacheStatisticsMetadataMapper.INSTANCE.wrap(stats, result);
- }
-
- private CacheStatisticsMetadata buildCacheStats(String name, SessionAwareCache cache) {
- CacheStatisticsMetadata stats = new CacheStatisticsMetadata();
- stats.setName(name);
- stats.setHitRatio(cache.getRequestCount() == 0?0:((double)cache.getCacheHitCount()/cache.getRequestCount())*100);
- stats.setTotalEntries(cache.getTotalCacheEntries());
- stats.setRequestCount(cache.getRequestCount());
- return stats;
- }
-
- protected void describeParameters(ModelNode operationNode, ResourceBundle bundle) {
- operationNode.get(REQUEST_PROPERTIES, OperationsConstants.CACHE_TYPE, TYPE).set(ModelType.STRING);
- operationNode.get(REQUEST_PROPERTIES, OperationsConstants.CACHE_TYPE, REQUIRED).set(true);
- operationNode.get(REQUEST_PROPERTIES, OperationsConstants.CACHE_TYPE, DESCRIPTION).set(getParameterDescription(bundle, OperationsConstants.CACHE_TYPE));
-
- ModelNode node = new ModelNode();
- operationNode.get(REPLY_PROPERTIES).add(VDBMetadataMapper.CacheStatisticsMetadataMapper.INSTANCE.describe(node));
- }
-}
-
-class WorkerPoolStatistics extends QueryEngineOperationHandler{
-
- protected WorkerPoolStatistics() {
- super("workerpool-statistics"); //$NON-NLS-1$
- }
- @Override
- protected void executeOperation(OperationContext context, DQPCore engine, ModelNode operation) throws OperationFailedException {
- ModelNode result = context.getResult();
- WorkerPoolStatisticsMetadata stats = engine.getWorkerPoolStatistics();
- VDBMetadataMapper.WorkerPoolStatisticsMetadataMapper.INSTANCE.wrap(stats, result);
- }
- protected void describeParameters(ModelNode operationNode, ResourceBundle bundle) {
- operationNode.get(REPLY_PROPERTIES).add(VDBMetadataMapper.WorkerPoolStatisticsMetadataMapper.INSTANCE.describe(new ModelNode()));
- }
-}
-
-class ListTransactions extends QueryEngineOperationHandler{
-
- protected ListTransactions() {
- super("list-transactions"); //$NON-NLS-1$
- }
- @Override
- protected void executeOperation(OperationContext context, DQPCore engine, ModelNode operation) throws OperationFailedException {
- ModelNode result = context.getResult();
- Collection<TransactionMetadata> txns = engine.getTransactions();
- for (TransactionMetadata txn:txns) {
- VDBMetadataMapper.TransactionMetadataMapper.INSTANCE.wrap(txn, result.add());
- }
- }
- protected void describeParameters(ModelNode operationNode, ResourceBundle bundle) {
- ModelNode node = new ModelNode();
- operationNode.get(REPLY_PROPERTIES).add(TransactionMetadataMapper.INSTANCE.describe(node));
- }
-}
-
-class TerminateTransaction extends QueryEngineOperationHandler{
-
- protected TerminateTransaction() {
- super("terminate-transaction"); //$NON-NLS-1$
- }
- @Override
- protected void executeOperation(OperationContext context, DQPCore engine, ModelNode operation) throws OperationFailedException {
-
- if (!operation.hasDefined(OperationsConstants.XID)) {
- throw new OperationFailedException(new ModelNode().set(IntegrationPlugin.Util.getString(OperationsConstants.XID+MISSING)));
- }
-
- String xid = operation.get(OperationsConstants.XID).asString();
- try {
- engine.terminateTransaction(xid);
- } catch (AdminException e) {
- throw new OperationFailedException(e, new ModelNode().set(e.getMessage()));
- }
- }
-
- protected void describeParameters(ModelNode operationNode, ResourceBundle bundle) {
- operationNode.get(REQUEST_PROPERTIES, OperationsConstants.XID, TYPE).set(ModelType.STRING);
- operationNode.get(REQUEST_PROPERTIES, OperationsConstants.XID, REQUIRED).set(true);
- operationNode.get(REQUEST_PROPERTIES, OperationsConstants.XID, DESCRIPTION).set(getParameterDescription(bundle, OperationsConstants.XID));
- }
-}
-
-class MergeVDBs extends BaseOperationHandler<VDBRepository>{
-
- protected MergeVDBs() {
- super("merge-vdbs"); //$NON-NLS-1$
- }
-
- @Override
- protected VDBRepository getService(OperationContext context, PathAddress pathAddress, ModelNode operation) throws OperationFailedException {
- ServiceController<?> sc = context.getServiceRegistry(false).getRequiredService(TeiidServiceNames.VDB_REPO);
- return VDBRepository.class.cast(sc.getValue());
- }
-
- @Override
- protected void executeOperation(OperationContext context, VDBRepository repo, ModelNode operation) throws OperationFailedException {
- if (!operation.hasDefined(OperationsConstants.SOURCE_VDBNAME)) {
- throw new OperationFailedException(new ModelNode().set(IntegrationPlugin.Util.getString(OperationsConstants.SOURCE_VDBNAME+MISSING)));
- }
- if (!operation.hasDefined(OperationsConstants.SOURCE_VDBVERSION)) {
- throw new OperationFailedException(new ModelNode().set(IntegrationPlugin.Util.getString(OperationsConstants.SOURCE_VDBVERSION+MISSING)));
- }
-
- if (!operation.hasDefined(OperationsConstants.TARGET_VDBNAME)) {
- throw new OperationFailedException(new ModelNode().set(IntegrationPlugin.Util.getString(OperationsConstants.TARGET_VDBNAME+MISSING)));
- }
- if (!operation.hasDefined(OperationsConstants.TARGET_VDBVERSION)) {
- throw new OperationFailedException(new ModelNode().set(IntegrationPlugin.Util.getString(OperationsConstants.TARGET_VDBVERSION+MISSING)));
- }
-
- String sourceVDBName = operation.get(OperationsConstants.SOURCE_VDBNAME).asString();
- int sourceVDBversion = operation.get(OperationsConstants.SOURCE_VDBVERSION).asInt();
- String targetVDBName = operation.get(OperationsConstants.TARGET_VDBNAME).asString();
- int targetVDBversion = operation.get(OperationsConstants.TARGET_VDBVERSION).asInt();
- try {
- repo.mergeVDBs(sourceVDBName, sourceVDBversion, targetVDBName, targetVDBversion);
- } catch (AdminException e) {
- throw new OperationFailedException(new ModelNode().set(e.getMessage()));
- }
- }
-
- protected void describeParameters(ModelNode operationNode, ResourceBundle bundle) {
- operationNode.get(REQUEST_PROPERTIES, OperationsConstants.SOURCE_VDBNAME, TYPE).set(ModelType.STRING);
- operationNode.get(REQUEST_PROPERTIES, OperationsConstants.SOURCE_VDBNAME, REQUIRED).set(true);
- operationNode.get(REQUEST_PROPERTIES, OperationsConstants.SOURCE_VDBNAME, DESCRIPTION).set(getParameterDescription(bundle, OperationsConstants.SOURCE_VDBNAME));
-
- operationNode.get(REQUEST_PROPERTIES, OperationsConstants.SOURCE_VDBVERSION, TYPE).set(ModelType.STRING);
- operationNode.get(REQUEST_PROPERTIES, OperationsConstants.SOURCE_VDBVERSION, REQUIRED).set(true);
- operationNode.get(REQUEST_PROPERTIES, OperationsConstants.SOURCE_VDBVERSION, DESCRIPTION).set(getParameterDescription(bundle, OperationsConstants.SOURCE_VDBVERSION));
-
- operationNode.get(REQUEST_PROPERTIES, OperationsConstants.TARGET_VDBNAME, TYPE).set(ModelType.STRING);
- operationNode.get(REQUEST_PROPERTIES, OperationsConstants.TARGET_VDBNAME, REQUIRED).set(true);
- operationNode.get(REQUEST_PROPERTIES, OperationsConstants.TARGET_VDBNAME, DESCRIPTION).set(getParameterDescription(bundle, OperationsConstants.TARGET_VDBNAME));
-
- operationNode.get(REQUEST_PROPERTIES, OperationsConstants.TARGET_VDBVERSION, TYPE).set(ModelType.STRING);
- operationNode.get(REQUEST_PROPERTIES, OperationsConstants.TARGET_VDBVERSION, REQUIRED).set(true);
- operationNode.get(REQUEST_PROPERTIES, OperationsConstants.TARGET_VDBVERSION, DESCRIPTION).set(getParameterDescription(bundle, OperationsConstants.TARGET_VDBVERSION));
- }
-}
-
-class ExecuteQuery extends QueryEngineOperationHandler{
-
- protected ExecuteQuery() {
- super("execute-query"); //$NON-NLS-1$
- }
- @Override
- protected void executeOperation(OperationContext context, DQPCore engine, ModelNode operation) throws OperationFailedException {
-
- if (!operation.hasDefined(OperationsConstants.VDB_NAME)) {
- throw new OperationFailedException(new ModelNode().set(IntegrationPlugin.Util.getString(OperationsConstants.VDB_NAME+MISSING)));
- }
- if (!operation.hasDefined(OperationsConstants.VDB_VERSION)) {
- throw new OperationFailedException(new ModelNode().set(IntegrationPlugin.Util.getString(OperationsConstants.VDB_VERSION+MISSING)));
- }
- if (!operation.hasDefined(OperationsConstants.SQL_QUERY)) {
- throw new OperationFailedException(new ModelNode().set(IntegrationPlugin.Util.getString(OperationsConstants.SQL_QUERY+MISSING)));
- }
- if (!operation.hasDefined(OperationsConstants.TIMEOUT_IN_MILLI)) {
- throw new OperationFailedException(new ModelNode().set(IntegrationPlugin.Util.getString(OperationsConstants.TIMEOUT_IN_MILLI+MISSING)));
- }
-
- ModelNode result = context.getResult();
- String vdbName = operation.get(OperationsConstants.VDB_NAME).asString();
- int vdbVersion = operation.get(OperationsConstants.VDB_VERSION).asInt();
- String sql = operation.get(OperationsConstants.SQL_QUERY).asString();
- int timeout = operation.get(OperationsConstants.TIMEOUT_IN_MILLI).asInt();
-
- result.set(executeQuery(vdbName, vdbVersion, sql, timeout, new ModelNode()));
- }
-
- protected void describeParameters(ModelNode operationNode, ResourceBundle bundle) {
- operationNode.get(REQUEST_PROPERTIES, OperationsConstants.VDB_NAME, TYPE).set(ModelType.STRING);
- operationNode.get(REQUEST_PROPERTIES, OperationsConstants.VDB_NAME, REQUIRED).set(true);
- operationNode.get(REQUEST_PROPERTIES, OperationsConstants.VDB_NAME, DESCRIPTION).set(getParameterDescription(bundle, OperationsConstants.VDB_NAME));
-
- operationNode.get(REQUEST_PROPERTIES, OperationsConstants.VDB_VERSION, TYPE).set(ModelType.STRING);
- operationNode.get(REQUEST_PROPERTIES, OperationsConstants.VDB_VERSION, REQUIRED).set(true);
- operationNode.get(REQUEST_PROPERTIES, OperationsConstants.VDB_VERSION, DESCRIPTION).set(getParameterDescription(bundle, OperationsConstants.VDB_VERSION));
-
- operationNode.get(REQUEST_PROPERTIES, OperationsConstants.SQL_QUERY, TYPE).set(ModelType.STRING);
- operationNode.get(REQUEST_PROPERTIES, OperationsConstants.SQL_QUERY, REQUIRED).set(true);
- operationNode.get(REQUEST_PROPERTIES, OperationsConstants.SQL_QUERY, DESCRIPTION).set(getParameterDescription(bundle, OperationsConstants.SQL_QUERY));
-
- operationNode.get(REQUEST_PROPERTIES, OperationsConstants.TIMEOUT_IN_MILLI, TYPE).set(ModelType.STRING);
- operationNode.get(REQUEST_PROPERTIES, OperationsConstants.TIMEOUT_IN_MILLI, REQUIRED).set(true);
- operationNode.get(REQUEST_PROPERTIES, OperationsConstants.TIMEOUT_IN_MILLI, DESCRIPTION).set(getParameterDescription(bundle, OperationsConstants.TIMEOUT_IN_MILLI));
-
- operationNode.get(REPLY_PROPERTIES).set(ModelType.LIST);
- }
-
- public ModelNode executeQuery(final String vdbName, final int version, final String command, final long timoutInMilli, final ModelNode resultsNode) throws OperationFailedException {
- String user = "CLI ADMIN"; //$NON-NLS-1$
- LogManager.logDetail(LogConstants.CTX_RUNTIME, IntegrationPlugin.Util.getString("admin_executing", user, command)); //$NON-NLS-1$
-
- SessionMetadata session = createTemporarySession(vdbName, version, user);
-
- final long requestID = 0L;
-
- DQPWorkContext context = new DQPWorkContext();
- context.setSession(session);
-
- try {
- return context.runInContext(new Callable<ModelNode>() {
- @Override
- public ModelNode call() throws Exception {
-
- long start = System.currentTimeMillis();
- RequestMessage request = new RequestMessage(command);
- request.setExecutionId(0L);
- request.setRowLimit(engine.getMaxRowsFetchSize()); // this would limit the number of rows that are returned.
- Future<ResultsMessage> message = engine.executeRequest(requestID, request);
- ResultsMessage rm = null;
- if (timoutInMilli < 0) {
- rm = message.get();
- } else {
- rm = message.get(timoutInMilli, TimeUnit.MILLISECONDS);
- }
- if (rm.getException() != null) {
- throw new AdminProcessingException(rm.getException());
- }
-
- if (rm.isUpdateResult()) {
- writeResults(resultsNode, Arrays.asList("update-count"), rm.getResultsList()); //$NON-NLS-1$
- }
- else {
- writeResults(resultsNode, Arrays.asList(rm.getColumnNames()), rm.getResultsList());
-
- while (rm.getFinalRow() == -1 || rm.getLastRow() < rm.getFinalRow()) {
- long elapsed = System.currentTimeMillis() - start;
- message = engine.processCursorRequest(requestID, rm.getLastRow()+1, 1024);
- rm = message.get(timoutInMilli-elapsed, TimeUnit.MILLISECONDS);
- writeResults(resultsNode, Arrays.asList(rm.getColumnNames()), rm.getResultsList());
- }
- }
-
- long elapsed = System.currentTimeMillis() - start;
- ResultsFuture<?> response = engine.closeRequest(requestID);
- response.get(timoutInMilli-elapsed, TimeUnit.MILLISECONDS);
- return resultsNode;
- }
- });
- } catch (Throwable t) {
- throw new OperationFailedException(new ModelNode().set(t.getMessage()));
- }
- }
-
- private void writeResults(ModelNode resultsNode, List<String> columns, List<? extends List<?>> results) throws SQLException {
- for (List<?> row:results) {
- ModelNode rowNode = new ModelNode();
-
- for (int colNum = 0; colNum < columns.size(); colNum++) {
-
- Object aValue = row.get(colNum);
- if (aValue != null) {
- if (aValue instanceof Integer) {
- rowNode.get(columns.get(colNum)).set((Integer)aValue);
- }
- else if (aValue instanceof Long) {
- rowNode.get(columns.get(colNum)).set((Long)aValue);
- }
- else if (aValue instanceof Double) {
- rowNode.get(columns.get(colNum)).set((Double)aValue);
- }
- else if (aValue instanceof Boolean) {
- rowNode.get(columns.get(colNum)).set((Boolean)aValue);
- }
- else if (aValue instanceof BigInteger) {
- rowNode.get(columns.get(colNum)).set((BigInteger)aValue);
- }
- else if (aValue instanceof BigDecimal) {
- rowNode.get(columns.get(colNum)).set((BigDecimal)aValue);
- }
- else if (aValue instanceof String) {
- rowNode.get(columns.get(colNum), TYPE).set(ModelType.STRING);
- rowNode.get(columns.get(colNum)).set((String)aValue);
- }
- else if (aValue instanceof Blob) {
- rowNode.get(columns.get(colNum), TYPE).set(ModelType.OBJECT);
- rowNode.get(columns.get(colNum)).set("blob"); //$NON-NLS-1$
- }
- else if (aValue instanceof Clob) {
- rowNode.get(columns.get(colNum), TYPE).set(ModelType.OBJECT);
- rowNode.get(columns.get(colNum)).set("clob"); //$NON-NLS-1$
- }
- else if (aValue instanceof SQLXML) {
- SQLXML xml = (SQLXML)aValue;
- rowNode.get(columns.get(colNum), TYPE).set(ModelType.STRING);
- rowNode.get(columns.get(colNum)).set(xml.getString());
- }
- else {
- rowNode.get(columns.get(colNum), TYPE).set(ModelType.STRING);
- rowNode.get(columns.get(colNum)).set(aValue.toString());
- }
- }
- }
- resultsNode.add(rowNode);
- }
- }
-
- private SessionMetadata createTemporarySession(final String vdbName, final int version, final String userName) {
-
- long creationTime = System.currentTimeMillis();
-
- // Return a new session info object
- SessionMetadata newSession = new SessionMetadata();
- newSession.setSessionToken(new SessionToken(userName));
- newSession.setSessionId(newSession.getSessionToken().getSessionID());
- newSession.setUserName(userName);
- newSession.setCreatedTime(creationTime);
- newSession.setApplicationName("admin-console"); //$NON-NLS-1$
- newSession.setVDBName(vdbName);
- newSession.setVDBVersion(version);
-
- newSession.setVdb(this.vdbRepo.getVDB(vdbName, version));
- return newSession;
- }
-}
-
-class GetVDB extends BaseOperationHandler<VDBRepository>{
-
- protected GetVDB() {
- super("get-vdb"); //$NON-NLS-1$
- }
-
- @Override
- protected VDBRepository getService(OperationContext context, PathAddress pathAddress, ModelNode operation) throws OperationFailedException {
- ServiceController<?> sc = context.getServiceRegistry(false).getRequiredService(TeiidServiceNames.VDB_REPO);
- return VDBRepository.class.cast(sc.getValue());
- }
-
- @Override
- protected void executeOperation(OperationContext context, VDBRepository repo, ModelNode operation) throws OperationFailedException {
- if (!operation.hasDefined(OperationsConstants.VDB_NAME)) {
- throw new OperationFailedException(new ModelNode().set(IntegrationPlugin.Util.getString(OperationsConstants.VDB_NAME+MISSING)));
- }
- if (!operation.hasDefined(OperationsConstants.VDB_VERSION)) {
- throw new OperationFailedException(new ModelNode().set(IntegrationPlugin.Util.getString(OperationsConstants.VDB_VERSION+MISSING)));
- }
-
- ModelNode result = context.getResult();
- String vdbName = operation.get(OperationsConstants.VDB_NAME).asString();
- int vdbVersion = operation.get(OperationsConstants.VDB_VERSION).asInt();
-
- VDBMetaData vdb = repo.getVDB(vdbName, vdbVersion);
- VDBMetadataMapper.INSTANCE.wrap(vdb, result);
- }
-
- protected void describeParameters(ModelNode operationNode, ResourceBundle bundle) {
- operationNode.get(REQUEST_PROPERTIES, OperationsConstants.VDB_NAME, TYPE).set(ModelType.STRING);
- operationNode.get(REQUEST_PROPERTIES, OperationsConstants.VDB_NAME, REQUIRED).set(true);
- operationNode.get(REQUEST_PROPERTIES, OperationsConstants.VDB_NAME, DESCRIPTION).set(getParameterDescription(bundle, OperationsConstants.VDB_NAME));
-
- operationNode.get(REQUEST_PROPERTIES, OperationsConstants.VDB_VERSION, TYPE).set(ModelType.STRING);
- operationNode.get(REQUEST_PROPERTIES, OperationsConstants.VDB_VERSION, REQUIRED).set(true);
- operationNode.get(REQUEST_PROPERTIES, OperationsConstants.VDB_VERSION, DESCRIPTION).set(getParameterDescription(bundle, OperationsConstants.VDB_VERSION));
-
- operationNode.get(REPLY_PROPERTIES).set(VDBMetadataMapper.INSTANCE.describe(new ModelNode()));
- }
-}
-
-class ListVDBs extends BaseOperationHandler<VDBRepository>{
-
- protected ListVDBs() {
- super("list-vdbs"); //$NON-NLS-1$
- }
-
- @Override
- protected VDBRepository getService(OperationContext context, PathAddress pathAddress, ModelNode operation) throws OperationFailedException {
- ServiceController<?> sc = context.getServiceRegistry(false).getRequiredService(TeiidServiceNames.VDB_REPO);
- return VDBRepository.class.cast(sc.getValue());
- }
-
- @Override
- protected void executeOperation(OperationContext context, VDBRepository repo, ModelNode operation) throws OperationFailedException {
- ModelNode result = context.getResult();
- List<VDBMetaData> vdbs = repo.getVDBs();
- for (VDBMetaData vdb:vdbs) {
- VDBMetadataMapper.INSTANCE.wrap(vdb, result.add());
- }
- }
- protected void describeParameters(ModelNode operationNode, ResourceBundle bundle) {
- operationNode.get(REPLY_PROPERTIES).add(VDBMetadataMapper.INSTANCE.describe(new ModelNode()));
- }
-}
-
-class ListTranslators extends TranslatorOperationHandler{
-
- protected ListTranslators() {
- super("list-translators"); //$NON-NLS-1$
- }
-
- @Override
- protected void executeOperation(OperationContext context, TranslatorRepository repo, ModelNode operation) throws OperationFailedException {
- ModelNode result = context.getResult();
- List<VDBTranslatorMetaData> translators = repo.getTranslators();
- for (VDBTranslatorMetaData t:translators) {
- VDBMetadataMapper.VDBTranslatorMetaDataMapper.INSTANCE.wrap(t, result.add());
- }
- }
-
- protected void describeParameters(ModelNode operationNode, ResourceBundle bundle) {
- operationNode.get(REPLY_PROPERTIES).add(VDBMetadataMapper.VDBTranslatorMetaDataMapper.INSTANCE.describe(new ModelNode()));
- }
-}
-
-class GetTranslator extends TranslatorOperationHandler{
-
- protected GetTranslator() {
- super("get-translator"); //$NON-NLS-1$
- }
-
- @Override
- protected void executeOperation(OperationContext context, TranslatorRepository repo, ModelNode operation) throws OperationFailedException {
-
- if (!operation.hasDefined(OperationsConstants.TRANSLATOR_NAME)) {
- throw new OperationFailedException(new ModelNode().set(IntegrationPlugin.Util.getString(OperationsConstants.TRANSLATOR_NAME+MISSING)));
- }
-
- ModelNode result = context.getResult();
- String translatorName = operation.get(OperationsConstants.TRANSLATOR_NAME).asString();
- VDBTranslatorMetaData translator = repo.getTranslatorMetaData(translatorName);
- VDBMetadataMapper.VDBTranslatorMetaDataMapper.INSTANCE.wrap(translator, result);
- }
-
- protected void describeParameters(ModelNode operationNode, ResourceBundle bundle) {
- operationNode.get(REQUEST_PROPERTIES, OperationsConstants.TRANSLATOR_NAME, TYPE).set(ModelType.STRING);
- operationNode.get(REQUEST_PROPERTIES, OperationsConstants.TRANSLATOR_NAME, REQUIRED).set(true);
- operationNode.get(REQUEST_PROPERTIES, OperationsConstants.TRANSLATOR_NAME, DESCRIPTION).set(getParameterDescription(bundle, OperationsConstants.TRANSLATOR_NAME));
-
- operationNode.get(REPLY_PROPERTIES).set(VDBTranslatorMetaDataMapper.INSTANCE.describe(new ModelNode()));
- }
-}
-
-abstract class VDBOperations extends BaseOperationHandler<VDBMetaData>{
- private ObjectSerializer serializer;
-
- public VDBOperations(String operationName) {
- super(operationName);
- }
-
- @Override
- public VDBMetaData getService(OperationContext context, PathAddress pathAddress, ModelNode operation) throws OperationFailedException {
- if (!operation.hasDefined(OperationsConstants.VDB_NAME)) {
- throw new OperationFailedException(new ModelNode().set(IntegrationPlugin.Util.getString(OperationsConstants.VDB_NAME+MISSING)));
- }
-
- if (!operation.hasDefined(OperationsConstants.VDB_VERSION)) {
- throw new OperationFailedException(new ModelNode().set(IntegrationPlugin.Util.getString(OperationsConstants.VDB_VERSION+MISSING)));
- }
-
- String vdbName = operation.get(OperationsConstants.VDB_NAME).asString();
- int vdbVersion = operation.get(OperationsConstants.VDB_VERSION).asInt();
-
- ServiceController<?> osSvc = context.getServiceRegistry(false).getRequiredService(TeiidServiceNames.OBJECT_SERIALIZER);
- this.serializer = ObjectSerializer.class.cast(osSvc.getValue());
-
- ServiceController<?> sc = context.getServiceRegistry(false).getRequiredService(TeiidServiceNames.vdbServiceName(vdbName, vdbVersion));
- return VDBMetaData.class.cast(sc.getValue());
- }
-
- protected void describeParameters(ModelNode operationNode, ResourceBundle bundle) {
- operationNode.get(REQUEST_PROPERTIES, OperationsConstants.VDB_NAME, TYPE).set(ModelType.STRING);
- operationNode.get(REQUEST_PROPERTIES, OperationsConstants.VDB_NAME, REQUIRED).set(true);
- operationNode.get(REQUEST_PROPERTIES, OperationsConstants.VDB_NAME, DESCRIPTION).set(getParameterDescription(bundle, OperationsConstants.VDB_NAME));
-
- operationNode.get(REQUEST_PROPERTIES, OperationsConstants.VDB_VERSION, TYPE).set(ModelType.STRING);
- operationNode.get(REQUEST_PROPERTIES, OperationsConstants.VDB_VERSION, REQUIRED).set(true);
- operationNode.get(REQUEST_PROPERTIES, OperationsConstants.VDB_VERSION, DESCRIPTION).set(getParameterDescription(bundle, OperationsConstants.VDB_VERSION));
- }
-
- protected void save(VDBMetaData vdb) throws AdminProcessingException{
- try {
- VDBMetadataParser.marshell(vdb, this.serializer.getVdbXmlOutputStream(vdb));
- } catch (IOException e) {
- throw new AdminProcessingException(e);
- } catch (XMLStreamException e) {
- throw new AdminProcessingException(e);
- }
- }
-}
-
-class AddDataRole extends VDBOperations {
-
- public AddDataRole() {
- super("add-data-role"); //$NON-NLS-1$
- }
-
- @Override
- protected void executeOperation(OperationContext context, VDBMetaData vdb, ModelNode operation) throws OperationFailedException {
- if (!operation.hasDefined(OperationsConstants.DATA_ROLE)) {
- throw new OperationFailedException(new ModelNode().set(IntegrationPlugin.Util.getString(OperationsConstants.DATA_ROLE+MISSING)));
- }
-
- if (!operation.hasDefined(OperationsConstants.MAPPED_ROLE)) {
- throw new OperationFailedException(new ModelNode().set(IntegrationPlugin.Util.getString(OperationsConstants.MAPPED_ROLE+MISSING)));
- }
-
- String policyName = operation.get(OperationsConstants.DATA_ROLE).asString();
- String mappedRole = operation.get(OperationsConstants.MAPPED_ROLE).asString();
-
- try {
- DataPolicyMetadata policy = vdb.getDataPolicy(policyName);
-
- if (policy == null) {
- throw new AdminProcessingException(IntegrationPlugin.Util.getString("policy_not_found", policyName, vdb.getName(), vdb.getVersion())); //$NON-NLS-1$
- }
-
- policy.addMappedRoleName(mappedRole);
- save(vdb);
- } catch (AdminProcessingException e) {
- throw new OperationFailedException(new ModelNode().set(e.getMessage()));
- }
- }
-
- @Override
- protected void describeParameters(ModelNode operationNode, ResourceBundle bundle) {
- super.describeParameters(operationNode, bundle);
-
- operationNode.get(REQUEST_PROPERTIES, OperationsConstants.DATA_ROLE, TYPE).set(ModelType.STRING);
- operationNode.get(REQUEST_PROPERTIES, OperationsConstants.DATA_ROLE, REQUIRED).set(true);
- operationNode.get(REQUEST_PROPERTIES, OperationsConstants.DATA_ROLE, DESCRIPTION).set(getParameterDescription(bundle, OperationsConstants.DATA_ROLE));
-
- operationNode.get(REQUEST_PROPERTIES, OperationsConstants.MAPPED_ROLE, TYPE).set(ModelType.STRING);
- operationNode.get(REQUEST_PROPERTIES, OperationsConstants.MAPPED_ROLE, REQUIRED).set(true);
- operationNode.get(REQUEST_PROPERTIES, OperationsConstants.MAPPED_ROLE, DESCRIPTION).set(getParameterDescription(bundle, OperationsConstants.MAPPED_ROLE));
- }
-}
-
-class RemoveDataRole extends VDBOperations {
-
- public RemoveDataRole() {
- super("remove-data-role"); //$NON-NLS-1$
- }
-
- @Override
- protected void executeOperation(OperationContext context, VDBMetaData vdb, ModelNode operation) throws OperationFailedException {
- if (!operation.hasDefined(OperationsConstants.DATA_ROLE)) {
- throw new OperationFailedException(new ModelNode().set(IntegrationPlugin.Util.getString(OperationsConstants.DATA_ROLE+MISSING)));
- }
-
- if (!operation.hasDefined(OperationsConstants.MAPPED_ROLE)) {
- throw new OperationFailedException(new ModelNode().set(IntegrationPlugin.Util.getString(OperationsConstants.MAPPED_ROLE+MISSING)));
- }
-
- String policyName = operation.get(OperationsConstants.DATA_ROLE).asString();
- String mappedRole = operation.get(OperationsConstants.MAPPED_ROLE).asString();
-
- try {
- DataPolicyMetadata policy = vdb.getDataPolicy(policyName);
-
- if (policy == null) {
- throw new AdminProcessingException(IntegrationPlugin.Util.getString("policy_not_found", policyName, vdb.getName(), vdb.getVersion())); //$NON-NLS-1$
- }
-
- policy.removeMappedRoleName(mappedRole);
- save(vdb);
- } catch (AdminProcessingException e) {
- throw new OperationFailedException(new ModelNode().set(e.getMessage()));
- }
- }
-
- @Override
- protected void describeParameters(ModelNode operationNode, ResourceBundle bundle) {
- super.describeParameters(operationNode, bundle);
-
- operationNode.get(REQUEST_PROPERTIES, OperationsConstants.DATA_ROLE, TYPE).set(ModelType.STRING);
- operationNode.get(REQUEST_PROPERTIES, OperationsConstants.DATA_ROLE, REQUIRED).set(true);
- operationNode.get(REQUEST_PROPERTIES, OperationsConstants.DATA_ROLE, DESCRIPTION).set(getParameterDescription(bundle, OperationsConstants.DATA_ROLE));
-
- operationNode.get(REQUEST_PROPERTIES, OperationsConstants.MAPPED_ROLE, TYPE).set(ModelType.STRING);
- operationNode.get(REQUEST_PROPERTIES, OperationsConstants.MAPPED_ROLE, REQUIRED).set(true);
- operationNode.get(REQUEST_PROPERTIES, OperationsConstants.MAPPED_ROLE, DESCRIPTION).set(getParameterDescription(bundle, OperationsConstants.MAPPED_ROLE));
- }
-}
-
-class AddAnyAuthenticatedDataRole extends VDBOperations {
-
- public AddAnyAuthenticatedDataRole() {
- super("add-anyauthenticated-role"); //$NON-NLS-1$
- }
-
- @Override
- protected void executeOperation(OperationContext context, VDBMetaData vdb, ModelNode operation) throws OperationFailedException {
- if (!operation.hasDefined(OperationsConstants.DATA_ROLE)) {
- throw new OperationFailedException(new ModelNode().set(IntegrationPlugin.Util.getString(OperationsConstants.DATA_ROLE+MISSING)));
- }
-
- String policyName = operation.get(OperationsConstants.DATA_ROLE).asString();
-
- try {
- DataPolicyMetadata policy = vdb.getDataPolicy(policyName);
-
- if (policy == null) {
- throw new AdminProcessingException(IntegrationPlugin.Util.getString("policy_not_found", policyName, vdb.getName(), vdb.getVersion())); //$NON-NLS-1$
- }
-
- policy.setAnyAuthenticated(true);
- save(vdb);
- } catch (AdminProcessingException e) {
- throw new OperationFailedException(new ModelNode().set(e.getMessage()));
- }
- }
-
- @Override
- protected void describeParameters(ModelNode operationNode, ResourceBundle bundle) {
- super.describeParameters(operationNode, bundle);
-
- operationNode.get(REQUEST_PROPERTIES, OperationsConstants.DATA_ROLE, TYPE).set(ModelType.STRING);
- operationNode.get(REQUEST_PROPERTIES, OperationsConstants.DATA_ROLE, REQUIRED).set(true);
- operationNode.get(REQUEST_PROPERTIES, OperationsConstants.DATA_ROLE, DESCRIPTION).set(getParameterDescription(bundle, OperationsConstants.DATA_ROLE));
- }
-
-}
-
-class RemoveAnyAuthenticatedDataRole extends VDBOperations {
-
- public RemoveAnyAuthenticatedDataRole() {
- super("remove-anyauthenticated-role"); //$NON-NLS-1$
- }
-
- @Override
- protected void executeOperation(OperationContext context, VDBMetaData vdb, ModelNode operation) throws OperationFailedException {
- if (!operation.hasDefined(OperationsConstants.DATA_ROLE)) {
- throw new OperationFailedException(new ModelNode().set(IntegrationPlugin.Util.getString(OperationsConstants.DATA_ROLE+MISSING)));
- }
-
- String policyName = operation.get(OperationsConstants.DATA_ROLE).asString();
-
- try {
- DataPolicyMetadata policy = vdb.getDataPolicy(policyName);
-
- if (policy == null) {
- throw new AdminProcessingException(IntegrationPlugin.Util.getString("policy_not_found", policyName, vdb.getName(), vdb.getVersion())); //$NON-NLS-1$
- }
-
- policy.setAnyAuthenticated(false);
- save(vdb);
- } catch (AdminProcessingException e) {
- throw new OperationFailedException(new ModelNode().set(e.getMessage()));
- }
- }
-
- @Override
- protected void describeParameters(ModelNode operationNode, ResourceBundle bundle) {
- super.describeParameters(operationNode, bundle);
-
- operationNode.get(REQUEST_PROPERTIES, OperationsConstants.DATA_ROLE, TYPE).set(ModelType.STRING);
- operationNode.get(REQUEST_PROPERTIES, OperationsConstants.DATA_ROLE, REQUIRED).set(true);
- operationNode.get(REQUEST_PROPERTIES, OperationsConstants.DATA_ROLE, DESCRIPTION).set(getParameterDescription(bundle, OperationsConstants.DATA_ROLE));
- }
-}
-
-class ChangeVDBConnectionType extends VDBOperations {
-
- public ChangeVDBConnectionType() {
- super("change-vdb-connection-type"); //$NON-NLS-1$
- }
-
- @Override
- protected void executeOperation(OperationContext context, VDBMetaData vdb, ModelNode operation) throws OperationFailedException {
- if (!operation.hasDefined(OperationsConstants.CONNECTION_TYPE)) {
- throw new OperationFailedException(new ModelNode().set(IntegrationPlugin.Util.getString(OperationsConstants.CONNECTION_TYPE+MISSING)));
- }
-
- String connectionType = operation.get(OperationsConstants.CONNECTION_TYPE).asString();
- try {
- vdb.setConnectionType(connectionType);
- save(vdb);
- } catch (AdminProcessingException e) {
- throw new OperationFailedException(new ModelNode().set(e.getMessage()));
- }
- }
-
- @Override
- protected void describeParameters(ModelNode operationNode, ResourceBundle bundle) {
- super.describeParameters(operationNode, bundle);
-
- operationNode.get(REQUEST_PROPERTIES, OperationsConstants.CONNECTION_TYPE, TYPE).set(ModelType.STRING);
- operationNode.get(REQUEST_PROPERTIES, OperationsConstants.CONNECTION_TYPE, REQUIRED).set(true);
- operationNode.get(REQUEST_PROPERTIES, OperationsConstants.CONNECTION_TYPE, DESCRIPTION).set(getParameterDescription(bundle, OperationsConstants.CONNECTION_TYPE));
- }
-}
-
-class AssignDataSource extends VDBOperations {
-
- public AssignDataSource() {
- super("assign-datasource"); //$NON-NLS-1$
- }
-
- @Override
- protected void executeOperation(OperationContext context, VDBMetaData vdb, ModelNode operation) throws OperationFailedException {
- if (!operation.hasDefined(OperationsConstants.MODEL_NAME)) {
- throw new OperationFailedException(new ModelNode().set(IntegrationPlugin.Util.getString(OperationsConstants.MODEL_NAME+MISSING)));
- }
-
- if (!operation.hasDefined(OperationsConstants.SOURCE_NAME)) {
- throw new OperationFailedException(new ModelNode().set(IntegrationPlugin.Util.getString(OperationsConstants.SOURCE_NAME+MISSING)));
- }
-
- if (!operation.hasDefined(OperationsConstants.TRANSLATOR_NAME)) {
- throw new OperationFailedException(new ModelNode().set(IntegrationPlugin.Util.getString(OperationsConstants.TRANSLATOR_NAME+MISSING)));
- }
-
- if (!operation.hasDefined(OperationsConstants.DS_NAME)) {
- throw new OperationFailedException(new ModelNode().set(IntegrationPlugin.Util.getString(OperationsConstants.DS_NAME+MISSING)));
- }
-
-
- String modelName = operation.get(OperationsConstants.MODEL_NAME).asString();
- String sourceName = operation.get(OperationsConstants.SOURCE_NAME).asString();
- String translatorName = operation.get(OperationsConstants.TRANSLATOR_NAME).asString();
- String dsName = operation.get(OperationsConstants.DS_NAME).asString();
-
- try {
- ModelMetaData model = vdb.getModel(modelName);
-
- if (model == null) {
- throw new AdminProcessingException(IntegrationPlugin.Util.getString("model_not_found", modelName, vdb.getName(), vdb.getVersion())); //$NON-NLS-1$
- }
-
- SourceMappingMetadata source = model.getSourceMapping(sourceName);
- if(source == null) {
- throw new AdminProcessingException(IntegrationPlugin.Util.getString("source_not_found", sourceName, modelName, vdb.getName(), vdb.getVersion())); //$NON-NLS-1$
- }
- source.setTranslatorName(translatorName);
- source.setConnectionJndiName(dsName);
- save(vdb);
- } catch (AdminProcessingException e) {
- throw new OperationFailedException(new ModelNode().set(e.getMessage()));
- }
- }
-
- @Override
- protected void describeParameters(ModelNode operationNode, ResourceBundle bundle) {
- super.describeParameters(operationNode, bundle);
-
- operationNode.get(REQUEST_PROPERTIES, OperationsConstants.MODEL_NAME, TYPE).set(ModelType.STRING);
- operationNode.get(REQUEST_PROPERTIES, OperationsConstants.MODEL_NAME, REQUIRED).set(true);
- operationNode.get(REQUEST_PROPERTIES, OperationsConstants.MODEL_NAME, DESCRIPTION).set(getParameterDescription(bundle, OperationsConstants.MODEL_NAME));
-
- operationNode.get(REQUEST_PROPERTIES, OperationsConstants.SOURCE_NAME, TYPE).set(ModelType.STRING);
- operationNode.get(REQUEST_PROPERTIES, OperationsConstants.SOURCE_NAME, REQUIRED).set(true);
- operationNode.get(REQUEST_PROPERTIES, OperationsConstants.SOURCE_NAME, DESCRIPTION).set(getParameterDescription(bundle, OperationsConstants.MODEL_NAME));
-
- operationNode.get(REQUEST_PROPERTIES, OperationsConstants.TRANSLATOR_NAME, TYPE).set(ModelType.STRING);
- operationNode.get(REQUEST_PROPERTIES, OperationsConstants.TRANSLATOR_NAME, REQUIRED).set(true);
- operationNode.get(REQUEST_PROPERTIES, OperationsConstants.TRANSLATOR_NAME, DESCRIPTION).set(getParameterDescription(bundle, OperationsConstants.TRANSLATOR_NAME));
-
- operationNode.get(REQUEST_PROPERTIES, OperationsConstants.DS_NAME, TYPE).set(ModelType.STRING);
- operationNode.get(REQUEST_PROPERTIES, OperationsConstants.DS_NAME, REQUIRED).set(true);
- operationNode.get(REQUEST_PROPERTIES, OperationsConstants.DS_NAME, DESCRIPTION).set(getParameterDescription(bundle, OperationsConstants.DS_NAME));
-
- }
-}
\ No newline at end of file
Copied: branches/as7/jboss-integration/src/main/java/org/teiid/jboss/TeiidAdd.java (from rev 3548, branches/as7/jboss-integration/src/main/java/org/teiid/jboss/TeiidBootServicesAdd.java)
===================================================================
--- branches/as7/jboss-integration/src/main/java/org/teiid/jboss/TeiidAdd.java (rev 0)
+++ branches/as7/jboss-integration/src/main/java/org/teiid/jboss/TeiidAdd.java 2011-10-18 15:56:08 UTC (rev 3559)
@@ -0,0 +1,470 @@
+/*
+ * JBoss, Home of Professional Open Source.
+ * See the COPYRIGHT.txt file distributed with this work for information
+ * regarding copyright ownership. Some portions may be licensed
+ * to Red Hat, Inc. under one or more contributor license agreements.
+ *
+ * This library 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 2.1 of the License, or (at your option) any later version.
+ *
+ * This library 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 this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+ * 02110-1301 USA.
+ */
+
+package org.teiid.jboss;
+
+import static org.jboss.as.controller.descriptions.ModelDescriptionConstants.ADD;
+import static org.jboss.as.controller.descriptions.ModelDescriptionConstants.DESCRIPTION;
+import static org.jboss.as.controller.descriptions.ModelDescriptionConstants.OPERATION_NAME;
+import static org.jboss.as.controller.descriptions.ModelDescriptionConstants.REQUEST_PROPERTIES;
+
+import java.util.List;
+import java.util.Locale;
+import java.util.ResourceBundle;
+import java.util.ServiceLoader;
+
+import javax.resource.spi.XATerminator;
+import javax.resource.spi.work.WorkManager;
+import javax.transaction.TransactionManager;
+
+import org.jboss.as.clustering.jgroups.ChannelFactory;
+import org.jboss.as.controller.AbstractAddStepHandler;
+import org.jboss.as.controller.OperationContext;
+import org.jboss.as.controller.OperationFailedException;
+import org.jboss.as.controller.ServiceVerificationHandler;
+import org.jboss.as.controller.descriptions.DescriptionProvider;
+import org.jboss.as.server.AbstractDeploymentChainStep;
+import org.jboss.as.server.DeploymentProcessorTarget;
+import org.jboss.as.server.deployment.Phase;
+import org.jboss.as.server.services.path.RelativePathService;
+import org.jboss.dmr.ModelNode;
+import org.jboss.modules.Module;
+import org.jboss.modules.ModuleIdentifier;
+import org.jboss.modules.ModuleLoadException;
+import org.jboss.msc.service.ServiceBuilder;
+import org.jboss.msc.service.ServiceBuilder.DependencyType;
+import org.jboss.msc.service.ServiceContainer;
+import org.jboss.msc.service.ServiceController;
+import org.jboss.msc.service.ServiceName;
+import org.jboss.msc.service.ServiceTarget;
+import org.jboss.msc.service.ValueService;
+import org.jboss.msc.value.InjectedValue;
+import org.teiid.PolicyDecider;
+import org.teiid.cache.CacheConfiguration;
+import org.teiid.cache.CacheConfiguration.Policy;
+import org.teiid.cache.DefaultCacheFactory;
+import org.teiid.cache.jboss.ClusterableCacheFactory;
+import org.teiid.common.buffer.BufferManager;
+import org.teiid.deployers.SystemVDBDeployer;
+import org.teiid.deployers.VDBRepository;
+import org.teiid.dqp.internal.datamgr.TranslatorRepository;
+import org.teiid.dqp.internal.process.AuthorizationValidator;
+import org.teiid.dqp.internal.process.CachedResults;
+import org.teiid.dqp.internal.process.DQPCore;
+import org.teiid.dqp.internal.process.DataRolePolicyDecider;
+import org.teiid.dqp.internal.process.DefaultAuthorizationValidator;
+import org.teiid.dqp.internal.process.PreparedPlan;
+import org.teiid.dqp.internal.process.SessionAwareCache;
+import org.teiid.jboss.deployers.RuntimeEngineDeployer;
+import org.teiid.query.ObjectReplicator;
+import org.teiid.query.function.SystemFunctionManager;
+import org.teiid.replication.jboss.JGroupsObjectReplicator;
+import org.teiid.services.BufferServiceImpl;
+
+class TeiidAdd extends AbstractAddStepHandler implements DescriptionProvider {
+
+ private static Element[] attributes = {
+ Element.ALLOW_ENV_FUNCTION_ELEMENT,
+ Element.ASYNC_THREAD_POOL_ELEMENT,
+ Element.MAX_THREADS_ELEMENT,
+ Element.MAX_ACTIVE_PLANS_ELEMENT,
+ Element.USER_REQUEST_SOURCE_CONCURRENCY_ELEMENT,
+ Element.TIME_SLICE_IN_MILLI_ELEMENT,
+ Element.MAX_ROWS_FETCH_SIZE_ELEMENT,
+ Element.LOB_CHUNK_SIZE_IN_KB_ELEMENT,
+ Element.QUERY_THRESHOLD_IN_SECS_ELEMENT,
+ Element.MAX_SOURCE_ROWS_ELEMENT,
+ Element.EXCEPTION_ON_MAX_SOURCE_ROWS_ELEMENT,
+ Element.DETECTING_CHANGE_EVENTS_ELEMENT,
+ Element.AUTHORIZATION_VALIDATOR_MODULE_ATTRIBUTE,
+ Element.POLICY_DECIDER_MODULE_ATTRIBUTE,
+
+ // object replicator
+ Element.OR_STACK_ATTRIBUTE,
+ Element.OR_CLUSTER_NAME_ATTRIBUTE,
+
+ // Buffer Service
+ Element.USE_DISK_ATTRIBUTE,
+ Element.PROCESSOR_BATCH_SIZE_ATTRIBUTE,
+ Element.CONNECTOR_BATCH_SIZE_ATTRIBUTE,
+ Element.MAX_PROCESSING_KB_ATTRIBUTE,
+ Element.MAX_RESERVED_KB_ATTRIBUTE,
+ Element.MAX_FILE_SIZE_ATTRIBUTE,
+ Element.MAX_BUFFER_SPACE_ATTRIBUTE,
+ Element.MAX_OPEN_FILES_ATTRIBUTE,
+
+ // prepared plan cache
+ Element.PPC_MAX_ENTRIES_ATTRIBUTE,
+ Element.PPC_MAX_AGE_IN_SECS_ATTRIBUTE,
+
+ // resultset cache
+ Element.RSC_NAME_ELEMENT,
+ Element.RSC_CONTAINER_NAME_ELEMENT,
+ Element.RSC_MAX_STALENESS_ELEMENT,
+ Element.RSC_ENABLE_ATTRIBUTE
+ };
+
+ @Override
+ public ModelNode getModelDescription(Locale locale) {
+ final ResourceBundle bundle = IntegrationPlugin.getResourceBundle(locale);
+ final ModelNode node = new ModelNode();
+ node.get(OPERATION_NAME).set(ADD);
+ node.get(DESCRIPTION).set(bundle.getString("teiid.add")); //$NON-NLS-1$
+
+ describeTeiid(node, REQUEST_PROPERTIES, bundle);
+
+ return node;
+ }
+
+ static void describeTeiid(final ModelNode node, String type, final ResourceBundle bundle) {
+ for (int i = 0; i < attributes.length; i++) {
+ attributes[i].describe(node, type, bundle);
+ }
+ }
+
+ @Override
+ protected void populateModel(ModelNode operation, ModelNode model) throws OperationFailedException {
+ populate(operation, model);
+ }
+
+ static void populate(ModelNode operation, ModelNode model) {
+ for (int i = 0; i < attributes.length; i++) {
+ attributes[i].populate(operation, model);
+ }
+ }
+
+
+ @Override
+ protected void performRuntime(final OperationContext context, final ModelNode operation, final ModelNode model,
+ final ServiceVerificationHandler verificationHandler, final List<ServiceController<?>> newControllers) throws OperationFailedException {
+
+ ServiceTarget target = context.getServiceTarget();
+
+ final JBossLifeCycleListener shutdownListener = new JBossLifeCycleListener();
+
+ final String asyncThreadPoolName = Element.ASYNC_THREAD_POOL_ELEMENT.asString(operation);
+
+ // translator repository
+ final TranslatorRepository translatorRepo = new TranslatorRepository();
+ ValueService<TranslatorRepository> translatorService = new ValueService<TranslatorRepository>(new org.jboss.msc.value.Value<TranslatorRepository>() {
+ @Override
+ public TranslatorRepository getValue() throws IllegalStateException, IllegalArgumentException {
+ return translatorRepo;
+ }
+ });
+ ServiceController<TranslatorRepository> service = target.addService(TeiidServiceNames.TRANSLATOR_REPO, translatorService).install();
+ newControllers.add(service);
+
+ // system function tree
+ SystemFunctionManager systemFunctionManager = new SystemFunctionManager();
+ if (Element.ALLOW_ENV_FUNCTION_ELEMENT.isDefined(operation)) {
+ systemFunctionManager.setAllowEnvFunction(Element.ALLOW_ENV_FUNCTION_ELEMENT.asBoolean(operation));
+ }
+ else {
+ systemFunctionManager.setAllowEnvFunction(false);
+ }
+ systemFunctionManager.setClassloader(Module.getCallerModule().getClassLoader());
+
+ // VDB repository
+ final VDBRepository vdbRepository = new VDBRepository();
+ vdbRepository.setSystemFunctionManager(systemFunctionManager);
+ VDBRepositoryService vdbRepositoryService = new VDBRepositoryService(vdbRepository);
+ newControllers.add(target.addService(TeiidServiceNames.VDB_REPO, vdbRepositoryService).install());
+
+ // System VDB Service
+ SystemVDBDeployer systemVDB = new SystemVDBDeployer();
+ systemVDB.setVDBRepository(vdbRepository);
+ SystemVDBService systemVDBService = new SystemVDBService(systemVDB);
+ newControllers.add(target.addService(TeiidServiceNames.SYSTEM_VDB, systemVDBService).install());
+
+ newControllers.add(RelativePathService.addService(TeiidServiceNames.DATA_DIR, "teiid-data", "jboss.server.data.dir", target)); //$NON-NLS-1$ //$NON-NLS-2$
+ final ObjectsSerializerService serializer = new ObjectsSerializerService();
+ ServiceBuilder<ObjectSerializer> objectSerializerService = target.addService(TeiidServiceNames.OBJECT_SERIALIZER, serializer);
+ objectSerializerService.addDependency(TeiidServiceNames.DATA_DIR, String.class, serializer.getPathInjector());
+ newControllers.add(objectSerializerService.install());
+
+ // TODO: remove verbose service by moving the buffer service from runtime project
+ newControllers.add(RelativePathService.addService(TeiidServiceNames.BUFFER_DIR, "teiid-buffer", "jboss.server.temp.dir", target)); //$NON-NLS-1$ //$NON-NLS-2$
+ final BufferServiceImpl bufferManager = buildBufferManager(operation);
+ BufferManagerService bufferService = new BufferManagerService(bufferManager);
+ ServiceBuilder<BufferServiceImpl> bufferServiceBuilder = target.addService(TeiidServiceNames.BUFFER_MGR, bufferService);
+ bufferServiceBuilder.addDependency(TeiidServiceNames.BUFFER_DIR, String.class, bufferService.pathInjector);
+ newControllers.add(bufferServiceBuilder.install());
+
+ PolicyDecider policyDecider;
+ if (Element.POLICY_DECIDER_MODULE_ATTRIBUTE.isDefined(operation)) {
+ policyDecider = buildService(PolicyDecider.class, Element.POLICY_DECIDER_MODULE_ATTRIBUTE.asString(operation));
+ }
+ else {
+ DataRolePolicyDecider drpd = new DataRolePolicyDecider();
+ drpd.setAllowCreateTemporaryTablesByDefault(true);
+ drpd.setAllowFunctionCallsByDefault(true);
+ policyDecider = drpd;
+ }
+
+ final AuthorizationValidator authValidator;
+ if (Element.AUTHORIZATION_VALIDATOR_MODULE_ATTRIBUTE.isDefined(operation)) {
+ authValidator = buildService(AuthorizationValidator.class, Element.AUTHORIZATION_VALIDATOR_MODULE_ATTRIBUTE.asString(operation));
+ authValidator.setEnabled(true);
+ }
+ else {
+ DefaultAuthorizationValidator dap = new DefaultAuthorizationValidator();
+ dap.setPolicyDecider(policyDecider);
+ dap.setEnabled(true);
+ authValidator = dap;
+ }
+
+ ValueService<AuthorizationValidator> authValidatorService = new ValueService<AuthorizationValidator>(new org.jboss.msc.value.Value<AuthorizationValidator>() {
+ @Override
+ public AuthorizationValidator getValue() throws IllegalStateException, IllegalArgumentException {
+ return authValidator;
+ }
+ });
+ newControllers.add(target.addService(TeiidServiceNames.AUTHORIZATION_VALIDATOR, authValidatorService).install());
+
+ // resultset cache
+ final SessionAwareCache<CachedResults> resultsetCache = buildResultsetCache(operation, bufferManager.getBufferManager());
+ ValueService<SessionAwareCache<CachedResults>> resultSetService = new ValueService<SessionAwareCache<CachedResults>>(new org.jboss.msc.value.Value<SessionAwareCache<CachedResults>>() {
+ @Override
+ public SessionAwareCache<CachedResults> getValue() throws IllegalStateException, IllegalArgumentException {
+ return resultsetCache;
+ }
+ });
+ newControllers.add(target.addService(TeiidServiceNames.CACHE_RESULTSET, resultSetService).install());
+
+ // prepared-plan cache
+ final SessionAwareCache<PreparedPlan> preparedPlanCache = buildPreparedPlanCache(operation, bufferManager.getBufferManager());
+ ValueService<SessionAwareCache<PreparedPlan>> preparedPlanService = new ValueService<SessionAwareCache<PreparedPlan>>(new org.jboss.msc.value.Value<SessionAwareCache<PreparedPlan>>() {
+ @Override
+ public SessionAwareCache<PreparedPlan> getValue() throws IllegalStateException, IllegalArgumentException {
+ return preparedPlanCache;
+ }
+ });
+ newControllers.add(target.addService(TeiidServiceNames.CACHE_PREPAREDPLAN, preparedPlanService).install());
+
+ // Object Replicator
+ if (Element.OR_STACK_ATTRIBUTE.isDefined(operation)) {
+ String stack = Element.OR_STACK_ATTRIBUTE.asString(operation);
+
+ String clusterName = "teiid-rep"; //$NON-NLS-1$
+ if (Element.OR_CLUSTER_NAME_ATTRIBUTE.isDefined(operation)) {
+ clusterName = Element.OR_CLUSTER_NAME_ATTRIBUTE.asString(operation);
+ }
+
+ JGroupsObjectReplicatorService replicatorService = new JGroupsObjectReplicatorService(clusterName);
+ replicatorService.setBufferManager(bufferManager.getBufferManager());
+ ServiceBuilder<JGroupsObjectReplicator> serviceBuilder = target.addService(TeiidServiceNames.OBJECT_REPLICATOR, replicatorService);
+ serviceBuilder.addDependency(ServiceName.JBOSS.append("jgroups", stack), ChannelFactory.class, replicatorService.channelFactoryInjector); //$NON-NLS-1$
+ newControllers.add(serviceBuilder.install());
+ }
+
+ // Query Engine
+ final RuntimeEngineDeployer engine = buildQueryEngine(operation);
+
+ ServiceBuilder<DQPCore> engineBuilder = target.addService(TeiidServiceNames.ENGINE, engine);
+ engineBuilder.addDependency(ServiceName.JBOSS.append("connector", "workmanager"), WorkManager.class, engine.getWorkManagerInjector()); //$NON-NLS-1$ //$NON-NLS-2$
+ engineBuilder.addDependency(ServiceName.JBOSS.append("txn", "XATerminator"), XATerminator.class, engine.getXaTerminatorInjector()); //$NON-NLS-1$ //$NON-NLS-2$
+ engineBuilder.addDependency(ServiceName.JBOSS.append("txn", "TransactionManager"), TransactionManager.class, engine.getTxnManagerInjector()); //$NON-NLS-1$ //$NON-NLS-2$
+ engineBuilder.addDependency(TeiidServiceNames.BUFFER_MGR, BufferServiceImpl.class, engine.getBufferServiceInjector());
+ engineBuilder.addDependency(TeiidServiceNames.SYSTEM_VDB, SystemVDBDeployer.class, new InjectedValue<SystemVDBDeployer>());
+ engineBuilder.addDependency(TeiidServiceNames.TRANSLATOR_REPO, TranslatorRepository.class, engine.getTranslatorRepositoryInjector());
+ engineBuilder.addDependency(TeiidServiceNames.VDB_REPO, VDBRepository.class, engine.getVdbRepositoryInjector());
+ engineBuilder.addDependency(TeiidServiceNames.AUTHORIZATION_VALIDATOR, AuthorizationValidator.class, engine.getAuthorizationValidatorInjector());
+ engineBuilder.addDependency(TeiidServiceNames.CACHE_RESULTSET, SessionAwareCache.class, engine.getResultSetCacheInjector());
+ engineBuilder.addDependency(TeiidServiceNames.CACHE_PREPAREDPLAN, SessionAwareCache.class, engine.getPreparedPlanCacheInjector());
+ engineBuilder.addDependency(DependencyType.OPTIONAL, TeiidServiceNames.OBJECT_REPLICATOR, ObjectReplicator.class, engine.getObjectReplicatorInjector());
+
+ engineBuilder.setInitialMode(ServiceController.Mode.ACTIVE);
+ ServiceController<DQPCore> controller = engineBuilder.install();
+ newControllers.add(controller);
+ ServiceContainer container = controller.getServiceContainer();
+ container.addTerminateListener(shutdownListener);
+
+ // Register VDB deployer
+ context.addStep(new AbstractDeploymentChainStep() {
+ @Override
+ public void execute(DeploymentProcessorTarget processorTarget) {
+ processorTarget.addDeploymentProcessor(Phase.STRUCTURE, Phase.STRUCTURE_WAR_DEPLOYMENT_INIT,new DynamicVDBRootMountDeployer());
+ processorTarget.addDeploymentProcessor(Phase.STRUCTURE, Phase.STRUCTURE_WAR_DEPLOYMENT_INIT|0x0001,new VDBStructureDeployer());
+ processorTarget.addDeploymentProcessor(Phase.PARSE, Phase.PARSE_WEB_DEPLOYMENT|0x0001, new VDBParserDeployer());
+ processorTarget.addDeploymentProcessor(Phase.DEPENDENCIES, Phase.DEPENDENCIES_WAR_MODULE|0x0001, new VDBDependencyDeployer());
+ processorTarget.addDeploymentProcessor(Phase.INSTALL, Phase.INSTALL_WAR_DEPLOYMENT|0x0001, new VDBDeployer(translatorRepo, asyncThreadPoolName));
+ }
+
+ }, OperationContext.Stage.RUNTIME);
+ }
+
+ private <T> T buildService(Class<T> type, String moduleName) throws OperationFailedException {
+ final ModuleIdentifier moduleId;
+ final Module module;
+ try {
+ moduleId = ModuleIdentifier.create(moduleName);
+ module = Module.getCallerModuleLoader().loadModule(moduleId);
+ } catch (ModuleLoadException e) {
+ throw new OperationFailedException(e, new ModelNode().set(IntegrationPlugin.Util.getString("failed_load_module", moduleName))); //$NON-NLS-1$
+ }
+ ServiceLoader<T> services = module.loadService(type);
+ return services.iterator().next();
+ }
+
+
+ private BufferServiceImpl buildBufferManager(ModelNode node) {
+ BufferServiceImpl bufferManger = new BufferServiceImpl();
+
+ if (node == null) {
+ return bufferManger;
+ }
+
+ if (Element.USE_DISK_ATTRIBUTE.isDefined(node)) {
+ bufferManger.setUseDisk(Element.USE_DISK_ATTRIBUTE.asBoolean(node));
+ }
+ if (Element.PROCESSOR_BATCH_SIZE_ATTRIBUTE.isDefined(node)) {
+ bufferManger.setProcessorBatchSize(Element.PROCESSOR_BATCH_SIZE_ATTRIBUTE.asInt(node));
+ }
+ if (Element.CONNECTOR_BATCH_SIZE_ATTRIBUTE.isDefined(node)) {
+ bufferManger.setConnectorBatchSize(Element.CONNECTOR_BATCH_SIZE_ATTRIBUTE.asInt(node));
+ }
+ if (Element.MAX_PROCESSING_KB_ATTRIBUTE.isDefined(node)) {
+ bufferManger.setMaxProcessingKb(Element.MAX_PROCESSING_KB_ATTRIBUTE.asInt(node));
+ }
+ if (Element.MAX_RESERVED_KB_ATTRIBUTE.isDefined(node)) {
+ bufferManger.setMaxReserveKb(Element.MAX_RESERVED_KB_ATTRIBUTE.asInt(node));
+ }
+ if (Element.MAX_FILE_SIZE_ATTRIBUTE.isDefined(node)) {
+ bufferManger.setMaxFileSize(Element.MAX_FILE_SIZE_ATTRIBUTE.asLong(node));
+ }
+ if (Element.MAX_BUFFER_SPACE_ATTRIBUTE.isDefined(node)) {
+ bufferManger.setMaxBufferSpace(Element.MAX_BUFFER_SPACE_ATTRIBUTE.asLong(node));
+ }
+ if (Element.MAX_OPEN_FILES_ATTRIBUTE.isDefined(node)) {
+ bufferManger.setMaxOpenFiles(Element.MAX_OPEN_FILES_ATTRIBUTE.asInt(node));
+ }
+ return bufferManger;
+ }
+
+ private SessionAwareCache<CachedResults> buildResultsetCache(ModelNode node, BufferManager bufferManager) {
+
+ CacheConfiguration cacheConfig = new CacheConfiguration();
+ // these settings are not really used; they are defined by infinispan
+ cacheConfig.setMaxEntries(1024);
+ cacheConfig.setMaxAgeInSeconds(7200);
+ cacheConfig.setType(Policy.EXPIRATION.name());
+ cacheConfig.setLocation("resultset"); //$NON-NLS-1$
+ cacheConfig.setMaxStaleness(60);
+
+ if (Element.RSC_ENABLE_ATTRIBUTE.isDefined(node)) {
+ if (!Element.RSC_ENABLE_ATTRIBUTE.asBoolean(node)) {
+ return null;
+ }
+ }
+
+ ClusterableCacheFactory cacheFactory = null;
+
+ if (Element.RSC_CONTAINER_NAME_ELEMENT.isDefined(node)) {
+ cacheFactory = new ClusterableCacheFactory();
+ cacheFactory.setCacheManager(Element.RSC_CONTAINER_NAME_ELEMENT.asString(node));
+ }
+ else {
+ SessionAwareCache<CachedResults> resultsetCache = new SessionAwareCache<CachedResults>(new DefaultCacheFactory(), SessionAwareCache.Type.RESULTSET, cacheConfig);
+ resultsetCache.setBufferManager(bufferManager);
+ return resultsetCache;
+ }
+
+ if (Element.RSC_NAME_ELEMENT.isDefined(node)) {
+ cacheFactory.setResultsetCacheName(Element.RSC_NAME_ELEMENT.asString(node));
+ }
+ else {
+ cacheFactory.setResultsetCacheName("resultset"); //$NON-NLS-1$
+ }
+
+ if (Element.RSC_MAX_STALENESS_ELEMENT.isDefined(node)) {
+ cacheConfig.setMaxStaleness(Element.RSC_MAX_STALENESS_ELEMENT.asInt(node));
+ }
+
+ SessionAwareCache<CachedResults> resultsetCache = new SessionAwareCache<CachedResults>(cacheFactory, SessionAwareCache.Type.RESULTSET, cacheConfig);
+ resultsetCache.setBufferManager(bufferManager);
+ return resultsetCache;
+ }
+
+
+ private SessionAwareCache<PreparedPlan> buildPreparedPlanCache(ModelNode node, BufferManager bufferManager) {
+ CacheConfiguration cacheConfig = new CacheConfiguration();
+ if (Element.PPC_MAX_ENTRIES_ATTRIBUTE.isDefined(node)) {
+ cacheConfig.setMaxEntries(Element.PPC_MAX_ENTRIES_ATTRIBUTE.asInt(node));
+ }
+ else {
+ cacheConfig.setMaxEntries(512);
+ }
+
+ if (Element.PPC_MAX_AGE_IN_SECS_ATTRIBUTE.isDefined(node)) {
+ cacheConfig.setMaxAgeInSeconds(Element.PPC_MAX_AGE_IN_SECS_ATTRIBUTE.asInt(node));
+ }
+ else {
+ cacheConfig.setMaxAgeInSeconds(28800);
+ }
+
+ cacheConfig.setType(Policy.LRU.name());
+
+ cacheConfig.setLocation("prepared"); //$NON-NLS-1$
+ SessionAwareCache<PreparedPlan> cache = new SessionAwareCache<PreparedPlan>(new DefaultCacheFactory(), SessionAwareCache.Type.PREPAREDPLAN, cacheConfig);
+ cache.setBufferManager(bufferManager);
+
+ return cache;
+ }
+
+
+ private RuntimeEngineDeployer buildQueryEngine(ModelNode node) {
+ RuntimeEngineDeployer engine = new RuntimeEngineDeployer();
+
+ if (Element.MAX_THREADS_ELEMENT.isDefined(node)) {
+ engine.setMaxThreads(Element.MAX_THREADS_ELEMENT.asInt(node));
+ }
+ if (Element.MAX_ACTIVE_PLANS_ELEMENT.isDefined(node)) {
+ engine.setMaxActivePlans(Element.MAX_ACTIVE_PLANS_ELEMENT.asInt(node));
+ }
+ if (Element.USER_REQUEST_SOURCE_CONCURRENCY_ELEMENT.isDefined(node)) {
+ engine.setUserRequestSourceConcurrency(Element.USER_REQUEST_SOURCE_CONCURRENCY_ELEMENT.asInt(node));
+ }
+ if (Element.TIME_SLICE_IN_MILLI_ELEMENT.isDefined(node)) {
+ engine.setTimeSliceInMilli(Element.TIME_SLICE_IN_MILLI_ELEMENT.asInt(node));
+ }
+ if (Element.MAX_ROWS_FETCH_SIZE_ELEMENT.isDefined(node)) {
+ engine.setMaxRowsFetchSize(Element.MAX_ROWS_FETCH_SIZE_ELEMENT.asInt(node));
+ }
+ if (Element.LOB_CHUNK_SIZE_IN_KB_ELEMENT.isDefined(node)) {
+ engine.setLobChunkSizeInKB(Element.LOB_CHUNK_SIZE_IN_KB_ELEMENT.asInt(node));
+ }
+ if (Element.QUERY_THRESHOLD_IN_SECS_ELEMENT.isDefined(node)) {
+ engine.setQueryThresholdInSecs(Element.QUERY_THRESHOLD_IN_SECS_ELEMENT.asInt(node));
+ }
+ if (Element.MAX_SOURCE_ROWS_ELEMENT.isDefined(node)) {
+ engine.setMaxSourceRows(Element.MAX_SOURCE_ROWS_ELEMENT.asInt(node));
+ }
+ if (Element.EXCEPTION_ON_MAX_SOURCE_ROWS_ELEMENT.isDefined(node)) {
+ engine.setExceptionOnMaxSourceRows(Element.EXCEPTION_ON_MAX_SOURCE_ROWS_ELEMENT.asBoolean(node));
+ }
+ if (Element.DETECTING_CHANGE_EVENTS_ELEMENT.isDefined(node)) {
+ engine.setDetectingChangeEvents(Element.DETECTING_CHANGE_EVENTS_ELEMENT.asBoolean(node));
+ }
+ return engine;
+ }
+}
Property changes on: branches/as7/jboss-integration/src/main/java/org/teiid/jboss/TeiidAdd.java
___________________________________________________________________
Added: svn:mime-type
+ text/plain
Deleted: branches/as7/jboss-integration/src/main/java/org/teiid/jboss/TeiidBootServicesAdd.java
===================================================================
--- branches/as7/jboss-integration/src/main/java/org/teiid/jboss/TeiidBootServicesAdd.java 2011-10-18 15:46:00 UTC (rev 3558)
+++ branches/as7/jboss-integration/src/main/java/org/teiid/jboss/TeiidBootServicesAdd.java 2011-10-18 15:56:08 UTC (rev 3559)
@@ -1,477 +0,0 @@
-/*
- * JBoss, Home of Professional Open Source.
- * See the COPYRIGHT.txt file distributed with this work for information
- * regarding copyright ownership. Some portions may be licensed
- * to Red Hat, Inc. under one or more contributor license agreements.
- *
- * This library 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 2.1 of the License, or (at your option) any later version.
- *
- * This library 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 this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
- * 02110-1301 USA.
- */
-
-package org.teiid.jboss;
-
-import static org.jboss.as.controller.descriptions.ModelDescriptionConstants.ADD;
-import static org.jboss.as.controller.descriptions.ModelDescriptionConstants.DESCRIPTION;
-import static org.jboss.as.controller.descriptions.ModelDescriptionConstants.OPERATION_NAME;
-import static org.jboss.as.controller.descriptions.ModelDescriptionConstants.REQUEST_PROPERTIES;
-
-import java.util.List;
-import java.util.Locale;
-import java.util.ResourceBundle;
-import java.util.ServiceLoader;
-
-import javax.resource.spi.XATerminator;
-import javax.resource.spi.work.WorkManager;
-import javax.transaction.TransactionManager;
-
-import org.jboss.as.clustering.jgroups.ChannelFactory;
-import org.jboss.as.controller.AbstractAddStepHandler;
-import org.jboss.as.controller.OperationContext;
-import org.jboss.as.controller.OperationFailedException;
-import org.jboss.as.controller.ServiceVerificationHandler;
-import org.jboss.as.controller.descriptions.DescriptionProvider;
-import org.jboss.as.server.AbstractDeploymentChainStep;
-import org.jboss.as.server.DeploymentProcessorTarget;
-import org.jboss.as.server.deployment.Phase;
-import org.jboss.as.server.services.path.RelativePathService;
-import org.jboss.dmr.ModelNode;
-import org.jboss.modules.Module;
-import org.jboss.modules.ModuleIdentifier;
-import org.jboss.modules.ModuleLoadException;
-import org.jboss.msc.service.ServiceBuilder;
-import org.jboss.msc.service.ServiceBuilder.DependencyType;
-import org.jboss.msc.service.ServiceContainer;
-import org.jboss.msc.service.ServiceController;
-import org.jboss.msc.service.ServiceName;
-import org.jboss.msc.service.ServiceTarget;
-import org.jboss.msc.service.ValueService;
-import org.jboss.msc.value.InjectedValue;
-import org.teiid.PolicyDecider;
-import org.teiid.cache.CacheConfiguration;
-import org.teiid.cache.CacheConfiguration.Policy;
-import org.teiid.cache.DefaultCacheFactory;
-import org.teiid.cache.jboss.ClusterableCacheFactory;
-import org.teiid.common.buffer.BufferManager;
-import org.teiid.deployers.SystemVDBDeployer;
-import org.teiid.deployers.VDBRepository;
-import org.teiid.dqp.internal.datamgr.TranslatorRepository;
-import org.teiid.dqp.internal.process.AuthorizationValidator;
-import org.teiid.dqp.internal.process.CachedResults;
-import org.teiid.dqp.internal.process.DQPCore;
-import org.teiid.dqp.internal.process.DataRolePolicyDecider;
-import org.teiid.dqp.internal.process.DefaultAuthorizationValidator;
-import org.teiid.dqp.internal.process.PreparedPlan;
-import org.teiid.dqp.internal.process.SessionAwareCache;
-import org.teiid.jboss.deployers.RuntimeEngineDeployer;
-import org.teiid.query.ObjectReplicator;
-import org.teiid.query.function.SystemFunctionManager;
-import org.teiid.replication.jboss.JGroupsObjectReplicator;
-import org.teiid.services.BufferServiceImpl;
-
-class TeiidBootServicesAdd extends AbstractAddStepHandler implements DescriptionProvider {
-
- private static Element[] attributes = {
- Element.ALLOW_ENV_FUNCTION_ELEMENT,
- Element.ASYNC_THREAD_POOL_ELEMENT,
- Element.MAX_THREADS_ELEMENT,
- Element.MAX_ACTIVE_PLANS_ELEMENT,
- Element.USER_REQUEST_SOURCE_CONCURRENCY_ELEMENT,
- Element.TIME_SLICE_IN_MILLI_ELEMENT,
- Element.MAX_ROWS_FETCH_SIZE_ELEMENT,
- Element.LOB_CHUNK_SIZE_IN_KB_ELEMENT,
- Element.QUERY_THRESHOLD_IN_SECS_ELEMENT,
- Element.MAX_SOURCE_ROWS_ELEMENT,
- Element.EXCEPTION_ON_MAX_SOURCE_ROWS_ELEMENT,
- Element.DETECTING_CHANGE_EVENTS_ELEMENT,
- Element.AUTHORIZATION_VALIDATOR_MODULE_ATTRIBUTE,
- Element.POLICY_DECIDER_MODULE_ATTRIBUTE,
-
- // object replicator
- Element.OR_STACK_ATTRIBUTE,
- Element.OR_CLUSTER_NAME_ATTRIBUTE,
-
- // Buffer Service
- Element.USE_DISK_ATTRIBUTE,
- Element.PROCESSOR_BATCH_SIZE_ATTRIBUTE,
- Element.CONNECTOR_BATCH_SIZE_ATTRIBUTE,
- Element.MAX_PROCESSING_KB_ATTRIBUTE,
- Element.MAX_RESERVED_KB_ATTRIBUTE,
- Element.MAX_FILE_SIZE_ATTRIBUTE,
- Element.MAX_BUFFER_SPACE_ATTRIBUTE,
- Element.MAX_OPEN_FILES_ATTRIBUTE,
-
- // prepared plan cache
- Element.PPC_MAX_ENTRIES_ATTRIBUTE,
- Element.PPC_MAX_AGE_IN_SECS_ATTRIBUTE,
- Element.PPC_MAX_STALENESS_ATTRIBUTE,
-
- // resultset cache
- Element.RSC_NAME_ELEMENT,
- Element.RSC_CONTAINER_NAME_ELEMENT,
- Element.RSC_MAX_STALENESS_ELEMENT,
- Element.RSC_ENABLE_ATTRIBUTE
- };
-
- @Override
- public ModelNode getModelDescription(Locale locale) {
- final ResourceBundle bundle = IntegrationPlugin.getResourceBundle(locale);
- final ModelNode node = new ModelNode();
- node.get(OPERATION_NAME).set(ADD);
- node.get(DESCRIPTION).set(bundle.getString("teiid.add")); //$NON-NLS-1$
-
- describeTeiid(node, REQUEST_PROPERTIES, bundle);
-
- return node;
- }
-
- static void describeTeiid(final ModelNode node, String type, final ResourceBundle bundle) {
- for (int i = 0; i < attributes.length; i++) {
- attributes[i].describe(node, type, bundle);
- }
- }
-
- @Override
- protected void populateModel(ModelNode operation, ModelNode model) throws OperationFailedException {
- populate(operation, model);
- }
-
- static void populate(ModelNode operation, ModelNode model) {
- for (int i = 0; i < attributes.length; i++) {
- attributes[i].populate(operation, model);
- }
- }
-
-
- @Override
- protected void performRuntime(final OperationContext context, final ModelNode operation, final ModelNode model,
- final ServiceVerificationHandler verificationHandler, final List<ServiceController<?>> newControllers) throws OperationFailedException {
-
- ServiceTarget target = context.getServiceTarget();
-
- final JBossLifeCycleListener shutdownListener = new JBossLifeCycleListener();
-
- final String asyncThreadPoolName = Element.ASYNC_THREAD_POOL_ELEMENT.asString(operation);
-
- // translator repository
- final TranslatorRepository translatorRepo = new TranslatorRepository();
- ValueService<TranslatorRepository> translatorService = new ValueService<TranslatorRepository>(new org.jboss.msc.value.Value<TranslatorRepository>() {
- @Override
- public TranslatorRepository getValue() throws IllegalStateException, IllegalArgumentException {
- return translatorRepo;
- }
- });
- ServiceController<TranslatorRepository> service = target.addService(TeiidServiceNames.TRANSLATOR_REPO, translatorService).install();
- newControllers.add(service);
-
- // system function tree
- SystemFunctionManager systemFunctionManager = new SystemFunctionManager();
- if (Element.ALLOW_ENV_FUNCTION_ELEMENT.isDefined(operation)) {
- systemFunctionManager.setAllowEnvFunction(Element.ALLOW_ENV_FUNCTION_ELEMENT.asBoolean(operation));
- }
- else {
- systemFunctionManager.setAllowEnvFunction(false);
- }
- systemFunctionManager.setClassloader(Module.getCallerModule().getClassLoader());
-
- // VDB repository
- final VDBRepository vdbRepository = new VDBRepository();
- vdbRepository.setSystemFunctionManager(systemFunctionManager);
- VDBRepositoryService vdbRepositoryService = new VDBRepositoryService(vdbRepository);
- newControllers.add(target.addService(TeiidServiceNames.VDB_REPO, vdbRepositoryService).install());
-
- // System VDB Service
- SystemVDBDeployer systemVDB = new SystemVDBDeployer();
- systemVDB.setVDBRepository(vdbRepository);
- SystemVDBService systemVDBService = new SystemVDBService(systemVDB);
- newControllers.add(target.addService(TeiidServiceNames.SYSTEM_VDB, systemVDBService).install());
-
- newControllers.add(RelativePathService.addService(TeiidServiceNames.DATA_DIR, "teiid-data", "jboss.server.data.dir", target)); //$NON-NLS-1$ //$NON-NLS-2$
- final ObjectsSerializerService serializer = new ObjectsSerializerService();
- ServiceBuilder<ObjectSerializer> objectSerializerService = target.addService(TeiidServiceNames.OBJECT_SERIALIZER, serializer);
- objectSerializerService.addDependency(TeiidServiceNames.DATA_DIR, String.class, serializer.getPathInjector());
- newControllers.add(objectSerializerService.install());
-
- // TODO: remove verbose service by moving the buffer service from runtime project
- newControllers.add(RelativePathService.addService(TeiidServiceNames.BUFFER_DIR, "teiid-buffer", "jboss.server.temp.dir", target)); //$NON-NLS-1$ //$NON-NLS-2$
- final BufferServiceImpl bufferManager = buildBufferManager(operation);
- BufferManagerService bufferService = new BufferManagerService(bufferManager);
- ServiceBuilder<BufferServiceImpl> bufferServiceBuilder = target.addService(TeiidServiceNames.BUFFER_MGR, bufferService);
- bufferServiceBuilder.addDependency(TeiidServiceNames.BUFFER_DIR, String.class, bufferService.pathInjector);
- newControllers.add(bufferServiceBuilder.install());
-
- PolicyDecider policyDecider;
- if (Element.POLICY_DECIDER_MODULE_ATTRIBUTE.isDefined(operation)) {
- policyDecider = buildService(PolicyDecider.class, Element.POLICY_DECIDER_MODULE_ATTRIBUTE.asString(operation));
- }
- else {
- DataRolePolicyDecider drpd = new DataRolePolicyDecider();
- drpd.setAllowCreateTemporaryTablesByDefault(true);
- drpd.setAllowFunctionCallsByDefault(true);
- policyDecider = drpd;
- }
-
- final AuthorizationValidator authValidator;
- if (Element.AUTHORIZATION_VALIDATOR_MODULE_ATTRIBUTE.isDefined(operation)) {
- authValidator = buildService(AuthorizationValidator.class, Element.AUTHORIZATION_VALIDATOR_MODULE_ATTRIBUTE.asString(operation));
- authValidator.setEnabled(true);
- }
- else {
- DefaultAuthorizationValidator dap = new DefaultAuthorizationValidator();
- dap.setPolicyDecider(policyDecider);
- dap.setEnabled(true);
- authValidator = dap;
- }
-
- ValueService<AuthorizationValidator> authValidatorService = new ValueService<AuthorizationValidator>(new org.jboss.msc.value.Value<AuthorizationValidator>() {
- @Override
- public AuthorizationValidator getValue() throws IllegalStateException, IllegalArgumentException {
- return authValidator;
- }
- });
- newControllers.add(target.addService(TeiidServiceNames.AUTHORIZATION_VALIDATOR, authValidatorService).install());
-
- // resultset cache
- final SessionAwareCache<CachedResults> resultsetCache = buildResultsetCache(operation, bufferManager.getBufferManager());
- ValueService<SessionAwareCache<CachedResults>> resultSetService = new ValueService<SessionAwareCache<CachedResults>>(new org.jboss.msc.value.Value<SessionAwareCache<CachedResults>>() {
- @Override
- public SessionAwareCache<CachedResults> getValue() throws IllegalStateException, IllegalArgumentException {
- return resultsetCache;
- }
- });
- newControllers.add(target.addService(TeiidServiceNames.CACHE_RESULTSET, resultSetService).install());
-
- // prepared-plan cache
- final SessionAwareCache<PreparedPlan> preparedPlanCache = buildPreparedPlanCache(operation, bufferManager.getBufferManager());
- ValueService<SessionAwareCache<PreparedPlan>> preparedPlanService = new ValueService<SessionAwareCache<PreparedPlan>>(new org.jboss.msc.value.Value<SessionAwareCache<PreparedPlan>>() {
- @Override
- public SessionAwareCache<PreparedPlan> getValue() throws IllegalStateException, IllegalArgumentException {
- return preparedPlanCache;
- }
- });
- newControllers.add(target.addService(TeiidServiceNames.CACHE_PREPAREDPLAN, preparedPlanService).install());
-
- // Object Replicator
- if (Element.OR_STACK_ATTRIBUTE.isDefined(operation)) {
- String stack = Element.OR_STACK_ATTRIBUTE.asString(operation);
-
- String clusterName = "teiid-rep"; //$NON-NLS-1$
- if (Element.OR_CLUSTER_NAME_ATTRIBUTE.isDefined(operation)) {
- clusterName = Element.OR_CLUSTER_NAME_ATTRIBUTE.asString(operation);
- }
-
- JGroupsObjectReplicatorService replicatorService = new JGroupsObjectReplicatorService(clusterName);
- replicatorService.setBufferManager(bufferManager.getBufferManager());
- ServiceBuilder<JGroupsObjectReplicator> serviceBuilder = target.addService(TeiidServiceNames.OBJECT_REPLICATOR, replicatorService);
- serviceBuilder.addDependency(ServiceName.JBOSS.append("jgroups", stack), ChannelFactory.class, replicatorService.channelFactoryInjector); //$NON-NLS-1$
- newControllers.add(serviceBuilder.install());
- }
-
- // Query Engine
- final RuntimeEngineDeployer engine = buildQueryEngine(operation);
-
- ServiceBuilder<DQPCore> engineBuilder = target.addService(TeiidServiceNames.ENGINE, engine);
- engineBuilder.addDependency(ServiceName.JBOSS.append("connector", "workmanager"), WorkManager.class, engine.getWorkManagerInjector()); //$NON-NLS-1$ //$NON-NLS-2$
- engineBuilder.addDependency(ServiceName.JBOSS.append("txn", "XATerminator"), XATerminator.class, engine.getXaTerminatorInjector()); //$NON-NLS-1$ //$NON-NLS-2$
- engineBuilder.addDependency(ServiceName.JBOSS.append("txn", "TransactionManager"), TransactionManager.class, engine.getTxnManagerInjector()); //$NON-NLS-1$ //$NON-NLS-2$
- engineBuilder.addDependency(TeiidServiceNames.BUFFER_MGR, BufferServiceImpl.class, engine.getBufferServiceInjector());
- engineBuilder.addDependency(TeiidServiceNames.SYSTEM_VDB, SystemVDBDeployer.class, new InjectedValue<SystemVDBDeployer>());
- engineBuilder.addDependency(TeiidServiceNames.TRANSLATOR_REPO, TranslatorRepository.class, engine.getTranslatorRepositoryInjector());
- engineBuilder.addDependency(TeiidServiceNames.VDB_REPO, VDBRepository.class, engine.getVdbRepositoryInjector());
- engineBuilder.addDependency(TeiidServiceNames.AUTHORIZATION_VALIDATOR, AuthorizationValidator.class, engine.getAuthorizationValidatorInjector());
- engineBuilder.addDependency(TeiidServiceNames.CACHE_RESULTSET, SessionAwareCache.class, engine.getResultSetCacheInjector());
- engineBuilder.addDependency(TeiidServiceNames.CACHE_PREPAREDPLAN, SessionAwareCache.class, engine.getPreparedPlanCacheInjector());
- engineBuilder.addDependency(DependencyType.OPTIONAL, TeiidServiceNames.OBJECT_REPLICATOR, ObjectReplicator.class, engine.getObjectReplicatorInjector());
-
- engineBuilder.setInitialMode(ServiceController.Mode.ACTIVE);
- ServiceController<DQPCore> controller = engineBuilder.install();
- newControllers.add(controller);
- ServiceContainer container = controller.getServiceContainer();
- container.addTerminateListener(shutdownListener);
-
- // Register VDB deployer
- context.addStep(new AbstractDeploymentChainStep() {
- @Override
- public void execute(DeploymentProcessorTarget processorTarget) {
- processorTarget.addDeploymentProcessor(Phase.STRUCTURE, Phase.STRUCTURE_WAR_DEPLOYMENT_INIT,new DynamicVDBRootMountDeployer());
- processorTarget.addDeploymentProcessor(Phase.STRUCTURE, Phase.STRUCTURE_WAR_DEPLOYMENT_INIT|0x0001,new VDBStructureDeployer());
- processorTarget.addDeploymentProcessor(Phase.PARSE, Phase.PARSE_WEB_DEPLOYMENT|0x0001, new VDBParserDeployer());
- processorTarget.addDeploymentProcessor(Phase.DEPENDENCIES, Phase.DEPENDENCIES_WAR_MODULE|0x0001, new VDBDependencyDeployer());
- processorTarget.addDeploymentProcessor(Phase.INSTALL, Phase.INSTALL_WAR_DEPLOYMENT|0x0001, new VDBDeployer(translatorRepo, asyncThreadPoolName));
- }
-
- }, OperationContext.Stage.RUNTIME);
- }
-
- private <T> T buildService(Class<T> type, String moduleName) throws OperationFailedException {
- final ModuleIdentifier moduleId;
- final Module module;
- try {
- moduleId = ModuleIdentifier.create(moduleName);
- module = Module.getCallerModuleLoader().loadModule(moduleId);
- } catch (ModuleLoadException e) {
- throw new OperationFailedException(e, new ModelNode().set(IntegrationPlugin.Util.getString("failed_load_module", moduleName))); //$NON-NLS-1$
- }
- ServiceLoader<T> services = module.loadService(type);
- return services.iterator().next();
- }
-
-
- private BufferServiceImpl buildBufferManager(ModelNode node) {
- BufferServiceImpl bufferManger = new BufferServiceImpl();
-
- if (node == null) {
- return bufferManger;
- }
-
- if (Element.USE_DISK_ATTRIBUTE.isDefined(node)) {
- bufferManger.setUseDisk(Element.USE_DISK_ATTRIBUTE.asBoolean(node));
- }
- if (Element.PROCESSOR_BATCH_SIZE_ATTRIBUTE.isDefined(node)) {
- bufferManger.setProcessorBatchSize(Element.PROCESSOR_BATCH_SIZE_ATTRIBUTE.asInt(node));
- }
- if (Element.CONNECTOR_BATCH_SIZE_ATTRIBUTE.isDefined(node)) {
- bufferManger.setConnectorBatchSize(Element.CONNECTOR_BATCH_SIZE_ATTRIBUTE.asInt(node));
- }
- if (Element.MAX_PROCESSING_KB_ATTRIBUTE.isDefined(node)) {
- bufferManger.setMaxProcessingKb(Element.MAX_PROCESSING_KB_ATTRIBUTE.asInt(node));
- }
- if (Element.MAX_RESERVED_KB_ATTRIBUTE.isDefined(node)) {
- bufferManger.setMaxReserveKb(Element.MAX_RESERVED_KB_ATTRIBUTE.asInt(node));
- }
- if (Element.MAX_FILE_SIZE_ATTRIBUTE.isDefined(node)) {
- bufferManger.setMaxFileSize(Element.MAX_FILE_SIZE_ATTRIBUTE.asLong(node));
- }
- if (Element.MAX_BUFFER_SPACE_ATTRIBUTE.isDefined(node)) {
- bufferManger.setMaxBufferSpace(Element.MAX_BUFFER_SPACE_ATTRIBUTE.asLong(node));
- }
- if (Element.MAX_OPEN_FILES_ATTRIBUTE.isDefined(node)) {
- bufferManger.setMaxOpenFiles(Element.MAX_OPEN_FILES_ATTRIBUTE.asInt(node));
- }
- return bufferManger;
- }
-
- private SessionAwareCache<CachedResults> buildResultsetCache(ModelNode node, BufferManager bufferManager) {
-
- CacheConfiguration cacheConfig = new CacheConfiguration();
- // these settings are not really used; they are defined by infinispan
- cacheConfig.setMaxEntries(1024);
- cacheConfig.setMaxAgeInSeconds(7200);
- cacheConfig.setType(Policy.EXPIRATION.name());
- cacheConfig.setLocation("resultset"); //$NON-NLS-1$
- cacheConfig.setMaxStaleness(60);
-
- if (Element.RSC_ENABLE_ATTRIBUTE.isDefined(node)) {
- if (!Element.RSC_ENABLE_ATTRIBUTE.asBoolean(node)) {
- return null;
- }
- }
-
- ClusterableCacheFactory cacheFactory = null;
-
- if (Element.RSC_CONTAINER_NAME_ELEMENT.isDefined(node)) {
- cacheFactory = new ClusterableCacheFactory();
- cacheFactory.setCacheManager(Element.RSC_CONTAINER_NAME_ELEMENT.asString(node));
- }
- else {
- SessionAwareCache<CachedResults> resultsetCache = new SessionAwareCache<CachedResults>(new DefaultCacheFactory(), SessionAwareCache.Type.RESULTSET, cacheConfig);
- resultsetCache.setBufferManager(bufferManager);
- return resultsetCache;
- }
-
- if (Element.RSC_NAME_ELEMENT.isDefined(node)) {
- cacheFactory.setResultsetCacheName(Element.RSC_NAME_ELEMENT.asString(node));
- }
- else {
- cacheFactory.setResultsetCacheName("resultset"); //$NON-NLS-1$
- }
-
- if (Element.RSC_MAX_STALENESS_ELEMENT.isDefined(node)) {
- cacheConfig.setMaxStaleness(Element.RSC_MAX_STALENESS_ELEMENT.asInt(node));
- }
-
- SessionAwareCache<CachedResults> resultsetCache = new SessionAwareCache<CachedResults>(cacheFactory, SessionAwareCache.Type.RESULTSET, cacheConfig);
- resultsetCache.setBufferManager(bufferManager);
- return resultsetCache;
- }
-
-
- private SessionAwareCache<PreparedPlan> buildPreparedPlanCache(ModelNode node, BufferManager bufferManager) {
- CacheConfiguration cacheConfig = new CacheConfiguration();
- if (Element.PPC_MAX_ENTRIES_ATTRIBUTE.isDefined(node)) {
- cacheConfig.setMaxEntries(Element.PPC_MAX_ENTRIES_ATTRIBUTE.asInt(node));
- }
- else {
- cacheConfig.setMaxEntries(512);
- }
-
- if (Element.PPC_MAX_AGE_IN_SECS_ATTRIBUTE.isDefined(node)) {
- cacheConfig.setMaxAgeInSeconds(Element.PPC_MAX_AGE_IN_SECS_ATTRIBUTE.asInt(node));
- }
- else {
- cacheConfig.setMaxAgeInSeconds(28800);
- }
-
- if (Element.PPC_MAX_STALENESS_ATTRIBUTE.isDefined(node)) {
- cacheConfig.setMaxStaleness(Element.PPC_MAX_STALENESS_ATTRIBUTE.asInt(node));
- }
- else {
- cacheConfig.setMaxStaleness(0);
- }
- cacheConfig.setType(Policy.LRU.name());
-
- cacheConfig.setLocation("prepared"); //$NON-NLS-1$
- SessionAwareCache<PreparedPlan> cache = new SessionAwareCache<PreparedPlan>(new DefaultCacheFactory(), SessionAwareCache.Type.PREPAREDPLAN, cacheConfig);
- cache.setBufferManager(bufferManager);
-
- return cache;
- }
-
-
- private RuntimeEngineDeployer buildQueryEngine(ModelNode node) {
- RuntimeEngineDeployer engine = new RuntimeEngineDeployer();
-
- if (Element.MAX_THREADS_ELEMENT.isDefined(node)) {
- engine.setMaxThreads(Element.MAX_THREADS_ELEMENT.asInt(node));
- }
- if (Element.MAX_ACTIVE_PLANS_ELEMENT.isDefined(node)) {
- engine.setMaxActivePlans(Element.MAX_ACTIVE_PLANS_ELEMENT.asInt(node));
- }
- if (Element.USER_REQUEST_SOURCE_CONCURRENCY_ELEMENT.isDefined(node)) {
- engine.setUserRequestSourceConcurrency(Element.USER_REQUEST_SOURCE_CONCURRENCY_ELEMENT.asInt(node));
- }
- if (Element.TIME_SLICE_IN_MILLI_ELEMENT.isDefined(node)) {
- engine.setTimeSliceInMilli(Element.TIME_SLICE_IN_MILLI_ELEMENT.asInt(node));
- }
- if (Element.MAX_ROWS_FETCH_SIZE_ELEMENT.isDefined(node)) {
- engine.setMaxRowsFetchSize(Element.MAX_ROWS_FETCH_SIZE_ELEMENT.asInt(node));
- }
- if (Element.LOB_CHUNK_SIZE_IN_KB_ELEMENT.isDefined(node)) {
- engine.setLobChunkSizeInKB(Element.LOB_CHUNK_SIZE_IN_KB_ELEMENT.asInt(node));
- }
- if (Element.QUERY_THRESHOLD_IN_SECS_ELEMENT.isDefined(node)) {
- engine.setQueryThresholdInSecs(Element.QUERY_THRESHOLD_IN_SECS_ELEMENT.asInt(node));
- }
- if (Element.MAX_SOURCE_ROWS_ELEMENT.isDefined(node)) {
- engine.setMaxSourceRows(Element.MAX_SOURCE_ROWS_ELEMENT.asInt(node));
- }
- if (Element.EXCEPTION_ON_MAX_SOURCE_ROWS_ELEMENT.isDefined(node)) {
- engine.setExceptionOnMaxSourceRows(Element.EXCEPTION_ON_MAX_SOURCE_ROWS_ELEMENT.asBoolean(node));
- }
- if (Element.DETECTING_CHANGE_EVENTS_ELEMENT.isDefined(node)) {
- engine.setDetectingChangeEvents(Element.DETECTING_CHANGE_EVENTS_ELEMENT.asBoolean(node));
- }
- return engine;
- }
-}
Modified: branches/as7/jboss-integration/src/main/java/org/teiid/jboss/TeiidExtension.java
===================================================================
--- branches/as7/jboss-integration/src/main/java/org/teiid/jboss/TeiidExtension.java 2011-10-18 15:46:00 UTC (rev 3558)
+++ branches/as7/jboss-integration/src/main/java/org/teiid/jboss/TeiidExtension.java 2011-10-18 15:56:08 UTC (rev 3559)
@@ -55,7 +55,7 @@
private static TransportRemove TRANSPORT_REMOVE = new TransportRemove();
private static TranslatorAdd TRANSLATOR_ADD = new TranslatorAdd();
private static TranslatorRemove TRANSLATOR_REMOVE = new TranslatorRemove();
- private static TeiidBootServicesAdd TEIID_BOOT_ADD = new TeiidBootServicesAdd();
+ private static TeiidAdd TEIID_BOOT_ADD = new TeiidAdd();
private static TeiidSubsystemDescribe TEIID_DESCRIBE = new TeiidSubsystemDescribe();
@Override
@@ -128,8 +128,6 @@
new AssignDataSource().register(teiidSubsystem);
new ChangeVDBConnectionType().register(teiidSubsystem);
new RemoveAnyAuthenticatedDataRole().register(teiidSubsystem);
-
- // engine level admin api handlers
new ListRequests().register(teiidSubsystem);
new ListSessions().register(teiidSubsystem);
new RequestsPerSession().register(teiidSubsystem);
Copied: branches/as7/jboss-integration/src/main/java/org/teiid/jboss/TeiidOperationHandler.java (from rev 3548, branches/as7/jboss-integration/src/main/java/org/teiid/jboss/QueryEngineOperationHandler.java)
===================================================================
--- branches/as7/jboss-integration/src/main/java/org/teiid/jboss/TeiidOperationHandler.java (rev 0)
+++ branches/as7/jboss-integration/src/main/java/org/teiid/jboss/TeiidOperationHandler.java 2011-10-18 15:56:08 UTC (rev 3559)
@@ -0,0 +1,1185 @@
+/*
+ * JBoss, Home of Professional Open Source.
+ * Copyright 2011, Red Hat, Inc., and individual contributors
+ * as indicated by the @author tags. See the copyright.txt file in the
+ * distribution for a full listing of individual contributors.
+ *
+ * This 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 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software 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 this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.teiid.jboss;
+
+import static org.jboss.as.controller.descriptions.ModelDescriptionConstants.DESCRIPTION;
+import static org.jboss.as.controller.descriptions.ModelDescriptionConstants.REPLY_PROPERTIES;
+import static org.jboss.as.controller.descriptions.ModelDescriptionConstants.REQUEST_PROPERTIES;
+import static org.jboss.as.controller.descriptions.ModelDescriptionConstants.REQUIRED;
+import static org.jboss.as.controller.descriptions.ModelDescriptionConstants.TYPE;
+
+import java.io.IOException;
+import java.math.BigDecimal;
+import java.math.BigInteger;
+import java.sql.Blob;
+import java.sql.Clob;
+import java.sql.SQLException;
+import java.sql.SQLXML;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.List;
+import java.util.ResourceBundle;
+import java.util.concurrent.Callable;
+import java.util.concurrent.Future;
+import java.util.concurrent.TimeUnit;
+
+import javax.xml.stream.XMLStreamException;
+
+import org.jboss.as.controller.OperationContext;
+import org.jboss.as.controller.OperationFailedException;
+import org.jboss.as.controller.PathAddress;
+import org.jboss.dmr.ModelNode;
+import org.jboss.dmr.ModelType;
+import org.jboss.msc.service.ServiceController;
+import org.jboss.msc.service.ServiceName;
+import org.teiid.adminapi.Admin;
+import org.teiid.adminapi.AdminException;
+import org.teiid.adminapi.AdminProcessingException;
+import org.teiid.adminapi.impl.*;
+import org.teiid.adminapi.impl.VDBMetadataMapper.TransactionMetadataMapper;
+import org.teiid.adminapi.impl.VDBMetadataMapper.VDBTranslatorMetaDataMapper;
+import org.teiid.client.RequestMessage;
+import org.teiid.client.ResultsMessage;
+import org.teiid.client.security.SessionToken;
+import org.teiid.client.util.ResultsFuture;
+import org.teiid.core.TeiidComponentException;
+import org.teiid.deployers.VDBRepository;
+import org.teiid.dqp.internal.datamgr.TranslatorRepository;
+import org.teiid.dqp.internal.process.DQPCore;
+import org.teiid.dqp.internal.process.DQPWorkContext;
+import org.teiid.dqp.internal.process.SessionAwareCache;
+import org.teiid.logging.LogConstants;
+import org.teiid.logging.LogManager;
+
+abstract class TeiidOperationHandler extends BaseOperationHandler<DQPCore> {
+ List<Transport> transports = new ArrayList<Transport>();
+ protected VDBRepository vdbRepo;
+ protected DQPCore engine;
+
+ protected TeiidOperationHandler(String operationName){
+ super(operationName);
+ }
+
+ @Override
+ protected DQPCore getService(OperationContext context, PathAddress pathAddress, ModelNode operation) throws OperationFailedException {
+ List<ServiceName> services = context.getServiceRegistry(false).getServiceNames();
+ for (ServiceName name:services) {
+ if (name.isParentOf(TeiidServiceNames.TRANSPORT_BASE)) {
+ ServiceController<?> transport = context.getServiceRegistry(false).getService(name);
+ if (transport != null) {
+ this.transports.add(Transport.class.cast(transport.getValue()));
+ }
+ }
+ }
+ ServiceController<?> repo = context.getServiceRegistry(false).getRequiredService(TeiidServiceNames.VDB_REPO);
+ if (repo != null) {
+ this.vdbRepo = VDBRepository.class.cast(repo.getValue());
+ }
+
+ ServiceController<?> sc = context.getServiceRegistry(false).getRequiredService(TeiidServiceNames.ENGINE);
+ if (sc != null) {
+ this.engine = DQPCore.class.cast(sc.getValue());
+ }
+ return this.engine;
+ }
+}
+
+abstract class TranslatorOperationHandler extends BaseOperationHandler<TranslatorRepository> {
+
+ protected TranslatorOperationHandler(String operationName){
+ super(operationName);
+ }
+
+ @Override
+ public TranslatorRepository getService(OperationContext context, PathAddress pathAddress, ModelNode operation) throws OperationFailedException {
+ ServiceController<?> sc = context.getServiceRegistry(false).getRequiredService(TeiidServiceNames.TRANSLATOR_REPO);
+ return TranslatorRepository.class.cast(sc.getValue());
+ }
+}
+
+class GetRuntimeVersion extends TeiidOperationHandler{
+ protected GetRuntimeVersion(String operationName) {
+ super(operationName);
+ }
+ @Override
+ protected void executeOperation(OperationContext context, DQPCore engine, ModelNode operation) throws OperationFailedException{
+ context.getResult().set(engine.getRuntimeVersion());
+ }
+ protected void describeParameters(ModelNode operationNode, ResourceBundle bundle) {
+ operationNode.get(REPLY_PROPERTIES).set(ModelType.STRING);
+ }
+}
+
+class GetActiveSessionsCount extends TeiidOperationHandler{
+ protected GetActiveSessionsCount(String operationName) {
+ super(operationName);
+ }
+ @Override
+ protected void executeOperation(OperationContext context, DQPCore engine, ModelNode operation) throws OperationFailedException{
+ try {
+ int count = 0;
+ for (Transport t: this.transports) {
+ count += t.getActiveSessionsCount();
+ }
+ context.getResult().set(String.valueOf(count));
+ } catch (AdminException e) {
+ throw new OperationFailedException(new ModelNode().set(e.getMessage()));
+ }
+ }
+ protected void describeParameters(ModelNode operationNode, ResourceBundle bundle) {
+ operationNode.get(REPLY_PROPERTIES).set(ModelType.INT);
+ }
+}
+
+class ListSessions extends TeiidOperationHandler{
+ protected ListSessions() {
+ super("list-sessions"); //$NON-NLS-1$
+ }
+ @Override
+ protected void executeOperation(OperationContext context, DQPCore engine, ModelNode operation) throws OperationFailedException{
+ ModelNode result = context.getResult();
+ for (Transport t: this.transports) {
+ Collection<SessionMetadata> sessions = t.getActiveSessions();
+ for (SessionMetadata session:sessions) {
+ VDBMetadataMapper.SessionMetadataMapper.INSTANCE.wrap(session, result.add());
+ }
+ }
+ }
+
+ protected void describeParameters(ModelNode operationNode, ResourceBundle bundle) {
+ operationNode.get(REPLY_PROPERTIES).add(VDBMetadataMapper.SessionMetadataMapper.INSTANCE.describe(new ModelNode()));
+ }
+}
+
+class RequestsPerSession extends TeiidOperationHandler{
+ protected RequestsPerSession() {
+ super("requests-per-session"); //$NON-NLS-1$
+ }
+ @Override
+ protected void executeOperation(OperationContext context, DQPCore engine, ModelNode operation) throws OperationFailedException{
+ if (!operation.hasDefined(OperationsConstants.SESSION)) {
+ throw new OperationFailedException(new ModelNode().set(IntegrationPlugin.Util.getString(OperationsConstants.SESSION+MISSING)));
+ }
+ ModelNode result = context.getResult();
+ List<RequestMetadata> requests = engine.getRequestsForSession(operation.get(OperationsConstants.SESSION).asString());
+ for (RequestMetadata request:requests) {
+ VDBMetadataMapper.RequestMetadataMapper.INSTANCE.wrap(request, result.add());
+ }
+ }
+
+ protected void describeParameters(ModelNode operationNode, ResourceBundle bundle) {
+ operationNode.get(REQUEST_PROPERTIES, OperationsConstants.SESSION, TYPE).set(ModelType.STRING);
+ operationNode.get(REQUEST_PROPERTIES, OperationsConstants.SESSION, REQUIRED).set(true);
+ operationNode.get(REQUEST_PROPERTIES, OperationsConstants.SESSION, DESCRIPTION).set(getParameterDescription(bundle, OperationsConstants.SESSION));
+
+ operationNode.get(REPLY_PROPERTIES).add(VDBMetadataMapper.RequestMetadataMapper.INSTANCE.describe(new ModelNode()));
+ }
+}
+
+class ListRequests extends TeiidOperationHandler{
+ protected ListRequests() {
+ super("list-requests"); //$NON-NLS-1$
+ }
+ @Override
+ protected void executeOperation(OperationContext context, DQPCore engine, ModelNode operation) throws OperationFailedException{
+ ModelNode result = context.getResult();
+ List<RequestMetadata> requests = engine.getRequests();
+ for (RequestMetadata request:requests) {
+ VDBMetadataMapper.RequestMetadataMapper.INSTANCE.wrap(request, result.add());
+ }
+ }
+ protected void describeParameters(ModelNode operationNode, ResourceBundle bundle) {
+ operationNode.get(REPLY_PROPERTIES).add(VDBMetadataMapper.RequestMetadataMapper.INSTANCE.describe(new ModelNode()));
+ }
+}
+
+class RequestsPerVDB extends TeiidOperationHandler{
+ protected RequestsPerVDB() {
+ super("requests-per-vdb"); //$NON-NLS-1$
+ }
+ @Override
+ protected void executeOperation(OperationContext context, DQPCore engine, ModelNode operation) throws OperationFailedException{
+ if (!operation.hasDefined(OperationsConstants.VDB_NAME)) {
+ throw new OperationFailedException(new ModelNode().set(IntegrationPlugin.Util.getString(OperationsConstants.VDB_NAME+MISSING)));
+ }
+ if (!operation.hasDefined(OperationsConstants.VDB_VERSION)) {
+ throw new OperationFailedException(new ModelNode().set(IntegrationPlugin.Util.getString(OperationsConstants.VDB_VERSION+MISSING)));
+ }
+
+ ModelNode result = context.getResult();
+ String vdbName = operation.get(OperationsConstants.VDB_NAME).asString();
+ int vdbVersion = operation.get(OperationsConstants.VDB_VERSION).asInt();
+ for (Transport t: this.transports) {
+ List<RequestMetadata> requests = t.getRequestsUsingVDB(vdbName,vdbVersion);
+ for (RequestMetadata request:requests) {
+ VDBMetadataMapper.RequestMetadataMapper.INSTANCE.wrap(request, result.add());
+ }
+ }
+ }
+
+ protected void describeParameters(ModelNode operationNode, ResourceBundle bundle) {
+ operationNode.get(REQUEST_PROPERTIES, OperationsConstants.VDB_NAME, TYPE).set(ModelType.STRING);
+ operationNode.get(REQUEST_PROPERTIES, OperationsConstants.VDB_NAME, REQUIRED).set(true);
+ operationNode.get(REQUEST_PROPERTIES, OperationsConstants.VDB_NAME, DESCRIPTION).set(getParameterDescription(bundle, OperationsConstants.VDB_NAME));
+
+ operationNode.get(REQUEST_PROPERTIES, OperationsConstants.VDB_VERSION, TYPE).set(ModelType.INT);
+ operationNode.get(REQUEST_PROPERTIES, OperationsConstants.VDB_VERSION, REQUIRED).set(true);
+ operationNode.get(REQUEST_PROPERTIES, OperationsConstants.VDB_VERSION, DESCRIPTION).set(getParameterDescription(bundle, OperationsConstants.VDB_VERSION));
+
+ operationNode.get(REPLY_PROPERTIES).add(VDBMetadataMapper.RequestMetadataMapper.INSTANCE.describe(new ModelNode()));
+ }
+}
+
+class GetLongRunningQueries extends TeiidOperationHandler{
+ protected GetLongRunningQueries() {
+ super("long-running-queries"); //$NON-NLS-1$
+ }
+ @Override
+ protected void executeOperation(OperationContext context, DQPCore engine, ModelNode operation) throws OperationFailedException{
+ ModelNode result = context.getResult();
+ List<RequestMetadata> requests = engine.getLongRunningRequests();
+ for (RequestMetadata request:requests) {
+ VDBMetadataMapper.RequestMetadataMapper.INSTANCE.wrap(request, result.add());
+ }
+ }
+ protected void describeParameters(ModelNode operationNode, ResourceBundle bundle) {
+ operationNode.get(REPLY_PROPERTIES).add(VDBMetadataMapper.RequestMetadataMapper.INSTANCE.describe(new ModelNode()));
+ }
+}
+
+class TerminateSession extends TeiidOperationHandler{
+ protected TerminateSession() {
+ super("terminate-session"); //$NON-NLS-1$
+ }
+ @Override
+ protected void executeOperation(OperationContext context, DQPCore engine, ModelNode operation) throws OperationFailedException{
+ if (!operation.hasDefined(OperationsConstants.SESSION)) {
+ throw new OperationFailedException(new ModelNode().set(IntegrationPlugin.Util.getString(OperationsConstants.SESSION+MISSING)));
+ }
+ for (Transport t: this.transports) {
+ t.terminateSession(operation.get(OperationsConstants.SESSION).asString());
+ }
+ }
+
+ protected void describeParameters(ModelNode operationNode, ResourceBundle bundle) {
+ operationNode.get(REQUEST_PROPERTIES, OperationsConstants.SESSION, TYPE).set(ModelType.STRING);
+ operationNode.get(REQUEST_PROPERTIES, OperationsConstants.SESSION, REQUIRED).set(true);
+ operationNode.get(REQUEST_PROPERTIES, OperationsConstants.SESSION, DESCRIPTION).set(getParameterDescription(bundle, OperationsConstants.SESSION));
+ }
+}
+
+class CancelRequest extends TeiidOperationHandler{
+ protected CancelRequest() {
+ super("cancel-request"); //$NON-NLS-1$
+ }
+ @Override
+ protected void executeOperation(OperationContext context, DQPCore engine, ModelNode operation) throws OperationFailedException{
+ try {
+ if (!operation.hasDefined(OperationsConstants.SESSION)) {
+ throw new OperationFailedException(new ModelNode().set(IntegrationPlugin.Util.getString(OperationsConstants.SESSION+MISSING)));
+ }
+ if (!operation.hasDefined(OperationsConstants.EXECUTION_ID)) {
+ throw new OperationFailedException(new ModelNode().set(IntegrationPlugin.Util.getString(OperationsConstants.EXECUTION_ID+MISSING)));
+ }
+ boolean pass = engine.cancelRequest(operation.get(OperationsConstants.SESSION).asString(), operation.get(OperationsConstants.EXECUTION_ID).asLong());
+ ModelNode result = context.getResult();
+ result.set(pass);
+ } catch (TeiidComponentException e) {
+ throw new OperationFailedException(e, new ModelNode().set(e.getMessage()));
+ }
+ }
+
+ protected void describeParameters(ModelNode operationNode, ResourceBundle bundle) {
+ operationNode.get(REQUEST_PROPERTIES, OperationsConstants.SESSION, TYPE).set(ModelType.STRING);
+ operationNode.get(REQUEST_PROPERTIES, OperationsConstants.SESSION, REQUIRED).set(true);
+ operationNode.get(REQUEST_PROPERTIES, OperationsConstants.SESSION, DESCRIPTION).set(getParameterDescription(bundle, OperationsConstants.SESSION));
+
+ operationNode.get(REQUEST_PROPERTIES, OperationsConstants.EXECUTION_ID, TYPE).set(ModelType.LONG);
+ operationNode.get(REQUEST_PROPERTIES, OperationsConstants.EXECUTION_ID, REQUIRED).set(true);
+ operationNode.get(REQUEST_PROPERTIES, OperationsConstants.EXECUTION_ID, DESCRIPTION).set(getParameterDescription(bundle, OperationsConstants.EXECUTION_ID));
+
+ operationNode.get(REPLY_PROPERTIES).set(ModelType.BOOLEAN);
+ }
+}
+
+abstract class BaseCachehandler extends BaseOperationHandler<SessionAwareCache>{
+ BaseCachehandler(String operationName){
+ super(operationName);
+ }
+
+ @Override
+ protected SessionAwareCache getService(OperationContext context, PathAddress pathAddress, ModelNode operation) throws OperationFailedException {
+ String cacheType = Admin.Cache.QUERY_SERVICE_RESULT_SET_CACHE.name();
+
+ if (operation.hasDefined(OperationsConstants.CACHE_TYPE)) {
+ cacheType = operation.get(OperationsConstants.CACHE_TYPE).asString();
+ //throw new OperationFailedException(new ModelNode().set(IntegrationPlugin.Util.getString(OperationsConstants.CACHE_TYPE+MISSING)));
+ }
+
+ ServiceController<?> sc;
+ if (SessionAwareCache.isResultsetCache(cacheType)) {
+ sc = context.getServiceRegistry(false).getRequiredService(TeiidServiceNames.CACHE_RESULTSET);
+ }
+ else {
+ sc = context.getServiceRegistry(false).getRequiredService(TeiidServiceNames.CACHE_PREPAREDPLAN);
+ }
+
+ return SessionAwareCache.class.cast(sc.getValue());
+ }
+}
+
+
+class CacheTypes extends BaseCachehandler {
+ protected CacheTypes() {
+ super("cache-types"); //$NON-NLS-1$
+ }
+
+ @Override
+ protected void executeOperation(OperationContext context, SessionAwareCache cache, ModelNode operation) throws OperationFailedException {
+ ModelNode result = context.getResult();
+ Collection<String> types = SessionAwareCache.getCacheTypes();
+ for (String type:types) {
+ result.add(type);
+ }
+ }
+
+ protected void describeParameters(ModelNode operationNode, ResourceBundle bundle) {
+ ModelNode node = new ModelNode();
+ node.get(OperationsConstants.CACHE_TYPE, TYPE).set(ModelType.STRING);
+ node.get(OperationsConstants.CACHE_TYPE, REQUIRED).set(true);
+ node.get(OperationsConstants.CACHE_TYPE, DESCRIPTION).set(getParameterDescription(bundle, OperationsConstants.CACHE_TYPE));
+ operationNode.get(REPLY_PROPERTIES).add(node);
+ }
+}
+
+class ClearCache extends BaseCachehandler {
+
+ protected ClearCache() {
+ super("clear-cache"); //$NON-NLS-1$
+ }
+
+ @Override
+ protected void executeOperation(OperationContext context, SessionAwareCache cache, ModelNode operation) throws OperationFailedException {
+ if (operation.hasDefined(OperationsConstants.CACHE_TYPE)) {
+ throw new OperationFailedException(new ModelNode().set(IntegrationPlugin.Util.getString(OperationsConstants.CACHE_TYPE+MISSING)));
+ }
+
+ String cacheType = operation.get(OperationsConstants.CACHE_TYPE).asString();
+ if (operation.hasDefined(OperationsConstants.VDB_NAME) && operation.hasDefined(OperationsConstants.VDB_VERSION)) {
+ String vdbName = operation.get(OperationsConstants.VDB_NAME).asString();
+ int vdbVersion = operation.get(OperationsConstants.VDB_VERSION).asInt();
+ LogManager.logInfo(LogConstants.CTX_DQP, IntegrationPlugin.Util.getString("clearing_cache_vdb", cacheType, vdbName, vdbVersion)); //$NON-NLS-1$
+ cache.clearForVDB(vdbName, vdbVersion);
+ }
+ else {
+ LogManager.logInfo(LogConstants.CTX_DQP, IntegrationPlugin.Util.getString("clearing_cache", cacheType)); //$NON-NLS-1$
+ cache.clearAll();
+ }
+ }
+
+ protected void describeParameters(ModelNode operationNode, ResourceBundle bundle) {
+ operationNode.get(REQUEST_PROPERTIES, OperationsConstants.CACHE_TYPE, TYPE).set(ModelType.STRING);
+ operationNode.get(REQUEST_PROPERTIES, OperationsConstants.CACHE_TYPE, REQUIRED).set(true);
+ operationNode.get(REQUEST_PROPERTIES, OperationsConstants.CACHE_TYPE, DESCRIPTION).set(getParameterDescription(bundle, OperationsConstants.CACHE_TYPE));
+
+ operationNode.get(REQUEST_PROPERTIES, OperationsConstants.VDB_NAME, TYPE).set(ModelType.STRING);
+ operationNode.get(REQUEST_PROPERTIES, OperationsConstants.VDB_NAME, REQUIRED).set(false);
+ operationNode.get(REQUEST_PROPERTIES, OperationsConstants.VDB_NAME, DESCRIPTION).set(getParameterDescription(bundle, OperationsConstants.VDB_NAME));
+
+ operationNode.get(REQUEST_PROPERTIES, OperationsConstants.VDB_VERSION, TYPE).set(ModelType.INT);
+ operationNode.get(REQUEST_PROPERTIES, OperationsConstants.VDB_VERSION, REQUIRED).set(false);
+ operationNode.get(REQUEST_PROPERTIES, OperationsConstants.VDB_VERSION, DESCRIPTION).set(getParameterDescription(bundle, OperationsConstants.VDB_VERSION));
+
+ }
+}
+
+class CacheStatistics extends BaseCachehandler {
+
+ protected CacheStatistics() {
+ super("cache-statistics"); //$NON-NLS-1$
+ }
+
+ @Override
+ protected void executeOperation(OperationContext context, SessionAwareCache cache, ModelNode operation) throws OperationFailedException {
+ if (!operation.hasDefined(OperationsConstants.CACHE_TYPE)) {
+ throw new OperationFailedException(new ModelNode().set(IntegrationPlugin.Util.getString(OperationsConstants.CACHE_TYPE+MISSING)));
+ }
+ ModelNode result = context.getResult();
+ String cacheType = operation.get(OperationsConstants.CACHE_TYPE).asString();
+ CacheStatisticsMetadata stats = buildCacheStats(cacheType, cache);
+ VDBMetadataMapper.CacheStatisticsMetadataMapper.INSTANCE.wrap(stats, result);
+ }
+
+ private CacheStatisticsMetadata buildCacheStats(String name, SessionAwareCache cache) {
+ CacheStatisticsMetadata stats = new CacheStatisticsMetadata();
+ stats.setName(name);
+ stats.setHitRatio(cache.getRequestCount() == 0?0:((double)cache.getCacheHitCount()/cache.getRequestCount())*100);
+ stats.setTotalEntries(cache.getTotalCacheEntries());
+ stats.setRequestCount(cache.getRequestCount());
+ return stats;
+ }
+
+ protected void describeParameters(ModelNode operationNode, ResourceBundle bundle) {
+ operationNode.get(REQUEST_PROPERTIES, OperationsConstants.CACHE_TYPE, TYPE).set(ModelType.STRING);
+ operationNode.get(REQUEST_PROPERTIES, OperationsConstants.CACHE_TYPE, REQUIRED).set(true);
+ operationNode.get(REQUEST_PROPERTIES, OperationsConstants.CACHE_TYPE, DESCRIPTION).set(getParameterDescription(bundle, OperationsConstants.CACHE_TYPE));
+
+ ModelNode node = new ModelNode();
+ operationNode.get(REPLY_PROPERTIES).add(VDBMetadataMapper.CacheStatisticsMetadataMapper.INSTANCE.describe(node));
+ }
+}
+
+class WorkerPoolStatistics extends TeiidOperationHandler{
+
+ protected WorkerPoolStatistics() {
+ super("workerpool-statistics"); //$NON-NLS-1$
+ }
+ @Override
+ protected void executeOperation(OperationContext context, DQPCore engine, ModelNode operation) throws OperationFailedException {
+ ModelNode result = context.getResult();
+ WorkerPoolStatisticsMetadata stats = engine.getWorkerPoolStatistics();
+ VDBMetadataMapper.WorkerPoolStatisticsMetadataMapper.INSTANCE.wrap(stats, result);
+ }
+ protected void describeParameters(ModelNode operationNode, ResourceBundle bundle) {
+ operationNode.get(REPLY_PROPERTIES).add(VDBMetadataMapper.WorkerPoolStatisticsMetadataMapper.INSTANCE.describe(new ModelNode()));
+ }
+}
+
+class ListTransactions extends TeiidOperationHandler{
+
+ protected ListTransactions() {
+ super("list-transactions"); //$NON-NLS-1$
+ }
+ @Override
+ protected void executeOperation(OperationContext context, DQPCore engine, ModelNode operation) throws OperationFailedException {
+ ModelNode result = context.getResult();
+ Collection<TransactionMetadata> txns = engine.getTransactions();
+ for (TransactionMetadata txn:txns) {
+ VDBMetadataMapper.TransactionMetadataMapper.INSTANCE.wrap(txn, result.add());
+ }
+ }
+ protected void describeParameters(ModelNode operationNode, ResourceBundle bundle) {
+ ModelNode node = new ModelNode();
+ operationNode.get(REPLY_PROPERTIES).add(TransactionMetadataMapper.INSTANCE.describe(node));
+ }
+}
+
+class TerminateTransaction extends TeiidOperationHandler{
+
+ protected TerminateTransaction() {
+ super("terminate-transaction"); //$NON-NLS-1$
+ }
+ @Override
+ protected void executeOperation(OperationContext context, DQPCore engine, ModelNode operation) throws OperationFailedException {
+
+ if (!operation.hasDefined(OperationsConstants.XID)) {
+ throw new OperationFailedException(new ModelNode().set(IntegrationPlugin.Util.getString(OperationsConstants.XID+MISSING)));
+ }
+
+ String xid = operation.get(OperationsConstants.XID).asString();
+ try {
+ engine.terminateTransaction(xid);
+ } catch (AdminException e) {
+ throw new OperationFailedException(e, new ModelNode().set(e.getMessage()));
+ }
+ }
+
+ protected void describeParameters(ModelNode operationNode, ResourceBundle bundle) {
+ operationNode.get(REQUEST_PROPERTIES, OperationsConstants.XID, TYPE).set(ModelType.STRING);
+ operationNode.get(REQUEST_PROPERTIES, OperationsConstants.XID, REQUIRED).set(true);
+ operationNode.get(REQUEST_PROPERTIES, OperationsConstants.XID, DESCRIPTION).set(getParameterDescription(bundle, OperationsConstants.XID));
+ }
+}
+
+class MergeVDBs extends BaseOperationHandler<VDBRepository>{
+
+ protected MergeVDBs() {
+ super("merge-vdbs"); //$NON-NLS-1$
+ }
+
+ @Override
+ protected VDBRepository getService(OperationContext context, PathAddress pathAddress, ModelNode operation) throws OperationFailedException {
+ ServiceController<?> sc = context.getServiceRegistry(false).getRequiredService(TeiidServiceNames.VDB_REPO);
+ return VDBRepository.class.cast(sc.getValue());
+ }
+
+ @Override
+ protected void executeOperation(OperationContext context, VDBRepository repo, ModelNode operation) throws OperationFailedException {
+ if (!operation.hasDefined(OperationsConstants.SOURCE_VDBNAME)) {
+ throw new OperationFailedException(new ModelNode().set(IntegrationPlugin.Util.getString(OperationsConstants.SOURCE_VDBNAME+MISSING)));
+ }
+ if (!operation.hasDefined(OperationsConstants.SOURCE_VDBVERSION)) {
+ throw new OperationFailedException(new ModelNode().set(IntegrationPlugin.Util.getString(OperationsConstants.SOURCE_VDBVERSION+MISSING)));
+ }
+
+ if (!operation.hasDefined(OperationsConstants.TARGET_VDBNAME)) {
+ throw new OperationFailedException(new ModelNode().set(IntegrationPlugin.Util.getString(OperationsConstants.TARGET_VDBNAME+MISSING)));
+ }
+ if (!operation.hasDefined(OperationsConstants.TARGET_VDBVERSION)) {
+ throw new OperationFailedException(new ModelNode().set(IntegrationPlugin.Util.getString(OperationsConstants.TARGET_VDBVERSION+MISSING)));
+ }
+
+ String sourceVDBName = operation.get(OperationsConstants.SOURCE_VDBNAME).asString();
+ int sourceVDBversion = operation.get(OperationsConstants.SOURCE_VDBVERSION).asInt();
+ String targetVDBName = operation.get(OperationsConstants.TARGET_VDBNAME).asString();
+ int targetVDBversion = operation.get(OperationsConstants.TARGET_VDBVERSION).asInt();
+ try {
+ repo.mergeVDBs(sourceVDBName, sourceVDBversion, targetVDBName, targetVDBversion);
+ } catch (AdminException e) {
+ throw new OperationFailedException(new ModelNode().set(e.getMessage()));
+ }
+ }
+
+ protected void describeParameters(ModelNode operationNode, ResourceBundle bundle) {
+ operationNode.get(REQUEST_PROPERTIES, OperationsConstants.SOURCE_VDBNAME, TYPE).set(ModelType.STRING);
+ operationNode.get(REQUEST_PROPERTIES, OperationsConstants.SOURCE_VDBNAME, REQUIRED).set(true);
+ operationNode.get(REQUEST_PROPERTIES, OperationsConstants.SOURCE_VDBNAME, DESCRIPTION).set(getParameterDescription(bundle, OperationsConstants.SOURCE_VDBNAME));
+
+ operationNode.get(REQUEST_PROPERTIES, OperationsConstants.SOURCE_VDBVERSION, TYPE).set(ModelType.STRING);
+ operationNode.get(REQUEST_PROPERTIES, OperationsConstants.SOURCE_VDBVERSION, REQUIRED).set(true);
+ operationNode.get(REQUEST_PROPERTIES, OperationsConstants.SOURCE_VDBVERSION, DESCRIPTION).set(getParameterDescription(bundle, OperationsConstants.SOURCE_VDBVERSION));
+
+ operationNode.get(REQUEST_PROPERTIES, OperationsConstants.TARGET_VDBNAME, TYPE).set(ModelType.STRING);
+ operationNode.get(REQUEST_PROPERTIES, OperationsConstants.TARGET_VDBNAME, REQUIRED).set(true);
+ operationNode.get(REQUEST_PROPERTIES, OperationsConstants.TARGET_VDBNAME, DESCRIPTION).set(getParameterDescription(bundle, OperationsConstants.TARGET_VDBNAME));
+
+ operationNode.get(REQUEST_PROPERTIES, OperationsConstants.TARGET_VDBVERSION, TYPE).set(ModelType.STRING);
+ operationNode.get(REQUEST_PROPERTIES, OperationsConstants.TARGET_VDBVERSION, REQUIRED).set(true);
+ operationNode.get(REQUEST_PROPERTIES, OperationsConstants.TARGET_VDBVERSION, DESCRIPTION).set(getParameterDescription(bundle, OperationsConstants.TARGET_VDBVERSION));
+ }
+}
+
+class ExecuteQuery extends TeiidOperationHandler{
+
+ protected ExecuteQuery() {
+ super("execute-query"); //$NON-NLS-1$
+ }
+ @Override
+ protected void executeOperation(OperationContext context, DQPCore engine, ModelNode operation) throws OperationFailedException {
+
+ if (!operation.hasDefined(OperationsConstants.VDB_NAME)) {
+ throw new OperationFailedException(new ModelNode().set(IntegrationPlugin.Util.getString(OperationsConstants.VDB_NAME+MISSING)));
+ }
+ if (!operation.hasDefined(OperationsConstants.VDB_VERSION)) {
+ throw new OperationFailedException(new ModelNode().set(IntegrationPlugin.Util.getString(OperationsConstants.VDB_VERSION+MISSING)));
+ }
+ if (!operation.hasDefined(OperationsConstants.SQL_QUERY)) {
+ throw new OperationFailedException(new ModelNode().set(IntegrationPlugin.Util.getString(OperationsConstants.SQL_QUERY+MISSING)));
+ }
+ if (!operation.hasDefined(OperationsConstants.TIMEOUT_IN_MILLI)) {
+ throw new OperationFailedException(new ModelNode().set(IntegrationPlugin.Util.getString(OperationsConstants.TIMEOUT_IN_MILLI+MISSING)));
+ }
+
+ ModelNode result = context.getResult();
+ String vdbName = operation.get(OperationsConstants.VDB_NAME).asString();
+ int vdbVersion = operation.get(OperationsConstants.VDB_VERSION).asInt();
+ String sql = operation.get(OperationsConstants.SQL_QUERY).asString();
+ int timeout = operation.get(OperationsConstants.TIMEOUT_IN_MILLI).asInt();
+
+ result.set(executeQuery(vdbName, vdbVersion, sql, timeout, new ModelNode()));
+ }
+
+ protected void describeParameters(ModelNode operationNode, ResourceBundle bundle) {
+ operationNode.get(REQUEST_PROPERTIES, OperationsConstants.VDB_NAME, TYPE).set(ModelType.STRING);
+ operationNode.get(REQUEST_PROPERTIES, OperationsConstants.VDB_NAME, REQUIRED).set(true);
+ operationNode.get(REQUEST_PROPERTIES, OperationsConstants.VDB_NAME, DESCRIPTION).set(getParameterDescription(bundle, OperationsConstants.VDB_NAME));
+
+ operationNode.get(REQUEST_PROPERTIES, OperationsConstants.VDB_VERSION, TYPE).set(ModelType.STRING);
+ operationNode.get(REQUEST_PROPERTIES, OperationsConstants.VDB_VERSION, REQUIRED).set(true);
+ operationNode.get(REQUEST_PROPERTIES, OperationsConstants.VDB_VERSION, DESCRIPTION).set(getParameterDescription(bundle, OperationsConstants.VDB_VERSION));
+
+ operationNode.get(REQUEST_PROPERTIES, OperationsConstants.SQL_QUERY, TYPE).set(ModelType.STRING);
+ operationNode.get(REQUEST_PROPERTIES, OperationsConstants.SQL_QUERY, REQUIRED).set(true);
+ operationNode.get(REQUEST_PROPERTIES, OperationsConstants.SQL_QUERY, DESCRIPTION).set(getParameterDescription(bundle, OperationsConstants.SQL_QUERY));
+
+ operationNode.get(REQUEST_PROPERTIES, OperationsConstants.TIMEOUT_IN_MILLI, TYPE).set(ModelType.STRING);
+ operationNode.get(REQUEST_PROPERTIES, OperationsConstants.TIMEOUT_IN_MILLI, REQUIRED).set(true);
+ operationNode.get(REQUEST_PROPERTIES, OperationsConstants.TIMEOUT_IN_MILLI, DESCRIPTION).set(getParameterDescription(bundle, OperationsConstants.TIMEOUT_IN_MILLI));
+
+ operationNode.get(REPLY_PROPERTIES).set(ModelType.LIST);
+ }
+
+ public ModelNode executeQuery(final String vdbName, final int version, final String command, final long timoutInMilli, final ModelNode resultsNode) throws OperationFailedException {
+ String user = "CLI ADMIN"; //$NON-NLS-1$
+ LogManager.logDetail(LogConstants.CTX_RUNTIME, IntegrationPlugin.Util.getString("admin_executing", user, command)); //$NON-NLS-1$
+
+ SessionMetadata session = createTemporarySession(vdbName, version, user);
+
+ final long requestID = 0L;
+
+ DQPWorkContext context = new DQPWorkContext();
+ context.setSession(session);
+
+ try {
+ return context.runInContext(new Callable<ModelNode>() {
+ @Override
+ public ModelNode call() throws Exception {
+
+ long start = System.currentTimeMillis();
+ RequestMessage request = new RequestMessage(command);
+ request.setExecutionId(0L);
+ request.setRowLimit(engine.getMaxRowsFetchSize()); // this would limit the number of rows that are returned.
+ Future<ResultsMessage> message = engine.executeRequest(requestID, request);
+ ResultsMessage rm = null;
+ if (timoutInMilli < 0) {
+ rm = message.get();
+ } else {
+ rm = message.get(timoutInMilli, TimeUnit.MILLISECONDS);
+ }
+ if (rm.getException() != null) {
+ throw new AdminProcessingException(rm.getException());
+ }
+
+ if (rm.isUpdateResult()) {
+ writeResults(resultsNode, Arrays.asList("update-count"), rm.getResultsList()); //$NON-NLS-1$
+ }
+ else {
+ writeResults(resultsNode, Arrays.asList(rm.getColumnNames()), rm.getResultsList());
+
+ while (rm.getFinalRow() == -1 || rm.getLastRow() < rm.getFinalRow()) {
+ long elapsed = System.currentTimeMillis() - start;
+ message = engine.processCursorRequest(requestID, rm.getLastRow()+1, 1024);
+ rm = message.get(timoutInMilli-elapsed, TimeUnit.MILLISECONDS);
+ writeResults(resultsNode, Arrays.asList(rm.getColumnNames()), rm.getResultsList());
+ }
+ }
+
+ long elapsed = System.currentTimeMillis() - start;
+ ResultsFuture<?> response = engine.closeRequest(requestID);
+ response.get(timoutInMilli-elapsed, TimeUnit.MILLISECONDS);
+ return resultsNode;
+ }
+ });
+ } catch (Throwable t) {
+ throw new OperationFailedException(new ModelNode().set(t.getMessage()));
+ }
+ }
+
+ private void writeResults(ModelNode resultsNode, List<String> columns, List<? extends List<?>> results) throws SQLException {
+ for (List<?> row:results) {
+ ModelNode rowNode = new ModelNode();
+
+ for (int colNum = 0; colNum < columns.size(); colNum++) {
+
+ Object aValue = row.get(colNum);
+ if (aValue != null) {
+ if (aValue instanceof Integer) {
+ rowNode.get(columns.get(colNum)).set((Integer)aValue);
+ }
+ else if (aValue instanceof Long) {
+ rowNode.get(columns.get(colNum)).set((Long)aValue);
+ }
+ else if (aValue instanceof Double) {
+ rowNode.get(columns.get(colNum)).set((Double)aValue);
+ }
+ else if (aValue instanceof Boolean) {
+ rowNode.get(columns.get(colNum)).set((Boolean)aValue);
+ }
+ else if (aValue instanceof BigInteger) {
+ rowNode.get(columns.get(colNum)).set((BigInteger)aValue);
+ }
+ else if (aValue instanceof BigDecimal) {
+ rowNode.get(columns.get(colNum)).set((BigDecimal)aValue);
+ }
+ else if (aValue instanceof String) {
+ rowNode.get(columns.get(colNum), TYPE).set(ModelType.STRING);
+ rowNode.get(columns.get(colNum)).set((String)aValue);
+ }
+ else if (aValue instanceof Blob) {
+ rowNode.get(columns.get(colNum), TYPE).set(ModelType.OBJECT);
+ rowNode.get(columns.get(colNum)).set("blob"); //$NON-NLS-1$
+ }
+ else if (aValue instanceof Clob) {
+ rowNode.get(columns.get(colNum), TYPE).set(ModelType.OBJECT);
+ rowNode.get(columns.get(colNum)).set("clob"); //$NON-NLS-1$
+ }
+ else if (aValue instanceof SQLXML) {
+ SQLXML xml = (SQLXML)aValue;
+ rowNode.get(columns.get(colNum), TYPE).set(ModelType.STRING);
+ rowNode.get(columns.get(colNum)).set(xml.getString());
+ }
+ else {
+ rowNode.get(columns.get(colNum), TYPE).set(ModelType.STRING);
+ rowNode.get(columns.get(colNum)).set(aValue.toString());
+ }
+ }
+ }
+ resultsNode.add(rowNode);
+ }
+ }
+
+ private SessionMetadata createTemporarySession(final String vdbName, final int version, final String userName) {
+
+ long creationTime = System.currentTimeMillis();
+
+ // Return a new session info object
+ SessionMetadata newSession = new SessionMetadata();
+ newSession.setSessionToken(new SessionToken(userName));
+ newSession.setSessionId(newSession.getSessionToken().getSessionID());
+ newSession.setUserName(userName);
+ newSession.setCreatedTime(creationTime);
+ newSession.setApplicationName("admin-console"); //$NON-NLS-1$
+ newSession.setVDBName(vdbName);
+ newSession.setVDBVersion(version);
+
+ newSession.setVdb(this.vdbRepo.getVDB(vdbName, version));
+ return newSession;
+ }
+}
+
+class GetVDB extends BaseOperationHandler<VDBRepository>{
+
+ protected GetVDB() {
+ super("get-vdb"); //$NON-NLS-1$
+ }
+
+ @Override
+ protected VDBRepository getService(OperationContext context, PathAddress pathAddress, ModelNode operation) throws OperationFailedException {
+ ServiceController<?> sc = context.getServiceRegistry(false).getRequiredService(TeiidServiceNames.VDB_REPO);
+ return VDBRepository.class.cast(sc.getValue());
+ }
+
+ @Override
+ protected void executeOperation(OperationContext context, VDBRepository repo, ModelNode operation) throws OperationFailedException {
+ if (!operation.hasDefined(OperationsConstants.VDB_NAME)) {
+ throw new OperationFailedException(new ModelNode().set(IntegrationPlugin.Util.getString(OperationsConstants.VDB_NAME+MISSING)));
+ }
+ if (!operation.hasDefined(OperationsConstants.VDB_VERSION)) {
+ throw new OperationFailedException(new ModelNode().set(IntegrationPlugin.Util.getString(OperationsConstants.VDB_VERSION+MISSING)));
+ }
+
+ ModelNode result = context.getResult();
+ String vdbName = operation.get(OperationsConstants.VDB_NAME).asString();
+ int vdbVersion = operation.get(OperationsConstants.VDB_VERSION).asInt();
+
+ VDBMetaData vdb = repo.getVDB(vdbName, vdbVersion);
+ VDBMetadataMapper.INSTANCE.wrap(vdb, result);
+ }
+
+ protected void describeParameters(ModelNode operationNode, ResourceBundle bundle) {
+ operationNode.get(REQUEST_PROPERTIES, OperationsConstants.VDB_NAME, TYPE).set(ModelType.STRING);
+ operationNode.get(REQUEST_PROPERTIES, OperationsConstants.VDB_NAME, REQUIRED).set(true);
+ operationNode.get(REQUEST_PROPERTIES, OperationsConstants.VDB_NAME, DESCRIPTION).set(getParameterDescription(bundle, OperationsConstants.VDB_NAME));
+
+ operationNode.get(REQUEST_PROPERTIES, OperationsConstants.VDB_VERSION, TYPE).set(ModelType.STRING);
+ operationNode.get(REQUEST_PROPERTIES, OperationsConstants.VDB_VERSION, REQUIRED).set(true);
+ operationNode.get(REQUEST_PROPERTIES, OperationsConstants.VDB_VERSION, DESCRIPTION).set(getParameterDescription(bundle, OperationsConstants.VDB_VERSION));
+
+ operationNode.get(REPLY_PROPERTIES).set(VDBMetadataMapper.INSTANCE.describe(new ModelNode()));
+ }
+}
+
+class ListVDBs extends BaseOperationHandler<VDBRepository>{
+
+ protected ListVDBs() {
+ super("list-vdbs"); //$NON-NLS-1$
+ }
+
+ @Override
+ protected VDBRepository getService(OperationContext context, PathAddress pathAddress, ModelNode operation) throws OperationFailedException {
+ ServiceController<?> sc = context.getServiceRegistry(false).getRequiredService(TeiidServiceNames.VDB_REPO);
+ return VDBRepository.class.cast(sc.getValue());
+ }
+
+ @Override
+ protected void executeOperation(OperationContext context, VDBRepository repo, ModelNode operation) throws OperationFailedException {
+ ModelNode result = context.getResult();
+ List<VDBMetaData> vdbs = repo.getVDBs();
+ for (VDBMetaData vdb:vdbs) {
+ VDBMetadataMapper.INSTANCE.wrap(vdb, result.add());
+ }
+ }
+ protected void describeParameters(ModelNode operationNode, ResourceBundle bundle) {
+ operationNode.get(REPLY_PROPERTIES).add(VDBMetadataMapper.INSTANCE.describe(new ModelNode()));
+ }
+}
+
+class ListTranslators extends TranslatorOperationHandler{
+
+ protected ListTranslators() {
+ super("list-translators"); //$NON-NLS-1$
+ }
+
+ @Override
+ protected void executeOperation(OperationContext context, TranslatorRepository repo, ModelNode operation) throws OperationFailedException {
+ ModelNode result = context.getResult();
+ List<VDBTranslatorMetaData> translators = repo.getTranslators();
+ for (VDBTranslatorMetaData t:translators) {
+ VDBMetadataMapper.VDBTranslatorMetaDataMapper.INSTANCE.wrap(t, result.add());
+ }
+ }
+
+ protected void describeParameters(ModelNode operationNode, ResourceBundle bundle) {
+ operationNode.get(REPLY_PROPERTIES).add(VDBMetadataMapper.VDBTranslatorMetaDataMapper.INSTANCE.describe(new ModelNode()));
+ }
+}
+
+class GetTranslator extends TranslatorOperationHandler{
+
+ protected GetTranslator() {
+ super("get-translator"); //$NON-NLS-1$
+ }
+
+ @Override
+ protected void executeOperation(OperationContext context, TranslatorRepository repo, ModelNode operation) throws OperationFailedException {
+
+ if (!operation.hasDefined(OperationsConstants.TRANSLATOR_NAME)) {
+ throw new OperationFailedException(new ModelNode().set(IntegrationPlugin.Util.getString(OperationsConstants.TRANSLATOR_NAME+MISSING)));
+ }
+
+ ModelNode result = context.getResult();
+ String translatorName = operation.get(OperationsConstants.TRANSLATOR_NAME).asString();
+ VDBTranslatorMetaData translator = repo.getTranslatorMetaData(translatorName);
+ VDBMetadataMapper.VDBTranslatorMetaDataMapper.INSTANCE.wrap(translator, result);
+ }
+
+ protected void describeParameters(ModelNode operationNode, ResourceBundle bundle) {
+ operationNode.get(REQUEST_PROPERTIES, OperationsConstants.TRANSLATOR_NAME, TYPE).set(ModelType.STRING);
+ operationNode.get(REQUEST_PROPERTIES, OperationsConstants.TRANSLATOR_NAME, REQUIRED).set(true);
+ operationNode.get(REQUEST_PROPERTIES, OperationsConstants.TRANSLATOR_NAME, DESCRIPTION).set(getParameterDescription(bundle, OperationsConstants.TRANSLATOR_NAME));
+
+ operationNode.get(REPLY_PROPERTIES).set(VDBTranslatorMetaDataMapper.INSTANCE.describe(new ModelNode()));
+ }
+}
+
+abstract class VDBOperations extends BaseOperationHandler<VDBMetaData>{
+ private ObjectSerializer serializer;
+
+ public VDBOperations(String operationName) {
+ super(operationName);
+ }
+
+ @Override
+ public VDBMetaData getService(OperationContext context, PathAddress pathAddress, ModelNode operation) throws OperationFailedException {
+ if (!operation.hasDefined(OperationsConstants.VDB_NAME)) {
+ throw new OperationFailedException(new ModelNode().set(IntegrationPlugin.Util.getString(OperationsConstants.VDB_NAME+MISSING)));
+ }
+
+ if (!operation.hasDefined(OperationsConstants.VDB_VERSION)) {
+ throw new OperationFailedException(new ModelNode().set(IntegrationPlugin.Util.getString(OperationsConstants.VDB_VERSION+MISSING)));
+ }
+
+ String vdbName = operation.get(OperationsConstants.VDB_NAME).asString();
+ int vdbVersion = operation.get(OperationsConstants.VDB_VERSION).asInt();
+
+ ServiceController<?> osSvc = context.getServiceRegistry(false).getRequiredService(TeiidServiceNames.OBJECT_SERIALIZER);
+ this.serializer = ObjectSerializer.class.cast(osSvc.getValue());
+
+ ServiceController<?> sc = context.getServiceRegistry(false).getRequiredService(TeiidServiceNames.vdbServiceName(vdbName, vdbVersion));
+ return VDBMetaData.class.cast(sc.getValue());
+ }
+
+ protected void describeParameters(ModelNode operationNode, ResourceBundle bundle) {
+ operationNode.get(REQUEST_PROPERTIES, OperationsConstants.VDB_NAME, TYPE).set(ModelType.STRING);
+ operationNode.get(REQUEST_PROPERTIES, OperationsConstants.VDB_NAME, REQUIRED).set(true);
+ operationNode.get(REQUEST_PROPERTIES, OperationsConstants.VDB_NAME, DESCRIPTION).set(getParameterDescription(bundle, OperationsConstants.VDB_NAME));
+
+ operationNode.get(REQUEST_PROPERTIES, OperationsConstants.VDB_VERSION, TYPE).set(ModelType.STRING);
+ operationNode.get(REQUEST_PROPERTIES, OperationsConstants.VDB_VERSION, REQUIRED).set(true);
+ operationNode.get(REQUEST_PROPERTIES, OperationsConstants.VDB_VERSION, DESCRIPTION).set(getParameterDescription(bundle, OperationsConstants.VDB_VERSION));
+ }
+
+ protected void save(VDBMetaData vdb) throws AdminProcessingException{
+ try {
+ VDBMetadataParser.marshell(vdb, this.serializer.getVdbXmlOutputStream(vdb));
+ } catch (IOException e) {
+ throw new AdminProcessingException(e);
+ } catch (XMLStreamException e) {
+ throw new AdminProcessingException(e);
+ }
+ }
+}
+
+class AddDataRole extends VDBOperations {
+
+ public AddDataRole() {
+ super("add-data-role"); //$NON-NLS-1$
+ }
+
+ @Override
+ protected void executeOperation(OperationContext context, VDBMetaData vdb, ModelNode operation) throws OperationFailedException {
+ if (!operation.hasDefined(OperationsConstants.DATA_ROLE)) {
+ throw new OperationFailedException(new ModelNode().set(IntegrationPlugin.Util.getString(OperationsConstants.DATA_ROLE+MISSING)));
+ }
+
+ if (!operation.hasDefined(OperationsConstants.MAPPED_ROLE)) {
+ throw new OperationFailedException(new ModelNode().set(IntegrationPlugin.Util.getString(OperationsConstants.MAPPED_ROLE+MISSING)));
+ }
+
+ String policyName = operation.get(OperationsConstants.DATA_ROLE).asString();
+ String mappedRole = operation.get(OperationsConstants.MAPPED_ROLE).asString();
+
+ try {
+ DataPolicyMetadata policy = vdb.getDataPolicy(policyName);
+
+ if (policy == null) {
+ throw new AdminProcessingException(IntegrationPlugin.Util.getString("policy_not_found", policyName, vdb.getName(), vdb.getVersion())); //$NON-NLS-1$
+ }
+
+ policy.addMappedRoleName(mappedRole);
+ save(vdb);
+ } catch (AdminProcessingException e) {
+ throw new OperationFailedException(new ModelNode().set(e.getMessage()));
+ }
+ }
+
+ @Override
+ protected void describeParameters(ModelNode operationNode, ResourceBundle bundle) {
+ super.describeParameters(operationNode, bundle);
+
+ operationNode.get(REQUEST_PROPERTIES, OperationsConstants.DATA_ROLE, TYPE).set(ModelType.STRING);
+ operationNode.get(REQUEST_PROPERTIES, OperationsConstants.DATA_ROLE, REQUIRED).set(true);
+ operationNode.get(REQUEST_PROPERTIES, OperationsConstants.DATA_ROLE, DESCRIPTION).set(getParameterDescription(bundle, OperationsConstants.DATA_ROLE));
+
+ operationNode.get(REQUEST_PROPERTIES, OperationsConstants.MAPPED_ROLE, TYPE).set(ModelType.STRING);
+ operationNode.get(REQUEST_PROPERTIES, OperationsConstants.MAPPED_ROLE, REQUIRED).set(true);
+ operationNode.get(REQUEST_PROPERTIES, OperationsConstants.MAPPED_ROLE, DESCRIPTION).set(getParameterDescription(bundle, OperationsConstants.MAPPED_ROLE));
+ }
+}
+
+class RemoveDataRole extends VDBOperations {
+
+ public RemoveDataRole() {
+ super("remove-data-role"); //$NON-NLS-1$
+ }
+
+ @Override
+ protected void executeOperation(OperationContext context, VDBMetaData vdb, ModelNode operation) throws OperationFailedException {
+ if (!operation.hasDefined(OperationsConstants.DATA_ROLE)) {
+ throw new OperationFailedException(new ModelNode().set(IntegrationPlugin.Util.getString(OperationsConstants.DATA_ROLE+MISSING)));
+ }
+
+ if (!operation.hasDefined(OperationsConstants.MAPPED_ROLE)) {
+ throw new OperationFailedException(new ModelNode().set(IntegrationPlugin.Util.getString(OperationsConstants.MAPPED_ROLE+MISSING)));
+ }
+
+ String policyName = operation.get(OperationsConstants.DATA_ROLE).asString();
+ String mappedRole = operation.get(OperationsConstants.MAPPED_ROLE).asString();
+
+ try {
+ DataPolicyMetadata policy = vdb.getDataPolicy(policyName);
+
+ if (policy == null) {
+ throw new AdminProcessingException(IntegrationPlugin.Util.getString("policy_not_found", policyName, vdb.getName(), vdb.getVersion())); //$NON-NLS-1$
+ }
+
+ policy.removeMappedRoleName(mappedRole);
+ save(vdb);
+ } catch (AdminProcessingException e) {
+ throw new OperationFailedException(new ModelNode().set(e.getMessage()));
+ }
+ }
+
+ @Override
+ protected void describeParameters(ModelNode operationNode, ResourceBundle bundle) {
+ super.describeParameters(operationNode, bundle);
+
+ operationNode.get(REQUEST_PROPERTIES, OperationsConstants.DATA_ROLE, TYPE).set(ModelType.STRING);
+ operationNode.get(REQUEST_PROPERTIES, OperationsConstants.DATA_ROLE, REQUIRED).set(true);
+ operationNode.get(REQUEST_PROPERTIES, OperationsConstants.DATA_ROLE, DESCRIPTION).set(getParameterDescription(bundle, OperationsConstants.DATA_ROLE));
+
+ operationNode.get(REQUEST_PROPERTIES, OperationsConstants.MAPPED_ROLE, TYPE).set(ModelType.STRING);
+ operationNode.get(REQUEST_PROPERTIES, OperationsConstants.MAPPED_ROLE, REQUIRED).set(true);
+ operationNode.get(REQUEST_PROPERTIES, OperationsConstants.MAPPED_ROLE, DESCRIPTION).set(getParameterDescription(bundle, OperationsConstants.MAPPED_ROLE));
+ }
+}
+
+class AddAnyAuthenticatedDataRole extends VDBOperations {
+
+ public AddAnyAuthenticatedDataRole() {
+ super("add-anyauthenticated-role"); //$NON-NLS-1$
+ }
+
+ @Override
+ protected void executeOperation(OperationContext context, VDBMetaData vdb, ModelNode operation) throws OperationFailedException {
+ if (!operation.hasDefined(OperationsConstants.DATA_ROLE)) {
+ throw new OperationFailedException(new ModelNode().set(IntegrationPlugin.Util.getString(OperationsConstants.DATA_ROLE+MISSING)));
+ }
+
+ String policyName = operation.get(OperationsConstants.DATA_ROLE).asString();
+
+ try {
+ DataPolicyMetadata policy = vdb.getDataPolicy(policyName);
+
+ if (policy == null) {
+ throw new AdminProcessingException(IntegrationPlugin.Util.getString("policy_not_found", policyName, vdb.getName(), vdb.getVersion())); //$NON-NLS-1$
+ }
+
+ policy.setAnyAuthenticated(true);
+ save(vdb);
+ } catch (AdminProcessingException e) {
+ throw new OperationFailedException(new ModelNode().set(e.getMessage()));
+ }
+ }
+
+ @Override
+ protected void describeParameters(ModelNode operationNode, ResourceBundle bundle) {
+ super.describeParameters(operationNode, bundle);
+
+ operationNode.get(REQUEST_PROPERTIES, OperationsConstants.DATA_ROLE, TYPE).set(ModelType.STRING);
+ operationNode.get(REQUEST_PROPERTIES, OperationsConstants.DATA_ROLE, REQUIRED).set(true);
+ operationNode.get(REQUEST_PROPERTIES, OperationsConstants.DATA_ROLE, DESCRIPTION).set(getParameterDescription(bundle, OperationsConstants.DATA_ROLE));
+ }
+
+}
+
+class RemoveAnyAuthenticatedDataRole extends VDBOperations {
+
+ public RemoveAnyAuthenticatedDataRole() {
+ super("remove-anyauthenticated-role"); //$NON-NLS-1$
+ }
+
+ @Override
+ protected void executeOperation(OperationContext context, VDBMetaData vdb, ModelNode operation) throws OperationFailedException {
+ if (!operation.hasDefined(OperationsConstants.DATA_ROLE)) {
+ throw new OperationFailedException(new ModelNode().set(IntegrationPlugin.Util.getString(OperationsConstants.DATA_ROLE+MISSING)));
+ }
+
+ String policyName = operation.get(OperationsConstants.DATA_ROLE).asString();
+
+ try {
+ DataPolicyMetadata policy = vdb.getDataPolicy(policyName);
+
+ if (policy == null) {
+ throw new AdminProcessingException(IntegrationPlugin.Util.getString("policy_not_found", policyName, vdb.getName(), vdb.getVersion())); //$NON-NLS-1$
+ }
+
+ policy.setAnyAuthenticated(false);
+ save(vdb);
+ } catch (AdminProcessingException e) {
+ throw new OperationFailedException(new ModelNode().set(e.getMessage()));
+ }
+ }
+
+ @Override
+ protected void describeParameters(ModelNode operationNode, ResourceBundle bundle) {
+ super.describeParameters(operationNode, bundle);
+
+ operationNode.get(REQUEST_PROPERTIES, OperationsConstants.DATA_ROLE, TYPE).set(ModelType.STRING);
+ operationNode.get(REQUEST_PROPERTIES, OperationsConstants.DATA_ROLE, REQUIRED).set(true);
+ operationNode.get(REQUEST_PROPERTIES, OperationsConstants.DATA_ROLE, DESCRIPTION).set(getParameterDescription(bundle, OperationsConstants.DATA_ROLE));
+ }
+}
+
+class ChangeVDBConnectionType extends VDBOperations {
+
+ public ChangeVDBConnectionType() {
+ super("change-vdb-connection-type"); //$NON-NLS-1$
+ }
+
+ @Override
+ protected void executeOperation(OperationContext context, VDBMetaData vdb, ModelNode operation) throws OperationFailedException {
+ if (!operation.hasDefined(OperationsConstants.CONNECTION_TYPE)) {
+ throw new OperationFailedException(new ModelNode().set(IntegrationPlugin.Util.getString(OperationsConstants.CONNECTION_TYPE+MISSING)));
+ }
+
+ String connectionType = operation.get(OperationsConstants.CONNECTION_TYPE).asString();
+ try {
+ vdb.setConnectionType(connectionType);
+ save(vdb);
+ } catch (AdminProcessingException e) {
+ throw new OperationFailedException(new ModelNode().set(e.getMessage()));
+ }
+ }
+
+ @Override
+ protected void describeParameters(ModelNode operationNode, ResourceBundle bundle) {
+ super.describeParameters(operationNode, bundle);
+
+ operationNode.get(REQUEST_PROPERTIES, OperationsConstants.CONNECTION_TYPE, TYPE).set(ModelType.STRING);
+ operationNode.get(REQUEST_PROPERTIES, OperationsConstants.CONNECTION_TYPE, REQUIRED).set(true);
+ operationNode.get(REQUEST_PROPERTIES, OperationsConstants.CONNECTION_TYPE, DESCRIPTION).set(getParameterDescription(bundle, OperationsConstants.CONNECTION_TYPE));
+ }
+}
+
+class AssignDataSource extends VDBOperations {
+
+ public AssignDataSource() {
+ super("assign-datasource"); //$NON-NLS-1$
+ }
+
+ @Override
+ protected void executeOperation(OperationContext context, VDBMetaData vdb, ModelNode operation) throws OperationFailedException {
+ if (!operation.hasDefined(OperationsConstants.MODEL_NAME)) {
+ throw new OperationFailedException(new ModelNode().set(IntegrationPlugin.Util.getString(OperationsConstants.MODEL_NAME+MISSING)));
+ }
+
+ if (!operation.hasDefined(OperationsConstants.SOURCE_NAME)) {
+ throw new OperationFailedException(new ModelNode().set(IntegrationPlugin.Util.getString(OperationsConstants.SOURCE_NAME+MISSING)));
+ }
+
+ if (!operation.hasDefined(OperationsConstants.TRANSLATOR_NAME)) {
+ throw new OperationFailedException(new ModelNode().set(IntegrationPlugin.Util.getString(OperationsConstants.TRANSLATOR_NAME+MISSING)));
+ }
+
+ if (!operation.hasDefined(OperationsConstants.DS_NAME)) {
+ throw new OperationFailedException(new ModelNode().set(IntegrationPlugin.Util.getString(OperationsConstants.DS_NAME+MISSING)));
+ }
+
+
+ String modelName = operation.get(OperationsConstants.MODEL_NAME).asString();
+ String sourceName = operation.get(OperationsConstants.SOURCE_NAME).asString();
+ String translatorName = operation.get(OperationsConstants.TRANSLATOR_NAME).asString();
+ String dsName = operation.get(OperationsConstants.DS_NAME).asString();
+
+ try {
+ ModelMetaData model = vdb.getModel(modelName);
+
+ if (model == null) {
+ throw new AdminProcessingException(IntegrationPlugin.Util.getString("model_not_found", modelName, vdb.getName(), vdb.getVersion())); //$NON-NLS-1$
+ }
+
+ SourceMappingMetadata source = model.getSourceMapping(sourceName);
+ if(source == null) {
+ throw new AdminProcessingException(IntegrationPlugin.Util.getString("source_not_found", sourceName, modelName, vdb.getName(), vdb.getVersion())); //$NON-NLS-1$
+ }
+ source.setTranslatorName(translatorName);
+ source.setConnectionJndiName(dsName);
+ save(vdb);
+ } catch (AdminProcessingException e) {
+ throw new OperationFailedException(new ModelNode().set(e.getMessage()));
+ }
+ }
+
+ @Override
+ protected void describeParameters(ModelNode operationNode, ResourceBundle bundle) {
+ super.describeParameters(operationNode, bundle);
+
+ operationNode.get(REQUEST_PROPERTIES, OperationsConstants.MODEL_NAME, TYPE).set(ModelType.STRING);
+ operationNode.get(REQUEST_PROPERTIES, OperationsConstants.MODEL_NAME, REQUIRED).set(true);
+ operationNode.get(REQUEST_PROPERTIES, OperationsConstants.MODEL_NAME, DESCRIPTION).set(getParameterDescription(bundle, OperationsConstants.MODEL_NAME));
+
+ operationNode.get(REQUEST_PROPERTIES, OperationsConstants.SOURCE_NAME, TYPE).set(ModelType.STRING);
+ operationNode.get(REQUEST_PROPERTIES, OperationsConstants.SOURCE_NAME, REQUIRED).set(true);
+ operationNode.get(REQUEST_PROPERTIES, OperationsConstants.SOURCE_NAME, DESCRIPTION).set(getParameterDescription(bundle, OperationsConstants.MODEL_NAME));
+
+ operationNode.get(REQUEST_PROPERTIES, OperationsConstants.TRANSLATOR_NAME, TYPE).set(ModelType.STRING);
+ operationNode.get(REQUEST_PROPERTIES, OperationsConstants.TRANSLATOR_NAME, REQUIRED).set(true);
+ operationNode.get(REQUEST_PROPERTIES, OperationsConstants.TRANSLATOR_NAME, DESCRIPTION).set(getParameterDescription(bundle, OperationsConstants.TRANSLATOR_NAME));
+
+ operationNode.get(REQUEST_PROPERTIES, OperationsConstants.DS_NAME, TYPE).set(ModelType.STRING);
+ operationNode.get(REQUEST_PROPERTIES, OperationsConstants.DS_NAME, REQUIRED).set(true);
+ operationNode.get(REQUEST_PROPERTIES, OperationsConstants.DS_NAME, DESCRIPTION).set(getParameterDescription(bundle, OperationsConstants.DS_NAME));
+
+ }
+}
\ No newline at end of file
Property changes on: branches/as7/jboss-integration/src/main/java/org/teiid/jboss/TeiidOperationHandler.java
___________________________________________________________________
Added: svn:mime-type
+ text/plain
Modified: branches/as7/jboss-integration/src/main/java/org/teiid/jboss/TeiidSubsystemDescribe.java
===================================================================
--- branches/as7/jboss-integration/src/main/java/org/teiid/jboss/TeiidSubsystemDescribe.java 2011-10-18 15:46:00 UTC (rev 3558)
+++ branches/as7/jboss-integration/src/main/java/org/teiid/jboss/TeiidSubsystemDescribe.java 2011-10-18 15:56:08 UTC (rev 3559)
@@ -49,7 +49,7 @@
node.get(ModelDescriptionConstants.TAIL_COMMENT_ALLOWED).set(true);
node.get(ModelDescriptionConstants.NAMESPACE).set(Namespace.CURRENT.getUri());
- TeiidBootServicesAdd.describeTeiid(node, ATTRIBUTES, bundle);
+ TeiidAdd.describeTeiid(node, ATTRIBUTES, bundle);
node.get(CHILDREN, Element.TRANSPORT_ELEMENT.getLocalName(), DESCRIPTION).set(Element.TRANSPORT_ELEMENT.getDescription(bundle));
node.get(CHILDREN, Element.TRANSPORT_ELEMENT.getLocalName(), REQUIRED).set(true);
@@ -69,7 +69,7 @@
subsystemAdd.get(OP).set(ADD);
subsystemAdd.get(OP_ADDR).set(rootAddress.toModelNode());
- TeiidBootServicesAdd.populate(subModel, subsystemAdd);
+ TeiidAdd.populate(subModel, subsystemAdd);
result.add(subsystemAdd);
if (subModel.hasDefined(Element.TRANSPORT_ELEMENT.getLocalName())) {
Modified: branches/as7/jboss-integration/src/main/java/org/teiid/jboss/TeiidSubsystemParser.java
===================================================================
--- branches/as7/jboss-integration/src/main/java/org/teiid/jboss/TeiidSubsystemParser.java 2011-10-18 15:46:00 UTC (rev 3558)
+++ branches/as7/jboss-integration/src/main/java/org/teiid/jboss/TeiidSubsystemParser.java 2011-10-18 15:56:08 UTC (rev 3559)
@@ -213,7 +213,6 @@
private void writePreparedPlanCacheConfiguration(XMLExtendedStreamWriter writer, ModelNode node) throws XMLStreamException {
writeAttribute(writer, Element.PPC_MAX_ENTRIES_ATTRIBUTE, node);
writeAttribute(writer, Element.PPC_MAX_AGE_IN_SECS_ATTRIBUTE, node);
- writeAttribute(writer, Element.PPC_MAX_STALENESS_ATTRIBUTE, node);
}
private boolean has(ModelNode node, String name) {
@@ -680,9 +679,6 @@
node.get(element.getModelName()).set(Integer.parseInt(attrValue));
break;
- case PPC_MAX_STALENESS_ATTRIBUTE:
- node.get(element.getModelName()).set(Integer.parseInt(attrValue));
- break;
default:
throw ParseUtils.unexpectedAttribute(reader, i);
}
Modified: branches/as7/jboss-integration/src/main/java/org/teiid/jboss/TranslatorAdd.java
===================================================================
--- branches/as7/jboss-integration/src/main/java/org/teiid/jboss/TranslatorAdd.java 2011-10-18 15:46:00 UTC (rev 3558)
+++ branches/as7/jboss-integration/src/main/java/org/teiid/jboss/TranslatorAdd.java 2011-10-18 15:56:08 UTC (rev 3559)
@@ -83,19 +83,26 @@
final String translatorName = pathAddress.getLastElement().getValue();
- final String moduleName = Element.TRANSLATOR_MODULE_ATTRIBUTE.asString(operation);
+ String moduleName = null;
+ if (Element.TRANSLATOR_MODULE_ATTRIBUTE.isDefined(operation)) {
+ moduleName = Element.TRANSLATOR_MODULE_ATTRIBUTE.asString(operation);
+ }
final ServiceTarget target = context.getServiceTarget();
final Module module;
- try {
- module = Module.getCallerModuleLoader().loadModule(ModuleIdentifier.create(moduleName));
- } catch (ModuleLoadException e) {
- throw new OperationFailedException(e, new ModelNode().set(IntegrationPlugin.Util.getString("failed_load_module", moduleName, translatorName))); //$NON-NLS-1$
+ ClassLoader translatorLoader = this.getClass().getClassLoader();
+ if (moduleName != null) {
+ try {
+ module = Module.getCallerModuleLoader().loadModule(ModuleIdentifier.create(moduleName));
+ translatorLoader = module.getClassLoader();
+ } catch (ModuleLoadException e) {
+ throw new OperationFailedException(e, new ModelNode().set(IntegrationPlugin.Util.getString("failed_load_module", moduleName, translatorName))); //$NON-NLS-1$
+ }
}
boolean added = false;
- final ServiceLoader<ExecutionFactory> serviceLoader = module.loadService(ExecutionFactory.class);
+ final ServiceLoader<ExecutionFactory> serviceLoader = ServiceLoader.load(ExecutionFactory.class, translatorLoader);
if (serviceLoader != null) {
for (ExecutionFactory ef:serviceLoader) {
VDBTranslatorMetaData metadata = TranslatorUtil.buildTranslatorMetadata(ef, moduleName);
Modified: branches/as7/jboss-integration/src/main/java/org/teiid/jboss/Transport.java
===================================================================
--- branches/as7/jboss-integration/src/main/java/org/teiid/jboss/Transport.java 2011-10-18 15:46:00 UTC (rev 3558)
+++ branches/as7/jboss-integration/src/main/java/org/teiid/jboss/Transport.java 2011-10-18 15:56:08 UTC (rev 3559)
@@ -27,10 +27,8 @@
import java.net.InetSocketAddress;
import java.util.ArrayList;
import java.util.Collection;
-import java.util.Collections;
import java.util.LinkedList;
import java.util.List;
-import java.util.Set;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ConcurrentMap;
@@ -49,13 +47,9 @@
import org.teiid.client.security.ILogon;
import org.teiid.client.util.ExceptionUtil;
import org.teiid.core.ComponentNotFoundException;
-import org.teiid.core.util.LRUCache;
-import org.teiid.deployers.CompositeVDB;
-import org.teiid.deployers.VDBLifeCycleListener;
import org.teiid.deployers.VDBRepository;
import org.teiid.dqp.internal.process.DQPCore;
import org.teiid.dqp.internal.process.DQPWorkContext;
-import org.teiid.dqp.internal.process.SessionAwareCache;
import org.teiid.dqp.service.SessionServiceException;
import org.teiid.logging.LogConstants;
import org.teiid.logging.LogManager;
@@ -70,7 +64,6 @@
import org.teiid.transport.ODBCSocketListener;
import org.teiid.transport.SocketConfiguration;
import org.teiid.transport.SocketListener;
-import org.teiid.vdb.runtime.VDBKey;
public class Transport implements Service<ClientServiceRegistry>, ClientServiceRegistry {
private enum Protocol {teiid, pg};
@@ -89,8 +82,6 @@
private final InjectedValue<SocketBinding> socketBindingInjector = new InjectedValue<SocketBinding>();
private final InjectedValue<VDBRepository> vdbRepositoryInjector = new InjectedValue<VDBRepository>();
- private final InjectedValue<SessionAwareCache> preparedPlanCacheInjector = new InjectedValue<SessionAwareCache>();
- private final InjectedValue<SessionAwareCache> resultSetCacheInjector = new InjectedValue<SessionAwareCache>();
private final InjectedValue<DQPCore> dqpInjector = new InjectedValue<DQPCore>();
private final InjectedValue<BufferServiceImpl> bufferServiceInjector = new InjectedValue<BufferServiceImpl>();
@@ -155,39 +146,6 @@
DQP dqpProxy = proxyService(DQP.class, getDQP(), LogConstants.CTX_DQP);
this.csr.registerClientService(ILogon.class, logon, LogConstants.CTX_SECURITY);
this.csr.registerClientService(DQP.class, dqpProxy, LogConstants.CTX_DQP);
-
- // add vdb life cycle listeners
- getVdbRepository().addListener(new VDBLifeCycleListener() {
-
- private Set<VDBKey> recentlyRemoved = Collections.newSetFromMap(new LRUCache<VDBKey, Boolean>(10000));
-
- @Override
- public void removed(String name, int version, CompositeVDB vdb) {
- recentlyRemoved.add(new VDBKey(name, version));
- }
-
- @Override
- public void added(String name, int version, CompositeVDB vdb) {
- if (!recentlyRemoved.remove(new VDBKey(name, version))) {
- return;
- }
- // terminate all the previous sessions
- try {
- Collection<SessionMetadata> sessions = sessionService.getActiveSessions();
- for (SessionMetadata session:sessions) {
- if (name.equalsIgnoreCase(session.getVDBName()) && version == session.getVDBVersion()){
- sessionService.terminateSession(session.getSessionId(), null);
- }
- }
- } catch (SessionServiceException e) {
- //ignore
- }
-
- // dump the caches.
- getResultSetCacheInjector().getValue().clearForVDB(name, version);
- getPreparedPlanCacheInjector().getValue().clearForVDB(name, version);
- }
- });
}
@Override
@@ -222,17 +180,13 @@
}));
}
- public List<RequestMetadata> getRequestsUsingVDB(String vdbName, int vdbVersion) throws AdminException {
+ public List<RequestMetadata> getRequestsUsingVDB(String vdbName, int vdbVersion) {
List<RequestMetadata> requests = new ArrayList<RequestMetadata>();
- try {
- Collection<SessionMetadata> sessions = this.sessionService.getActiveSessions();
- for (SessionMetadata session:sessions) {
- if (session.getVDBName().equals(vdbName) && session.getVDBVersion() == vdbVersion) {
- requests.addAll(getDQP().getRequestsForSession(session.getSessionId()));
- }
+ Collection<SessionMetadata> sessions = this.sessionService.getActiveSessions();
+ for (SessionMetadata session:sessions) {
+ if (session.getVDBName().equals(vdbName) && session.getVDBVersion() == vdbVersion) {
+ requests.addAll(getDQP().getRequestsForSession(session.getSessionId()));
}
- } catch (SessionServiceException e) {
- throw new AdminComponentException(e);
}
return requests;
}
@@ -241,12 +195,8 @@
this.sessionService.terminateSession(terminateeId, DQPWorkContext.getWorkContext().getSessionId());
}
- public Collection<SessionMetadata> getActiveSessions() throws AdminException {
- try {
- return this.sessionService.getActiveSessions();
- } catch (SessionServiceException e) {
- throw new AdminComponentException(e);
- }
+ public Collection<SessionMetadata> getActiveSessions(){
+ return this.sessionService.getActiveSessions();
}
public int getActiveSessionsCount() throws AdminException{
@@ -300,14 +250,6 @@
private VDBRepository getVdbRepository() {
return vdbRepositoryInjector.getValue();
}
-
- public InjectedValue<SessionAwareCache> getResultSetCacheInjector() {
- return resultSetCacheInjector;
- }
-
- public InjectedValue<SessionAwareCache> getPreparedPlanCacheInjector() {
- return preparedPlanCacheInjector;
- }
private DQPCore getDQP() {
return getDqpInjector().getValue();
Modified: branches/as7/jboss-integration/src/main/java/org/teiid/jboss/TransportAdd.java
===================================================================
--- branches/as7/jboss-integration/src/main/java/org/teiid/jboss/TransportAdd.java 2011-10-18 15:46:00 UTC (rev 3558)
+++ branches/as7/jboss-integration/src/main/java/org/teiid/jboss/TransportAdd.java 2011-10-18 15:56:08 UTC (rev 3559)
@@ -56,7 +56,6 @@
import org.jboss.msc.service.ServiceTarget;
import org.teiid.deployers.VDBRepository;
import org.teiid.dqp.internal.process.DQPCore;
-import org.teiid.dqp.internal.process.SessionAwareCache;
import org.teiid.logging.LogConstants;
import org.teiid.logging.LogManager;
import org.teiid.services.BufferServiceImpl;
@@ -177,8 +176,6 @@
}
transportBuilder.addDependency(TeiidServiceNames.BUFFER_MGR, BufferServiceImpl.class, transport.getBufferServiceInjector());
transportBuilder.addDependency(TeiidServiceNames.VDB_REPO, VDBRepository.class, transport.getVdbRepositoryInjector());
- transportBuilder.addDependency(TeiidServiceNames.CACHE_RESULTSET, SessionAwareCache.class, transport.getResultSetCacheInjector());
- transportBuilder.addDependency(TeiidServiceNames.CACHE_PREPAREDPLAN, SessionAwareCache.class, transport.getPreparedPlanCacheInjector());
transportBuilder.addDependency(TeiidServiceNames.ENGINE, DQPCore.class, transport.getDqpInjector());
@@ -193,7 +190,7 @@
// register a JNDI name, this looks hard.
if (transport.isEmbedded() && !isEmbeddedRegistered()) {
- final ClientServiceRegistryReferenceFactoryService referenceFactoryService = new ClientServiceRegistryReferenceFactoryService();
+ final CSRReferenceFactoryService referenceFactoryService = new CSRReferenceFactoryService();
final ServiceName referenceFactoryServiceName =TeiidServiceNames.transportServiceName(transportName).append("reference-factory"); //$NON-NLS-1$
final ServiceBuilder<?> referenceBuilder = target.addService(referenceFactoryServiceName,referenceFactoryService);
referenceBuilder.addDependency(TeiidServiceNames.transportServiceName(transportName), ClientServiceRegistry.class, referenceFactoryService.getCSRInjector());
Modified: branches/as7/jboss-integration/src/main/java/org/teiid/jboss/deployers/RuntimeEngineDeployer.java
===================================================================
--- branches/as7/jboss-integration/src/main/java/org/teiid/jboss/deployers/RuntimeEngineDeployer.java 2011-10-18 15:46:00 UTC (rev 3558)
+++ branches/as7/jboss-integration/src/main/java/org/teiid/jboss/deployers/RuntimeEngineDeployer.java 2011-10-18 15:56:08 UTC (rev 3559)
@@ -25,8 +25,11 @@
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
+import java.util.Collection;
+import java.util.Collections;
import java.util.Date;
import java.util.List;
+import java.util.Set;
import javax.resource.spi.XATerminator;
import javax.resource.spi.work.WorkManager;
@@ -34,12 +37,18 @@
import org.jboss.modules.Module;
import org.jboss.msc.service.Service;
+import org.jboss.msc.service.ServiceController;
+import org.jboss.msc.service.ServiceName;
import org.jboss.msc.service.StartContext;
import org.jboss.msc.service.StopContext;
import org.jboss.msc.value.InjectedValue;
+import org.teiid.adminapi.impl.SessionMetadata;
import org.teiid.adminapi.impl.VDBMetaData;
import org.teiid.core.TeiidComponentException;
import org.teiid.core.TeiidRuntimeException;
+import org.teiid.core.util.LRUCache;
+import org.teiid.deployers.CompositeVDB;
+import org.teiid.deployers.VDBLifeCycleListener;
import org.teiid.deployers.VDBRepository;
import org.teiid.dqp.internal.datamgr.TranslatorRepository;
import org.teiid.dqp.internal.process.AuthorizationValidator;
@@ -53,6 +62,8 @@
import org.teiid.events.EventDistributor;
import org.teiid.events.EventDistributorFactory;
import org.teiid.jboss.IntegrationPlugin;
+import org.teiid.jboss.TeiidServiceNames;
+import org.teiid.jboss.Transport;
import org.teiid.logging.LogConstants;
import org.teiid.logging.LogManager;
import org.teiid.logging.MessageLevel;
@@ -71,6 +82,7 @@
import org.teiid.query.tempdata.GlobalTableStore;
import org.teiid.services.BufferServiceImpl;
import org.teiid.transport.LocalServerConnection;
+import org.teiid.vdb.runtime.VDBKey;
public class RuntimeEngineDeployer extends DQPConfiguration implements Serializable, EventDistributor, EventDistributorFactory, Service<DQPCore> {
@@ -93,7 +105,7 @@
private final InjectedValue<ObjectReplicator> objectReplicatorInjector = new InjectedValue<ObjectReplicator>();
@Override
- public void start(StartContext context) {
+ public void start(final StartContext context) {
this.transactionServerImpl.setWorkManager(getWorkManagerInjector().getValue());
this.transactionServerImpl.setXaTerminator(getXaTerminatorInjector().getValue());
this.transactionServerImpl.setTransactionManager(getTxnManagerInjector().getValue());
@@ -132,6 +144,44 @@
return null;
}
});
+
+ // add vdb life cycle listeners
+ getVdbRepository().addListener(new VDBLifeCycleListener() {
+
+ private Set<VDBKey> recentlyRemoved = Collections.newSetFromMap(new LRUCache<VDBKey, Boolean>(10000));
+
+ @Override
+ public void removed(String name, int version, CompositeVDB vdb) {
+ recentlyRemoved.add(new VDBKey(name, version));
+ }
+
+ @Override
+ public void added(String name, int version, CompositeVDB vdb) {
+ if (!recentlyRemoved.remove(new VDBKey(name, version))) {
+ return;
+ }
+ // terminate all the previous sessions
+ List<ServiceName> services = context.getController().getServiceContainer().getServiceNames();
+ for (ServiceName service:services) {
+ if (service.isParentOf(TeiidServiceNames.TRANSPORT_BASE)) {
+ ServiceController<?> transport = context.getController().getServiceContainer().getService(service);
+ if (transport != null) {
+ Transport t = Transport.class.cast(transport.getValue());
+ Collection<SessionMetadata> sessions = t.getActiveSessions();
+ for (SessionMetadata session:sessions) {
+ if (name.equalsIgnoreCase(session.getVDBName()) && version == session.getVDBVersion()){
+ t.terminateSession(session.getSessionId());
+ }
+ }
+ }
+ }
+ }
+
+ // dump the caches.
+ getResultSetCacheInjector().getValue().clearForVDB(name, version);
+ getPreparedPlanCacheInjector().getValue().clearForVDB(name, version);
+ }
+ });
LogManager.logInfo(LogConstants.CTX_RUNTIME, IntegrationPlugin.Util.getString("engine_started", this.dqpCore.getRuntimeVersion(), new Date(System.currentTimeMillis()).toString())); //$NON-NLS-1$
}
Modified: branches/as7/jboss-integration/src/main/resources/org/teiid/jboss/i18n.properties
===================================================================
--- branches/as7/jboss-integration/src/main/resources/org/teiid/jboss/i18n.properties 2011-10-18 15:46:00 UTC (rev 3558)
+++ branches/as7/jboss-integration/src/main/resources/org/teiid/jboss/i18n.properties 2011-10-18 15:56:08 UTC (rev 3559)
@@ -100,11 +100,10 @@
#prepared-plan
preparedplan-cache-max-entries.describe=Max Entries allowed
preparedplan-cache-max-age-in-seconds.describe=Max age in seconds
-preparedplan-cache-max-staleness.describe=Max staleness in seconds. Modifications are based upon data updates -1 indicates no max. (default 60 - 1 minute)
#resultset cache
-resultset-cache-enable.describe= Resultset cache enabled
-resultset-cache-container-name.describe=Infinispan cache container name
+resultset-cache-enable.describe= Resultset cache enabled
+resultset-cache-container-name.describe=Infinispan cache container name
resultset-cache-name.describe = Infinispan cache name for resultset
resultset-cache-max-age-in-seconds.describe=Max age in seconds
resultset-cache-max-staleness.describe=Max staleness in seconds. Modifications are based upon data updates -1 indicates no max. (default 60 - 1 minute)
Deleted: branches/as7/jboss-integration/src/test/java/org/teiid/jboss/TestTeiidAdminOperations.java
===================================================================
--- branches/as7/jboss-integration/src/test/java/org/teiid/jboss/TestTeiidAdminOperations.java 2011-10-18 15:46:00 UTC (rev 3558)
+++ branches/as7/jboss-integration/src/test/java/org/teiid/jboss/TestTeiidAdminOperations.java 2011-10-18 15:56:08 UTC (rev 3559)
@@ -1,326 +0,0 @@
-package org.teiid.jboss;
-
-import static junit.framework.Assert.assertEquals;
-import static org.jboss.as.controller.descriptions.ModelDescriptionConstants.*;
-import static org.junit.Assert.fail;
-
-import java.io.ByteArrayInputStream;
-import java.io.FileNotFoundException;
-import java.io.FileReader;
-import java.io.IOException;
-import java.net.URL;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Collections;
-import java.util.List;
-
-import javax.xml.transform.Source;
-import javax.xml.transform.stream.StreamSource;
-import javax.xml.validation.Schema;
-import javax.xml.validation.SchemaFactory;
-import javax.xml.validation.Validator;
-
-import junit.framework.Assert;
-
-import org.jboss.as.controller.OperationContext.Type;
-import org.jboss.as.controller.PathAddress;
-import org.jboss.as.controller.PathElement;
-import org.jboss.as.subsystem.test.AbstractSubsystemTest;
-import org.jboss.as.subsystem.test.AdditionalInitialization;
-import org.jboss.as.subsystem.test.KernelServices;
-import org.jboss.dmr.ModelNode;
-import org.junit.Test;
-import org.teiid.core.util.ObjectConverterUtil;
-import org.xml.sax.ErrorHandler;
-import org.xml.sax.SAXException;
-import org.xml.sax.SAXParseException;
-
-@SuppressWarnings("nls")
-public class TestTeiidAdminOperations extends AbstractSubsystemTest {
-
- public TestTeiidAdminOperations() {
- super(TeiidExtension.TEIID_SUBSYSTEM, new TeiidExtension());
- }
-
- @Test
- public void testDescribeHandler() throws Exception {
- String subsystemXml = ObjectConverterUtil.convertToString(new FileReader("src/test/resources/teiid-sample-config.xml"));
- KernelServices servicesA = super.installInController(
- new AdditionalInitialization() {
- @Override
- protected Type getType() {
- return Type.MANAGEMENT;
- }
- },
- subsystemXml);
-
-
- //Get the model and the describe operations from the first controller
- ModelNode modelA = servicesA.readWholeModel();
- String marshalled = servicesA.getPersistedSubsystemXml();
-
- ModelNode describeOp = new ModelNode();
- describeOp.get(OP).set(DESCRIBE);
- describeOp.get(OP_ADDR).set(PathAddress.pathAddress(PathElement.pathElement(SUBSYSTEM, TeiidExtension.TEIID_SUBSYSTEM)).toModelNode());
- List<ModelNode> operations = super.checkResultAndGetContents(servicesA.executeOperation(describeOp)).asList();
-
-
- //Install the describe options from the first controller into a second controller
- KernelServices servicesB = super.installInController(operations);
- ModelNode modelB = servicesB.readWholeModel();
-
- //Make sure the models from the two controllers are identical
- super.compare(modelA, modelB);
- }
-
- @Test
- public void testMinimumConfiguration() throws Exception {
- String subsystemXml = "<subsystem xmlns=\"urn:jboss:domain:teiid:1.0\">\n" +
- " <async-thread-pool>teiid-async</async-thread-pool>"+
- "</subsystem>";
- KernelServices services = super.installInController(subsystemXml);
- ModelNode model = services.readWholeModel();
- }
-
- @Test
- public void testOutputPerisitence() throws Exception {
- String subsystemXml = ObjectConverterUtil.convertToString(new FileReader("src/test/resources/teiid-sample-config.xml"));
-
- String json = ObjectConverterUtil.convertToString(new FileReader("src/test/resources/teiid-model-json.txt"));
- ModelNode testModel = ModelNode.fromJSONString(json);
- String triggered = outputModel(testModel);
-
- KernelServices services = super.installInController(
- new AdditionalInitialization() {
- @Override
- protected Type getType() {
- return Type.MANAGEMENT;
- }
- },
- subsystemXml);
- //Get the model and the persisted xml from the controller
- ModelNode model = services.readWholeModel();
- String marshalled = services.getPersistedSubsystemXml();
-
- //System.out.println(marshalled);
-
- Assert.assertEquals(marshalled, triggered);
- Assert.assertEquals(normalizeXML(marshalled), normalizeXML(triggered));
- }
-
- @Test
- public void testOutputModel() throws Exception {
- String subsystemXml = ObjectConverterUtil.convertToString(new FileReader("src/test/resources/teiid-sample-config.xml"));
-
- String json = ObjectConverterUtil.convertToString(new FileReader("src/test/resources/teiid-model-json.txt"));
- ModelNode testModel = ModelNode.fromJSONString(json);
- String triggered = outputModel(testModel);
-
- KernelServices services = super.installInController(
- new AdditionalInitialization() {
- @Override
- protected Type getType() {
- return Type.MANAGEMENT;
- }
- },
- subsystemXml);
- //Get the model and the persisted xml from the controller
- ModelNode model = services.readWholeModel();
- String marshalled = services.getPersistedSubsystemXml();
-
- Assert.assertEquals(marshalled, triggered);
- Assert.assertEquals(normalizeXML(marshalled), normalizeXML(triggered));
- }
-
- @Test
- public void testSchema() throws Exception {
- String subsystemXml = ObjectConverterUtil.convertToString(new FileReader("src/test/resources/teiid-sample-config.xml"));
- validate(subsystemXml);
-
- KernelServices services = super.installInController(
- new AdditionalInitialization() {
- @Override
- protected Type getType() {
- return Type.MANAGEMENT;
- }
- },
- subsystemXml);
- //Get the model and the persisted xml from the controller
- ModelNode model = services.readWholeModel();
- String marshalled = services.getPersistedSubsystemXml();
-
- validate(marshalled);
- }
-
- private void validate(String marshalled) throws SAXException, IOException {
- URL xsdURL = Thread.currentThread().getContextClassLoader().getResource("schema/jboss-teiid.xsd");
- System.out.println(marshalled);
-
- SchemaFactory factory = SchemaFactory.newInstance("http://www.w3.org/2001/XMLSchema");
- Schema schema = factory.newSchema(xsdURL);
-
- Validator validator = schema.newValidator();
- Source source = new StreamSource(new ByteArrayInputStream(marshalled.getBytes()));
- validator.setErrorHandler(new ErrorHandler() {
-
- @Override
- public void warning(SAXParseException exception) throws SAXException {
- fail(exception.getMessage());
- }
-
- @Override
- public void fatalError(SAXParseException exception) throws SAXException {
- fail(exception.getMessage());
- }
-
- @Override
- public void error(SAXParseException exception) throws SAXException {
- if (!exception.getMessage().contains("cvc-enumeration-valid") && !exception.getMessage().contains("cvc-type"))
- fail(exception.getMessage());
- }
- });
-
- validator.validate(source);
- }
-
- @Test
- public void testSubSystemDescription() throws IOException {
- ModelNode node = new ModelNode();
- TeiidBootServicesAdd.describeTeiid(node, ATTRIBUTES, IntegrationPlugin.getResourceBundle(null));
- assertEquals(ObjectConverterUtil.convertToString(new FileReader("src/test/resources/teiid-model-config.txt")), node.toString());
- }
-
- @Test
- public void testParseSubsystem() throws Exception {
- //Parse the subsystem xml into operations
- String subsystemXml = ObjectConverterUtil.convertToString(new FileReader("src/test/resources/teiid-sample-config.xml"));
- List<ModelNode> operations = super.parse(subsystemXml);
-
- ///Check that we have the expected number of operations
- Assert.assertEquals(5, operations.size());
-
- //Check that each operation has the correct content
- ModelNode addSubsystem = operations.get(0);
- Assert.assertEquals(ADD, addSubsystem.get(OP).asString());
- PathAddress addr = PathAddress.pathAddress(addSubsystem.get(OP_ADDR));
- Assert.assertEquals(1, addr.size());
- PathElement element = addr.getElement(0);
- Assert.assertEquals(SUBSYSTEM, element.getKey());
- Assert.assertEquals(TeiidExtension.TEIID_SUBSYSTEM, element.getValue());
- }
-
- @Test
- public void testQueryOperatrions() throws Exception {
- KernelServices services = buildSubsystem();
-
- PathAddress addr = PathAddress.pathAddress(
- PathElement.pathElement(SUBSYSTEM, TeiidExtension.TEIID_SUBSYSTEM));
- ModelNode addOp = new ModelNode();
- addOp.get(OP).set("read-operation-names");
- addOp.get(OP_ADDR).set(addr.toModelNode());
-
- ModelNode result = services.executeOperation(addOp);
- Assert.assertEquals(SUCCESS, result.get(OUTCOME).asString());
-
- List<String> opNames = getList(result);
- assertEquals(36, opNames.size());
- String[] ops = { "add", "add-anyauthenticated-role", "add-data-role",
- "assign-datasource", "cache-statistics", "cache-types",
- "cancel-request", "change-vdb-connection-type", "clear-cache",
- "describe", "execute-query", "get-translator", "get-vdb",
- "list-requests", "list-sessions", "list-transactions",
- "list-translators", "list-vdbs", "long-running-queries",
- "merge-vdbs", "read-attribute", "read-children-names",
- "read-children-resources", "read-children-types",
- "read-operation-description", "read-operation-names",
- "read-resource", "read-resource-description",
- "remove-anyauthenticated-role", "remove-data-role",
- "requests-per-session", "requests-per-vdb",
- "terminate-session", "terminate-transaction",
- "workerpool-statistics", "write-attribute" };
- assertEquals(Arrays.asList(ops), opNames);
- }
-
- @Test
- public void testAddRemoveTransport() throws Exception {
- KernelServices services = buildSubsystem();
-
- PathAddress addr = PathAddress.pathAddress(PathElement.pathElement(SUBSYSTEM, TeiidExtension.TEIID_SUBSYSTEM));
-
- // look at current query engines make sure there are only two from configuration.
- ModelNode read = new ModelNode();
- read.get(OP).set("read-children-names");
- read.get(OP_ADDR).set(addr.toModelNode());
- read.get(CHILD_TYPE).set("transport");
-
- ModelNode result = services.executeOperation(read);
- Assert.assertEquals(SUCCESS, result.get(OUTCOME).asString());
-
- List<String> opNames = getList(result);
- assertEquals(2, opNames.size());
- String [] ops = {"jdbc", "odbc"};
- assertEquals(Arrays.asList(ops), opNames);
-
- // add transport
- ModelNode addOp = new ModelNode();
- addOp.get(OP).set("add");
- addOp.get(OP_ADDR).set(addr.toModelNode().add("transport", "newbie")); //$NON-NLS-1$);
- addOp.get("protocol").set("pg");
- addOp.get("socket-binding").set("socket");
- addOp.get("authentication-security-domain").set("teiid-security");
-
- result = services.executeOperation(addOp);
- Assert.assertEquals(SUCCESS, result.get(OUTCOME).asString());
-
- result = services.executeOperation(read);
- Assert.assertEquals(SUCCESS, result.get(OUTCOME).asString());
- opNames = getList(result);
- assertEquals(3, opNames.size());
- String [] ops2 = {"jdbc", "newbie", "odbc"};
- assertEquals(Arrays.asList(ops2), opNames);
-
- // add transport
- ModelNode remove = new ModelNode();
- addOp.get(OP).set("remove");
- addOp.get(OP_ADDR).set(addr.toModelNode().add("transport", "jdbc")); //$NON-NLS-1$);
- result = services.executeOperation(addOp);
- Assert.assertEquals(SUCCESS, result.get(OUTCOME).asString());
-
- result = services.executeOperation(read);
- Assert.assertEquals(SUCCESS, result.get(OUTCOME).asString());
- opNames = getList(result);
- assertEquals(2, opNames.size());
- String [] ops3 = {"newbie", "odbc"};
- assertEquals(Arrays.asList(ops3), opNames);
- }
-
- private KernelServices buildSubsystem() throws IOException,
- FileNotFoundException, Exception {
- String subsystemXml = ObjectConverterUtil.convertToString(new FileReader("src/test/resources/teiid-sample-config.xml"));
-
- KernelServices services = super.installInController(
- new AdditionalInitialization() {
- @Override
- protected Type getType() {
- return Type.MANAGEMENT;
- }
- },
- subsystemXml);
- return services;
- }
-
- private static List<String> getList(ModelNode operationResult) {
- if(!operationResult.hasDefined("result"))
- return Collections.emptyList();
-
- List<ModelNode> nodeList = operationResult.get("result").asList();
- if(nodeList.isEmpty())
- return Collections.emptyList();
-
- List<String> list = new ArrayList<String>(nodeList.size());
- for(ModelNode node : nodeList) {
- list.add(node.asString());
- }
- return list;
- }
-}
Copied: branches/as7/jboss-integration/src/test/java/org/teiid/jboss/TestTeiidOperations.java (from rev 3548, branches/as7/jboss-integration/src/test/java/org/teiid/jboss/TestTeiidAdminOperations.java)
===================================================================
--- branches/as7/jboss-integration/src/test/java/org/teiid/jboss/TestTeiidOperations.java (rev 0)
+++ branches/as7/jboss-integration/src/test/java/org/teiid/jboss/TestTeiidOperations.java 2011-10-18 15:56:08 UTC (rev 3559)
@@ -0,0 +1,419 @@
+package org.teiid.jboss;
+
+import static junit.framework.Assert.assertEquals;
+import static org.jboss.as.controller.descriptions.ModelDescriptionConstants.*;
+import static org.junit.Assert.fail;
+
+import java.io.ByteArrayInputStream;
+import java.io.FileInputStream;
+import java.io.FileNotFoundException;
+import java.io.FileReader;
+import java.io.IOException;
+import java.net.URL;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.List;
+
+import javax.xml.transform.Source;
+import javax.xml.transform.stream.StreamSource;
+import javax.xml.validation.Schema;
+import javax.xml.validation.SchemaFactory;
+import javax.xml.validation.Validator;
+
+import junit.framework.Assert;
+
+import org.jboss.as.cli.Util;
+import org.jboss.as.cli.operation.impl.DefaultOperationRequestAddress;
+import org.jboss.as.cli.operation.impl.DefaultOperationRequestBuilder;
+import org.jboss.as.controller.OperationContext.Type;
+import org.jboss.as.controller.client.OperationBuilder;
+import org.jboss.as.controller.PathAddress;
+import org.jboss.as.controller.PathElement;
+import org.jboss.as.subsystem.test.AbstractSubsystemTest;
+import org.jboss.as.subsystem.test.AdditionalInitialization;
+import org.jboss.as.subsystem.test.KernelServices;
+import org.jboss.dmr.ModelNode;
+import org.junit.Ignore;
+import org.junit.Test;
+import org.teiid.core.util.ObjectConverterUtil;
+import org.teiid.core.util.UnitTestUtil;
+import org.xml.sax.ErrorHandler;
+import org.xml.sax.SAXException;
+import org.xml.sax.SAXParseException;
+
+@SuppressWarnings("nls")
+public class TestTeiidOperations extends AbstractSubsystemTest {
+
+ public TestTeiidOperations() {
+ super(TeiidExtension.TEIID_SUBSYSTEM, new TeiidExtension());
+ }
+
+ @Test
+ public void testDescribeHandler() throws Exception {
+ String subsystemXml = ObjectConverterUtil.convertToString(new FileReader("src/test/resources/teiid-sample-config.xml"));
+ KernelServices servicesA = super.installInController(
+ new AdditionalInitialization() {
+ @Override
+ protected Type getType() {
+ return Type.MANAGEMENT;
+ }
+ },
+ subsystemXml);
+
+
+ //Get the model and the describe operations from the first controller
+ ModelNode modelA = servicesA.readWholeModel();
+ String marshalled = servicesA.getPersistedSubsystemXml();
+
+ ModelNode describeOp = new ModelNode();
+ describeOp.get(OP).set(DESCRIBE);
+ describeOp.get(OP_ADDR).set(PathAddress.pathAddress(PathElement.pathElement(SUBSYSTEM, TeiidExtension.TEIID_SUBSYSTEM)).toModelNode());
+ List<ModelNode> operations = super.checkResultAndGetContents(servicesA.executeOperation(describeOp)).asList();
+
+
+ //Install the describe options from the first controller into a second controller
+ KernelServices servicesB = super.installInController(operations);
+ ModelNode modelB = servicesB.readWholeModel();
+
+ //Make sure the models from the two controllers are identical
+ super.compare(modelA, modelB);
+ }
+
+ @Test
+ public void testMinimumConfiguration() throws Exception {
+ String subsystemXml = "<subsystem xmlns=\"urn:jboss:domain:teiid:1.0\">\n" +
+ " <async-thread-pool>teiid-async</async-thread-pool>"+
+ "</subsystem>";
+ KernelServices services = super.installInController(subsystemXml);
+ services.readWholeModel();
+ }
+
+ @Test
+ public void testOutputPerisitence() throws Exception {
+ String subsystemXml = ObjectConverterUtil.convertToString(new FileReader("src/test/resources/teiid-sample-config.xml"));
+
+ String json = ObjectConverterUtil.convertToString(new FileReader("src/test/resources/teiid-model-json.txt"));
+ ModelNode testModel = ModelNode.fromJSONString(json);
+ String triggered = outputModel(testModel);
+
+ KernelServices services = super.installInController(
+ new AdditionalInitialization() {
+ @Override
+ protected Type getType() {
+ return Type.MANAGEMENT;
+ }
+ },
+ subsystemXml);
+ //Get the model and the persisted xml from the controller
+ ModelNode model = services.readWholeModel();
+ String marshalled = services.getPersistedSubsystemXml();
+
+ //System.out.println(marshalled);
+
+ Assert.assertEquals(marshalled, triggered);
+ Assert.assertEquals(normalizeXML(marshalled), normalizeXML(triggered));
+ }
+
+ @Test
+ public void testOutputModel() throws Exception {
+ String subsystemXml = ObjectConverterUtil.convertToString(new FileReader("src/test/resources/teiid-sample-config.xml"));
+
+ String json = ObjectConverterUtil.convertToString(new FileReader("src/test/resources/teiid-model-json.txt"));
+ ModelNode testModel = ModelNode.fromJSONString(json);
+ String triggered = outputModel(testModel);
+
+ KernelServices services = super.installInController(
+ new AdditionalInitialization() {
+ @Override
+ protected Type getType() {
+ return Type.MANAGEMENT;
+ }
+ },
+ subsystemXml);
+ //Get the model and the persisted xml from the controller
+ ModelNode model = services.readWholeModel();
+ String marshalled = services.getPersistedSubsystemXml();
+
+ Assert.assertEquals(marshalled, triggered);
+ Assert.assertEquals(normalizeXML(marshalled), normalizeXML(triggered));
+ }
+
+ @Test
+ public void testSchema() throws Exception {
+ String subsystemXml = ObjectConverterUtil.convertToString(new FileReader("src/test/resources/teiid-sample-config.xml"));
+ validate(subsystemXml);
+
+ KernelServices services = super.installInController(
+ new AdditionalInitialization() {
+ @Override
+ protected Type getType() {
+ return Type.MANAGEMENT;
+ }
+ },
+ subsystemXml);
+ //Get the model and the persisted xml from the controller
+ ModelNode model = services.readWholeModel();
+ String marshalled = services.getPersistedSubsystemXml();
+
+ validate(marshalled);
+ }
+
+ private void validate(String marshalled) throws SAXException, IOException {
+ URL xsdURL = Thread.currentThread().getContextClassLoader().getResource("schema/jboss-teiid.xsd");
+ System.out.println(marshalled);
+
+ SchemaFactory factory = SchemaFactory.newInstance("http://www.w3.org/2001/XMLSchema");
+ Schema schema = factory.newSchema(xsdURL);
+
+ Validator validator = schema.newValidator();
+ Source source = new StreamSource(new ByteArrayInputStream(marshalled.getBytes()));
+ validator.setErrorHandler(new ErrorHandler() {
+
+ @Override
+ public void warning(SAXParseException exception) throws SAXException {
+ fail(exception.getMessage());
+ }
+
+ @Override
+ public void fatalError(SAXParseException exception) throws SAXException {
+ fail(exception.getMessage());
+ }
+
+ @Override
+ public void error(SAXParseException exception) throws SAXException {
+ if (!exception.getMessage().contains("cvc-enumeration-valid") && !exception.getMessage().contains("cvc-type"))
+ fail(exception.getMessage());
+ }
+ });
+
+ validator.validate(source);
+ }
+
+ @Test
+ public void testSubSystemDescription() throws IOException {
+ ModelNode node = new ModelNode();
+ TeiidAdd.describeTeiid(node, ATTRIBUTES, IntegrationPlugin.getResourceBundle(null));
+ assertEquals(ObjectConverterUtil.convertToString(new FileReader("src/test/resources/teiid-model-config.txt")), node.toString());
+ }
+
+ @Test
+ public void testParseSubsystem() throws Exception {
+ //Parse the subsystem xml into operations
+ String subsystemXml = ObjectConverterUtil.convertToString(new FileReader("src/test/resources/teiid-sample-config.xml"));
+ List<ModelNode> operations = super.parse(subsystemXml);
+
+ ///Check that we have the expected number of operations
+ Assert.assertEquals(5, operations.size());
+
+ //Check that each operation has the correct content
+ ModelNode addSubsystem = operations.get(0);
+ Assert.assertEquals(ADD, addSubsystem.get(OP).asString());
+ PathAddress addr = PathAddress.pathAddress(addSubsystem.get(OP_ADDR));
+ Assert.assertEquals(1, addr.size());
+ PathElement element = addr.getElement(0);
+ Assert.assertEquals(SUBSYSTEM, element.getKey());
+ Assert.assertEquals(TeiidExtension.TEIID_SUBSYSTEM, element.getValue());
+ }
+
+ @Test
+ public void testQueryOperations() throws Exception {
+ KernelServices services = buildSubsystem();
+
+ PathAddress addr = PathAddress.pathAddress(
+ PathElement.pathElement(SUBSYSTEM, TeiidExtension.TEIID_SUBSYSTEM));
+ ModelNode addOp = new ModelNode();
+ addOp.get(OP).set("read-operation-names");
+ addOp.get(OP_ADDR).set(addr.toModelNode());
+
+ ModelNode result = services.executeOperation(addOp);
+ Assert.assertEquals(SUCCESS, result.get(OUTCOME).asString());
+
+ List<String> opNames = getList(result);
+ assertEquals(36, opNames.size());
+ String[] ops = { "add", "add-anyauthenticated-role", "add-data-role",
+ "assign-datasource", "cache-statistics", "cache-types",
+ "cancel-request", "change-vdb-connection-type", "clear-cache",
+ "describe", "execute-query", "get-translator", "get-vdb",
+ "list-requests", "list-sessions", "list-transactions",
+ "list-translators", "list-vdbs", "long-running-queries",
+ "merge-vdbs", "read-attribute", "read-children-names",
+ "read-children-resources", "read-children-types",
+ "read-operation-description", "read-operation-names",
+ "read-resource", "read-resource-description",
+ "remove-anyauthenticated-role", "remove-data-role",
+ "requests-per-session", "requests-per-vdb",
+ "terminate-session", "terminate-transaction",
+ "workerpool-statistics", "write-attribute" };
+ assertEquals(Arrays.asList(ops), opNames);
+ }
+
+ @Test
+ public void testAddRemoveTransport() throws Exception {
+ KernelServices services = buildSubsystem();
+
+ PathAddress addr = PathAddress.pathAddress(PathElement.pathElement(SUBSYSTEM, TeiidExtension.TEIID_SUBSYSTEM));
+
+ // look at current query engines make sure there are only two from configuration.
+ ModelNode read = new ModelNode();
+ read.get(OP).set("read-children-names");
+ read.get(OP_ADDR).set(addr.toModelNode());
+ read.get(CHILD_TYPE).set("transport");
+
+ ModelNode result = services.executeOperation(read);
+ Assert.assertEquals(SUCCESS, result.get(OUTCOME).asString());
+
+ List<String> opNames = getList(result);
+ assertEquals(2, opNames.size());
+ String [] ops = {"jdbc", "odbc"};
+ assertEquals(Arrays.asList(ops), opNames);
+
+ // add transport
+ ModelNode addOp = new ModelNode();
+ addOp.get(OP).set("add");
+ addOp.get(OP_ADDR).set(addr.toModelNode().add("transport", "newbie")); //$NON-NLS-1$);
+ addOp.get("protocol").set("pg");
+ addOp.get("socket-binding").set("socket");
+ addOp.get("authentication-security-domain").set("teiid-security");
+
+ result = services.executeOperation(addOp);
+ Assert.assertEquals(SUCCESS, result.get(OUTCOME).asString());
+
+ result = services.executeOperation(read);
+ Assert.assertEquals(SUCCESS, result.get(OUTCOME).asString());
+ opNames = getList(result);
+ assertEquals(3, opNames.size());
+ String [] ops2 = {"jdbc", "newbie", "odbc"};
+ assertEquals(Arrays.asList(ops2), opNames);
+
+ // add transport
+ ModelNode remove = new ModelNode();
+ remove.get(OP).set("remove");
+ remove.get(OP_ADDR).set(addr.toModelNode().add("transport", "jdbc")); //$NON-NLS-1$);
+ result = services.executeOperation(remove);
+ Assert.assertEquals(SUCCESS, result.get(OUTCOME).asString());
+
+ result = services.executeOperation(read);
+ Assert.assertEquals(SUCCESS, result.get(OUTCOME).asString());
+ opNames = getList(result);
+ assertEquals(2, opNames.size());
+ String [] ops3 = {"newbie", "odbc"};
+ assertEquals(Arrays.asList(ops3), opNames);
+ }
+
+ private KernelServices buildSubsystem() throws IOException,
+ FileNotFoundException, Exception {
+ String subsystemXml = ObjectConverterUtil.convertToString(new FileReader("src/test/resources/teiid-sample-config.xml"));
+
+ KernelServices services = super.installInController(subsystemXml);
+ return services;
+ }
+
+ private static List<String> getList(ModelNode operationResult) {
+ if(!operationResult.hasDefined("result"))
+ return Collections.emptyList();
+
+ List<ModelNode> nodeList = operationResult.get("result").asList();
+ if(nodeList.isEmpty())
+ return Collections.emptyList();
+
+ List<String> list = new ArrayList<String>(nodeList.size());
+ for(ModelNode node : nodeList) {
+ list.add(node.asString());
+ }
+ return list;
+ }
+
+ private ModelNode buildProperty(String name, String value) {
+ ModelNode node = new ModelNode();
+ node.get("property-name").set(name);
+ node.get("property-value").set(value);
+ return node;
+ }
+
+ @Test
+ public void testTranslator() throws Exception {
+ KernelServices services = buildSubsystem();
+
+ PathAddress addr = PathAddress.pathAddress(PathElement.pathElement(SUBSYSTEM, TeiidExtension.TEIID_SUBSYSTEM));
+
+ ModelNode addOp = new ModelNode();
+ addOp.get(OP).set("add");
+ addOp.get(OP_ADDR).set(addr.toModelNode().add("translator", "oracle"));
+ services.executeOperation(addOp);
+
+ ModelNode listOp = new ModelNode();
+ listOp.get(OP).set("list-translators");
+ listOp.get(OP_ADDR).set(addr.toModelNode());
+
+ ModelNode result = services.executeOperation(listOp);
+ Assert.assertEquals(SUCCESS, result.get(OUTCOME).asString());
+
+ List<ModelNode> translators = result.get("result").asList();
+
+ ModelNode oracle = new ModelNode();
+ oracle.get("translator-name").set("oracle");
+ oracle.get("description").set("A translator for Oracle 9i Database or later");
+ oracle.get("children", "properties").add(buildProperty("execution-factory-class","org.teiid.translator.jdbc.oracle.OracleExecutionFactory"));
+ oracle.get("children", "properties").add(buildProperty("TrimStrings","false"));
+ oracle.get("children", "properties").add(buildProperty("SupportedJoinCriteria","ANY"));
+ oracle.get("children", "properties").add(buildProperty("requiresCriteria","false"));
+ oracle.get("children", "properties").add(buildProperty("supportsOuterJoins","true"));
+ oracle.get("children", "properties").add(buildProperty("useCommentsInSourceQuery","false"));
+ oracle.get("children", "properties").add(buildProperty("useBindVariables","true"));
+ oracle.get("children", "properties").add(buildProperty("MaxPreparedInsertBatchSize","2048"));
+ oracle.get("children", "properties").add(buildProperty("supportsInnerJoins","true"));
+ oracle.get("children", "properties").add(buildProperty("MaxInCriteriaSize","1000"));
+ oracle.get("children", "properties").add(buildProperty("supportsSelectDistinct","true"));
+ oracle.get("children", "properties").add(buildProperty("supportsOrderBy","true"));
+ oracle.get("children", "properties").add(buildProperty("supportsFullOuterJoins","true"));
+ oracle.get("children", "properties").add(buildProperty("Immutable","false"));
+ oracle.get("children", "properties").add(buildProperty("MaxDependentInPredicates","50"));
+
+ super.compare(translators.get(0), oracle);
+ }
+
+ @Ignore
+ public void testVDBOperations() throws Exception {
+ KernelServices services = buildSubsystem();
+ String fileName = "bqt.vdb";
+
+ byte[] bytes = ObjectConverterUtil.convertToByteArray(new FileInputStream(UnitTestUtil.getTestDataFile(fileName)));
+ PathAddress addr = PathAddress.pathAddress(PathElement.pathElement(SUBSYSTEM, TeiidExtension.TEIID_SUBSYSTEM));
+
+ // add
+ ModelNode composite = new ModelNode();
+ composite.get("operation").set("composite");
+ composite.get("address").setEmptyList();
+ ModelNode steps = composite.get("steps");
+
+ DefaultOperationRequestBuilder builder = new DefaultOperationRequestBuilder();
+ builder.setOperationName("add");
+ builder.addNode("deployment", fileName);
+
+ builder.getModelNode().get("content").get(0).get("bytes").set(bytes);
+ steps.add(builder.buildRequest());
+
+ // deploy
+ builder = new DefaultOperationRequestBuilder();
+ builder.setOperationName("deploy");
+ builder.addNode("deployment", fileName);
+ steps.add(builder.buildRequest());
+
+ ModelNode result = services.executeOperation(composite);
+
+ Assert.assertEquals(SUCCESS, result.get(OUTCOME).asString());
+
+ ModelNode addOp = new ModelNode();
+ addOp.get(OP).set("list-vdbs");
+ addOp.get(OP_ADDR).set(addr.toModelNode());
+
+ result = services.executeOperation(addOp);
+ Assert.assertEquals(SUCCESS, result.get(OUTCOME).asString());
+
+ List<String> opNames = getList(result);
+ assertEquals(2, opNames.size());
+ String [] ops3 = {"newbie", "odbc"};
+ assertEquals(Arrays.asList(ops3), opNames);
+ }
+}
Property changes on: branches/as7/jboss-integration/src/test/java/org/teiid/jboss/TestTeiidOperations.java
___________________________________________________________________
Added: svn:mime-type
+ text/plain
Added: branches/as7/jboss-integration/src/test/resources/bqt.vdb
===================================================================
(Binary files differ)
Property changes on: branches/as7/jboss-integration/src/test/resources/bqt.vdb
___________________________________________________________________
Added: svn:mime-type
+ application/octet-stream
Modified: branches/as7/jboss-integration/src/test/resources/teiid-model-config.txt
===================================================================
--- branches/as7/jboss-integration/src/test/resources/teiid-model-config.txt 2011-10-18 15:46:00 UTC (rev 3558)
+++ branches/as7/jboss-integration/src/test/resources/teiid-model-config.txt 2011-10-18 15:56:08 UTC (rev 3559)
@@ -176,13 +176,6 @@
"max-occurs" => 1,
"default" => 28800
},
- "preparedplan-cache-max-staleness" => {
- "type" => INT,
- "description" => "Max staleness in seconds. Modifications are based upon data updates -1 indicates no max. (default 60 - 1 minute)",
- "required" => false,
- "max-occurs" => 1,
- "default" => 0
- },
"resultset-cache-name" => {
"type" => STRING,
"description" => "Infinispan cache name for resultset",
@@ -192,7 +185,7 @@
},
"resultset-cache-container-name" => {
"type" => STRING,
- "description" => "Infinispan cache container name ",
+ "description" => "Infinispan cache container name",
"required" => false,
"max-occurs" => 1
},
@@ -205,7 +198,7 @@
},
"resultset-cache-enable" => {
"type" => BOOLEAN,
- "description" => "Resultset cache enabled ",
+ "description" => "Resultset cache enabled",
"required" => false,
"max-occurs" => 1
}
Modified: branches/as7/jboss-integration/src/test/resources/teiid-model-json.txt
===================================================================
--- branches/as7/jboss-integration/src/test/resources/teiid-model-json.txt 2011-10-18 15:46:00 UTC (rev 3558)
+++ branches/as7/jboss-integration/src/test/resources/teiid-model-json.txt 2011-10-18 15:56:08 UTC (rev 3559)
@@ -20,7 +20,6 @@
"object-replicator-stack" : "stack",
"preparedplan-cache-max-age-in-seconds" : 28800,
"preparedplan-cache-max-entries" : 512,
- "preparedplan-cache-max-staleness" : 90,
"query-threshold-in-seconds" : 600,
"resultset-cache-container-name" : "container",
"resultset-cache-enable" : false,
Modified: branches/as7/jboss-integration/src/test/resources/teiid-sample-config.xml
===================================================================
--- branches/as7/jboss-integration/src/test/resources/teiid-sample-config.xml 2011-10-18 15:46:00 UTC (rev 3558)
+++ branches/as7/jboss-integration/src/test/resources/teiid-sample-config.xml 2011-10-18 15:56:08 UTC (rev 3559)
@@ -23,7 +23,7 @@
<resultset-cache name="cache" container-name="container" enable="false" max-staleness="90"/>
- <preparedplan-cache max-entries="512" max-age-in-seconds="28800" max-staleness="90"/>
+ <preparedplan-cache max-entries="512" max-age-in-seconds="28800"/>
<object-replicator stack="stack" cluster-name="cluster"/>
Modified: branches/as7/runtime/src/main/java/org/teiid/services/SessionServiceImpl.java
===================================================================
--- branches/as7/runtime/src/main/java/org/teiid/services/SessionServiceImpl.java 2011-10-18 15:46:00 UTC (rev 3558)
+++ branches/as7/runtime/src/main/java/org/teiid/services/SessionServiceImpl.java 2011-10-18 15:56:08 UTC (rev 3559)
@@ -272,7 +272,7 @@
}
@Override
- public Collection<SessionMetadata> getActiveSessions() throws SessionServiceException {
+ public Collection<SessionMetadata> getActiveSessions() {
return new ArrayList<SessionMetadata>(this.sessionCache.values());
}
Modified: branches/as7/test-integration/common/pom.xml
===================================================================
--- branches/as7/test-integration/common/pom.xml 2011-10-18 15:46:00 UTC (rev 3558)
+++ branches/as7/test-integration/common/pom.xml 2011-10-18 15:56:08 UTC (rev 3559)
@@ -20,11 +20,7 @@
<artifactId>h2</artifactId>
<version>1.2.147</version>
</dependency>
- <dependency>
- <groupId>org.jboss.as</groupId>
- <artifactId>jboss-as-clustering-jgroups</artifactId>
- <scope>provided</scope>
- </dependency>
+
<dependency>
<artifactId>teiid-cache-jbosscache</artifactId>
<groupId>org.jboss.teiid</groupId>
12 years, 6 months
teiid SVN: r3558 - branches/7.4.x/documentation/admin-guide/src/main/docbook/en-US/content.
by teiid-commits@lists.jboss.org
Author: shawkins
Date: 2011-10-18 11:46:00 -0400 (Tue, 18 Oct 2011)
New Revision: 3558
Modified:
branches/7.4.x/documentation/admin-guide/src/main/docbook/en-US/content/security.xml
Log:
SOA-3448 fixing programlisting whitespace
Modified: branches/7.4.x/documentation/admin-guide/src/main/docbook/en-US/content/security.xml
===================================================================
--- branches/7.4.x/documentation/admin-guide/src/main/docbook/en-US/content/security.xml 2011-10-18 10:52:08 UTC (rev 3557)
+++ branches/7.4.x/documentation/admin-guide/src/main/docbook/en-US/content/security.xml 2011-10-18 15:46:00 UTC (rev 3558)
@@ -115,22 +115,20 @@
<example>
<title>Example user.properties file</title>
<programlisting><![CDATA[# A users.properties file for use with the UsersRolesLoginModule
- # username=password
-
- fred=password
- george=password
- ...]]></programlisting>
+# username=password
+
+fred=password
+george=password...]]></programlisting>
</example>
JAAS role assignments are stored in the <profile>conf/props/teiid-security-roles.properties file.
<example>
<title>Example user.properties file</title>
<programlisting><![CDATA[# A roles.properties file for use with the UsersRolesLoginModule
- # username=role1,role2,...
-
- data_role_1=fred,sally
- data_role_2=george
- ]]></programlisting>
+# username=role1,role2,...
+
+data_role_1=fred,sally
+data_role_2=george]]></programlisting>
</example>
User and role names are entirely up to the needs of the given deployment. For example each application team can set their own security constraints for their VDBs, by mapping their VDB data roles to application specific JAAS roles, e.g. app_role_1=user1,user2,user3.
@@ -202,31 +200,27 @@
data source. Here is a sample configuration, this needs to be configured in "teiid-jboss-beans.xml" file.
</para>
- <programlisting><![CDATA[
- <application-policy xmlns="urn:jboss:security-beans:1.0" name="teiid-security">
- <authentication>
+ <programlisting><![CDATA[<application-policy xmlns="urn:jboss:security-beans:1.0" name="teiid-security">
+ <authentication>
+
+ <login-module code="org.jboss.security.auth.spi.UsersRolesLoginModule" flag="required">
+ <module-option name = "password-stacking">useFirstPass</module-option>
+ <module-option name="usersProperties">props/teiid-security-users.properties</module-option>
+ <module-option name="rolesProperties">props/teiid-security-roles.properties</module-option>
+ </login-module>
+
+ <login-module code="org.jboss.resource.security.CallerIdentityLoginModule" flag="required">
+ <module-option name = "password-stacking">useFirstPass</module-option>
+ <module-option name = "managedConnectionFactoryName">jboss.jca:service=LocalTxCM,name=DefaultDS</module-option>
+ </login-module>
+
+ </authentication>
+</application-policy>]]></programlisting>
- <login-module code="org.jboss.security.auth.spi.UsersRolesLoginModule" flag="required">
- <module-option name = "password-stacking">useFirstPass</module-option>
- <module-option name="usersProperties">props/teiid-security-users.properties</module-option>
- <module-option name="rolesProperties">props/teiid-security-roles.properties</module-option>
- </login-module>
-
- <login-module code="org.jboss.resource.security.CallerIdentityLoginModule" flag="required">
- <module-option name = "password-stacking">useFirstPass</module-option>
- <module-option name = "managedConnectionFactoryName">jboss.jca:service=LocalTxCM,name=DefaultDS</module-option>
- </login-module>
-
- </authentication>
- </application-policy>
- ]]></programlisting>
-
<para>In the -ds.xml file that is defined as the "managedConnectionFactoryName" in the above configuration,
you need to add the following element</para>
- <programlisting><![CDATA[
- <security-domain>teiid-security</security-domain>
- ]]></programlisting>
+ <programlisting><![CDATA[<security-domain>teiid-security</security-domain>]]></programlisting>
<para>In the above configuration example, in the primary login module "UsersRolesLoginModule" is setup to hold the
passwords in the file, and when user logs in with password, the same password will be also set on the logged in Subject after
@@ -251,31 +245,27 @@
map to different roles. If a user has multiple roles, the first role that has the credential will be chosen.
Below find the sample configuration.</para>
- <programlisting><![CDATA[
- <application-policy xmlns="urn:jboss:security-beans:1.0" name="teiid-security">
- <authentication>
-
- <login-module code="org.jboss.security.auth.spi.UsersRolesLoginModule" flag="required">
- <module-option name = "password-stacking">useFirstPass</module-option>
- <module-option name="usersProperties">props/teiid-security-users.properties</module-option>
- <module-option name="rolesProperties">props/teiid-security-roles.properties</module-option>
- </login-module>
-
- <login-module code="org.teiid.jboss.RoleBasedCredentialMapIdentityLoginModule" flag="required">
- <module-option name = "password-stacking">useFirstPass</module-option>
- <module-option name="credentialMap">props/teiid-credentialmap.properties</module-option>
- <module-option name = "managedConnectionFactoryName">jboss.jca:service=LocalTxCM,name=DefaultDS</module-option>
- </login-module>
-
- </authentication>
- </application-policy>
- ]]></programlisting>
+ <programlisting><![CDATA[<application-policy xmlns="urn:jboss:security-beans:1.0" name="teiid-security">
+ <authentication>
+
+ <login-module code="org.jboss.security.auth.spi.UsersRolesLoginModule" flag="required">
+ <module-option name = "password-stacking">useFirstPass</module-option>
+ <module-option name="usersProperties">props/teiid-security-users.properties</module-option>
+ <module-option name="rolesProperties">props/teiid-security-roles.properties</module-option>
+ </login-module>
+
+ <login-module code="org.teiid.jboss.RoleBasedCredentialMapIdentityLoginModule" flag="required">
+ <module-option name = "password-stacking">useFirstPass</module-option>
+ <module-option name="credentialMap">props/teiid-credentialmap.properties</module-option>
+ <module-option name = "managedConnectionFactoryName">jboss.jca:service=LocalTxCM,name=DefaultDS</module-option>
+ </login-module>
+
+ </authentication>
+</application-policy>]]></programlisting>
<para>In the -ds.xml file that is defined as the "managedConnectionFactoryName" in the above configuration,
you need to add the following element</para>
- <programlisting><![CDATA[
- <security-domain>teiid-security</security-domain>
- ]]></programlisting>
+ <programlisting><![CDATA[<security-domain>teiid-security</security-domain>]]></programlisting>
<para>In the above configuration example, in the primary login module "UsersRolesLoginModule" is setup for logging in
the primary user and assign some roles. The "RoleBasedCredentialMap" login module is configured to hold
@@ -288,19 +278,17 @@
password in the file defined by the "credentialMap" property, and define following properties in
the "RoleBasedCredentialMap" login module.</para>
- <programlisting><![CDATA[
- <login-module code="org.teiid.jboss.RoleBasedCredentialMapIdentityLoginModule" flag="required">
- <module-option name = "password-stacking">useFirstPass</module-option>
- <module-option name="credentialMap">props/teiid-credentialmap.properties</module-option>
- <module-option name = "managedConnectionFactoryName">jboss.jca:service=LocalTxCM,name=DefaultDS</module-option>
-
- <!-- below properties are only required when passwords are encrypted -->
- <module-option name = "pbealgo">PBEWithMD5AndDES</module-option>
- <module-option name = "pbepass">testPBEIdentityLoginModule</module-option>
- <module-option name = "salt">abcdefgh</module-option>
- <module-option name = "iterationCount">19</module-option>
- </login-module>
- ]]></programlisting>
+ <programlisting><![CDATA[<login-module code="org.teiid.jboss.RoleBasedCredentialMapIdentityLoginModule" flag="required">
+ <module-option name = "password-stacking">useFirstPass</module-option>
+ <module-option name="credentialMap">props/teiid-credentialmap.properties</module-option>
+ <module-option name = "managedConnectionFactoryName">jboss.jca:service=LocalTxCM,name=DefaultDS</module-option>
+
+ <!-- below properties are only required when passwords are encrypted -->
+ <module-option name = "pbealgo">PBEWithMD5AndDES</module-option>
+ <module-option name = "pbepass">testPBEIdentityLoginModule</module-option>
+ <module-option name = "salt">abcdefgh</module-option>
+ <module-option name = "iterationCount">19</module-option>
+</login-module>]]></programlisting>
<para>For full details about encryption of the password, please follow this
<ulink url="http://community.jboss.org/docs/DOC-9703">document</ulink>'s
12 years, 6 months
teiid SVN: r3557 - in trunk: adminshell/src/main/java/groovy and 236 other directories.
by teiid-commits@lists.jboss.org
Author: shawkins
Date: 2011-10-18 06:52:08 -0400 (Tue, 18 Oct 2011)
New Revision: 3557
Added:
trunk/connectors/translator-jdbc/src/test/java/org/teiid/translator/jdbc/ingres/TestIngresExecutionFactory.java
Modified:
trunk/
trunk/adminshell/src/main/java/groovy/
trunk/adminshell/src/main/java/groovy/sql/
trunk/adminshell/src/main/java/groovy/sql/TeiidSql.java
trunk/adminshell/src/main/java/org/teiid/adminshell/
trunk/adminshell/src/main/java/org/teiid/adminshell/AdminHelpCommand.java
trunk/adminshell/src/main/java/org/teiid/adminshell/AdminShell.java
trunk/adminshell/src/main/java/org/teiid/adminshell/GroovyAdminConsole.java
trunk/adminshell/src/main/java/org/teiid/adminshell/GroovyAdminShell.java
trunk/adminshell/src/main/java/org/teiid/adminshell/GroovySqlExtensions.java
trunk/adminshell/src/main/java/org/teiid/adminshell/Help.java
trunk/adminshell/src/main/java/org/teiid/adminshell/MigrationUtil.java
trunk/adminshell/src/main/java/org/teiid/adminshell/SqlHelpCommand.java
trunk/adminshell/src/main/resources/org/
trunk/adminshell/src/main/resources/org/codehaus/
trunk/adminshell/src/main/resources/org/codehaus/groovy/
trunk/adminshell/src/main/resources/org/codehaus/groovy/tools/
trunk/adminshell/src/main/resources/org/codehaus/groovy/tools/shell/
trunk/adminshell/src/main/resources/org/codehaus/groovy/tools/shell/commands.xml
trunk/adminshell/src/main/resources/org/teiid/
trunk/adminshell/src/main/resources/org/teiid/adminshell/
trunk/adminshell/src/main/resources/org/teiid/adminshell/AdminHelpCommand.properties
trunk/adminshell/src/main/resources/org/teiid/adminshell/SqlHelpCommand.properties
trunk/adminshell/src/test/java/org/
trunk/adminshell/src/test/java/org/teiid/
trunk/adminshell/src/test/java/org/teiid/adminshell/
trunk/adminshell/src/test/java/org/teiid/adminshell/TestAdminShell.java
trunk/adminshell/src/test/resources/foo/
trunk/adminshell/src/test/resources/foo/bar.txt
trunk/api/src/main/java/org/teiid/connector/DataPlugin.java
trunk/api/src/main/java/org/teiid/events/
trunk/api/src/main/java/org/teiid/events/EventDistributor.java
trunk/api/src/main/java/org/teiid/events/EventDistributorFactory.java
trunk/api/src/main/java/org/teiid/language/visitor/
trunk/api/src/main/java/org/teiid/logging/JavaLogger.java
trunk/api/src/main/java/org/teiid/metadata/
trunk/api/src/main/java/org/teiid/metadata/AbstractMetadataRecord.java
trunk/api/src/main/java/org/teiid/metadata/Column.java
trunk/api/src/main/java/org/teiid/metadata/ColumnSet.java
trunk/api/src/main/java/org/teiid/metadata/Datatype.java
trunk/api/src/main/java/org/teiid/metadata/ForeignKey.java
trunk/api/src/main/java/org/teiid/metadata/ProcedureParameter.java
trunk/api/src/main/java/org/teiid/metadata/Schema.java
trunk/api/src/main/java/org/teiid/translator/TranslatorException.java
trunk/api/src/main/resources/org/
trunk/api/src/main/resources/org/teiid/
trunk/api/src/main/resources/org/teiid/connector/
trunk/api/src/test/java/org/
trunk/api/src/test/java/org/teiid/
trunk/api/src/test/java/org/teiid/connector/
trunk/build/kits/
trunk/build/kits/adminshell/
trunk/build/kits/jboss-container/
trunk/build/kits/jboss-container/teiid-examples/dynamicvdb-ws-weather/
trunk/build/kits/jboss-container/teiid-examples/dynamicvdb-ws-weather/README.txt
trunk/build/kits/jboss-container/teiid-examples/dynamicvdb-ws-weather/weather-ds.xml
trunk/build/kits/jboss-container/teiid-examples/dynamicvdb-ws-weather/weather-vdb.xml
trunk/cache-jbosscache/src/main/java/org/
trunk/cache-jbosscache/src/main/java/org/teiid/
trunk/cache-jbosscache/src/main/java/org/teiid/cache/
trunk/cache-jbosscache/src/main/java/org/teiid/cache/jboss/
trunk/cache-jbosscache/src/main/java/org/teiid/events/
trunk/cache-jbosscache/src/main/java/org/teiid/replication/
trunk/cache-jbosscache/src/main/java/org/teiid/replication/jboss/
trunk/cache-jbosscache/src/main/java/org/teiid/replication/jboss/JGroupsInputStream.java
trunk/cache-jbosscache/src/main/java/org/teiid/replication/jboss/JGroupsObjectReplicator.java
trunk/cache-jbosscache/src/main/java/org/teiid/replication/jboss/JGroupsOutputStream.java
trunk/cache-jbosscache/src/test/java/
trunk/client/src/main/java/org/teiid/client/SourceWarning.java
trunk/client/src/main/java/org/teiid/client/util/
trunk/client/src/main/java/org/teiid/client/util/ExceptionHolder.java
trunk/client/src/main/java/org/teiid/client/util/ExceptionUtil.java
trunk/client/src/main/java/org/teiid/client/util/ResultsFuture.java
trunk/client/src/main/java/org/teiid/client/util/ResultsReceiver.java
trunk/client/src/main/java/org/teiid/jdbc/
trunk/client/src/main/java/org/teiid/jdbc/BaseDataSource.java
trunk/client/src/main/java/org/teiid/jdbc/BatchResults.java
trunk/client/src/main/java/org/teiid/jdbc/CallableStatementImpl.java
trunk/client/src/main/java/org/teiid/jdbc/ConnectionImpl.java
trunk/client/src/main/java/org/teiid/jdbc/ConnectionListener.java
trunk/client/src/main/java/org/teiid/jdbc/ConnectionProfile.java
trunk/client/src/main/java/org/teiid/jdbc/DataTypeTransformer.java
trunk/client/src/main/java/org/teiid/jdbc/DatabaseMetaDataImpl.java
trunk/client/src/main/java/org/teiid/jdbc/DeferredMetadataProvider.java
trunk/client/src/main/java/org/teiid/jdbc/EmbeddedProfile.java
trunk/client/src/main/java/org/teiid/jdbc/EnhancedTimer.java
trunk/client/src/main/java/org/teiid/jdbc/ExecutionProperties.java
trunk/client/src/main/java/org/teiid/jdbc/FilteredResultsMetadata.java
trunk/client/src/main/java/org/teiid/jdbc/JDBCColumnNames.java
trunk/client/src/main/java/org/teiid/jdbc/JDBCColumnPositions.java
trunk/client/src/main/java/org/teiid/jdbc/JDBCPlugin.java
trunk/client/src/main/java/org/teiid/jdbc/JDBCURL.java
trunk/client/src/main/java/org/teiid/jdbc/MetadataProvider.java
trunk/client/src/main/java/org/teiid/jdbc/ParameterMetaDataImpl.java
trunk/client/src/main/java/org/teiid/jdbc/PartialResultsWarning.java
trunk/client/src/main/java/org/teiid/jdbc/PreparedStatementImpl.java
trunk/client/src/main/java/org/teiid/jdbc/ResultSetImpl.java
trunk/client/src/main/java/org/teiid/jdbc/ResultSetMetaDataImpl.java
trunk/client/src/main/java/org/teiid/jdbc/SQLStates.java
trunk/client/src/main/java/org/teiid/jdbc/SocketProfile.java
trunk/client/src/main/java/org/teiid/jdbc/StatementImpl.java
trunk/client/src/main/java/org/teiid/jdbc/TeiidConnection.java
trunk/client/src/main/java/org/teiid/jdbc/TeiidDataSource.java
trunk/client/src/main/java/org/teiid/jdbc/TeiidDriver.java
trunk/client/src/main/java/org/teiid/jdbc/TeiidSQLException.java
trunk/client/src/main/java/org/teiid/jdbc/TeiidStatement.java
trunk/client/src/main/java/org/teiid/jdbc/WarningUtil.java
trunk/client/src/main/java/org/teiid/jdbc/WrapperImpl.java
trunk/client/src/main/java/org/teiid/jdbc/XAConnectionImpl.java
trunk/client/src/main/java/org/teiid/jdbc/XAResourceImpl.java
trunk/client/src/main/java/org/teiid/net/socket/
trunk/client/src/main/java/org/teiid/net/socket/Handshake.java
trunk/client/src/main/java/org/teiid/net/socket/Message.java
trunk/client/src/main/java/org/teiid/net/socket/ObjectChannel.java
trunk/client/src/main/java/org/teiid/net/socket/ObjectChannelFactory.java
trunk/client/src/main/java/org/teiid/net/socket/OioOjbectChannelFactory.java
trunk/client/src/main/java/org/teiid/net/socket/ServerDiscovery.java
trunk/client/src/main/java/org/teiid/net/socket/ServiceInvocationStruct.java
trunk/client/src/main/java/org/teiid/net/socket/SingleInstanceCommunicationException.java
trunk/client/src/main/java/org/teiid/net/socket/SocketServerConnection.java
trunk/client/src/main/java/org/teiid/net/socket/SocketServerConnectionFactory.java
trunk/client/src/main/java/org/teiid/net/socket/SocketServerInstance.java
trunk/client/src/main/java/org/teiid/net/socket/SocketServerInstanceFactory.java
trunk/client/src/main/java/org/teiid/net/socket/SocketServerInstanceImpl.java
trunk/client/src/main/java/org/teiid/net/socket/SocketUtil.java
trunk/client/src/main/java/org/teiid/net/socket/UrlServerDiscovery.java
trunk/client/src/main/java/org/teiid/netty/handler/codec/serialization/
trunk/client/src/main/resources/org/
trunk/client/src/main/resources/org/teiid/
trunk/client/src/main/resources/org/teiid/jdbc/
trunk/client/src/main/resources/org/teiid/net/
trunk/client/src/test/java/org/teiid/client/TestRequestMessage.java
trunk/client/src/test/java/org/teiid/client/plan/
trunk/client/src/test/java/org/teiid/client/plan/TestPlanNode.java
trunk/client/src/test/java/org/teiid/client/util/
trunk/client/src/test/java/org/teiid/client/util/TestExceptionHolder.java
trunk/client/src/test/java/org/teiid/client/util/TestResultsFuture.java
trunk/client/src/test/java/org/teiid/jdbc/
trunk/client/src/test/java/org/teiid/jdbc/TestAllResultsImpl.java
trunk/client/src/test/java/org/teiid/jdbc/TestBatchResults.java
trunk/client/src/test/java/org/teiid/jdbc/TestCallableStatement.java
trunk/client/src/test/java/org/teiid/jdbc/TestConnection.java
trunk/client/src/test/java/org/teiid/jdbc/TestDataTypeTransformer.java
trunk/client/src/test/java/org/teiid/jdbc/TestEmbeddedProfile.java
trunk/client/src/test/java/org/teiid/jdbc/TestEnhancedTimer.java
trunk/client/src/test/java/org/teiid/jdbc/TestJDBCURL.java
trunk/client/src/test/java/org/teiid/jdbc/TestPreparedStatement.java
trunk/client/src/test/java/org/teiid/jdbc/TestResultSet.java
trunk/client/src/test/java/org/teiid/jdbc/TestSQLException.java
trunk/client/src/test/java/org/teiid/jdbc/TestSocketProfile.java
trunk/client/src/test/java/org/teiid/jdbc/TestStatement.java
trunk/client/src/test/java/org/teiid/jdbc/TestTeiidDataSource.java
trunk/client/src/test/java/org/teiid/jdbc/TestTeiidDriver.java
trunk/client/src/test/java/org/teiid/jdbc/TestWrapperImpl.java
trunk/client/src/test/java/org/teiid/jdbc/TestXAConnection.java
trunk/client/src/test/java/org/teiid/jdbc/util/
trunk/client/src/test/java/org/teiid/net/
trunk/client/src/test/java/org/teiid/net/TestTeiidURL.java
trunk/client/src/test/java/org/teiid/net/socket/
trunk/client/src/test/resources/metamatrix.keystore
trunk/client/src/test/resources/metamatrix.truststore
trunk/common-core/src/main/java/org/
trunk/common-core/src/main/java/org/teiid/
trunk/common-core/src/main/java/org/teiid/core/
trunk/common-core/src/main/java/org/teiid/core/BundleUtil.java
trunk/common-core/src/main/java/org/teiid/core/ComponentNotFoundException.java
trunk/common-core/src/main/java/org/teiid/core/CoreConstants.java
trunk/common-core/src/main/java/org/teiid/core/CorePlugin.java
trunk/common-core/src/main/java/org/teiid/core/TeiidComponentException.java
trunk/common-core/src/main/java/org/teiid/core/TeiidException.java
trunk/common-core/src/main/java/org/teiid/core/TeiidProcessingException.java
trunk/common-core/src/main/java/org/teiid/core/TeiidRuntimeException.java
trunk/common-core/src/main/java/org/teiid/core/crypto/
trunk/common-core/src/main/java/org/teiid/core/types/
trunk/common-core/src/main/java/org/teiid/core/types/BaseLob.java
trunk/common-core/src/main/java/org/teiid/core/types/BlobImpl.java
trunk/common-core/src/main/java/org/teiid/core/types/BlobType.java
trunk/common-core/src/main/java/org/teiid/core/types/ClobImpl.java
trunk/common-core/src/main/java/org/teiid/core/types/ClobType.java
trunk/common-core/src/main/java/org/teiid/core/types/DataTypeManager.java
trunk/common-core/src/main/java/org/teiid/core/types/InputStreamFactory.java
trunk/common-core/src/main/java/org/teiid/core/types/JDBCSQLTypeInfo.java
trunk/common-core/src/main/java/org/teiid/core/types/LobSearchUtil.java
trunk/common-core/src/main/java/org/teiid/core/types/NullType.java
trunk/common-core/src/main/java/org/teiid/core/types/SQLXMLImpl.java
trunk/common-core/src/main/java/org/teiid/core/types/Sequencable.java
trunk/common-core/src/main/java/org/teiid/core/types/SourceTransform.java
trunk/common-core/src/main/java/org/teiid/core/types/StandardXMLTranslator.java
trunk/common-core/src/main/java/org/teiid/core/types/Streamable.java
trunk/common-core/src/main/java/org/teiid/core/types/Transform.java
trunk/common-core/src/main/java/org/teiid/core/types/TransformationException.java
trunk/common-core/src/main/java/org/teiid/core/types/XMLTranslator.java
trunk/common-core/src/main/java/org/teiid/core/types/XMLType.java
trunk/common-core/src/main/java/org/teiid/core/types/basic/
trunk/common-core/src/main/java/org/teiid/core/util/
trunk/common-core/src/main/java/org/teiid/core/util/ApplicationInfo.java
trunk/common-core/src/test/java/org/
trunk/common-core/src/test/java/org/teiid/
trunk/common-core/src/test/java/org/teiid/core/
trunk/common-core/src/test/java/org/teiid/core/TestMetaMatrixException.java
trunk/common-core/src/test/java/org/teiid/core/TestMetaMatrixRuntimeException.java
trunk/common-core/src/test/java/org/teiid/core/crypto/
trunk/common-core/src/test/java/org/teiid/core/types/
trunk/common-core/src/test/java/org/teiid/core/types/TestBlobValue.java
trunk/common-core/src/test/java/org/teiid/core/types/TestClobValue.java
trunk/common-core/src/test/java/org/teiid/core/types/TestDataTypeManager.java
trunk/common-core/src/test/java/org/teiid/core/types/TestSQLXMLImpl.java
trunk/common-core/src/test/java/org/teiid/core/types/TestXMLStreamSourceTranslator.java
trunk/common-core/src/test/java/org/teiid/core/types/TestXMLValue.java
trunk/common-core/src/test/java/org/teiid/core/types/basic/
trunk/common-core/src/test/java/org/teiid/core/util/
trunk/common-core/src/test/java/org/teiid/query/
trunk/common-core/src/test/java/org/teiid/query/unittest/
trunk/common-core/src/test/java/org/teiid/query/unittest/TimestampUtil.java
trunk/connectors/connector-file/src/main/java/org/teiid/resource/adapter/
trunk/connectors/connector-file/src/main/java/org/teiid/resource/adapter/file/
trunk/connectors/connector-file/src/main/resources/org/
trunk/connectors/connector-file/src/main/resources/org/teiid/
trunk/connectors/connector-file/src/main/resources/org/teiid/resource/
trunk/connectors/connector-file/src/main/resources/org/teiid/resource/adapter/
trunk/connectors/connector-file/src/main/resources/org/teiid/resource/adapter/file/
trunk/connectors/connector-file/src/main/resources/org/teiid/resource/adapter/file/i18n.properties
trunk/connectors/connector-file/src/test/java/org/
trunk/connectors/connector-file/src/test/java/org/teiid/
trunk/connectors/connector-file/src/test/java/org/teiid/resource/
trunk/connectors/connector-file/src/test/java/org/teiid/resource/adapter/
trunk/connectors/connector-file/src/test/java/org/teiid/resource/adapter/file/
trunk/connectors/connector-file/src/test/java/org/teiid/resource/adapter/file/TestFileConnection.java
trunk/connectors/connector-ldap/src/main/java/org/teiid/resource/adapter/
trunk/connectors/connector-ldap/src/main/java/org/teiid/resource/adapter/ldap/
trunk/connectors/connector-ws/src/main/resources/org/
trunk/connectors/connector-ws/src/main/resources/org/teiid/
trunk/connectors/connector-ws/src/main/resources/org/teiid/resource/
trunk/connectors/connector-ws/src/main/resources/org/teiid/resource/adapter/
trunk/connectors/connector-ws/src/main/resources/org/teiid/resource/adapter/ws/
trunk/connectors/connector-ws/src/main/resources/org/teiid/resource/adapter/ws/i18n.properties
trunk/connectors/translator-jdbc/src/main/java/org/teiid/translator/jdbc/AliasModifier.java
trunk/connectors/translator-jdbc/src/main/java/org/teiid/translator/jdbc/EscapeSyntaxModifier.java
trunk/connectors/translator-jdbc/src/main/java/org/teiid/translator/jdbc/FunctionModifier.java
trunk/connectors/translator-jdbc/src/main/java/org/teiid/translator/jdbc/JDBCBaseExecution.java
trunk/connectors/translator-jdbc/src/main/java/org/teiid/translator/jdbc/JDBCPlugin.java
trunk/connectors/translator-jdbc/src/main/java/org/teiid/translator/jdbc/JDBCProcedureExecution.java
trunk/connectors/translator-jdbc/src/main/java/org/teiid/translator/jdbc/JDBCQueryExecution.java
trunk/connectors/translator-jdbc/src/main/java/org/teiid/translator/jdbc/JDBCUpdateExecution.java
trunk/connectors/translator-jdbc/src/main/java/org/teiid/translator/jdbc/ModFunctionModifier.java
trunk/connectors/translator-jdbc/src/main/java/org/teiid/translator/jdbc/SQLConversionVisitor.java
trunk/connectors/translator-jdbc/src/main/java/org/teiid/translator/jdbc/SimpleJDBCExecutionFactory.java
trunk/connectors/translator-jdbc/src/main/java/org/teiid/translator/jdbc/TranslatedCommand.java
trunk/connectors/translator-jdbc/src/main/java/org/teiid/translator/jdbc/ingres/IngresExecutionFactory.java
trunk/connectors/translator-jdbc/src/main/java/org/teiid/translator/jdbc/ingres/LocateFunctionModifier.java
trunk/connectors/translator-jdbc/src/test/java/org/teiid/translator/jdbc/FakeConnection.java
trunk/connectors/translator-jdbc/src/test/java/org/teiid/translator/jdbc/access/
trunk/connectors/translator-jdbc/src/test/java/org/teiid/translator/jdbc/db2/
trunk/connectors/translator-jdbc/src/test/java/org/teiid/translator/jdbc/derby/
trunk/connectors/translator-jdbc/src/test/java/org/teiid/translator/jdbc/ingres/
trunk/connectors/translator-jdbc/src/test/java/org/teiid/translator/jdbc/ingres/TestIngresConvertModifier.java
trunk/connectors/translator-jdbc/src/test/java/org/teiid/translator/jdbc/mysql/
trunk/connectors/translator-jdbc/src/test/java/org/teiid/translator/jdbc/oracle/
trunk/connectors/translator-jdbc/src/test/java/org/teiid/translator/jdbc/postgresql/
trunk/connectors/translator-jdbc/src/test/java/org/teiid/translator/jdbc/sqlserver/
trunk/connectors/translator-jdbc/src/test/java/org/teiid/translator/jdbc/sybase/
trunk/connectors/translator-ldap/src/main/java/org/teiid/translator/
trunk/connectors/translator-ldap/src/main/java/org/teiid/translator/ldap/
trunk/documentation/reference/src/main/docbook/en-US/Reference.xml
trunk/documentation/reference/src/main/docbook/en-US/content/translators.xml
trunk/engine/src/main/java/org/teiid/api/
trunk/engine/src/main/java/org/teiid/api/exception/
trunk/engine/src/main/java/org/teiid/api/exception/query/
trunk/engine/src/main/java/org/teiid/api/exception/query/ExpressionEvaluationException.java
trunk/engine/src/main/java/org/teiid/api/exception/query/FunctionExecutionException.java
trunk/engine/src/main/java/org/teiid/api/exception/query/FunctionMetadataException.java
trunk/engine/src/main/java/org/teiid/api/exception/query/InvalidFunctionException.java
trunk/engine/src/main/java/org/teiid/api/exception/query/QueryMetadataException.java
trunk/engine/src/main/java/org/teiid/api/exception/query/QueryParserException.java
trunk/engine/src/main/java/org/teiid/api/exception/query/QueryPlannerException.java
trunk/engine/src/main/java/org/teiid/api/exception/query/QueryProcessingException.java
trunk/engine/src/main/java/org/teiid/api/exception/query/QueryResolverException.java
trunk/engine/src/main/java/org/teiid/api/exception/query/QueryValidatorException.java
trunk/engine/src/main/java/org/teiid/api/exception/query/UnresolvedSymbolDescription.java
trunk/engine/src/main/java/org/teiid/common/
trunk/engine/src/main/java/org/teiid/common/buffer/
trunk/engine/src/main/java/org/teiid/common/buffer/AbstractTupleSource.java
trunk/engine/src/main/java/org/teiid/common/buffer/AutoCleanupUtil.java
trunk/engine/src/main/java/org/teiid/common/buffer/BaseCacheEntry.java
trunk/engine/src/main/java/org/teiid/common/buffer/BatchManager.java
trunk/engine/src/main/java/org/teiid/common/buffer/BlockedException.java
trunk/engine/src/main/java/org/teiid/common/buffer/BufferManager.java
trunk/engine/src/main/java/org/teiid/common/buffer/Cache.java
trunk/engine/src/main/java/org/teiid/common/buffer/CacheEntry.java
trunk/engine/src/main/java/org/teiid/common/buffer/CacheKey.java
trunk/engine/src/main/java/org/teiid/common/buffer/FileStore.java
trunk/engine/src/main/java/org/teiid/common/buffer/FileStoreInputStreamFactory.java
trunk/engine/src/main/java/org/teiid/common/buffer/IndexedTupleSource.java
trunk/engine/src/main/java/org/teiid/common/buffer/LightWeightCopyOnWriteList.java
trunk/engine/src/main/java/org/teiid/common/buffer/LobManager.java
trunk/engine/src/main/java/org/teiid/common/buffer/SPage.java
trunk/engine/src/main/java/org/teiid/common/buffer/STree.java
trunk/engine/src/main/java/org/teiid/common/buffer/Serializer.java
trunk/engine/src/main/java/org/teiid/common/buffer/StorageManager.java
trunk/engine/src/main/java/org/teiid/common/buffer/TupleBatch.java
trunk/engine/src/main/java/org/teiid/common/buffer/TupleBrowser.java
trunk/engine/src/main/java/org/teiid/common/buffer/TupleBuffer.java
trunk/engine/src/main/java/org/teiid/common/buffer/TupleSource.java
trunk/engine/src/main/java/org/teiid/common/buffer/impl/
trunk/engine/src/main/java/org/teiid/core/
trunk/engine/src/main/java/org/teiid/core/id/
trunk/engine/src/main/java/org/teiid/dqp/internal/datamgr/CapabilitiesConverter.java
trunk/engine/src/main/java/org/teiid/dqp/internal/process/DQPWorkContext.java
trunk/engine/src/main/java/org/teiid/dqp/internal/process/LobWorkItem.java
trunk/engine/src/main/java/org/teiid/dqp/internal/process/MetaDataProcessor.java
trunk/engine/src/main/java/org/teiid/dqp/internal/process/multisource/
trunk/engine/src/main/java/org/teiid/query/
trunk/engine/src/main/java/org/teiid/query/ObjectReplicator.java
trunk/engine/src/main/java/org/teiid/query/QueryPlugin.java
trunk/engine/src/main/java/org/teiid/query/ReplicatedObject.java
trunk/engine/src/main/java/org/teiid/query/analysis/
trunk/engine/src/main/java/org/teiid/query/eval/
trunk/engine/src/main/java/org/teiid/query/function/
trunk/engine/src/main/java/org/teiid/query/function/CharsetUtils.java
trunk/engine/src/main/java/org/teiid/query/function/FunctionDescriptor.java
trunk/engine/src/main/java/org/teiid/query/function/FunctionForm.java
trunk/engine/src/main/java/org/teiid/query/function/FunctionLibrary.java
trunk/engine/src/main/java/org/teiid/query/function/FunctionMetadataSource.java
trunk/engine/src/main/java/org/teiid/query/function/FunctionMethods.java
trunk/engine/src/main/java/org/teiid/query/function/FunctionTree.java
trunk/engine/src/main/java/org/teiid/query/function/SystemFunctionManager.java
trunk/engine/src/main/java/org/teiid/query/function/UDFSource.java
trunk/engine/src/main/java/org/teiid/query/function/aggregate/
trunk/engine/src/main/java/org/teiid/query/function/metadata/
trunk/engine/src/main/java/org/teiid/query/function/source/
trunk/engine/src/main/java/org/teiid/query/mapping/
trunk/engine/src/main/java/org/teiid/query/mapping/relational/
trunk/engine/src/main/java/org/teiid/query/mapping/xml/
trunk/engine/src/main/java/org/teiid/query/metadata/
trunk/engine/src/main/java/org/teiid/query/optimizer/
trunk/engine/src/main/java/org/teiid/query/optimizer/BatchedUpdatePlanner.java
trunk/engine/src/main/java/org/teiid/query/optimizer/CommandPlanner.java
trunk/engine/src/main/java/org/teiid/query/optimizer/DdlPlanner.java
trunk/engine/src/main/java/org/teiid/query/optimizer/ProcedurePlanner.java
trunk/engine/src/main/java/org/teiid/query/optimizer/QueryOptimizer.java
trunk/engine/src/main/java/org/teiid/query/optimizer/TriggerActionPlanner.java
trunk/engine/src/main/java/org/teiid/query/optimizer/capabilities/
trunk/engine/src/main/java/org/teiid/query/optimizer/relational/
trunk/engine/src/main/java/org/teiid/query/optimizer/relational/AliasGenerator.java
trunk/engine/src/main/java/org/teiid/query/optimizer/relational/OptimizerRule.java
trunk/engine/src/main/java/org/teiid/query/optimizer/relational/PartitionAnalyzer.java
trunk/engine/src/main/java/org/teiid/query/optimizer/relational/PlanHints.java
trunk/engine/src/main/java/org/teiid/query/optimizer/relational/PlanToProcessConverter.java
trunk/engine/src/main/java/org/teiid/query/optimizer/relational/RelationalPlanner.java
trunk/engine/src/main/java/org/teiid/query/optimizer/relational/RuleStack.java
trunk/engine/src/main/java/org/teiid/query/optimizer/relational/plantree/
trunk/engine/src/main/java/org/teiid/query/optimizer/relational/rules/
trunk/engine/src/main/java/org/teiid/query/optimizer/relational/rules/RulePlanProcedures.java
trunk/engine/src/main/java/org/teiid/query/optimizer/xml/
trunk/engine/src/main/java/org/teiid/query/parser/
trunk/engine/src/main/java/org/teiid/query/processor/
trunk/engine/src/main/java/org/teiid/query/processor/BatchCollector.java
trunk/engine/src/main/java/org/teiid/query/processor/BatchIterator.java
trunk/engine/src/main/java/org/teiid/query/processor/BatchedUpdatePlan.java
trunk/engine/src/main/java/org/teiid/query/processor/CollectionTupleSource.java
trunk/engine/src/main/java/org/teiid/query/processor/DdlPlan.java
trunk/engine/src/main/java/org/teiid/query/processor/ProcessorDataManager.java
trunk/engine/src/main/java/org/teiid/query/processor/ProcessorPlan.java
trunk/engine/src/main/java/org/teiid/query/processor/QueryProcessor.java
trunk/engine/src/main/java/org/teiid/query/processor/proc/
trunk/engine/src/main/java/org/teiid/query/processor/relational/
trunk/engine/src/main/java/org/teiid/query/processor/relational/AccessNode.java
trunk/engine/src/main/java/org/teiid/query/processor/relational/SubqueryAwareEvaluator.java
trunk/engine/src/main/java/org/teiid/query/processor/xml/
trunk/engine/src/main/java/org/teiid/query/report/
trunk/engine/src/main/java/org/teiid/query/resolver/
trunk/engine/src/main/java/org/teiid/query/resolver/CommandResolver.java
trunk/engine/src/main/java/org/teiid/query/resolver/ProcedureContainerResolver.java
trunk/engine/src/main/java/org/teiid/query/resolver/QueryResolver.java
trunk/engine/src/main/java/org/teiid/query/resolver/VariableResolver.java
trunk/engine/src/main/java/org/teiid/query/resolver/command/
trunk/engine/src/main/java/org/teiid/query/resolver/util/
trunk/engine/src/main/java/org/teiid/query/rewriter/
trunk/engine/src/main/java/org/teiid/query/sql/
trunk/engine/src/main/java/org/teiid/query/sql/LanguageObject.java
trunk/engine/src/main/java/org/teiid/query/sql/LanguageVisitor.java
trunk/engine/src/main/java/org/teiid/query/sql/ProcedureReservedWords.java
trunk/engine/src/main/java/org/teiid/query/sql/lang/
trunk/engine/src/main/java/org/teiid/query/sql/navigator/
trunk/engine/src/main/java/org/teiid/query/sql/proc/
trunk/engine/src/main/java/org/teiid/query/sql/symbol/
trunk/engine/src/main/java/org/teiid/query/sql/util/
trunk/engine/src/main/java/org/teiid/query/sql/visitor/
trunk/engine/src/main/java/org/teiid/query/tempdata/
trunk/engine/src/main/java/org/teiid/query/util/
trunk/engine/src/main/java/org/teiid/query/validator/
trunk/engine/src/main/java/org/teiid/query/xquery/
trunk/engine/src/main/java/org/teiid/query/xquery/saxon/
trunk/engine/src/main/java/org/teiid/vdb/
trunk/engine/src/main/java/org/teiid/vdb/runtime/
trunk/engine/src/test/java/org/teiid/cache/
trunk/engine/src/test/java/org/teiid/cache/TestDefaultCache.java
trunk/engine/src/test/java/org/teiid/common/
trunk/engine/src/test/java/org/teiid/common/buffer/
trunk/engine/src/test/java/org/teiid/common/queue/
trunk/engine/src/test/java/org/teiid/dqp/internal/process/TestDQPCoreRequestHandling.java
trunk/engine/src/test/java/org/teiid/dqp/internal/process/TestDQPWorkContext.java
trunk/engine/src/test/java/org/teiid/dqp/internal/process/TestMetaDataProcessor.java
trunk/engine/src/test/java/org/teiid/dqp/internal/process/TestPreparedPlanCache.java
trunk/engine/src/test/java/org/teiid/dqp/internal/process/multisource/
trunk/engine/src/test/java/org/teiid/query/
trunk/engine/src/test/java/org/teiid/query/analysis/
trunk/engine/src/test/java/org/teiid/query/function/
trunk/engine/src/test/java/org/teiid/query/function/TestFunction.java
trunk/engine/src/test/java/org/teiid/query/function/TestFunctionLibrary.java
trunk/engine/src/test/java/org/teiid/query/function/TestFunctionMetadataReader.java
trunk/engine/src/test/java/org/teiid/query/function/TestFunctionMethods.java
trunk/engine/src/test/java/org/teiid/query/function/TestFunctionTree.java
trunk/engine/src/test/java/org/teiid/query/function/TestResolvedFunctions.java
trunk/engine/src/test/java/org/teiid/query/function/metadata/
trunk/engine/src/test/java/org/teiid/query/function/source/
trunk/engine/src/test/java/org/teiid/query/mapping/
trunk/engine/src/test/java/org/teiid/query/mapping/xml/
trunk/engine/src/test/java/org/teiid/query/metadata/
trunk/engine/src/test/java/org/teiid/query/optimizer/
trunk/engine/src/test/java/org/teiid/query/optimizer/FakeFunctionMetadataSource.java
trunk/engine/src/test/java/org/teiid/query/optimizer/InlineViewCase.java
trunk/engine/src/test/java/org/teiid/query/optimizer/TestAccessPatterns.java
trunk/engine/src/test/java/org/teiid/query/optimizer/TestAggregatePushdown.java
trunk/engine/src/test/java/org/teiid/query/optimizer/TestAnsiJoinPushdown.java
trunk/engine/src/test/java/org/teiid/query/optimizer/TestBatchedUpdatePlanner.java
trunk/engine/src/test/java/org/teiid/query/optimizer/TestComparableMetadataPushdown.java
trunk/engine/src/test/java/org/teiid/query/optimizer/TestDependentJoins.java
trunk/engine/src/test/java/org/teiid/query/optimizer/TestExpressionsInGroupBy.java
trunk/engine/src/test/java/org/teiid/query/optimizer/TestInlineView.java
trunk/engine/src/test/java/org/teiid/query/optimizer/TestJoinOptimization.java
trunk/engine/src/test/java/org/teiid/query/optimizer/TestJoinPushdownRestrictions.java
trunk/engine/src/test/java/org/teiid/query/optimizer/TestJoinWithFunction.java
trunk/engine/src/test/java/org/teiid/query/optimizer/TestLimit.java
trunk/engine/src/test/java/org/teiid/query/optimizer/TestOptimizer.java
trunk/engine/src/test/java/org/teiid/query/optimizer/TestOptionalJoins.java
trunk/engine/src/test/java/org/teiid/query/optimizer/TestPartitionedJoinPlanning.java
trunk/engine/src/test/java/org/teiid/query/optimizer/TestRuleMergeVirtual.java
trunk/engine/src/test/java/org/teiid/query/optimizer/TestRuleRaiseNull.java
trunk/engine/src/test/java/org/teiid/query/optimizer/TestRuleRemoveSorts.java
trunk/engine/src/test/java/org/teiid/query/optimizer/TestSortOptimization.java
trunk/engine/src/test/java/org/teiid/query/optimizer/TestStoredProcedurePlanning.java
trunk/engine/src/test/java/org/teiid/query/optimizer/TestSubqueryPushdown.java
trunk/engine/src/test/java/org/teiid/query/optimizer/TestUnionPlanning.java
trunk/engine/src/test/java/org/teiid/query/optimizer/capabilities/
trunk/engine/src/test/java/org/teiid/query/optimizer/proc/
trunk/engine/src/test/java/org/teiid/query/optimizer/relational/
trunk/engine/src/test/java/org/teiid/query/optimizer/relational/TestAliasGenerator.java
trunk/engine/src/test/java/org/teiid/query/optimizer/relational/TestMaterialization.java
trunk/engine/src/test/java/org/teiid/query/optimizer/relational/TestRuleStack.java
trunk/engine/src/test/java/org/teiid/query/optimizer/relational/plantree/
trunk/engine/src/test/java/org/teiid/query/optimizer/relational/rules/
trunk/engine/src/test/java/org/teiid/query/optimizer/xml/
trunk/engine/src/test/java/org/teiid/query/parser/
trunk/engine/src/test/java/org/teiid/query/processor/
trunk/engine/src/test/java/org/teiid/query/processor/FakeDataManager.java
trunk/engine/src/test/java/org/teiid/query/processor/FakeDataStore.java
trunk/engine/src/test/java/org/teiid/query/processor/FakeProcessorPlan.java
trunk/engine/src/test/java/org/teiid/query/processor/FakeTupleSource.java
trunk/engine/src/test/java/org/teiid/query/processor/HardcodedDataManager.java
trunk/engine/src/test/java/org/teiid/query/processor/TestAggregateProcessing.java
trunk/engine/src/test/java/org/teiid/query/processor/TestArrayTable.java
trunk/engine/src/test/java/org/teiid/query/processor/TestBaseProcessorPlan.java
trunk/engine/src/test/java/org/teiid/query/processor/TestBatchIterator.java
trunk/engine/src/test/java/org/teiid/query/processor/TestBatchedUpdatePlan.java
trunk/engine/src/test/java/org/teiid/query/processor/TestCollectionTupleSource.java
trunk/engine/src/test/java/org/teiid/query/processor/TestDependentJoins.java
trunk/engine/src/test/java/org/teiid/query/processor/TestInherintlyUpdatableViews.java
trunk/engine/src/test/java/org/teiid/query/processor/TestInsertProcessing.java
trunk/engine/src/test/java/org/teiid/query/processor/TestJoinWithFunction.java
trunk/engine/src/test/java/org/teiid/query/processor/TestMaterialization.java
trunk/engine/src/test/java/org/teiid/query/processor/TestOptionalJoins.java
trunk/engine/src/test/java/org/teiid/query/processor/TestOrderByProcessing.java
trunk/engine/src/test/java/org/teiid/query/processor/TestProcedureRelational.java
trunk/engine/src/test/java/org/teiid/query/processor/TestProcessor.java
trunk/engine/src/test/java/org/teiid/query/processor/TestQueryProcessor.java
trunk/engine/src/test/java/org/teiid/query/processor/TestSQLXMLProcessing.java
trunk/engine/src/test/java/org/teiid/query/processor/TestSecurityFunctions.java
trunk/engine/src/test/java/org/teiid/query/processor/TestSetProcessing.java
trunk/engine/src/test/java/org/teiid/query/processor/TestTempTables.java
trunk/engine/src/test/java/org/teiid/query/processor/TestTextTable.java
trunk/engine/src/test/java/org/teiid/query/processor/TestTriggerActions.java
trunk/engine/src/test/java/org/teiid/query/processor/TestVirtualDepJoin.java
trunk/engine/src/test/java/org/teiid/query/processor/TestWindowFunctions.java
trunk/engine/src/test/java/org/teiid/query/processor/TestWithClauseProcessing.java
trunk/engine/src/test/java/org/teiid/query/processor/eval/
trunk/engine/src/test/java/org/teiid/query/processor/proc/
trunk/engine/src/test/java/org/teiid/query/processor/relational/
trunk/engine/src/test/java/org/teiid/query/processor/xml/
trunk/engine/src/test/java/org/teiid/query/resolver/
trunk/engine/src/test/java/org/teiid/query/rewriter/
trunk/engine/src/test/java/org/teiid/query/sql/
trunk/engine/src/test/java/org/teiid/query/sql/lang/
trunk/engine/src/test/java/org/teiid/query/sql/proc/
trunk/engine/src/test/java/org/teiid/query/sql/symbol/
trunk/engine/src/test/java/org/teiid/query/sql/util/
trunk/engine/src/test/java/org/teiid/query/sql/visitor/
trunk/engine/src/test/java/org/teiid/query/unittest/
trunk/engine/src/test/java/org/teiid/query/util/
trunk/engine/src/test/java/org/teiid/query/validator/
trunk/engine/src/test/java/org/teiid/vdb/
trunk/engine/src/test/java/org/teiid/vdb/runtime/
trunk/engine/src/test/resources/text/
trunk/engine/src/test/resources/text/TextParts_HeaderRow2.csv
trunk/engine/src/test/resources/text/cdm_dos.txt
trunk/engine/src/test/resources/text/cdm_dos_win.txt
trunk/engine/src/test/resources/text/test-file.txt.csv
trunk/metadata/src/main/resources/org/
trunk/metadata/src/main/resources/org/teiid/
trunk/metadata/src/main/resources/org/teiid/metadata/i18n.properties
trunk/metadata/src/test/java/org/teiid/cdk/
trunk/metadata/src/test/java/org/teiid/cdk/api/
trunk/metadata/src/test/java/org/teiid/cdk/unittest/
trunk/metadata/src/test/java/org/teiid/core/
trunk/metadata/src/test/java/org/teiid/core/util/
trunk/metadata/src/test/java/org/teiid/internal/
trunk/metadata/src/test/java/org/teiid/internal/core/
trunk/metadata/src/test/java/org/teiid/internal/core/index/
trunk/runtime/src/main/java/org/teiid/deployers/VirtualDatabaseException.java
trunk/runtime/src/main/java/org/teiid/transport/SSLAwareChannelHandler.java
trunk/runtime/src/main/java/org/teiid/transport/SSLConfiguration.java
trunk/runtime/src/main/java/org/teiid/transport/SocketClientInstance.java
trunk/runtime/src/main/java/org/teiid/transport/pg/
trunk/runtime/src/main/java/org/teiid/transport/pg/PGbytea.java
trunk/runtime/src/main/resources/org/teiid/transport/
trunk/runtime/src/test/java/org/teiid/dqp/
trunk/runtime/src/test/java/org/teiid/dqp/service/
trunk/runtime/src/test/java/org/teiid/dqp/service/buffer/
trunk/runtime/src/test/resources/dqp/config/
trunk/runtime/src/test/resources/groups.properties
trunk/runtime/src/test/resources/permissions.xml
trunk/runtime/src/test/resources/permissions2.xml
trunk/runtime/src/test/resources/users.properties
trunk/test-integration/common/src/test/java/org/teiid/cdk/
trunk/test-integration/common/src/test/java/org/teiid/cdk/api/
trunk/test-integration/common/src/test/java/org/teiid/connector/language/
trunk/test-integration/common/src/test/java/org/teiid/connector/metadata/runtime/
trunk/test-integration/common/src/test/java/org/teiid/connector/metadata/runtime/TestMetadataObject.java
trunk/test-integration/common/src/test/java/org/teiid/connector/visitor/util/
trunk/test-integration/common/src/test/java/org/teiid/dqp/
trunk/test-integration/common/src/test/java/org/teiid/dqp/internal/
trunk/test-integration/common/src/test/java/org/teiid/dqp/internal/process/
trunk/test-integration/common/src/test/java/org/teiid/transport/
trunk/test-integration/common/src/test/java/org/teiid/transport/TestJDBCSocketTransport.java
trunk/test-integration/common/src/test/java/org/teiid/transport/TestODBCSocketTransport.java
trunk/test-integration/common/src/test/resources/TestJDBCSocketTransport/
trunk/test-integration/common/src/test/resources/TestJDBCSocketTransport/testSelect.expected
trunk/test-integration/common/src/test/resources/TestODBCSocketTransport/
trunk/test-integration/common/src/test/resources/TestODBCSocketTransport/testColumnMetadataWithAlias.expected
trunk/test-integration/common/src/test/resources/TestODBCSocketTransport/testPk.expected
trunk/test-integration/common/src/test/resources/TestODBCSocketTransport/testPkPrepared.expected
trunk/test-integration/common/src/test/resources/TestODBCSocketTransport/testSelect.expected
trunk/test-integration/common/src/test/resources/TestSystemVirtualModel/
trunk/test-integration/common/src/test/resources/TestSystemVirtualModel/testColumns.expected
trunk/test-integration/common/src/test/resources/TestSystemVirtualModel/testDataTypes.expected
trunk/test-integration/common/src/test/resources/TestSystemVirtualModel/testKeyColumns.expected
trunk/test-integration/common/src/test/resources/TestSystemVirtualModel/testKeys.expected
trunk/test-integration/common/src/test/resources/TestSystemVirtualModel/testProcedureParams.expected
trunk/test-integration/common/src/test/resources/TestSystemVirtualModel/testProcedures.expected
trunk/test-integration/common/src/test/resources/TestSystemVirtualModel/testReferenceKeyColumns.expected
trunk/test-integration/common/src/test/resources/TestSystemVirtualModel/testSchemas.expected
trunk/test-integration/common/src/test/resources/TestSystemVirtualModel/testTableIsSystem.expected
trunk/test-integration/common/src/test/resources/TestSystemVirtualModel/testTables.expected
trunk/test-integration/common/src/test/resources/TestSystemVirtualModel/testVDBResources.expected
trunk/test-integration/db/src/main/java/org/teiid/internal/
trunk/test-integration/db/src/main/java/org/teiid/internal/core/
trunk/test-integration/db/src/main/java/org/teiid/internal/core/xml/
trunk/test-integration/db/src/test/java/com/
trunk/test-integration/db/src/test/java/org/teiid/internal/
trunk/test-integration/db/src/test/java/org/teiid/internal/core/
Log:
forward merging 7.4.1
Property changes on: trunk
___________________________________________________________________
Added: svn:mergeinfo
+ /branches/7.4.x:3535-3555
Property changes on: trunk/adminshell/src/main/java/groovy
___________________________________________________________________
Added: svn:mergeinfo
+ /branches/7.4.x/adminshell/src/main/java/groovy:3535-3555*
Property changes on: trunk/adminshell/src/main/java/groovy/sql
___________________________________________________________________
Added: svn:mergeinfo
+ /branches/7.4.x/adminshell/src/main/java/groovy/sql:3535-3555*
Property changes on: trunk/adminshell/src/main/java/groovy/sql/TeiidSql.java
___________________________________________________________________
Added: svn:mergeinfo
+ /branches/7.4.x/adminshell/src/main/java/groovy/sql/TeiidSql.java:3535-3555
Property changes on: trunk/adminshell/src/main/java/org/teiid/adminshell
___________________________________________________________________
Added: svn:mergeinfo
+ /branches/7.4.x/adminshell/src/main/java/org/teiid/adminshell:3535-3555*
Property changes on: trunk/adminshell/src/main/java/org/teiid/adminshell/AdminHelpCommand.java
___________________________________________________________________
Added: svn:mergeinfo
+ /branches/7.4.x/adminshell/src/main/java/org/teiid/adminshell/AdminHelpCommand.java:3535-3555
Property changes on: trunk/adminshell/src/main/java/org/teiid/adminshell/AdminShell.java
___________________________________________________________________
Modified: svn:mergeinfo
- /branches/7.1.x/adminshell/src/main/java/org/teiid/adminshell/AdminShell.java:2901-2940
+ /branches/7.1.x/adminshell/src/main/java/org/teiid/adminshell/AdminShell.java:2901-2940
/branches/7.4.x/adminshell/src/main/java/org/teiid/adminshell/AdminShell.java:3535-3555
Property changes on: trunk/adminshell/src/main/java/org/teiid/adminshell/GroovyAdminConsole.java
___________________________________________________________________
Added: svn:mergeinfo
+ /branches/7.4.x/adminshell/src/main/java/org/teiid/adminshell/GroovyAdminConsole.java:3535-3555
Property changes on: trunk/adminshell/src/main/java/org/teiid/adminshell/GroovyAdminShell.java
___________________________________________________________________
Added: svn:mergeinfo
+ /branches/7.4.x/adminshell/src/main/java/org/teiid/adminshell/GroovyAdminShell.java:3535-3555
Property changes on: trunk/adminshell/src/main/java/org/teiid/adminshell/GroovySqlExtensions.java
___________________________________________________________________
Added: svn:mergeinfo
+ /branches/7.4.x/adminshell/src/main/java/org/teiid/adminshell/GroovySqlExtensions.java:3535-3555
Property changes on: trunk/adminshell/src/main/java/org/teiid/adminshell/Help.java
___________________________________________________________________
Added: svn:mergeinfo
+ /branches/7.4.x/adminshell/src/main/java/org/teiid/adminshell/Help.java:3535-3555
Property changes on: trunk/adminshell/src/main/java/org/teiid/adminshell/MigrationUtil.java
___________________________________________________________________
Added: svn:mergeinfo
+ /branches/7.4.x/adminshell/src/main/java/org/teiid/adminshell/MigrationUtil.java:3535-3555
Property changes on: trunk/adminshell/src/main/java/org/teiid/adminshell/SqlHelpCommand.java
___________________________________________________________________
Added: svn:mergeinfo
+ /branches/7.4.x/adminshell/src/main/java/org/teiid/adminshell/SqlHelpCommand.java:3535-3555
Property changes on: trunk/adminshell/src/main/resources/org
___________________________________________________________________
Added: svn:mergeinfo
+ /branches/7.4.x/adminshell/src/main/resources/org:3535-3555*
Property changes on: trunk/adminshell/src/main/resources/org/codehaus
___________________________________________________________________
Added: svn:mergeinfo
+ /branches/7.4.x/adminshell/src/main/resources/org/codehaus:3535-3555*
Property changes on: trunk/adminshell/src/main/resources/org/codehaus/groovy
___________________________________________________________________
Added: svn:mergeinfo
+ /branches/7.4.x/adminshell/src/main/resources/org/codehaus/groovy:3535-3555*
Property changes on: trunk/adminshell/src/main/resources/org/codehaus/groovy/tools
___________________________________________________________________
Added: svn:mergeinfo
+ /branches/7.4.x/adminshell/src/main/resources/org/codehaus/groovy/tools:3535-3555*
Property changes on: trunk/adminshell/src/main/resources/org/codehaus/groovy/tools/shell
___________________________________________________________________
Added: svn:mergeinfo
+ /branches/7.4.x/adminshell/src/main/resources/org/codehaus/groovy/tools/shell:3535-3555*
Property changes on: trunk/adminshell/src/main/resources/org/codehaus/groovy/tools/shell/commands.xml
___________________________________________________________________
Added: svn:mergeinfo
+ /branches/7.4.x/adminshell/src/main/resources/org/codehaus/groovy/tools/shell/commands.xml:3535-3555
Property changes on: trunk/adminshell/src/main/resources/org/teiid
___________________________________________________________________
Added: svn:mergeinfo
+ /branches/7.4.x/adminshell/src/main/resources/org/teiid:3535-3555*
Property changes on: trunk/adminshell/src/main/resources/org/teiid/adminshell
___________________________________________________________________
Added: svn:mergeinfo
+ /branches/7.4.x/adminshell/src/main/resources/org/teiid/adminshell:3535-3555*
Property changes on: trunk/adminshell/src/main/resources/org/teiid/adminshell/AdminHelpCommand.properties
___________________________________________________________________
Added: svn:mergeinfo
+ /branches/7.4.x/adminshell/src/main/resources/org/teiid/adminshell/AdminHelpCommand.properties:3535-3555
Property changes on: trunk/adminshell/src/main/resources/org/teiid/adminshell/SqlHelpCommand.properties
___________________________________________________________________
Added: svn:mergeinfo
+ /branches/7.4.x/adminshell/src/main/resources/org/teiid/adminshell/SqlHelpCommand.properties:3535-3555
Property changes on: trunk/adminshell/src/test/java/org
___________________________________________________________________
Added: svn:mergeinfo
+ /branches/7.4.x/adminshell/src/test/java/org:3535-3555*
Property changes on: trunk/adminshell/src/test/java/org/teiid
___________________________________________________________________
Added: svn:mergeinfo
+ /branches/7.4.x/adminshell/src/test/java/org/teiid:3535-3555*
Property changes on: trunk/adminshell/src/test/java/org/teiid/adminshell
___________________________________________________________________
Added: svn:mergeinfo
+ /branches/7.4.x/adminshell/src/test/java/org/teiid/adminshell:3535-3555*
Property changes on: trunk/adminshell/src/test/java/org/teiid/adminshell/TestAdminShell.java
___________________________________________________________________
Added: svn:mergeinfo
+ /branches/7.4.x/adminshell/src/test/java/org/teiid/adminshell/TestAdminShell.java:3535-3555
Property changes on: trunk/adminshell/src/test/resources/foo
___________________________________________________________________
Added: svn:mergeinfo
+ /branches/7.4.x/adminshell/src/test/resources/foo:3535-3555*
Property changes on: trunk/adminshell/src/test/resources/foo/bar.txt
___________________________________________________________________
Added: svn:mergeinfo
+ /branches/7.4.x/adminshell/src/test/resources/foo/bar.txt:3535-3555
Property changes on: trunk/api/src/main/java/org/teiid/connector/DataPlugin.java
___________________________________________________________________
Deleted: svn:mergeinfo
-
Property changes on: trunk/api/src/main/java/org/teiid/events
___________________________________________________________________
Added: svn:mergeinfo
+ /branches/7.4.x/api/src/main/java/org/teiid/events:3535-3555*
Property changes on: trunk/api/src/main/java/org/teiid/events/EventDistributor.java
___________________________________________________________________
Modified: svn:mergeinfo
- /branches/7.4.x/api/src/main/java/org/teiid/events/EventDistributor.java:3340-3349
+ /branches/7.4.x/api/src/main/java/org/teiid/events/EventDistributor.java:3340-3349,3535-3555
Property changes on: trunk/api/src/main/java/org/teiid/events/EventDistributorFactory.java
___________________________________________________________________
Added: svn:mergeinfo
+ /branches/7.4.x/api/src/main/java/org/teiid/events/EventDistributorFactory.java:3535-3555
Property changes on: trunk/api/src/main/java/org/teiid/language/visitor
___________________________________________________________________
Deleted: svn:mergeinfo
-
Property changes on: trunk/api/src/main/java/org/teiid/logging/JavaLogger.java
___________________________________________________________________
Deleted: svn:mergeinfo
-
Property changes on: trunk/api/src/main/java/org/teiid/metadata
___________________________________________________________________
Deleted: svn:mergeinfo
-
Property changes on: trunk/api/src/main/java/org/teiid/metadata/AbstractMetadataRecord.java
___________________________________________________________________
Deleted: svn:mergeinfo
-
Property changes on: trunk/api/src/main/java/org/teiid/metadata/Column.java
___________________________________________________________________
Deleted: svn:mergeinfo
-
Property changes on: trunk/api/src/main/java/org/teiid/metadata/ColumnSet.java
___________________________________________________________________
Deleted: svn:mergeinfo
-
Property changes on: trunk/api/src/main/java/org/teiid/metadata/Datatype.java
___________________________________________________________________
Deleted: svn:mergeinfo
-
Property changes on: trunk/api/src/main/java/org/teiid/metadata/ForeignKey.java
___________________________________________________________________
Deleted: svn:mergeinfo
-
Property changes on: trunk/api/src/main/java/org/teiid/metadata/ProcedureParameter.java
___________________________________________________________________
Deleted: svn:mergeinfo
-
Property changes on: trunk/api/src/main/java/org/teiid/metadata/Schema.java
___________________________________________________________________
Deleted: svn:mergeinfo
-
Property changes on: trunk/api/src/main/java/org/teiid/translator/TranslatorException.java
___________________________________________________________________
Deleted: svn:mergeinfo
-
Property changes on: trunk/api/src/main/resources/org
___________________________________________________________________
Deleted: svn:mergeinfo
-
Property changes on: trunk/api/src/main/resources/org/teiid
___________________________________________________________________
Deleted: svn:mergeinfo
-
Property changes on: trunk/api/src/main/resources/org/teiid/connector
___________________________________________________________________
Deleted: svn:mergeinfo
-
Property changes on: trunk/api/src/test/java/org
___________________________________________________________________
Deleted: svn:mergeinfo
-
Property changes on: trunk/api/src/test/java/org/teiid
___________________________________________________________________
Deleted: svn:mergeinfo
-
Property changes on: trunk/api/src/test/java/org/teiid/connector
___________________________________________________________________
Deleted: svn:mergeinfo
-
Property changes on: trunk/build/kits
___________________________________________________________________
Added: svn:mergeinfo
+ /branches/7.4.x/build/kits:3535-3555*
Property changes on: trunk/build/kits/adminshell
___________________________________________________________________
Added: svn:mergeinfo
+ /branches/7.4.x/build/kits/adminshell:3535-3555
Property changes on: trunk/build/kits/jboss-container
___________________________________________________________________
Added: svn:mergeinfo
+ /branches/7.4.x/build/kits/jboss-container:3535-3555
Property changes on: trunk/build/kits/jboss-container/teiid-examples/dynamicvdb-ws-weather
___________________________________________________________________
Added: svn:mergeinfo
+ /branches/7.4.x/build/kits/jboss-container/teiid-examples/dynamicvdb-ws-weather:3535-3555*
Property changes on: trunk/build/kits/jboss-container/teiid-examples/dynamicvdb-ws-weather/README.txt
___________________________________________________________________
Added: svn:mergeinfo
+ /branches/7.4.x/build/kits/jboss-container/teiid-examples/dynamicvdb-ws-weather/README.txt:3535-3555
Property changes on: trunk/build/kits/jboss-container/teiid-examples/dynamicvdb-ws-weather/weather-ds.xml
___________________________________________________________________
Added: svn:mergeinfo
+ /branches/7.4.x/build/kits/jboss-container/teiid-examples/dynamicvdb-ws-weather/weather-ds.xml:3535-3555
Property changes on: trunk/build/kits/jboss-container/teiid-examples/dynamicvdb-ws-weather/weather-vdb.xml
___________________________________________________________________
Added: svn:mergeinfo
+ /branches/7.4.x/build/kits/jboss-container/teiid-examples/dynamicvdb-ws-weather/weather-vdb.xml:3535-3555
Property changes on: trunk/cache-jbosscache/src/main/java/org
___________________________________________________________________
Added: svn:mergeinfo
+ /branches/7.4.x/cache-jbosscache/src/main/java/org:3535-3555*
Property changes on: trunk/cache-jbosscache/src/main/java/org/teiid
___________________________________________________________________
Added: svn:mergeinfo
+ /branches/7.4.x/cache-jbosscache/src/main/java/org/teiid:3535-3555*
Property changes on: trunk/cache-jbosscache/src/main/java/org/teiid/cache
___________________________________________________________________
Added: svn:mergeinfo
+ /branches/7.4.x/cache-jbosscache/src/main/java/org/teiid/cache:3535-3555*
Property changes on: trunk/cache-jbosscache/src/main/java/org/teiid/cache/jboss
___________________________________________________________________
Added: svn:mergeinfo
+ /branches/7.4.x/cache-jbosscache/src/main/java/org/teiid/cache/jboss:3535-3555
Property changes on: trunk/cache-jbosscache/src/main/java/org/teiid/events
___________________________________________________________________
Added: svn:mergeinfo
+ /branches/7.4.x/cache-jbosscache/src/main/java/org/teiid/events:3535-3555*
Property changes on: trunk/cache-jbosscache/src/main/java/org/teiid/replication
___________________________________________________________________
Added: svn:mergeinfo
+ /branches/7.4.x/cache-jbosscache/src/main/java/org/teiid/replication:3535-3555*
Property changes on: trunk/cache-jbosscache/src/main/java/org/teiid/replication/jboss
___________________________________________________________________
Added: svn:mergeinfo
+ /branches/7.4.x/cache-jbosscache/src/main/java/org/teiid/replication/jboss:3535-3555*
Property changes on: trunk/cache-jbosscache/src/main/java/org/teiid/replication/jboss/JGroupsInputStream.java
___________________________________________________________________
Added: svn:mergeinfo
+ /branches/7.4.x/cache-jbosscache/src/main/java/org/teiid/replication/jboss/JGroupsInputStream.java:3535-3555
Property changes on: trunk/cache-jbosscache/src/main/java/org/teiid/replication/jboss/JGroupsObjectReplicator.java
___________________________________________________________________
Added: svn:mergeinfo
+ /branches/7.4.x/cache-jbosscache/src/main/java/org/teiid/replication/jboss/JGroupsObjectReplicator.java:3535-3555
Property changes on: trunk/cache-jbosscache/src/main/java/org/teiid/replication/jboss/JGroupsOutputStream.java
___________________________________________________________________
Added: svn:mergeinfo
+ /branches/7.4.x/cache-jbosscache/src/main/java/org/teiid/replication/jboss/JGroupsOutputStream.java:3535-3555
Property changes on: trunk/cache-jbosscache/src/test/java
___________________________________________________________________
Added: svn:mergeinfo
+ /branches/7.4.x/cache-jbosscache/src/test/java:3535-3555*
Property changes on: trunk/client/src/main/java/org/teiid/client/SourceWarning.java
___________________________________________________________________
Deleted: svn:mergeinfo
-
Property changes on: trunk/client/src/main/java/org/teiid/client/util
___________________________________________________________________
Added: svn:mergeinfo
+ /branches/7.4.x/client/src/main/java/org/teiid/client/util:3535-3555*
Property changes on: trunk/client/src/main/java/org/teiid/client/util/ExceptionHolder.java
___________________________________________________________________
Added: svn:mergeinfo
+ /branches/7.4.x/client/src/main/java/org/teiid/client/util/ExceptionHolder.java:3535-3555
Property changes on: trunk/client/src/main/java/org/teiid/client/util/ExceptionUtil.java
___________________________________________________________________
Added: svn:mergeinfo
+ /branches/7.4.x/client/src/main/java/org/teiid/client/util/ExceptionUtil.java:3535-3555
Property changes on: trunk/client/src/main/java/org/teiid/client/util/ResultsFuture.java
___________________________________________________________________
Added: svn:mergeinfo
+ /branches/7.4.x/client/src/main/java/org/teiid/client/util/ResultsFuture.java:3535-3555
Property changes on: trunk/client/src/main/java/org/teiid/client/util/ResultsReceiver.java
___________________________________________________________________
Added: svn:mergeinfo
+ /branches/7.4.x/client/src/main/java/org/teiid/client/util/ResultsReceiver.java:3535-3555
Property changes on: trunk/client/src/main/java/org/teiid/jdbc
___________________________________________________________________
Added: svn:mergeinfo
+ /branches/7.4.x/client/src/main/java/org/teiid/jdbc:3535-3555*
Property changes on: trunk/client/src/main/java/org/teiid/jdbc/BaseDataSource.java
___________________________________________________________________
Added: svn:mergeinfo
+ /branches/7.4.x/client/src/main/java/org/teiid/jdbc/BaseDataSource.java:3535-3555
Property changes on: trunk/client/src/main/java/org/teiid/jdbc/BatchResults.java
___________________________________________________________________
Added: svn:mergeinfo
+ /branches/7.4.x/client/src/main/java/org/teiid/jdbc/BatchResults.java:3535-3555
Property changes on: trunk/client/src/main/java/org/teiid/jdbc/CallableStatementImpl.java
___________________________________________________________________
Added: svn:mergeinfo
+ /branches/7.4.x/client/src/main/java/org/teiid/jdbc/CallableStatementImpl.java:3535-3555
Property changes on: trunk/client/src/main/java/org/teiid/jdbc/ConnectionImpl.java
___________________________________________________________________
Modified: svn:mergeinfo
- /branches/7.4.x/client/src/main/java/org/teiid/jdbc/ConnectionImpl.java:3149-3217
+ /branches/7.4.x/client/src/main/java/org/teiid/jdbc/ConnectionImpl.java:3149-3217,3535-3555
Property changes on: trunk/client/src/main/java/org/teiid/jdbc/ConnectionListener.java
___________________________________________________________________
Added: svn:mergeinfo
+ /branches/7.4.x/client/src/main/java/org/teiid/jdbc/ConnectionListener.java:3535-3555
Property changes on: trunk/client/src/main/java/org/teiid/jdbc/ConnectionProfile.java
___________________________________________________________________
Added: svn:mergeinfo
+ /branches/7.4.x/client/src/main/java/org/teiid/jdbc/ConnectionProfile.java:3535-3555
Property changes on: trunk/client/src/main/java/org/teiid/jdbc/DataTypeTransformer.java
___________________________________________________________________
Added: svn:mergeinfo
+ /branches/7.4.x/client/src/main/java/org/teiid/jdbc/DataTypeTransformer.java:3535-3555
Property changes on: trunk/client/src/main/java/org/teiid/jdbc/DatabaseMetaDataImpl.java
___________________________________________________________________
Modified: svn:mergeinfo
- /branches/7.4.x/client/src/main/java/org/teiid/jdbc/DatabaseMetaDataImpl.java:3281-3325
+ /branches/7.4.x/client/src/main/java/org/teiid/jdbc/DatabaseMetaDataImpl.java:3281-3325,3535-3555
Property changes on: trunk/client/src/main/java/org/teiid/jdbc/DeferredMetadataProvider.java
___________________________________________________________________
Added: svn:mergeinfo
+ /branches/7.4.x/client/src/main/java/org/teiid/jdbc/DeferredMetadataProvider.java:3535-3555
Property changes on: trunk/client/src/main/java/org/teiid/jdbc/EmbeddedProfile.java
___________________________________________________________________
Modified: svn:mergeinfo
- /branches/7.4.x/client/src/main/java/org/teiid/jdbc/EmbeddedProfile.java:3149-3217
+ /branches/7.4.x/client/src/main/java/org/teiid/jdbc/EmbeddedProfile.java:3149-3217,3535-3555
Property changes on: trunk/client/src/main/java/org/teiid/jdbc/EnhancedTimer.java
___________________________________________________________________
Added: svn:mergeinfo
+ /branches/7.4.x/client/src/main/java/org/teiid/jdbc/EnhancedTimer.java:3535-3555
Property changes on: trunk/client/src/main/java/org/teiid/jdbc/ExecutionProperties.java
___________________________________________________________________
Added: svn:mergeinfo
+ /branches/7.4.x/client/src/main/java/org/teiid/jdbc/ExecutionProperties.java:3535-3555
Property changes on: trunk/client/src/main/java/org/teiid/jdbc/FilteredResultsMetadata.java
___________________________________________________________________
Added: svn:mergeinfo
+ /branches/7.4.x/client/src/main/java/org/teiid/jdbc/FilteredResultsMetadata.java:3535-3555
Property changes on: trunk/client/src/main/java/org/teiid/jdbc/JDBCColumnNames.java
___________________________________________________________________
Added: svn:mergeinfo
+ /branches/7.4.x/client/src/main/java/org/teiid/jdbc/JDBCColumnNames.java:3535-3555
Property changes on: trunk/client/src/main/java/org/teiid/jdbc/JDBCColumnPositions.java
___________________________________________________________________
Added: svn:mergeinfo
+ /branches/7.4.x/client/src/main/java/org/teiid/jdbc/JDBCColumnPositions.java:3535-3555
Property changes on: trunk/client/src/main/java/org/teiid/jdbc/JDBCPlugin.java
___________________________________________________________________
Added: svn:mergeinfo
+ /branches/7.4.x/client/src/main/java/org/teiid/jdbc/JDBCPlugin.java:3535-3555
Property changes on: trunk/client/src/main/java/org/teiid/jdbc/JDBCURL.java
___________________________________________________________________
Modified: svn:mergeinfo
- /branches/7.4.x/client/src/main/java/org/teiid/jdbc/JDBCURL.java:3149-3217,3281-3325
+ /branches/7.4.x/client/src/main/java/org/teiid/jdbc/JDBCURL.java:3149-3217,3281-3325,3535-3555
Property changes on: trunk/client/src/main/java/org/teiid/jdbc/MetadataProvider.java
___________________________________________________________________
Added: svn:mergeinfo
+ /branches/7.4.x/client/src/main/java/org/teiid/jdbc/MetadataProvider.java:3535-3555
Property changes on: trunk/client/src/main/java/org/teiid/jdbc/ParameterMetaDataImpl.java
___________________________________________________________________
Added: svn:mergeinfo
+ /branches/7.4.x/client/src/main/java/org/teiid/jdbc/ParameterMetaDataImpl.java:3535-3555
Property changes on: trunk/client/src/main/java/org/teiid/jdbc/PartialResultsWarning.java
___________________________________________________________________
Added: svn:mergeinfo
+ /branches/7.4.x/client/src/main/java/org/teiid/jdbc/PartialResultsWarning.java:3535-3555
Property changes on: trunk/client/src/main/java/org/teiid/jdbc/PreparedStatementImpl.java
___________________________________________________________________
Added: svn:mergeinfo
+ /branches/7.4.x/client/src/main/java/org/teiid/jdbc/PreparedStatementImpl.java:3535-3555
Property changes on: trunk/client/src/main/java/org/teiid/jdbc/ResultSetImpl.java
___________________________________________________________________
Added: svn:mergeinfo
+ /branches/7.4.x/client/src/main/java/org/teiid/jdbc/ResultSetImpl.java:3535-3555
Property changes on: trunk/client/src/main/java/org/teiid/jdbc/ResultSetMetaDataImpl.java
___________________________________________________________________
Modified: svn:mergeinfo
- /branches/7.4.x/client/src/main/java/org/teiid/jdbc/ResultSetMetaDataImpl.java:3281-3325
+ /branches/7.4.x/client/src/main/java/org/teiid/jdbc/ResultSetMetaDataImpl.java:3281-3325,3535-3555
Property changes on: trunk/client/src/main/java/org/teiid/jdbc/SQLStates.java
___________________________________________________________________
Modified: svn:mergeinfo
- /branches/7.4.x/client/src/main/java/org/teiid/jdbc/SQLStates.java:3220-3275
+ /branches/7.4.x/client/src/main/java/org/teiid/jdbc/SQLStates.java:3220-3275,3535-3555
Property changes on: trunk/client/src/main/java/org/teiid/jdbc/SocketProfile.java
___________________________________________________________________
Added: svn:mergeinfo
+ /branches/7.4.x/client/src/main/java/org/teiid/jdbc/SocketProfile.java:3535-3555
Property changes on: trunk/client/src/main/java/org/teiid/jdbc/StatementImpl.java
___________________________________________________________________
Modified: svn:mergeinfo
- /branches/7.4.x/client/src/main/java/org/teiid/jdbc/StatementImpl.java:3149-3217,3220-3275,3281-3325,3355-3365
+ /branches/7.4.x/client/src/main/java/org/teiid/jdbc/StatementImpl.java:3149-3217,3220-3275,3281-3325,3355-3365,3535-3555
Property changes on: trunk/client/src/main/java/org/teiid/jdbc/TeiidConnection.java
___________________________________________________________________
Added: svn:mergeinfo
+ /branches/7.4.x/client/src/main/java/org/teiid/jdbc/TeiidConnection.java:3535-3555
Property changes on: trunk/client/src/main/java/org/teiid/jdbc/TeiidDataSource.java
___________________________________________________________________
Added: svn:mergeinfo
+ /branches/7.4.x/client/src/main/java/org/teiid/jdbc/TeiidDataSource.java:3535-3555
Property changes on: trunk/client/src/main/java/org/teiid/jdbc/TeiidDriver.java
___________________________________________________________________
Added: svn:mergeinfo
+ /branches/7.4.x/client/src/main/java/org/teiid/jdbc/TeiidDriver.java:3535-3555
Property changes on: trunk/client/src/main/java/org/teiid/jdbc/TeiidSQLException.java
___________________________________________________________________
Modified: svn:mergeinfo
- /branches/7.4.x/client/src/main/java/org/teiid/jdbc/TeiidSQLException.java:3220-3275
+ /branches/7.4.x/client/src/main/java/org/teiid/jdbc/TeiidSQLException.java:3220-3275,3535-3555
Property changes on: trunk/client/src/main/java/org/teiid/jdbc/TeiidStatement.java
___________________________________________________________________
Added: svn:mergeinfo
+ /branches/7.4.x/client/src/main/java/org/teiid/jdbc/TeiidStatement.java:3535-3555
Property changes on: trunk/client/src/main/java/org/teiid/jdbc/WarningUtil.java
___________________________________________________________________
Added: svn:mergeinfo
+ /branches/7.4.x/client/src/main/java/org/teiid/jdbc/WarningUtil.java:3535-3555
Property changes on: trunk/client/src/main/java/org/teiid/jdbc/WrapperImpl.java
___________________________________________________________________
Added: svn:mergeinfo
+ /branches/7.4.x/client/src/main/java/org/teiid/jdbc/WrapperImpl.java:3535-3555
Property changes on: trunk/client/src/main/java/org/teiid/jdbc/XAConnectionImpl.java
___________________________________________________________________
Added: svn:mergeinfo
+ /branches/7.4.x/client/src/main/java/org/teiid/jdbc/XAConnectionImpl.java:3535-3555
Property changes on: trunk/client/src/main/java/org/teiid/jdbc/XAResourceImpl.java
___________________________________________________________________
Added: svn:mergeinfo
+ /branches/7.4.x/client/src/main/java/org/teiid/jdbc/XAResourceImpl.java:3535-3555
Property changes on: trunk/client/src/main/java/org/teiid/net/socket
___________________________________________________________________
Added: svn:mergeinfo
+ /branches/7.4.x/client/src/main/java/org/teiid/net/socket:3535-3555*
Property changes on: trunk/client/src/main/java/org/teiid/net/socket/Handshake.java
___________________________________________________________________
Added: svn:mergeinfo
+ /branches/7.4.x/client/src/main/java/org/teiid/net/socket/Handshake.java:3535-3555
Property changes on: trunk/client/src/main/java/org/teiid/net/socket/Message.java
___________________________________________________________________
Added: svn:mergeinfo
+ /branches/7.4.x/client/src/main/java/org/teiid/net/socket/Message.java:3535-3555
Property changes on: trunk/client/src/main/java/org/teiid/net/socket/ObjectChannel.java
___________________________________________________________________
Added: svn:mergeinfo
+ /branches/7.4.x/client/src/main/java/org/teiid/net/socket/ObjectChannel.java:3535-3555
Property changes on: trunk/client/src/main/java/org/teiid/net/socket/ObjectChannelFactory.java
___________________________________________________________________
Added: svn:mergeinfo
+ /branches/7.4.x/client/src/main/java/org/teiid/net/socket/ObjectChannelFactory.java:3535-3555
Property changes on: trunk/client/src/main/java/org/teiid/net/socket/OioOjbectChannelFactory.java
___________________________________________________________________
Added: svn:mergeinfo
+ /branches/7.4.x/client/src/main/java/org/teiid/net/socket/OioOjbectChannelFactory.java:3535-3555
Property changes on: trunk/client/src/main/java/org/teiid/net/socket/ServerDiscovery.java
___________________________________________________________________
Added: svn:mergeinfo
+ /branches/7.4.x/client/src/main/java/org/teiid/net/socket/ServerDiscovery.java:3535-3555
Property changes on: trunk/client/src/main/java/org/teiid/net/socket/ServiceInvocationStruct.java
___________________________________________________________________
Added: svn:mergeinfo
+ /branches/7.4.x/client/src/main/java/org/teiid/net/socket/ServiceInvocationStruct.java:3535-3555
Property changes on: trunk/client/src/main/java/org/teiid/net/socket/SingleInstanceCommunicationException.java
___________________________________________________________________
Added: svn:mergeinfo
+ /branches/7.4.x/client/src/main/java/org/teiid/net/socket/SingleInstanceCommunicationException.java:3535-3555
Property changes on: trunk/client/src/main/java/org/teiid/net/socket/SocketServerConnection.java
___________________________________________________________________
Added: svn:mergeinfo
+ /branches/7.4.x/client/src/main/java/org/teiid/net/socket/SocketServerConnection.java:3535-3555
Property changes on: trunk/client/src/main/java/org/teiid/net/socket/SocketServerConnectionFactory.java
___________________________________________________________________
Modified: svn:mergeinfo
- /branches/7.4.x/client/src/main/java/org/teiid/net/socket/SocketServerConnectionFactory.java:3149-3217
+ /branches/7.4.x/client/src/main/java/org/teiid/net/socket/SocketServerConnectionFactory.java:3149-3217,3535-3555
Property changes on: trunk/client/src/main/java/org/teiid/net/socket/SocketServerInstance.java
___________________________________________________________________
Added: svn:mergeinfo
+ /branches/7.4.x/client/src/main/java/org/teiid/net/socket/SocketServerInstance.java:3535-3555
Property changes on: trunk/client/src/main/java/org/teiid/net/socket/SocketServerInstanceFactory.java
___________________________________________________________________
Added: svn:mergeinfo
+ /branches/7.4.x/client/src/main/java/org/teiid/net/socket/SocketServerInstanceFactory.java:3535-3555
Property changes on: trunk/client/src/main/java/org/teiid/net/socket/SocketServerInstanceImpl.java
___________________________________________________________________
Added: svn:mergeinfo
+ /branches/7.4.x/client/src/main/java/org/teiid/net/socket/SocketServerInstanceImpl.java:3535-3555
Property changes on: trunk/client/src/main/java/org/teiid/net/socket/SocketUtil.java
___________________________________________________________________
Added: svn:mergeinfo
+ /branches/7.4.x/client/src/main/java/org/teiid/net/socket/SocketUtil.java:3535-3555
Property changes on: trunk/client/src/main/java/org/teiid/net/socket/UrlServerDiscovery.java
___________________________________________________________________
Added: svn:mergeinfo
+ /branches/7.4.x/client/src/main/java/org/teiid/net/socket/UrlServerDiscovery.java:3535-3555
Property changes on: trunk/client/src/main/java/org/teiid/netty/handler/codec/serialization
___________________________________________________________________
Deleted: svn:mergeinfo
-
Property changes on: trunk/client/src/main/resources/org
___________________________________________________________________
Added: svn:mergeinfo
+ /branches/7.4.x/client/src/main/resources/org:3535-3555*
Property changes on: trunk/client/src/main/resources/org/teiid
___________________________________________________________________
Added: svn:mergeinfo
+ /branches/7.4.x/client/src/main/resources/org/teiid:3535-3555*
Property changes on: trunk/client/src/main/resources/org/teiid/jdbc
___________________________________________________________________
Added: svn:mergeinfo
+ /branches/7.4.x/client/src/main/resources/org/teiid/jdbc:3535-3555
Property changes on: trunk/client/src/main/resources/org/teiid/net
___________________________________________________________________
Added: svn:mergeinfo
+ /branches/7.4.x/client/src/main/resources/org/teiid/net:3535-3555*
Property changes on: trunk/client/src/test/java/org/teiid/client/TestRequestMessage.java
___________________________________________________________________
Deleted: svn:mergeinfo
-
Property changes on: trunk/client/src/test/java/org/teiid/client/plan
___________________________________________________________________
Added: svn:mergeinfo
+ /branches/7.4.x/client/src/test/java/org/teiid/client/plan:3535-3555*
Property changes on: trunk/client/src/test/java/org/teiid/client/plan/TestPlanNode.java
___________________________________________________________________
Added: svn:mergeinfo
+ /branches/7.4.x/client/src/test/java/org/teiid/client/plan/TestPlanNode.java:3535-3555
Property changes on: trunk/client/src/test/java/org/teiid/client/util
___________________________________________________________________
Added: svn:mergeinfo
+ /branches/7.4.x/client/src/test/java/org/teiid/client/util:3535-3555*
Property changes on: trunk/client/src/test/java/org/teiid/client/util/TestExceptionHolder.java
___________________________________________________________________
Added: svn:mergeinfo
+ /branches/7.4.x/client/src/test/java/org/teiid/client/util/TestExceptionHolder.java:3535-3555
Property changes on: trunk/client/src/test/java/org/teiid/client/util/TestResultsFuture.java
___________________________________________________________________
Added: svn:mergeinfo
+ /branches/7.4.x/client/src/test/java/org/teiid/client/util/TestResultsFuture.java:3535-3555
Property changes on: trunk/client/src/test/java/org/teiid/jdbc
___________________________________________________________________
Added: svn:mergeinfo
+ /branches/7.4.x/client/src/test/java/org/teiid/jdbc:3535-3555*
Property changes on: trunk/client/src/test/java/org/teiid/jdbc/TestAllResultsImpl.java
___________________________________________________________________
Added: svn:mergeinfo
+ /branches/7.4.x/client/src/test/java/org/teiid/jdbc/TestAllResultsImpl.java:3535-3555
Property changes on: trunk/client/src/test/java/org/teiid/jdbc/TestBatchResults.java
___________________________________________________________________
Added: svn:mergeinfo
+ /branches/7.4.x/client/src/test/java/org/teiid/jdbc/TestBatchResults.java:3535-3555
Property changes on: trunk/client/src/test/java/org/teiid/jdbc/TestCallableStatement.java
___________________________________________________________________
Added: svn:mergeinfo
+ /branches/7.4.x/client/src/test/java/org/teiid/jdbc/TestCallableStatement.java:3535-3555
Property changes on: trunk/client/src/test/java/org/teiid/jdbc/TestConnection.java
___________________________________________________________________
Modified: svn:mergeinfo
- /branches/7.4.x/client/src/test/java/org/teiid/jdbc/TestConnection.java:3281-3325
+ /branches/7.4.x/client/src/test/java/org/teiid/jdbc/TestConnection.java:3281-3325,3535-3555
Property changes on: trunk/client/src/test/java/org/teiid/jdbc/TestDataTypeTransformer.java
___________________________________________________________________
Added: svn:mergeinfo
+ /branches/7.4.x/client/src/test/java/org/teiid/jdbc/TestDataTypeTransformer.java:3535-3555
Property changes on: trunk/client/src/test/java/org/teiid/jdbc/TestEmbeddedProfile.java
___________________________________________________________________
Added: svn:mergeinfo
+ /branches/7.4.x/client/src/test/java/org/teiid/jdbc/TestEmbeddedProfile.java:3535-3555
Property changes on: trunk/client/src/test/java/org/teiid/jdbc/TestEnhancedTimer.java
___________________________________________________________________
Added: svn:mergeinfo
+ /branches/7.4.x/client/src/test/java/org/teiid/jdbc/TestEnhancedTimer.java:3535-3555
Property changes on: trunk/client/src/test/java/org/teiid/jdbc/TestJDBCURL.java
___________________________________________________________________
Added: svn:mergeinfo
+ /branches/7.4.x/client/src/test/java/org/teiid/jdbc/TestJDBCURL.java:3535-3555
Property changes on: trunk/client/src/test/java/org/teiid/jdbc/TestPreparedStatement.java
___________________________________________________________________
Added: svn:mergeinfo
+ /branches/7.4.x/client/src/test/java/org/teiid/jdbc/TestPreparedStatement.java:3535-3555
Property changes on: trunk/client/src/test/java/org/teiid/jdbc/TestResultSet.java
___________________________________________________________________
Added: svn:mergeinfo
+ /branches/7.4.x/client/src/test/java/org/teiid/jdbc/TestResultSet.java:3535-3555
Property changes on: trunk/client/src/test/java/org/teiid/jdbc/TestSQLException.java
___________________________________________________________________
Modified: svn:mergeinfo
- /branches/7.4.x/client/src/test/java/org/teiid/jdbc/TestSQLException.java:3220-3275
+ /branches/7.4.x/client/src/test/java/org/teiid/jdbc/TestSQLException.java:3220-3275,3535-3555
Property changes on: trunk/client/src/test/java/org/teiid/jdbc/TestSocketProfile.java
___________________________________________________________________
Added: svn:mergeinfo
+ /branches/7.4.x/client/src/test/java/org/teiid/jdbc/TestSocketProfile.java:3535-3555
Property changes on: trunk/client/src/test/java/org/teiid/jdbc/TestStatement.java
___________________________________________________________________
Modified: svn:mergeinfo
- /branches/7.4.x/client/src/test/java/org/teiid/jdbc/TestStatement.java:3149-3217,3220-3275
+ /branches/7.4.x/client/src/test/java/org/teiid/jdbc/TestStatement.java:3149-3217,3220-3275,3535-3555
Property changes on: trunk/client/src/test/java/org/teiid/jdbc/TestTeiidDataSource.java
___________________________________________________________________
Added: svn:mergeinfo
+ /branches/7.4.x/client/src/test/java/org/teiid/jdbc/TestTeiidDataSource.java:3535-3555
Property changes on: trunk/client/src/test/java/org/teiid/jdbc/TestTeiidDriver.java
___________________________________________________________________
Modified: svn:mergeinfo
- /branches/7.4.x/client/src/test/java/org/teiid/jdbc/TestTeiidDriver.java:3149-3217,3281-3325
+ /branches/7.4.x/client/src/test/java/org/teiid/jdbc/TestTeiidDriver.java:3149-3217,3281-3325,3535-3555
Property changes on: trunk/client/src/test/java/org/teiid/jdbc/TestWrapperImpl.java
___________________________________________________________________
Added: svn:mergeinfo
+ /branches/7.4.x/client/src/test/java/org/teiid/jdbc/TestWrapperImpl.java:3535-3555
Property changes on: trunk/client/src/test/java/org/teiid/jdbc/TestXAConnection.java
___________________________________________________________________
Added: svn:mergeinfo
+ /branches/7.4.x/client/src/test/java/org/teiid/jdbc/TestXAConnection.java:3535-3555
Property changes on: trunk/client/src/test/java/org/teiid/jdbc/util
___________________________________________________________________
Added: svn:mergeinfo
+ /branches/7.4.x/client/src/test/java/org/teiid/jdbc/util:3535-3555
Property changes on: trunk/client/src/test/java/org/teiid/net
___________________________________________________________________
Added: svn:mergeinfo
+ /branches/7.4.x/client/src/test/java/org/teiid/net:3535-3555*
Property changes on: trunk/client/src/test/java/org/teiid/net/TestTeiidURL.java
___________________________________________________________________
Added: svn:mergeinfo
+ /branches/7.4.x/client/src/test/java/org/teiid/net/TestTeiidURL.java:3535-3555
Property changes on: trunk/client/src/test/java/org/teiid/net/socket
___________________________________________________________________
Added: svn:mergeinfo
+ /branches/7.4.x/client/src/test/java/org/teiid/net/socket:3535-3555
Property changes on: trunk/client/src/test/resources/metamatrix.keystore
___________________________________________________________________
Deleted: svn:mergeinfo
-
Property changes on: trunk/client/src/test/resources/metamatrix.truststore
___________________________________________________________________
Deleted: svn:mergeinfo
-
Property changes on: trunk/common-core/src/main/java/org
___________________________________________________________________
Added: svn:mergeinfo
+ /branches/7.4.x/common-core/src/main/java/org:3535-3555*
Property changes on: trunk/common-core/src/main/java/org/teiid
___________________________________________________________________
Added: svn:mergeinfo
+ /branches/7.4.x/common-core/src/main/java/org/teiid:3535-3555*
Property changes on: trunk/common-core/src/main/java/org/teiid/core
___________________________________________________________________
Added: svn:mergeinfo
+ /branches/7.4.x/common-core/src/main/java/org/teiid/core:3535-3555*
Property changes on: trunk/common-core/src/main/java/org/teiid/core/BundleUtil.java
___________________________________________________________________
Added: svn:mergeinfo
+ /branches/7.4.x/common-core/src/main/java/org/teiid/core/BundleUtil.java:3535-3555
Property changes on: trunk/common-core/src/main/java/org/teiid/core/ComponentNotFoundException.java
___________________________________________________________________
Added: svn:mergeinfo
+ /branches/7.4.x/common-core/src/main/java/org/teiid/core/ComponentNotFoundException.java:3535-3555
Property changes on: trunk/common-core/src/main/java/org/teiid/core/CoreConstants.java
___________________________________________________________________
Added: svn:mergeinfo
+ /branches/7.4.x/common-core/src/main/java/org/teiid/core/CoreConstants.java:3535-3555
Property changes on: trunk/common-core/src/main/java/org/teiid/core/CorePlugin.java
___________________________________________________________________
Added: svn:mergeinfo
+ /branches/7.4.x/common-core/src/main/java/org/teiid/core/CorePlugin.java:3535-3555
Property changes on: trunk/common-core/src/main/java/org/teiid/core/TeiidComponentException.java
___________________________________________________________________
Added: svn:mergeinfo
+ /branches/7.4.x/common-core/src/main/java/org/teiid/core/TeiidComponentException.java:3535-3555
Property changes on: trunk/common-core/src/main/java/org/teiid/core/TeiidException.java
___________________________________________________________________
Modified: svn:mergeinfo
- /branches/7.4.x/common-core/src/main/java/org/teiid/core/TeiidException.java:3220-3275
+ /branches/7.4.x/common-core/src/main/java/org/teiid/core/TeiidException.java:3220-3275,3535-3555
Property changes on: trunk/common-core/src/main/java/org/teiid/core/TeiidProcessingException.java
___________________________________________________________________
Added: svn:mergeinfo
+ /branches/7.4.x/common-core/src/main/java/org/teiid/core/TeiidProcessingException.java:3535-3555
Property changes on: trunk/common-core/src/main/java/org/teiid/core/TeiidRuntimeException.java
___________________________________________________________________
Modified: svn:mergeinfo
- /branches/7.4.x/common-core/src/main/java/org/teiid/core/TeiidRuntimeException.java:3220-3275
+ /branches/7.4.x/common-core/src/main/java/org/teiid/core/TeiidRuntimeException.java:3220-3275,3535-3555
Property changes on: trunk/common-core/src/main/java/org/teiid/core/crypto
___________________________________________________________________
Added: svn:mergeinfo
+ /branches/7.4.x/common-core/src/main/java/org/teiid/core/crypto:3535-3555
Property changes on: trunk/common-core/src/main/java/org/teiid/core/types
___________________________________________________________________
Added: svn:mergeinfo
+ /branches/7.4.x/common-core/src/main/java/org/teiid/core/types:3535-3555*
Property changes on: trunk/common-core/src/main/java/org/teiid/core/types/BaseLob.java
___________________________________________________________________
Added: svn:mergeinfo
+ /branches/7.4.x/common-core/src/main/java/org/teiid/core/types/BaseLob.java:3535-3555
Property changes on: trunk/common-core/src/main/java/org/teiid/core/types/BlobImpl.java
___________________________________________________________________
Added: svn:mergeinfo
+ /branches/7.4.x/common-core/src/main/java/org/teiid/core/types/BlobImpl.java:3535-3555
Property changes on: trunk/common-core/src/main/java/org/teiid/core/types/BlobType.java
___________________________________________________________________
Added: svn:mergeinfo
+ /branches/7.4.x/common-core/src/main/java/org/teiid/core/types/BlobType.java:3535-3555
Property changes on: trunk/common-core/src/main/java/org/teiid/core/types/ClobImpl.java
___________________________________________________________________
Added: svn:mergeinfo
+ /branches/7.4.x/common-core/src/main/java/org/teiid/core/types/ClobImpl.java:3535-3555
Property changes on: trunk/common-core/src/main/java/org/teiid/core/types/ClobType.java
___________________________________________________________________
Added: svn:mergeinfo
+ /branches/7.4.x/common-core/src/main/java/org/teiid/core/types/ClobType.java:3535-3555
Property changes on: trunk/common-core/src/main/java/org/teiid/core/types/DataTypeManager.java
___________________________________________________________________
Added: svn:mergeinfo
+ /branches/7.4.x/common-core/src/main/java/org/teiid/core/types/DataTypeManager.java:3535-3555
Property changes on: trunk/common-core/src/main/java/org/teiid/core/types/InputStreamFactory.java
___________________________________________________________________
Added: svn:mergeinfo
+ /branches/7.4.x/common-core/src/main/java/org/teiid/core/types/InputStreamFactory.java:3535-3555
Property changes on: trunk/common-core/src/main/java/org/teiid/core/types/JDBCSQLTypeInfo.java
___________________________________________________________________
Added: svn:mergeinfo
+ /branches/7.4.x/common-core/src/main/java/org/teiid/core/types/JDBCSQLTypeInfo.java:3535-3555
Property changes on: trunk/common-core/src/main/java/org/teiid/core/types/LobSearchUtil.java
___________________________________________________________________
Added: svn:mergeinfo
+ /branches/7.4.x/common-core/src/main/java/org/teiid/core/types/LobSearchUtil.java:3535-3555
Property changes on: trunk/common-core/src/main/java/org/teiid/core/types/NullType.java
___________________________________________________________________
Added: svn:mergeinfo
+ /branches/7.4.x/common-core/src/main/java/org/teiid/core/types/NullType.java:3535-3555
Property changes on: trunk/common-core/src/main/java/org/teiid/core/types/SQLXMLImpl.java
___________________________________________________________________
Added: svn:mergeinfo
+ /branches/7.4.x/common-core/src/main/java/org/teiid/core/types/SQLXMLImpl.java:3535-3555
Property changes on: trunk/common-core/src/main/java/org/teiid/core/types/Sequencable.java
___________________________________________________________________
Added: svn:mergeinfo
+ /branches/7.4.x/common-core/src/main/java/org/teiid/core/types/Sequencable.java:3535-3555
Property changes on: trunk/common-core/src/main/java/org/teiid/core/types/SourceTransform.java
___________________________________________________________________
Added: svn:mergeinfo
+ /branches/7.4.x/common-core/src/main/java/org/teiid/core/types/SourceTransform.java:3535-3555
Property changes on: trunk/common-core/src/main/java/org/teiid/core/types/StandardXMLTranslator.java
___________________________________________________________________
Added: svn:mergeinfo
+ /branches/7.4.x/common-core/src/main/java/org/teiid/core/types/StandardXMLTranslator.java:3535-3555
Property changes on: trunk/common-core/src/main/java/org/teiid/core/types/Streamable.java
___________________________________________________________________
Added: svn:mergeinfo
+ /branches/7.4.x/common-core/src/main/java/org/teiid/core/types/Streamable.java:3535-3555
Property changes on: trunk/common-core/src/main/java/org/teiid/core/types/Transform.java
___________________________________________________________________
Added: svn:mergeinfo
+ /branches/7.4.x/common-core/src/main/java/org/teiid/core/types/Transform.java:3535-3555
Property changes on: trunk/common-core/src/main/java/org/teiid/core/types/TransformationException.java
___________________________________________________________________
Added: svn:mergeinfo
+ /branches/7.4.x/common-core/src/main/java/org/teiid/core/types/TransformationException.java:3535-3555
Property changes on: trunk/common-core/src/main/java/org/teiid/core/types/XMLTranslator.java
___________________________________________________________________
Added: svn:mergeinfo
+ /branches/7.4.x/common-core/src/main/java/org/teiid/core/types/XMLTranslator.java:3535-3555
Property changes on: trunk/common-core/src/main/java/org/teiid/core/types/XMLType.java
___________________________________________________________________
Added: svn:mergeinfo
+ /branches/7.4.x/common-core/src/main/java/org/teiid/core/types/XMLType.java:3535-3555
Property changes on: trunk/common-core/src/main/java/org/teiid/core/types/basic
___________________________________________________________________
Added: svn:mergeinfo
+ /branches/7.4.x/common-core/src/main/java/org/teiid/core/types/basic:3535-3555
Property changes on: trunk/common-core/src/main/java/org/teiid/core/util
___________________________________________________________________
Added: svn:mergeinfo
+ /branches/7.4.x/common-core/src/main/java/org/teiid/core/util:3535-3555
Property changes on: trunk/common-core/src/main/java/org/teiid/core/util/ApplicationInfo.java
___________________________________________________________________
Deleted: svn:mergeinfo
-
Property changes on: trunk/common-core/src/test/java/org
___________________________________________________________________
Added: svn:mergeinfo
+ /branches/7.4.x/common-core/src/test/java/org:3535-3555*
Property changes on: trunk/common-core/src/test/java/org/teiid
___________________________________________________________________
Added: svn:mergeinfo
+ /branches/7.4.x/common-core/src/test/java/org/teiid:3535-3555*
Property changes on: trunk/common-core/src/test/java/org/teiid/core
___________________________________________________________________
Added: svn:mergeinfo
+ /branches/7.4.x/common-core/src/test/java/org/teiid/core:3535-3555*
Property changes on: trunk/common-core/src/test/java/org/teiid/core/TestMetaMatrixException.java
___________________________________________________________________
Added: svn:mergeinfo
+ /branches/7.4.x/common-core/src/test/java/org/teiid/core/TestMetaMatrixException.java:3535-3555
Property changes on: trunk/common-core/src/test/java/org/teiid/core/TestMetaMatrixRuntimeException.java
___________________________________________________________________
Modified: svn:mergeinfo
- /branches/7.4.x/common-core/src/test/java/org/teiid/core/TestMetaMatrixRuntimeException.java:3220-3275
+ /branches/7.4.x/common-core/src/test/java/org/teiid/core/TestMetaMatrixRuntimeException.java:3220-3275,3535-3555
Property changes on: trunk/common-core/src/test/java/org/teiid/core/crypto
___________________________________________________________________
Added: svn:mergeinfo
+ /branches/7.4.x/common-core/src/test/java/org/teiid/core/crypto:3535-3555
Property changes on: trunk/common-core/src/test/java/org/teiid/core/types
___________________________________________________________________
Added: svn:mergeinfo
+ /branches/7.4.x/common-core/src/test/java/org/teiid/core/types:3535-3555*
Property changes on: trunk/common-core/src/test/java/org/teiid/core/types/TestBlobValue.java
___________________________________________________________________
Added: svn:mergeinfo
+ /branches/7.4.x/common-core/src/test/java/org/teiid/core/types/TestBlobValue.java:3535-3555
Property changes on: trunk/common-core/src/test/java/org/teiid/core/types/TestClobValue.java
___________________________________________________________________
Added: svn:mergeinfo
+ /branches/7.4.x/common-core/src/test/java/org/teiid/core/types/TestClobValue.java:3535-3555
Property changes on: trunk/common-core/src/test/java/org/teiid/core/types/TestDataTypeManager.java
___________________________________________________________________
Added: svn:mergeinfo
+ /branches/7.4.x/common-core/src/test/java/org/teiid/core/types/TestDataTypeManager.java:3535-3555
Property changes on: trunk/common-core/src/test/java/org/teiid/core/types/TestSQLXMLImpl.java
___________________________________________________________________
Added: svn:mergeinfo
+ /branches/7.4.x/common-core/src/test/java/org/teiid/core/types/TestSQLXMLImpl.java:3535-3555
Property changes on: trunk/common-core/src/test/java/org/teiid/core/types/TestXMLStreamSourceTranslator.java
___________________________________________________________________
Added: svn:mergeinfo
+ /branches/7.4.x/common-core/src/test/java/org/teiid/core/types/TestXMLStreamSourceTranslator.java:3535-3555
Property changes on: trunk/common-core/src/test/java/org/teiid/core/types/TestXMLValue.java
___________________________________________________________________
Added: svn:mergeinfo
+ /branches/7.4.x/common-core/src/test/java/org/teiid/core/types/TestXMLValue.java:3535-3555
Property changes on: trunk/common-core/src/test/java/org/teiid/core/types/basic
___________________________________________________________________
Added: svn:mergeinfo
+ /branches/7.4.x/common-core/src/test/java/org/teiid/core/types/basic:3535-3555
Property changes on: trunk/common-core/src/test/java/org/teiid/core/util
___________________________________________________________________
Added: svn:mergeinfo
+ /branches/7.4.x/common-core/src/test/java/org/teiid/core/util:3535-3555
Property changes on: trunk/common-core/src/test/java/org/teiid/query
___________________________________________________________________
Added: svn:mergeinfo
+ /branches/7.4.x/common-core/src/test/java/org/teiid/query:3535-3555*
Property changes on: trunk/common-core/src/test/java/org/teiid/query/unittest
___________________________________________________________________
Added: svn:mergeinfo
+ /branches/7.4.x/common-core/src/test/java/org/teiid/query/unittest:3535-3555
Property changes on: trunk/common-core/src/test/java/org/teiid/query/unittest/TimestampUtil.java
___________________________________________________________________
Deleted: svn:mergeinfo
-
Property changes on: trunk/connectors/connector-file/src/main/java/org/teiid/resource/adapter
___________________________________________________________________
Added: svn:mergeinfo
+ /branches/7.4.x/connectors/connector-file/src/main/java/org/teiid/resource/adapter:3535-3555*
Property changes on: trunk/connectors/connector-file/src/main/java/org/teiid/resource/adapter/file
___________________________________________________________________
Added: svn:mergeinfo
+ /branches/7.4.x/connectors/connector-file/src/main/java/org/teiid/resource/adapter/file:3535-3555
Property changes on: trunk/connectors/connector-file/src/main/resources/org
___________________________________________________________________
Added: svn:mergeinfo
+ /branches/7.4.x/connectors/connector-file/src/main/resources/org:3535-3555*
Property changes on: trunk/connectors/connector-file/src/main/resources/org/teiid
___________________________________________________________________
Added: svn:mergeinfo
+ /branches/7.4.x/connectors/connector-file/src/main/resources/org/teiid:3535-3555*
Property changes on: trunk/connectors/connector-file/src/main/resources/org/teiid/resource
___________________________________________________________________
Added: svn:mergeinfo
+ /branches/7.4.x/connectors/connector-file/src/main/resources/org/teiid/resource:3535-3555*
Property changes on: trunk/connectors/connector-file/src/main/resources/org/teiid/resource/adapter
___________________________________________________________________
Added: svn:mergeinfo
+ /branches/7.4.x/connectors/connector-file/src/main/resources/org/teiid/resource/adapter:3535-3555*
Property changes on: trunk/connectors/connector-file/src/main/resources/org/teiid/resource/adapter/file
___________________________________________________________________
Added: svn:mergeinfo
+ /branches/7.4.x/connectors/connector-file/src/main/resources/org/teiid/resource/adapter/file:3535-3555*
Property changes on: trunk/connectors/connector-file/src/main/resources/org/teiid/resource/adapter/file/i18n.properties
___________________________________________________________________
Added: svn:mergeinfo
+ /branches/7.4.x/connectors/connector-file/src/main/resources/org/teiid/resource/adapter/file/i18n.properties:3535-3555
Property changes on: trunk/connectors/connector-file/src/test/java/org
___________________________________________________________________
Added: svn:mergeinfo
+ /branches/7.4.x/connectors/connector-file/src/test/java/org:3535-3555*
Property changes on: trunk/connectors/connector-file/src/test/java/org/teiid
___________________________________________________________________
Added: svn:mergeinfo
+ /branches/7.4.x/connectors/connector-file/src/test/java/org/teiid:3535-3555*
Property changes on: trunk/connectors/connector-file/src/test/java/org/teiid/resource
___________________________________________________________________
Added: svn:mergeinfo
+ /branches/7.4.x/connectors/connector-file/src/test/java/org/teiid/resource:3535-3555*
Property changes on: trunk/connectors/connector-file/src/test/java/org/teiid/resource/adapter
___________________________________________________________________
Added: svn:mergeinfo
+ /branches/7.4.x/connectors/connector-file/src/test/java/org/teiid/resource/adapter:3535-3555*
Property changes on: trunk/connectors/connector-file/src/test/java/org/teiid/resource/adapter/file
___________________________________________________________________
Added: svn:mergeinfo
+ /branches/7.4.x/connectors/connector-file/src/test/java/org/teiid/resource/adapter/file:3535-3555*
Property changes on: trunk/connectors/connector-file/src/test/java/org/teiid/resource/adapter/file/TestFileConnection.java
___________________________________________________________________
Added: svn:mergeinfo
+ /branches/7.4.x/connectors/connector-file/src/test/java/org/teiid/resource/adapter/file/TestFileConnection.java:3535-3555
Property changes on: trunk/connectors/connector-ldap/src/main/java/org/teiid/resource/adapter
___________________________________________________________________
Added: svn:mergeinfo
+ /branches/7.4.x/connectors/connector-ldap/src/main/java/org/teiid/resource/adapter:3535-3555*
Property changes on: trunk/connectors/connector-ldap/src/main/java/org/teiid/resource/adapter/ldap
___________________________________________________________________
Added: svn:mergeinfo
+ /branches/7.4.x/connectors/connector-ldap/src/main/java/org/teiid/resource/adapter/ldap:3535-3555
Property changes on: trunk/connectors/connector-ws/src/main/resources/org
___________________________________________________________________
Added: svn:mergeinfo
+ /branches/7.4.x/connectors/connector-ws/src/main/resources/org:3535-3555*
Property changes on: trunk/connectors/connector-ws/src/main/resources/org/teiid
___________________________________________________________________
Added: svn:mergeinfo
+ /branches/7.4.x/connectors/connector-ws/src/main/resources/org/teiid:3535-3555*
Property changes on: trunk/connectors/connector-ws/src/main/resources/org/teiid/resource
___________________________________________________________________
Added: svn:mergeinfo
+ /branches/7.4.x/connectors/connector-ws/src/main/resources/org/teiid/resource:3535-3555*
Property changes on: trunk/connectors/connector-ws/src/main/resources/org/teiid/resource/adapter
___________________________________________________________________
Added: svn:mergeinfo
+ /branches/7.4.x/connectors/connector-ws/src/main/resources/org/teiid/resource/adapter:3535-3555*
Property changes on: trunk/connectors/connector-ws/src/main/resources/org/teiid/resource/adapter/ws
___________________________________________________________________
Added: svn:mergeinfo
+ /branches/7.4.x/connectors/connector-ws/src/main/resources/org/teiid/resource/adapter/ws:3535-3555*
Property changes on: trunk/connectors/connector-ws/src/main/resources/org/teiid/resource/adapter/ws/i18n.properties
___________________________________________________________________
Added: svn:mergeinfo
+ /branches/7.4.x/connectors/connector-ws/src/main/resources/org/teiid/resource/adapter/ws/i18n.properties:3535-3555
Property changes on: trunk/connectors/translator-jdbc/src/main/java/org/teiid/translator/jdbc/AliasModifier.java
___________________________________________________________________
Deleted: svn:mergeinfo
-
Property changes on: trunk/connectors/translator-jdbc/src/main/java/org/teiid/translator/jdbc/EscapeSyntaxModifier.java
___________________________________________________________________
Deleted: svn:mergeinfo
-
Property changes on: trunk/connectors/translator-jdbc/src/main/java/org/teiid/translator/jdbc/FunctionModifier.java
___________________________________________________________________
Modified: svn:mergeinfo
-
+ /branches/7.4.x/connectors/translator-jdbc/src/main/java/org/teiid/translator/jdbc/FunctionModifier.java:3535-3555
Property changes on: trunk/connectors/translator-jdbc/src/main/java/org/teiid/translator/jdbc/JDBCBaseExecution.java
___________________________________________________________________
Deleted: svn:mergeinfo
-
Property changes on: trunk/connectors/translator-jdbc/src/main/java/org/teiid/translator/jdbc/JDBCPlugin.java
___________________________________________________________________
Deleted: svn:mergeinfo
-
Property changes on: trunk/connectors/translator-jdbc/src/main/java/org/teiid/translator/jdbc/JDBCProcedureExecution.java
___________________________________________________________________
Deleted: svn:mergeinfo
-
Property changes on: trunk/connectors/translator-jdbc/src/main/java/org/teiid/translator/jdbc/JDBCQueryExecution.java
___________________________________________________________________
Deleted: svn:mergeinfo
-
Property changes on: trunk/connectors/translator-jdbc/src/main/java/org/teiid/translator/jdbc/JDBCUpdateExecution.java
___________________________________________________________________
Deleted: svn:mergeinfo
-
Property changes on: trunk/connectors/translator-jdbc/src/main/java/org/teiid/translator/jdbc/ModFunctionModifier.java
___________________________________________________________________
Deleted: svn:mergeinfo
-
Property changes on: trunk/connectors/translator-jdbc/src/main/java/org/teiid/translator/jdbc/SQLConversionVisitor.java
___________________________________________________________________
Deleted: svn:mergeinfo
-
Property changes on: trunk/connectors/translator-jdbc/src/main/java/org/teiid/translator/jdbc/SimpleJDBCExecutionFactory.java
___________________________________________________________________
Deleted: svn:mergeinfo
-
Property changes on: trunk/connectors/translator-jdbc/src/main/java/org/teiid/translator/jdbc/TranslatedCommand.java
___________________________________________________________________
Deleted: svn:mergeinfo
-
Modified: trunk/connectors/translator-jdbc/src/main/java/org/teiid/translator/jdbc/ingres/IngresExecutionFactory.java
===================================================================
--- trunk/connectors/translator-jdbc/src/main/java/org/teiid/translator/jdbc/ingres/IngresExecutionFactory.java 2011-10-18 10:45:34 UTC (rev 3556)
+++ trunk/connectors/translator-jdbc/src/main/java/org/teiid/translator/jdbc/ingres/IngresExecutionFactory.java 2011-10-18 10:52:08 UTC (rev 3557)
@@ -77,7 +77,7 @@
registerFunctionModifier(SourceSystemFunctions.RAND, new AliasModifier("random")); //$NON-NLS-1$
registerFunctionModifier(SourceSystemFunctions.UCASE, new AliasModifier("uppercase")); //$NON-NLS-1$
registerFunctionModifier(SourceSystemFunctions.DAYOFMONTH, new AliasModifier("day")); //$NON-NLS-1$
- registerFunctionModifier(SourceSystemFunctions.LOCATE, new LocateFunctionModifier(getLanguageFactory()));
+ registerFunctionModifier(SourceSystemFunctions.LOCATE, new LocateFunctionModifier());
addPushDownFunction(INGRES, "bit_add", INTEGER, INTEGER, INTEGER); //$NON-NLS-1$
addPushDownFunction(INGRES, "bit_length", INTEGER, INTEGER); //$NON-NLS-1$
Modified: trunk/connectors/translator-jdbc/src/main/java/org/teiid/translator/jdbc/ingres/LocateFunctionModifier.java
===================================================================
--- trunk/connectors/translator-jdbc/src/main/java/org/teiid/translator/jdbc/ingres/LocateFunctionModifier.java 2011-10-18 10:45:34 UTC (rev 3556)
+++ trunk/connectors/translator-jdbc/src/main/java/org/teiid/translator/jdbc/ingres/LocateFunctionModifier.java 2011-10-18 10:52:08 UTC (rev 3557)
@@ -21,28 +21,24 @@
*/
package org.teiid.translator.jdbc.ingres;
-import java.util.Arrays;
import java.util.List;
import org.teiid.language.Expression;
import org.teiid.language.Function;
-import org.teiid.language.LanguageFactory;
-import org.teiid.translator.TypeFacility;
import org.teiid.translator.jdbc.FunctionModifier;
public class LocateFunctionModifier extends FunctionModifier {
- private LanguageFactory languageFactory;
-
- public LocateFunctionModifier(LanguageFactory languageFactory) {
- this.languageFactory = languageFactory;
+ public LocateFunctionModifier() {
}
+
@Override
public List<?> translate(Function function) {
Expression a = function.getParameters().get(0);
Expression b = function.getParameters().get(1);
-
- return Arrays.asList(languageFactory.createFunction("locate", new Expression[] {b, a}, TypeFacility.RUNTIME_TYPES.INTEGER)); //$NON-NLS-1$
+ function.getParameters().set(0, b);
+ function.getParameters().set(1, a);
+ return null;
}
}
Property changes on: trunk/connectors/translator-jdbc/src/test/java/org/teiid/translator/jdbc/FakeConnection.java
___________________________________________________________________
Deleted: svn:mergeinfo
-
Property changes on: trunk/connectors/translator-jdbc/src/test/java/org/teiid/translator/jdbc/access
___________________________________________________________________
Deleted: svn:mergeinfo
-
Property changes on: trunk/connectors/translator-jdbc/src/test/java/org/teiid/translator/jdbc/db2
___________________________________________________________________
Deleted: svn:mergeinfo
-
Property changes on: trunk/connectors/translator-jdbc/src/test/java/org/teiid/translator/jdbc/derby
___________________________________________________________________
Deleted: svn:mergeinfo
-
Property changes on: trunk/connectors/translator-jdbc/src/test/java/org/teiid/translator/jdbc/ingres
___________________________________________________________________
Added: svn:mergeinfo
+ /branches/7.4.x/connectors/translator-jdbc/src/test/java/org/teiid/translator/jdbc/ingres:3535-3555*
Property changes on: trunk/connectors/translator-jdbc/src/test/java/org/teiid/translator/jdbc/ingres/TestIngresConvertModifier.java
___________________________________________________________________
Added: svn:mergeinfo
+ /branches/7.4.x/connectors/translator-jdbc/src/test/java/org/teiid/translator/jdbc/ingres/TestIngresConvertModifier.java:3535-3555
Copied: trunk/connectors/translator-jdbc/src/test/java/org/teiid/translator/jdbc/ingres/TestIngresExecutionFactory.java (from rev 3555, branches/7.4.x/connectors/translator-jdbc/src/test/java/org/teiid/translator/jdbc/ingres/TestIngresExecutionFactory.java)
===================================================================
--- trunk/connectors/translator-jdbc/src/test/java/org/teiid/translator/jdbc/ingres/TestIngresExecutionFactory.java (rev 0)
+++ trunk/connectors/translator-jdbc/src/test/java/org/teiid/translator/jdbc/ingres/TestIngresExecutionFactory.java 2011-10-18 10:52:08 UTC (rev 3557)
@@ -0,0 +1,47 @@
+/*
+ * JBoss, Home of Professional Open Source.
+ * See the COPYRIGHT.txt file distributed with this work for information
+ * regarding copyright ownership. Some portions may be licensed
+ * to Red Hat, Inc. under one or more contributor license agreements.
+ *
+ * This library 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 2.1 of the License, or (at your option) any later version.
+ *
+ * This library 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 this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+ * 02110-1301 USA.
+ */
+
+package org.teiid.translator.jdbc.ingres;
+
+import org.junit.BeforeClass;
+import org.junit.Test;
+import org.teiid.translator.TranslatorException;
+import org.teiid.translator.jdbc.TranslationHelper;
+
+public class TestIngresExecutionFactory {
+
+ private static IngresExecutionFactory TRANSLATOR;
+
+ @BeforeClass
+ public static void setUp() throws TranslatorException {
+ TRANSLATOR = new IngresExecutionFactory();
+ TRANSLATOR.start();
+ }
+
+ @Test public void testLocate() throws Exception {
+ String input = "SELECT INTKEY FROM BQT1.SmallA WHERE LOCATE(1, INTKEY) = 1 ORDER BY INTKEY"; //$NON-NLS-1$
+ String output = "SELECT SmallA.IntKey FROM SmallA WHERE locate(cast(SmallA.IntKey AS varchar(4000)), '1') = 1 ORDER BY SmallA.IntKey"; //$NON-NLS-1$
+
+ TranslationHelper.helpTestVisitor(TranslationHelper.BQT_VDB, input, output, TRANSLATOR);
+ }
+
+}
Property changes on: trunk/connectors/translator-jdbc/src/test/java/org/teiid/translator/jdbc/ingres/TestIngresExecutionFactory.java
___________________________________________________________________
Added: svn:mime-type
+ text/plain
Added: svn:mergeinfo
+ /branches/7.4.x/connectors/translator-jdbc/src/test/java/org/teiid/translator/jdbc/ingres/TestIngresExecutionFactory.java:3535-3555
Property changes on: trunk/connectors/translator-jdbc/src/test/java/org/teiid/translator/jdbc/mysql
___________________________________________________________________
Deleted: svn:mergeinfo
-
Property changes on: trunk/connectors/translator-jdbc/src/test/java/org/teiid/translator/jdbc/oracle
___________________________________________________________________
Deleted: svn:mergeinfo
-
Property changes on: trunk/connectors/translator-jdbc/src/test/java/org/teiid/translator/jdbc/postgresql
___________________________________________________________________
Deleted: svn:mergeinfo
-
Property changes on: trunk/connectors/translator-jdbc/src/test/java/org/teiid/translator/jdbc/sqlserver
___________________________________________________________________
Deleted: svn:mergeinfo
-
Property changes on: trunk/connectors/translator-jdbc/src/test/java/org/teiid/translator/jdbc/sybase
___________________________________________________________________
Deleted: svn:mergeinfo
-
Property changes on: trunk/connectors/translator-ldap/src/main/java/org/teiid/translator
___________________________________________________________________
Added: svn:mergeinfo
+ /branches/7.4.x/connectors/translator-ldap/src/main/java/org/teiid/translator:3535-3555*
Property changes on: trunk/connectors/translator-ldap/src/main/java/org/teiid/translator/ldap
___________________________________________________________________
Added: svn:mergeinfo
+ /branches/7.4.x/connectors/translator-ldap/src/main/java/org/teiid/translator/ldap:3535-3555
Property changes on: trunk/documentation/reference/src/main/docbook/en-US/Reference.xml
___________________________________________________________________
Deleted: svn:mergeinfo
-
Modified: trunk/documentation/reference/src/main/docbook/en-US/content/translators.xml
===================================================================
--- trunk/documentation/reference/src/main/docbook/en-US/content/translators.xml 2011-10-18 10:45:34 UTC (rev 3556)
+++ trunk/documentation/reference/src/main/docbook/en-US/content/translators.xml 2011-10-18 10:52:08 UTC (rev 3557)
@@ -239,6 +239,11 @@
</listitem>
<listitem>
<para>
+ <emphasis>access</emphasis> - for use with Microsoft Access 2003 or later.
+ </para>
+ </listitem>
+ <listitem>
+ <para>
<emphasis>db2</emphasis> - for use with DB2 8 or later.
</para>
</listitem>
Property changes on: trunk/engine/src/main/java/org/teiid/api
___________________________________________________________________
Added: svn:mergeinfo
+ /branches/7.4.x/engine/src/main/java/org/teiid/api:3535-3555*
Property changes on: trunk/engine/src/main/java/org/teiid/api/exception
___________________________________________________________________
Added: svn:mergeinfo
+ /branches/7.4.x/engine/src/main/java/org/teiid/api/exception:3535-3555*
Property changes on: trunk/engine/src/main/java/org/teiid/api/exception/query
___________________________________________________________________
Added: svn:mergeinfo
+ /branches/7.4.x/engine/src/main/java/org/teiid/api/exception/query:3535-3555*
Property changes on: trunk/engine/src/main/java/org/teiid/api/exception/query/ExpressionEvaluationException.java
___________________________________________________________________
Added: svn:mergeinfo
+ /branches/7.4.x/engine/src/main/java/org/teiid/api/exception/query/ExpressionEvaluationException.java:3535-3555
Property changes on: trunk/engine/src/main/java/org/teiid/api/exception/query/FunctionExecutionException.java
___________________________________________________________________
Added: svn:mergeinfo
+ /branches/7.4.x/engine/src/main/java/org/teiid/api/exception/query/FunctionExecutionException.java:3535-3555
Property changes on: trunk/engine/src/main/java/org/teiid/api/exception/query/FunctionMetadataException.java
___________________________________________________________________
Added: svn:mergeinfo
+ /branches/7.4.x/engine/src/main/java/org/teiid/api/exception/query/FunctionMetadataException.java:3535-3555
Property changes on: trunk/engine/src/main/java/org/teiid/api/exception/query/InvalidFunctionException.java
___________________________________________________________________
Added: svn:mergeinfo
+ /branches/7.4.x/engine/src/main/java/org/teiid/api/exception/query/InvalidFunctionException.java:3535-3555
Property changes on: trunk/engine/src/main/java/org/teiid/api/exception/query/QueryMetadataException.java
___________________________________________________________________
Added: svn:mergeinfo
+ /branches/7.4.x/engine/src/main/java/org/teiid/api/exception/query/QueryMetadataException.java:3535-3555
Property changes on: trunk/engine/src/main/java/org/teiid/api/exception/query/QueryParserException.java
___________________________________________________________________
Added: svn:mergeinfo
+ /branches/7.4.x/engine/src/main/java/org/teiid/api/exception/query/QueryParserException.java:3535-3555
Property changes on: trunk/engine/src/main/java/org/teiid/api/exception/query/QueryPlannerException.java
___________________________________________________________________
Added: svn:mergeinfo
+ /branches/7.4.x/engine/src/main/java/org/teiid/api/exception/query/QueryPlannerException.java:3535-3555
Property changes on: trunk/engine/src/main/java/org/teiid/api/exception/query/QueryProcessingException.java
___________________________________________________________________
Added: svn:mergeinfo
+ /branches/7.4.x/engine/src/main/java/org/teiid/api/exception/query/QueryProcessingException.java:3535-3555
Property changes on: trunk/engine/src/main/java/org/teiid/api/exception/query/QueryResolverException.java
___________________________________________________________________
Added: svn:mergeinfo
+ /branches/7.4.x/engine/src/main/java/org/teiid/api/exception/query/QueryResolverException.java:3535-3555
Property changes on: trunk/engine/src/main/java/org/teiid/api/exception/query/QueryValidatorException.java
___________________________________________________________________
Added: svn:mergeinfo
+ /branches/7.4.x/engine/src/main/java/org/teiid/api/exception/query/QueryValidatorException.java:3535-3555
Property changes on: trunk/engine/src/main/java/org/teiid/api/exception/query/UnresolvedSymbolDescription.java
___________________________________________________________________
Added: svn:mergeinfo
+ /branches/7.4.x/engine/src/main/java/org/teiid/api/exception/query/UnresolvedSymbolDescription.java:3535-3555
Property changes on: trunk/engine/src/main/java/org/teiid/common
___________________________________________________________________
Added: svn:mergeinfo
+ /branches/7.4.x/engine/src/main/java/org/teiid/common:3535-3555*
Property changes on: trunk/engine/src/main/java/org/teiid/common/buffer
___________________________________________________________________
Added: svn:mergeinfo
+ /branches/7.4.x/engine/src/main/java/org/teiid/common/buffer:3535-3555*
Property changes on: trunk/engine/src/main/java/org/teiid/common/buffer/AbstractTupleSource.java
___________________________________________________________________
Added: svn:mergeinfo
+ /branches/7.4.x/engine/src/main/java/org/teiid/common/buffer/AbstractTupleSource.java:3535-3555
Property changes on: trunk/engine/src/main/java/org/teiid/common/buffer/AutoCleanupUtil.java
___________________________________________________________________
Added: svn:mergeinfo
+ /branches/7.4.x/engine/src/main/java/org/teiid/common/buffer/AutoCleanupUtil.java:3535-3555
Property changes on: trunk/engine/src/main/java/org/teiid/common/buffer/BaseCacheEntry.java
___________________________________________________________________
Added: svn:mergeinfo
+ /branches/7.4.x/engine/src/main/java/org/teiid/common/buffer/BaseCacheEntry.java:3535-3555
Property changes on: trunk/engine/src/main/java/org/teiid/common/buffer/BatchManager.java
___________________________________________________________________
Added: svn:mergeinfo
+ /branches/7.4.x/engine/src/main/java/org/teiid/common/buffer/BatchManager.java:3535-3555
Property changes on: trunk/engine/src/main/java/org/teiid/common/buffer/BlockedException.java
___________________________________________________________________
Modified: svn:mergeinfo
- /branches/7.4.x/engine/src/main/java/org/teiid/common/buffer/BlockedException.java:3149-3217
+ /branches/7.4.x/engine/src/main/java/org/teiid/common/buffer/BlockedException.java:3149-3217,3535-3555
Property changes on: trunk/engine/src/main/java/org/teiid/common/buffer/BufferManager.java
___________________________________________________________________
Modified: svn:mergeinfo
- /branches/7.4.x/engine/src/main/java/org/teiid/common/buffer/BufferManager.java:3220-3275
+ /branches/7.4.x/engine/src/main/java/org/teiid/common/buffer/BufferManager.java:3220-3275,3535-3555
Property changes on: trunk/engine/src/main/java/org/teiid/common/buffer/Cache.java
___________________________________________________________________
Added: svn:mergeinfo
+ /branches/7.4.x/engine/src/main/java/org/teiid/common/buffer/Cache.java:3535-3555
Property changes on: trunk/engine/src/main/java/org/teiid/common/buffer/CacheEntry.java
___________________________________________________________________
Added: svn:mergeinfo
+ /branches/7.4.x/engine/src/main/java/org/teiid/common/buffer/CacheEntry.java:3535-3555
Property changes on: trunk/engine/src/main/java/org/teiid/common/buffer/CacheKey.java
___________________________________________________________________
Added: svn:mergeinfo
+ /branches/7.4.x/engine/src/main/java/org/teiid/common/buffer/CacheKey.java:3535-3555
Property changes on: trunk/engine/src/main/java/org/teiid/common/buffer/FileStore.java
___________________________________________________________________
Added: svn:mergeinfo
+ /branches/7.4.x/engine/src/main/java/org/teiid/common/buffer/FileStore.java:3535-3555
Property changes on: trunk/engine/src/main/java/org/teiid/common/buffer/FileStoreInputStreamFactory.java
___________________________________________________________________
Added: svn:mergeinfo
+ /branches/7.4.x/engine/src/main/java/org/teiid/common/buffer/FileStoreInputStreamFactory.java:3535-3555
Property changes on: trunk/engine/src/main/java/org/teiid/common/buffer/IndexedTupleSource.java
___________________________________________________________________
Added: svn:mergeinfo
+ /branches/7.4.x/engine/src/main/java/org/teiid/common/buffer/IndexedTupleSource.java:3535-3555
Property changes on: trunk/engine/src/main/java/org/teiid/common/buffer/LightWeightCopyOnWriteList.java
___________________________________________________________________
Added: svn:mergeinfo
+ /branches/7.4.x/engine/src/main/java/org/teiid/common/buffer/LightWeightCopyOnWriteList.java:3535-3555
Property changes on: trunk/engine/src/main/java/org/teiid/common/buffer/LobManager.java
___________________________________________________________________
Added: svn:mergeinfo
+ /branches/7.4.x/engine/src/main/java/org/teiid/common/buffer/LobManager.java:3535-3555
Property changes on: trunk/engine/src/main/java/org/teiid/common/buffer/SPage.java
___________________________________________________________________
Added: svn:mergeinfo
+ /branches/7.4.x/engine/src/main/java/org/teiid/common/buffer/SPage.java:3535-3555
Property changes on: trunk/engine/src/main/java/org/teiid/common/buffer/STree.java
___________________________________________________________________
Added: svn:mergeinfo
+ /branches/7.4.x/engine/src/main/java/org/teiid/common/buffer/STree.java:3535-3555
Property changes on: trunk/engine/src/main/java/org/teiid/common/buffer/Serializer.java
___________________________________________________________________
Added: svn:mergeinfo
+ /branches/7.4.x/engine/src/main/java/org/teiid/common/buffer/Serializer.java:3535-3555
Property changes on: trunk/engine/src/main/java/org/teiid/common/buffer/StorageManager.java
___________________________________________________________________
Added: svn:mergeinfo
+ /branches/7.4.x/engine/src/main/java/org/teiid/common/buffer/StorageManager.java:3535-3555
Property changes on: trunk/engine/src/main/java/org/teiid/common/buffer/TupleBatch.java
___________________________________________________________________
Modified: svn:mergeinfo
- /branches/7.4.x/engine/src/main/java/org/teiid/common/buffer/TupleBatch.java:3220-3275
+ /branches/7.4.x/engine/src/main/java/org/teiid/common/buffer/TupleBatch.java:3220-3275,3535-3555
Property changes on: trunk/engine/src/main/java/org/teiid/common/buffer/TupleBrowser.java
___________________________________________________________________
Added: svn:mergeinfo
+ /branches/7.4.x/engine/src/main/java/org/teiid/common/buffer/TupleBrowser.java:3535-3555
Property changes on: trunk/engine/src/main/java/org/teiid/common/buffer/TupleBuffer.java
___________________________________________________________________
Modified: svn:mergeinfo
- /branches/7.4.x/engine/src/main/java/org/teiid/common/buffer/TupleBuffer.java:3149-3217,3220-3275,3340-3349
+ /branches/7.4.x/engine/src/main/java/org/teiid/common/buffer/TupleBuffer.java:3149-3217,3220-3275,3340-3349,3535-3555
Property changes on: trunk/engine/src/main/java/org/teiid/common/buffer/TupleSource.java
___________________________________________________________________
Added: svn:mergeinfo
+ /branches/7.4.x/engine/src/main/java/org/teiid/common/buffer/TupleSource.java:3535-3555
Property changes on: trunk/engine/src/main/java/org/teiid/common/buffer/impl
___________________________________________________________________
Added: svn:mergeinfo
+ /branches/7.4.x/engine/src/main/java/org/teiid/common/buffer/impl:3535-3555
Property changes on: trunk/engine/src/main/java/org/teiid/core
___________________________________________________________________
Added: svn:mergeinfo
+ /branches/7.4.x/engine/src/main/java/org/teiid/core:3535-3555*
Property changes on: trunk/engine/src/main/java/org/teiid/core/id
___________________________________________________________________
Added: svn:mergeinfo
+ /branches/7.4.x/engine/src/main/java/org/teiid/core/id:3535-3555
Property changes on: trunk/engine/src/main/java/org/teiid/dqp/internal/datamgr/CapabilitiesConverter.java
___________________________________________________________________
Deleted: svn:mergeinfo
-
Modified: trunk/engine/src/main/java/org/teiid/dqp/internal/process/DQPWorkContext.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/dqp/internal/process/DQPWorkContext.java 2011-10-18 10:45:34 UTC (rev 3556)
+++ trunk/engine/src/main/java/org/teiid/dqp/internal/process/DQPWorkContext.java 2011-10-18 10:52:08 UTC (rev 3557)
@@ -29,7 +29,9 @@
import java.util.Enumeration;
import java.util.HashMap;
import java.util.HashSet;
+import java.util.Map;
import java.util.Set;
+import java.util.TreeMap;
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.FutureTask;
@@ -48,6 +50,39 @@
private static final long serialVersionUID = -6389893410233192977L;
+ public enum Version {
+ SEVEN_1("7.1"), //$NON-NLS-1$
+ SEVEN_2("7.2"), //$NON-NLS-1$
+ SEVEN_3("7.3"), //$NON-NLS-1$
+ SEVEN_4("7.4"); //$NON-NLS-1$
+
+ private String string;
+
+ private Version(String string) {
+ this.string = string;
+ }
+
+ @Override
+ public String toString() {
+ return string;
+ }
+
+ private static TreeMap<String, Version> versionMap = new TreeMap<String, Version>();
+ static {
+ for (Version v : Version.values()) {
+ versionMap.put(v.toString(), v);
+ }
+ }
+
+ public static Version getVersion(String version) {
+ Map.Entry<String, Version> v = versionMap.floorEntry(version);
+ if (v == null) {
+ return SEVEN_1;
+ }
+ return v.getValue();
+ }
+ }
+
private static ThreadLocal<DQPWorkContext> CONTEXTS = new ThreadLocal<DQPWorkContext>() {
protected DQPWorkContext initialValue() {
return new DQPWorkContext();
@@ -72,6 +107,7 @@
private SecurityHelper securityHelper;
private HashMap<String, DataPolicy> policies;
private boolean useCallingThread;
+ private Version clientVersion = Version.SEVEN_4;
public DQPWorkContext() {
}
@@ -257,5 +293,13 @@
}
}
return roles;
- }
+ }
+
+ public Version getClientVersion() {
+ return clientVersion;
+ }
+
+ public void setClientVersion(Version clientVersion) {
+ this.clientVersion = clientVersion;
+ }
}
Property changes on: trunk/engine/src/main/java/org/teiid/dqp/internal/process/LobWorkItem.java
___________________________________________________________________
Deleted: svn:mergeinfo
-
Modified: trunk/engine/src/main/java/org/teiid/dqp/internal/process/MetaDataProcessor.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/dqp/internal/process/MetaDataProcessor.java 2011-10-18 10:45:34 UTC (rev 3556)
+++ trunk/engine/src/main/java/org/teiid/dqp/internal/process/MetaDataProcessor.java 2011-10-18 10:52:08 UTC (rev 3557)
@@ -39,6 +39,7 @@
import org.teiid.core.types.DataTypeManager;
import org.teiid.core.types.XMLType;
import org.teiid.dqp.internal.process.DQPCore.ClientState;
+import org.teiid.dqp.internal.process.DQPWorkContext.Version;
import org.teiid.dqp.internal.process.SessionAwareCache.CacheID;
import org.teiid.dqp.internal.process.multisource.MultiSourceMetadataWrapper;
import org.teiid.dqp.message.RequestID;
@@ -78,6 +79,8 @@
private int vdbVersion;
private RequestID requestID;
+ private boolean labelAsName;
+
public MetaDataProcessor(DQPCore requestManager, SessionAwareCache<PreparedPlan> planCache, String vdbName, int vdbVersion) {
this.requestManager = requestManager;
this.planCache = planCache;
@@ -98,6 +101,7 @@
this.requestID = requestId;
this.metadata = workContext.getVDB().getAttachment(QueryMetadataInterface.class);
+ this.labelAsName = workContext.getClientVersion().compareTo(Version.SEVEN_3) <= 0;
// If multi-source, use the multi-source wrapper as well
Set<String> multiModels = workContext.getVDB().getMultiSourceModelNames();
@@ -246,7 +250,7 @@
Class<?> type = symbol.getType();
column.put(ResultsMetadataConstants.DATA_TYPE, DataTypeManager.getDataTypeName(type));
column.put(ResultsMetadataConstants.ELEMENT_LABEL, label);
- column.put(ResultsMetadataConstants.ELEMENT_NAME, metadata.getName(elementID));
+ column.put(ResultsMetadataConstants.ELEMENT_NAME, labelAsName?label:metadata.getName(elementID));
GroupSymbol group = symbol.getGroupSymbol();
if(group == null || group.getMetadataID() == null) {
@@ -399,7 +403,7 @@
column.put(ResultsMetadataConstants.VIRTUAL_DATABASE_NAME, vdbName);
column.put(ResultsMetadataConstants.VIRTUAL_DATABASE_VERSION, vdbVersion);
column.put(ResultsMetadataConstants.GROUP_NAME, tableName);
- column.put(ResultsMetadataConstants.ELEMENT_NAME, columnName);
+ column.put(ResultsMetadataConstants.ELEMENT_NAME, labelAsName?columnLabel:columnName);
column.put(ResultsMetadataConstants.ELEMENT_LABEL, columnLabel);
column.put(ResultsMetadataConstants.AUTO_INCREMENTING, Boolean.FALSE);
column.put(ResultsMetadataConstants.CASE_SENSITIVE, Boolean.FALSE);
Property changes on: trunk/engine/src/main/java/org/teiid/dqp/internal/process/MetaDataProcessor.java
___________________________________________________________________
Deleted: svn:mergeinfo
-
Property changes on: trunk/engine/src/main/java/org/teiid/dqp/internal/process/multisource
___________________________________________________________________
Deleted: svn:mergeinfo
-
Property changes on: trunk/engine/src/main/java/org/teiid/query
___________________________________________________________________
Added: svn:mergeinfo
+ /branches/7.4.x/engine/src/main/java/org/teiid/query:3535-3555*
Property changes on: trunk/engine/src/main/java/org/teiid/query/ObjectReplicator.java
___________________________________________________________________
Added: svn:mergeinfo
+ /branches/7.4.x/engine/src/main/java/org/teiid/query/ObjectReplicator.java:3535-3555
Property changes on: trunk/engine/src/main/java/org/teiid/query/QueryPlugin.java
___________________________________________________________________
Added: svn:mergeinfo
+ /branches/7.4.x/engine/src/main/java/org/teiid/query/QueryPlugin.java:3535-3555
Property changes on: trunk/engine/src/main/java/org/teiid/query/ReplicatedObject.java
___________________________________________________________________
Added: svn:mergeinfo
+ /branches/7.4.x/engine/src/main/java/org/teiid/query/ReplicatedObject.java:3535-3555
Property changes on: trunk/engine/src/main/java/org/teiid/query/analysis
___________________________________________________________________
Added: svn:mergeinfo
+ /branches/7.4.x/engine/src/main/java/org/teiid/query/analysis:3535-3555
Property changes on: trunk/engine/src/main/java/org/teiid/query/eval
___________________________________________________________________
Added: svn:mergeinfo
+ /branches/7.4.x/engine/src/main/java/org/teiid/query/eval:3535-3555
Property changes on: trunk/engine/src/main/java/org/teiid/query/function
___________________________________________________________________
Added: svn:mergeinfo
+ /branches/7.4.x/engine/src/main/java/org/teiid/query/function:3535-3555*
Property changes on: trunk/engine/src/main/java/org/teiid/query/function/CharsetUtils.java
___________________________________________________________________
Added: svn:mergeinfo
+ /branches/7.4.x/engine/src/main/java/org/teiid/query/function/CharsetUtils.java:3535-3555
Property changes on: trunk/engine/src/main/java/org/teiid/query/function/FunctionDescriptor.java
___________________________________________________________________
Modified: svn:mergeinfo
- /branches/7.4.x/engine/src/main/java/org/teiid/query/function/FunctionDescriptor.java:3149-3171
+ /branches/7.4.x/engine/src/main/java/org/teiid/query/function/FunctionDescriptor.java:3149-3171,3535-3555
Property changes on: trunk/engine/src/main/java/org/teiid/query/function/FunctionForm.java
___________________________________________________________________
Added: svn:mergeinfo
+ /branches/7.4.x/engine/src/main/java/org/teiid/query/function/FunctionForm.java:3535-3555
Property changes on: trunk/engine/src/main/java/org/teiid/query/function/FunctionLibrary.java
___________________________________________________________________
Added: svn:mergeinfo
+ /branches/7.4.x/engine/src/main/java/org/teiid/query/function/FunctionLibrary.java:3535-3555
Property changes on: trunk/engine/src/main/java/org/teiid/query/function/FunctionMetadataSource.java
___________________________________________________________________
Added: svn:mergeinfo
+ /branches/7.4.x/engine/src/main/java/org/teiid/query/function/FunctionMetadataSource.java:3535-3555
Property changes on: trunk/engine/src/main/java/org/teiid/query/function/FunctionMethods.java
___________________________________________________________________
Added: svn:mergeinfo
+ /branches/7.4.x/engine/src/main/java/org/teiid/query/function/FunctionMethods.java:3535-3555
Property changes on: trunk/engine/src/main/java/org/teiid/query/function/FunctionTree.java
___________________________________________________________________
Modified: svn:mergeinfo
- /branches/7.4.x/engine/src/main/java/org/teiid/query/function/FunctionTree.java:3149-3171
+ /branches/7.4.x/engine/src/main/java/org/teiid/query/function/FunctionTree.java:3149-3171,3535-3555
Property changes on: trunk/engine/src/main/java/org/teiid/query/function/SystemFunctionManager.java
___________________________________________________________________
Added: svn:mergeinfo
+ /branches/7.4.x/engine/src/main/java/org/teiid/query/function/SystemFunctionManager.java:3535-3555
Property changes on: trunk/engine/src/main/java/org/teiid/query/function/UDFSource.java
___________________________________________________________________
Added: svn:mergeinfo
+ /branches/7.4.x/engine/src/main/java/org/teiid/query/function/UDFSource.java:3535-3555
Property changes on: trunk/engine/src/main/java/org/teiid/query/function/aggregate
___________________________________________________________________
Added: svn:mergeinfo
+ /branches/7.4.x/engine/src/main/java/org/teiid/query/function/aggregate:3535-3555
Property changes on: trunk/engine/src/main/java/org/teiid/query/function/metadata
___________________________________________________________________
Added: svn:mergeinfo
+ /branches/7.4.x/engine/src/main/java/org/teiid/query/function/metadata:3535-3555
Property changes on: trunk/engine/src/main/java/org/teiid/query/function/source
___________________________________________________________________
Added: svn:mergeinfo
+ /branches/7.4.x/engine/src/main/java/org/teiid/query/function/source:3535-3555
Property changes on: trunk/engine/src/main/java/org/teiid/query/mapping
___________________________________________________________________
Added: svn:mergeinfo
+ /branches/7.4.x/engine/src/main/java/org/teiid/query/mapping:3535-3555*
Property changes on: trunk/engine/src/main/java/org/teiid/query/mapping/relational
___________________________________________________________________
Added: svn:mergeinfo
+ /branches/7.4.x/engine/src/main/java/org/teiid/query/mapping/relational:3535-3555
Property changes on: trunk/engine/src/main/java/org/teiid/query/mapping/xml
___________________________________________________________________
Added: svn:mergeinfo
+ /branches/7.4.x/engine/src/main/java/org/teiid/query/mapping/xml:3535-3555
Property changes on: trunk/engine/src/main/java/org/teiid/query/metadata
___________________________________________________________________
Added: svn:mergeinfo
+ /branches/7.4.x/engine/src/main/java/org/teiid/query/metadata:3535-3555
Property changes on: trunk/engine/src/main/java/org/teiid/query/optimizer
___________________________________________________________________
Added: svn:mergeinfo
+ /branches/7.4.x/engine/src/main/java/org/teiid/query/optimizer:3535-3555*
Property changes on: trunk/engine/src/main/java/org/teiid/query/optimizer/BatchedUpdatePlanner.java
___________________________________________________________________
Added: svn:mergeinfo
+ /branches/7.4.x/engine/src/main/java/org/teiid/query/optimizer/BatchedUpdatePlanner.java:3535-3555
Property changes on: trunk/engine/src/main/java/org/teiid/query/optimizer/CommandPlanner.java
___________________________________________________________________
Added: svn:mergeinfo
+ /branches/7.4.x/engine/src/main/java/org/teiid/query/optimizer/CommandPlanner.java:3535-3555
Property changes on: trunk/engine/src/main/java/org/teiid/query/optimizer/DdlPlanner.java
___________________________________________________________________
Added: svn:mergeinfo
+ /branches/7.4.x/engine/src/main/java/org/teiid/query/optimizer/DdlPlanner.java:3535-3555
Property changes on: trunk/engine/src/main/java/org/teiid/query/optimizer/ProcedurePlanner.java
___________________________________________________________________
Added: svn:mergeinfo
+ /branches/7.4.x/engine/src/main/java/org/teiid/query/optimizer/ProcedurePlanner.java:3535-3555
Property changes on: trunk/engine/src/main/java/org/teiid/query/optimizer/QueryOptimizer.java
___________________________________________________________________
Added: svn:mergeinfo
+ /branches/7.4.x/engine/src/main/java/org/teiid/query/optimizer/QueryOptimizer.java:3535-3555
Property changes on: trunk/engine/src/main/java/org/teiid/query/optimizer/TriggerActionPlanner.java
___________________________________________________________________
Added: svn:mergeinfo
+ /branches/7.4.x/engine/src/main/java/org/teiid/query/optimizer/TriggerActionPlanner.java:3535-3555
Property changes on: trunk/engine/src/main/java/org/teiid/query/optimizer/capabilities
___________________________________________________________________
Added: svn:mergeinfo
+ /branches/7.4.x/engine/src/main/java/org/teiid/query/optimizer/capabilities:3535-3555
Property changes on: trunk/engine/src/main/java/org/teiid/query/optimizer/relational
___________________________________________________________________
Added: svn:mergeinfo
+ /branches/7.4.x/engine/src/main/java/org/teiid/query/optimizer/relational:3535-3555*
Property changes on: trunk/engine/src/main/java/org/teiid/query/optimizer/relational/AliasGenerator.java
___________________________________________________________________
Added: svn:mergeinfo
+ /branches/7.4.x/engine/src/main/java/org/teiid/query/optimizer/relational/AliasGenerator.java:3535-3555
Property changes on: trunk/engine/src/main/java/org/teiid/query/optimizer/relational/OptimizerRule.java
___________________________________________________________________
Added: svn:mergeinfo
+ /branches/7.4.x/engine/src/main/java/org/teiid/query/optimizer/relational/OptimizerRule.java:3535-3555
Property changes on: trunk/engine/src/main/java/org/teiid/query/optimizer/relational/PartitionAnalyzer.java
___________________________________________________________________
Added: svn:mergeinfo
+ /branches/7.4.x/engine/src/main/java/org/teiid/query/optimizer/relational/PartitionAnalyzer.java:3535-3555
Property changes on: trunk/engine/src/main/java/org/teiid/query/optimizer/relational/PlanHints.java
___________________________________________________________________
Added: svn:mergeinfo
+ /branches/7.4.x/engine/src/main/java/org/teiid/query/optimizer/relational/PlanHints.java:3535-3555
Property changes on: trunk/engine/src/main/java/org/teiid/query/optimizer/relational/PlanToProcessConverter.java
___________________________________________________________________
Modified: svn:mergeinfo
- /branches/7.4.x/engine/src/main/java/org/teiid/query/optimizer/relational/PlanToProcessConverter.java:3149-3217
+ /branches/7.4.x/engine/src/main/java/org/teiid/query/optimizer/relational/PlanToProcessConverter.java:3149-3217,3535-3555
Property changes on: trunk/engine/src/main/java/org/teiid/query/optimizer/relational/RelationalPlanner.java
___________________________________________________________________
Modified: svn:mergeinfo
- /branches/7.4.x/engine/src/main/java/org/teiid/query/optimizer/relational/RelationalPlanner.java:3149-3217
+ /branches/7.4.x/engine/src/main/java/org/teiid/query/optimizer/relational/RelationalPlanner.java:3149-3217,3535-3555
Property changes on: trunk/engine/src/main/java/org/teiid/query/optimizer/relational/RuleStack.java
___________________________________________________________________
Added: svn:mergeinfo
+ /branches/7.4.x/engine/src/main/java/org/teiid/query/optimizer/relational/RuleStack.java:3535-3555
Property changes on: trunk/engine/src/main/java/org/teiid/query/optimizer/relational/plantree
___________________________________________________________________
Added: svn:mergeinfo
+ /branches/7.4.x/engine/src/main/java/org/teiid/query/optimizer/relational/plantree:3535-3555
Property changes on: trunk/engine/src/main/java/org/teiid/query/optimizer/relational/rules
___________________________________________________________________
Added: svn:mergeinfo
+ /branches/7.4.x/engine/src/main/java/org/teiid/query/optimizer/relational/rules:3535-3555
Modified: trunk/engine/src/main/java/org/teiid/query/optimizer/relational/rules/RulePlanProcedures.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/query/optimizer/relational/rules/RulePlanProcedures.java 2011-10-18 10:45:34 UTC (rev 3556)
+++ trunk/engine/src/main/java/org/teiid/query/optimizer/relational/rules/RulePlanProcedures.java 2011-10-18 10:52:08 UTC (rev 3557)
@@ -134,10 +134,12 @@
Criteria crit = Criteria.combineCriteria(conjuncts);
- accessNode.setProperty(NodeConstants.Info.PROCEDURE_CRITERIA, crit);
- accessNode.setProperty(NodeConstants.Info.PROCEDURE_INPUTS, inputReferences);
- accessNode.setProperty(NodeConstants.Info.PROCEDURE_DEFAULTS, defaults);
- accessNode.setProperty(NodeConstants.Info.IS_DEPENDENT_SET, Boolean.TRUE);
+ if (crit != null) {
+ accessNode.setProperty(NodeConstants.Info.PROCEDURE_CRITERIA, crit);
+ accessNode.setProperty(NodeConstants.Info.PROCEDURE_INPUTS, inputReferences);
+ accessNode.setProperty(NodeConstants.Info.PROCEDURE_DEFAULTS, defaults);
+ accessNode.setProperty(NodeConstants.Info.IS_DEPENDENT_SET, Boolean.TRUE);
+ }
}
return plan;
Property changes on: trunk/engine/src/main/java/org/teiid/query/optimizer/xml
___________________________________________________________________
Added: svn:mergeinfo
+ /branches/7.4.x/engine/src/main/java/org/teiid/query/optimizer/xml:3535-3555
Property changes on: trunk/engine/src/main/java/org/teiid/query/parser
___________________________________________________________________
Added: svn:mergeinfo
+ /branches/7.4.x/engine/src/main/java/org/teiid/query/parser:3535-3555
Property changes on: trunk/engine/src/main/java/org/teiid/query/processor
___________________________________________________________________
Added: svn:mergeinfo
+ /branches/7.4.x/engine/src/main/java/org/teiid/query/processor:3535-3555*
Property changes on: trunk/engine/src/main/java/org/teiid/query/processor/BatchCollector.java
___________________________________________________________________
Added: svn:mergeinfo
+ /branches/7.4.x/engine/src/main/java/org/teiid/query/processor/BatchCollector.java:3535-3555
Property changes on: trunk/engine/src/main/java/org/teiid/query/processor/BatchIterator.java
___________________________________________________________________
Added: svn:mergeinfo
+ /branches/7.4.x/engine/src/main/java/org/teiid/query/processor/BatchIterator.java:3535-3555
Property changes on: trunk/engine/src/main/java/org/teiid/query/processor/BatchedUpdatePlan.java
___________________________________________________________________
Added: svn:mergeinfo
+ /branches/7.4.x/engine/src/main/java/org/teiid/query/processor/BatchedUpdatePlan.java:3535-3555
Property changes on: trunk/engine/src/main/java/org/teiid/query/processor/CollectionTupleSource.java
___________________________________________________________________
Added: svn:mergeinfo
+ /branches/7.4.x/engine/src/main/java/org/teiid/query/processor/CollectionTupleSource.java:3535-3555
Property changes on: trunk/engine/src/main/java/org/teiid/query/processor/DdlPlan.java
___________________________________________________________________
Added: svn:mergeinfo
+ /branches/7.4.x/engine/src/main/java/org/teiid/query/processor/DdlPlan.java:3535-3555
Property changes on: trunk/engine/src/main/java/org/teiid/query/processor/ProcessorDataManager.java
___________________________________________________________________
Added: svn:mergeinfo
+ /branches/7.4.x/engine/src/main/java/org/teiid/query/processor/ProcessorDataManager.java:3535-3555
Property changes on: trunk/engine/src/main/java/org/teiid/query/processor/ProcessorPlan.java
___________________________________________________________________
Added: svn:mergeinfo
+ /branches/7.4.x/engine/src/main/java/org/teiid/query/processor/ProcessorPlan.java:3535-3555
Property changes on: trunk/engine/src/main/java/org/teiid/query/processor/QueryProcessor.java
___________________________________________________________________
Modified: svn:mergeinfo
- /branches/7.4.x/engine/src/main/java/org/teiid/query/processor/QueryProcessor.java:3220-3275,3340-3349
+ /branches/7.4.x/engine/src/main/java/org/teiid/query/processor/QueryProcessor.java:3220-3275,3340-3349,3535-3555
Property changes on: trunk/engine/src/main/java/org/teiid/query/processor/proc
___________________________________________________________________
Added: svn:mergeinfo
+ /branches/7.4.x/engine/src/main/java/org/teiid/query/processor/proc:3535-3555
Property changes on: trunk/engine/src/main/java/org/teiid/query/processor/relational
___________________________________________________________________
Added: svn:mergeinfo
+ /branches/7.4.x/engine/src/main/java/org/teiid/query/processor/relational:3535-3555
Modified: trunk/engine/src/main/java/org/teiid/query/processor/relational/AccessNode.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/query/processor/relational/AccessNode.java 2011-10-18 10:45:34 UTC (rev 3556)
+++ trunk/engine/src/main/java/org/teiid/query/processor/relational/AccessNode.java 2011-10-18 10:52:08 UTC (rev 3557)
@@ -328,6 +328,15 @@
terminateBatches();
return pullBatch();
}
+
+ @Override
+ protected void addBatchRow(List row) {
+ if (this.getOutputElements().isEmpty()) {
+ //a dummy column was added to the query, just remove it now
+ row = Collections.emptyList();
+ }
+ super.addBatchRow(row);
+ }
private void registerNext() throws TeiidComponentException,
TeiidProcessingException {
Property changes on: trunk/engine/src/main/java/org/teiid/query/processor/relational/SubqueryAwareEvaluator.java
___________________________________________________________________
Deleted: svn:mergeinfo
-
Property changes on: trunk/engine/src/main/java/org/teiid/query/processor/xml
___________________________________________________________________
Added: svn:mergeinfo
+ /branches/7.4.x/engine/src/main/java/org/teiid/query/processor/xml:3535-3555
Property changes on: trunk/engine/src/main/java/org/teiid/query/report
___________________________________________________________________
Added: svn:mergeinfo
+ /branches/7.4.x/engine/src/main/java/org/teiid/query/report:3535-3555
Property changes on: trunk/engine/src/main/java/org/teiid/query/resolver
___________________________________________________________________
Added: svn:mergeinfo
+ /branches/7.4.x/engine/src/main/java/org/teiid/query/resolver:3535-3555*
Property changes on: trunk/engine/src/main/java/org/teiid/query/resolver/CommandResolver.java
___________________________________________________________________
Added: svn:mergeinfo
+ /branches/7.4.x/engine/src/main/java/org/teiid/query/resolver/CommandResolver.java:3535-3555
Property changes on: trunk/engine/src/main/java/org/teiid/query/resolver/ProcedureContainerResolver.java
___________________________________________________________________
Added: svn:mergeinfo
+ /branches/7.4.x/engine/src/main/java/org/teiid/query/resolver/ProcedureContainerResolver.java:3535-3555
Property changes on: trunk/engine/src/main/java/org/teiid/query/resolver/QueryResolver.java
___________________________________________________________________
Added: svn:mergeinfo
+ /branches/7.4.x/engine/src/main/java/org/teiid/query/resolver/QueryResolver.java:3535-3555
Property changes on: trunk/engine/src/main/java/org/teiid/query/resolver/VariableResolver.java
___________________________________________________________________
Added: svn:mergeinfo
+ /branches/7.4.x/engine/src/main/java/org/teiid/query/resolver/VariableResolver.java:3535-3555
Property changes on: trunk/engine/src/main/java/org/teiid/query/resolver/command
___________________________________________________________________
Added: svn:mergeinfo
+ /branches/7.4.x/engine/src/main/java/org/teiid/query/resolver/command:3535-3555
Property changes on: trunk/engine/src/main/java/org/teiid/query/resolver/util
___________________________________________________________________
Added: svn:mergeinfo
+ /branches/7.4.x/engine/src/main/java/org/teiid/query/resolver/util:3535-3555
Property changes on: trunk/engine/src/main/java/org/teiid/query/rewriter
___________________________________________________________________
Added: svn:mergeinfo
+ /branches/7.4.x/engine/src/main/java/org/teiid/query/rewriter:3535-3555
Property changes on: trunk/engine/src/main/java/org/teiid/query/sql
___________________________________________________________________
Added: svn:mergeinfo
+ /branches/7.4.x/engine/src/main/java/org/teiid/query/sql:3535-3555*
Property changes on: trunk/engine/src/main/java/org/teiid/query/sql/LanguageObject.java
___________________________________________________________________
Modified: svn:mergeinfo
- /branches/7.4.x/engine/src/main/java/org/teiid/query/sql/LanguageObject.java:3149-3217
+ /branches/7.4.x/engine/src/main/java/org/teiid/query/sql/LanguageObject.java:3149-3217,3535-3555
Property changes on: trunk/engine/src/main/java/org/teiid/query/sql/LanguageVisitor.java
___________________________________________________________________
Added: svn:mergeinfo
+ /branches/7.4.x/engine/src/main/java/org/teiid/query/sql/LanguageVisitor.java:3535-3555
Property changes on: trunk/engine/src/main/java/org/teiid/query/sql/ProcedureReservedWords.java
___________________________________________________________________
Added: svn:mergeinfo
+ /branches/7.4.x/engine/src/main/java/org/teiid/query/sql/ProcedureReservedWords.java:3535-3555
Property changes on: trunk/engine/src/main/java/org/teiid/query/sql/lang
___________________________________________________________________
Added: svn:mergeinfo
+ /branches/7.4.x/engine/src/main/java/org/teiid/query/sql/lang:3535-3555
Property changes on: trunk/engine/src/main/java/org/teiid/query/sql/navigator
___________________________________________________________________
Added: svn:mergeinfo
+ /branches/7.4.x/engine/src/main/java/org/teiid/query/sql/navigator:3535-3555
Property changes on: trunk/engine/src/main/java/org/teiid/query/sql/proc
___________________________________________________________________
Added: svn:mergeinfo
+ /branches/7.4.x/engine/src/main/java/org/teiid/query/sql/proc:3535-3555
Property changes on: trunk/engine/src/main/java/org/teiid/query/sql/symbol
___________________________________________________________________
Added: svn:mergeinfo
+ /branches/7.4.x/engine/src/main/java/org/teiid/query/sql/symbol:3535-3555
Property changes on: trunk/engine/src/main/java/org/teiid/query/sql/util
___________________________________________________________________
Added: svn:mergeinfo
+ /branches/7.4.x/engine/src/main/java/org/teiid/query/sql/util:3535-3555
Property changes on: trunk/engine/src/main/java/org/teiid/query/sql/visitor
___________________________________________________________________
Added: svn:mergeinfo
+ /branches/7.4.x/engine/src/main/java/org/teiid/query/sql/visitor:3535-3555
Property changes on: trunk/engine/src/main/java/org/teiid/query/tempdata
___________________________________________________________________
Added: svn:mergeinfo
+ /branches/7.4.x/engine/src/main/java/org/teiid/query/tempdata:3535-3555
Property changes on: trunk/engine/src/main/java/org/teiid/query/util
___________________________________________________________________
Added: svn:mergeinfo
+ /branches/7.4.x/engine/src/main/java/org/teiid/query/util:3535-3555
Property changes on: trunk/engine/src/main/java/org/teiid/query/validator
___________________________________________________________________
Added: svn:mergeinfo
+ /branches/7.4.x/engine/src/main/java/org/teiid/query/validator:3535-3555
Property changes on: trunk/engine/src/main/java/org/teiid/query/xquery
___________________________________________________________________
Added: svn:mergeinfo
+ /branches/7.4.x/engine/src/main/java/org/teiid/query/xquery:3535-3555*
Property changes on: trunk/engine/src/main/java/org/teiid/query/xquery/saxon
___________________________________________________________________
Added: svn:mergeinfo
+ /branches/7.4.x/engine/src/main/java/org/teiid/query/xquery/saxon:3535-3555
Property changes on: trunk/engine/src/main/java/org/teiid/vdb
___________________________________________________________________
Added: svn:mergeinfo
+ /branches/7.4.x/engine/src/main/java/org/teiid/vdb:3535-3555*
Property changes on: trunk/engine/src/main/java/org/teiid/vdb/runtime
___________________________________________________________________
Added: svn:mergeinfo
+ /branches/7.4.x/engine/src/main/java/org/teiid/vdb/runtime:3535-3555
Property changes on: trunk/engine/src/test/java/org/teiid/cache
___________________________________________________________________
Added: svn:mergeinfo
+ /branches/7.4.x/engine/src/test/java/org/teiid/cache:3535-3555*
Property changes on: trunk/engine/src/test/java/org/teiid/cache/TestDefaultCache.java
___________________________________________________________________
Added: svn:mergeinfo
+ /branches/7.4.x/engine/src/test/java/org/teiid/cache/TestDefaultCache.java:3535-3555
Property changes on: trunk/engine/src/test/java/org/teiid/common
___________________________________________________________________
Added: svn:mergeinfo
+ /branches/7.4.x/engine/src/test/java/org/teiid/common:3535-3555*
Property changes on: trunk/engine/src/test/java/org/teiid/common/buffer
___________________________________________________________________
Added: svn:mergeinfo
+ /branches/7.4.x/engine/src/test/java/org/teiid/common/buffer:3535-3555
Property changes on: trunk/engine/src/test/java/org/teiid/common/queue
___________________________________________________________________
Added: svn:mergeinfo
+ /branches/7.4.x/engine/src/test/java/org/teiid/common/queue:3535-3555
Property changes on: trunk/engine/src/test/java/org/teiid/dqp/internal/process/TestDQPCoreRequestHandling.java
___________________________________________________________________
Deleted: svn:mergeinfo
-
Property changes on: trunk/engine/src/test/java/org/teiid/dqp/internal/process/TestDQPWorkContext.java
___________________________________________________________________
Deleted: svn:mergeinfo
-
Modified: trunk/engine/src/test/java/org/teiid/dqp/internal/process/TestMetaDataProcessor.java
===================================================================
--- trunk/engine/src/test/java/org/teiid/dqp/internal/process/TestMetaDataProcessor.java 2011-10-18 10:45:34 UTC (rev 3556)
+++ trunk/engine/src/test/java/org/teiid/dqp/internal/process/TestMetaDataProcessor.java 2011-10-18 10:52:08 UTC (rev 3557)
@@ -28,6 +28,7 @@
import java.util.Map;
import java.util.Set;
+import org.junit.Before;
import org.junit.Test;
import org.teiid.adminapi.impl.ModelMetaData;
import org.teiid.adminapi.impl.VDBMetaData;
@@ -36,6 +37,7 @@
import org.teiid.client.metadata.ResultsMetadataConstants;
import org.teiid.core.types.DataTypeManager;
import org.teiid.dqp.internal.datamgr.FakeTransactionService;
+import org.teiid.dqp.internal.process.DQPWorkContext.Version;
import org.teiid.dqp.message.RequestID;
import org.teiid.metadata.Column;
import org.teiid.metadata.MetadataStore;
@@ -54,6 +56,12 @@
*/
@SuppressWarnings({"nls", "unchecked"})
public class TestMetaDataProcessor {
+
+ private boolean asLegacyClient;
+
+ @Before public void setup() {
+ asLegacyClient = false;
+ }
public Map[] helpGetMetadata(String sql, QueryMetadataInterface metadata, VDBMetaData vdb) throws Exception {
// Prepare sql
@@ -66,6 +74,9 @@
requestMgr.setTransactionService(new FakeTransactionService());
DQPWorkContext workContext = RealMetadataFactory.buildWorkContext(metadata, vdb);
+ if (asLegacyClient) {
+ workContext.setClientVersion(Version.SEVEN_3);
+ }
// Initialize components
RequestID requestID = workContext.getRequestID(1);
@@ -81,7 +92,18 @@
Map[] metadata = helpGetMetadata("SELECT e1 FROM pm1.g1", RealMetadataFactory.example1Cached(), RealMetadataFactory.example1VDB()); //$NON-NLS-1$
assertNotNull(metadata);
assertEquals(1, metadata.length);
+ assertEquals("e1", metadata[0].get(ResultsMetadataConstants.ELEMENT_NAME)); //$NON-NLS-1$
+ assertEquals("e1", metadata[0].get(ResultsMetadataConstants.ELEMENT_LABEL)); //$NON-NLS-1$
}
+
+ @Test public void testLegacyClient() throws Exception {
+ asLegacyClient = true;
+ Map[] metadata = helpGetMetadata("SELECT e1 as e2 FROM pm1.g1", RealMetadataFactory.example1Cached(), RealMetadataFactory.example1VDB()); //$NON-NLS-1$
+ assertNotNull(metadata);
+ assertEquals(1, metadata.length);
+ assertEquals("e2", metadata[0].get(ResultsMetadataConstants.ELEMENT_NAME)); //$NON-NLS-1$
+ assertEquals("e2", metadata[0].get(ResultsMetadataConstants.ELEMENT_LABEL)); //$NON-NLS-1$
+ }
@Test public void testSimpleUpdate() throws Exception {
Map[] metadata = helpGetMetadata("INSERT INTO pm1.g1 (e1) VALUES ('x')", RealMetadataFactory.example1Cached(), RealMetadataFactory.example1VDB()); //$NON-NLS-1$
Property changes on: trunk/engine/src/test/java/org/teiid/dqp/internal/process/TestPreparedPlanCache.java
___________________________________________________________________
Deleted: svn:mergeinfo
-
Property changes on: trunk/engine/src/test/java/org/teiid/dqp/internal/process/multisource
___________________________________________________________________
Deleted: svn:mergeinfo
-
Property changes on: trunk/engine/src/test/java/org/teiid/query
___________________________________________________________________
Added: svn:mergeinfo
+ /branches/7.4.x/engine/src/test/java/org/teiid/query:3535-3555*
Property changes on: trunk/engine/src/test/java/org/teiid/query/analysis
___________________________________________________________________
Added: svn:mergeinfo
+ /branches/7.4.x/engine/src/test/java/org/teiid/query/analysis:3535-3555
Property changes on: trunk/engine/src/test/java/org/teiid/query/function
___________________________________________________________________
Added: svn:mergeinfo
+ /branches/7.4.x/engine/src/test/java/org/teiid/query/function:3535-3555*
Property changes on: trunk/engine/src/test/java/org/teiid/query/function/TestFunction.java
___________________________________________________________________
Modified: svn:mergeinfo
- /branches/7.4.x/engine/src/test/java/org/teiid/query/function/TestFunction.java:3281-3325
+ /branches/7.4.x/engine/src/test/java/org/teiid/query/function/TestFunction.java:3281-3325,3535-3555
Property changes on: trunk/engine/src/test/java/org/teiid/query/function/TestFunctionLibrary.java
___________________________________________________________________
Modified: svn:mergeinfo
- /branches/7.4.x/engine/src/test/java/org/teiid/query/function/TestFunctionLibrary.java:3149-3217
+ /branches/7.4.x/engine/src/test/java/org/teiid/query/function/TestFunctionLibrary.java:3149-3217,3535-3555
Property changes on: trunk/engine/src/test/java/org/teiid/query/function/TestFunctionMetadataReader.java
___________________________________________________________________
Added: svn:mergeinfo
+ /branches/7.4.x/engine/src/test/java/org/teiid/query/function/TestFunctionMetadataReader.java:3535-3555
Property changes on: trunk/engine/src/test/java/org/teiid/query/function/TestFunctionMethods.java
___________________________________________________________________
Added: svn:mergeinfo
+ /branches/7.4.x/engine/src/test/java/org/teiid/query/function/TestFunctionMethods.java:3535-3555
Property changes on: trunk/engine/src/test/java/org/teiid/query/function/TestFunctionTree.java
___________________________________________________________________
Modified: svn:mergeinfo
- /branches/7.4.x/engine/src/test/java/org/teiid/query/function/TestFunctionTree.java:3149-3217
+ /branches/7.4.x/engine/src/test/java/org/teiid/query/function/TestFunctionTree.java:3149-3217,3535-3555
Property changes on: trunk/engine/src/test/java/org/teiid/query/function/TestResolvedFunctions.java
___________________________________________________________________
Modified: svn:mergeinfo
- /branches/7.4.x/engine/src/test/java/org/teiid/query/function/TestResolvedFunctions.java:3149-3217
+ /branches/7.4.x/engine/src/test/java/org/teiid/query/function/TestResolvedFunctions.java:3149-3217,3535-3555
Property changes on: trunk/engine/src/test/java/org/teiid/query/function/metadata
___________________________________________________________________
Added: svn:mergeinfo
+ /branches/7.4.x/engine/src/test/java/org/teiid/query/function/metadata:3535-3555
Property changes on: trunk/engine/src/test/java/org/teiid/query/function/source
___________________________________________________________________
Added: svn:mergeinfo
+ /branches/7.4.x/engine/src/test/java/org/teiid/query/function/source:3535-3555
Property changes on: trunk/engine/src/test/java/org/teiid/query/mapping
___________________________________________________________________
Added: svn:mergeinfo
+ /branches/7.4.x/engine/src/test/java/org/teiid/query/mapping:3535-3555*
Property changes on: trunk/engine/src/test/java/org/teiid/query/mapping/xml
___________________________________________________________________
Added: svn:mergeinfo
+ /branches/7.4.x/engine/src/test/java/org/teiid/query/mapping/xml:3535-3555
Property changes on: trunk/engine/src/test/java/org/teiid/query/metadata
___________________________________________________________________
Added: svn:mergeinfo
+ /branches/7.4.x/engine/src/test/java/org/teiid/query/metadata:3535-3555
Property changes on: trunk/engine/src/test/java/org/teiid/query/optimizer
___________________________________________________________________
Added: svn:mergeinfo
+ /branches/7.4.x/engine/src/test/java/org/teiid/query/optimizer:3535-3555*
Property changes on: trunk/engine/src/test/java/org/teiid/query/optimizer/FakeFunctionMetadataSource.java
___________________________________________________________________
Added: svn:mergeinfo
+ /branches/7.4.x/engine/src/test/java/org/teiid/query/optimizer/FakeFunctionMetadataSource.java:3535-3555
Property changes on: trunk/engine/src/test/java/org/teiid/query/optimizer/InlineViewCase.java
___________________________________________________________________
Added: svn:mergeinfo
+ /branches/7.4.x/engine/src/test/java/org/teiid/query/optimizer/InlineViewCase.java:3535-3555
Property changes on: trunk/engine/src/test/java/org/teiid/query/optimizer/TestAccessPatterns.java
___________________________________________________________________
Modified: svn:mergeinfo
- /branches/7.4.x/engine/src/test/java/org/teiid/query/optimizer/TestAccessPatterns.java:3149-3217
+ /branches/7.4.x/engine/src/test/java/org/teiid/query/optimizer/TestAccessPatterns.java:3149-3217,3535-3555
Property changes on: trunk/engine/src/test/java/org/teiid/query/optimizer/TestAggregatePushdown.java
___________________________________________________________________
Modified: svn:mergeinfo
- /branches/7.4.x/engine/src/test/java/org/teiid/query/optimizer/TestAggregatePushdown.java:3149-3217,3220-3275
+ /branches/7.4.x/engine/src/test/java/org/teiid/query/optimizer/TestAggregatePushdown.java:3149-3217,3220-3275,3535-3555
Property changes on: trunk/engine/src/test/java/org/teiid/query/optimizer/TestAnsiJoinPushdown.java
___________________________________________________________________
Modified: svn:mergeinfo
- /branches/7.4.x/engine/src/test/java/org/teiid/query/optimizer/TestAnsiJoinPushdown.java:3149-3217
+ /branches/7.4.x/engine/src/test/java/org/teiid/query/optimizer/TestAnsiJoinPushdown.java:3149-3217,3535-3555
Property changes on: trunk/engine/src/test/java/org/teiid/query/optimizer/TestBatchedUpdatePlanner.java
___________________________________________________________________
Modified: svn:mergeinfo
- /branches/7.4.x/engine/src/test/java/org/teiid/query/optimizer/TestBatchedUpdatePlanner.java:3149-3217
+ /branches/7.4.x/engine/src/test/java/org/teiid/query/optimizer/TestBatchedUpdatePlanner.java:3149-3217,3535-3555
Property changes on: trunk/engine/src/test/java/org/teiid/query/optimizer/TestComparableMetadataPushdown.java
___________________________________________________________________
Added: svn:mergeinfo
+ /branches/7.4.x/engine/src/test/java/org/teiid/query/optimizer/TestComparableMetadataPushdown.java:3535-3555
Property changes on: trunk/engine/src/test/java/org/teiid/query/optimizer/TestDependentJoins.java
___________________________________________________________________
Modified: svn:mergeinfo
- /branches/7.4.x/engine/src/test/java/org/teiid/query/optimizer/TestDependentJoins.java:3149-3217,3220-3275
+ /branches/7.4.x/engine/src/test/java/org/teiid/query/optimizer/TestDependentJoins.java:3149-3217,3220-3275,3535-3555
Property changes on: trunk/engine/src/test/java/org/teiid/query/optimizer/TestExpressionsInGroupBy.java
___________________________________________________________________
Modified: svn:mergeinfo
- /branches/7.4.x/engine/src/test/java/org/teiid/query/optimizer/TestExpressionsInGroupBy.java:3149-3217
+ /branches/7.4.x/engine/src/test/java/org/teiid/query/optimizer/TestExpressionsInGroupBy.java:3149-3217,3535-3555
Property changes on: trunk/engine/src/test/java/org/teiid/query/optimizer/TestInlineView.java
___________________________________________________________________
Modified: svn:mergeinfo
- /branches/7.4.x/engine/src/test/java/org/teiid/query/optimizer/TestInlineView.java:3149-3217
+ /branches/7.4.x/engine/src/test/java/org/teiid/query/optimizer/TestInlineView.java:3149-3217,3535-3555
Property changes on: trunk/engine/src/test/java/org/teiid/query/optimizer/TestJoinOptimization.java
___________________________________________________________________
Modified: svn:mergeinfo
- /branches/7.4.x/engine/src/test/java/org/teiid/query/optimizer/TestJoinOptimization.java:3149-3217
+ /branches/7.4.x/engine/src/test/java/org/teiid/query/optimizer/TestJoinOptimization.java:3149-3217,3535-3555
Property changes on: trunk/engine/src/test/java/org/teiid/query/optimizer/TestJoinPushdownRestrictions.java
___________________________________________________________________
Modified: svn:mergeinfo
- /branches/7.4.x/engine/src/test/java/org/teiid/query/optimizer/TestJoinPushdownRestrictions.java:3149-3217
+ /branches/7.4.x/engine/src/test/java/org/teiid/query/optimizer/TestJoinPushdownRestrictions.java:3149-3217,3535-3555
Property changes on: trunk/engine/src/test/java/org/teiid/query/optimizer/TestJoinWithFunction.java
___________________________________________________________________
Added: svn:mergeinfo
+ /branches/7.4.x/engine/src/test/java/org/teiid/query/optimizer/TestJoinWithFunction.java:3535-3555
Property changes on: trunk/engine/src/test/java/org/teiid/query/optimizer/TestLimit.java
___________________________________________________________________
Modified: svn:mergeinfo
- /branches/7.4.x/engine/src/test/java/org/teiid/query/optimizer/TestLimit.java:3149-3217
+ /branches/7.4.x/engine/src/test/java/org/teiid/query/optimizer/TestLimit.java:3149-3217,3535-3555
Property changes on: trunk/engine/src/test/java/org/teiid/query/optimizer/TestOptimizer.java
___________________________________________________________________
Modified: svn:mergeinfo
- /branches/7.4.x/engine/src/test/java/org/teiid/query/optimizer/TestOptimizer.java:3149-3217,3220-3275
+ /branches/7.4.x/engine/src/test/java/org/teiid/query/optimizer/TestOptimizer.java:3149-3217,3220-3275,3535-3555
Property changes on: trunk/engine/src/test/java/org/teiid/query/optimizer/TestOptionalJoins.java
___________________________________________________________________
Modified: svn:mergeinfo
- /branches/7.4.x/engine/src/test/java/org/teiid/query/optimizer/TestOptionalJoins.java:3149-3217,3220-3275
+ /branches/7.4.x/engine/src/test/java/org/teiid/query/optimizer/TestOptionalJoins.java:3149-3217,3220-3275,3535-3555
Property changes on: trunk/engine/src/test/java/org/teiid/query/optimizer/TestPartitionedJoinPlanning.java
___________________________________________________________________
Modified: svn:mergeinfo
- /branches/7.4.x/engine/src/test/java/org/teiid/query/optimizer/TestPartitionedJoinPlanning.java:3149-3217
+ /branches/7.4.x/engine/src/test/java/org/teiid/query/optimizer/TestPartitionedJoinPlanning.java:3149-3217,3535-3555
Property changes on: trunk/engine/src/test/java/org/teiid/query/optimizer/TestRuleMergeVirtual.java
___________________________________________________________________
Modified: svn:mergeinfo
- /branches/7.4.x/engine/src/test/java/org/teiid/query/optimizer/TestRuleMergeVirtual.java:3149-3217
+ /branches/7.4.x/engine/src/test/java/org/teiid/query/optimizer/TestRuleMergeVirtual.java:3149-3217,3535-3555
Property changes on: trunk/engine/src/test/java/org/teiid/query/optimizer/TestRuleRaiseNull.java
___________________________________________________________________
Modified: svn:mergeinfo
- /branches/7.4.x/engine/src/test/java/org/teiid/query/optimizer/TestRuleRaiseNull.java:3149-3217
+ /branches/7.4.x/engine/src/test/java/org/teiid/query/optimizer/TestRuleRaiseNull.java:3149-3217,3535-3555
Property changes on: trunk/engine/src/test/java/org/teiid/query/optimizer/TestRuleRemoveSorts.java
___________________________________________________________________
Modified: svn:mergeinfo
- /branches/7.4.x/engine/src/test/java/org/teiid/query/optimizer/TestRuleRemoveSorts.java:3149-3217
+ /branches/7.4.x/engine/src/test/java/org/teiid/query/optimizer/TestRuleRemoveSorts.java:3149-3217,3535-3555
Property changes on: trunk/engine/src/test/java/org/teiid/query/optimizer/TestSortOptimization.java
___________________________________________________________________
Modified: svn:mergeinfo
- /branches/7.4.x/engine/src/test/java/org/teiid/query/optimizer/TestSortOptimization.java:3149-3217
+ /branches/7.4.x/engine/src/test/java/org/teiid/query/optimizer/TestSortOptimization.java:3149-3217,3535-3555
Property changes on: trunk/engine/src/test/java/org/teiid/query/optimizer/TestStoredProcedurePlanning.java
___________________________________________________________________
Modified: svn:mergeinfo
- /branches/7.4.x/engine/src/test/java/org/teiid/query/optimizer/TestStoredProcedurePlanning.java:3149-3217
+ /branches/7.4.x/engine/src/test/java/org/teiid/query/optimizer/TestStoredProcedurePlanning.java:3149-3217,3535-3555
Property changes on: trunk/engine/src/test/java/org/teiid/query/optimizer/TestSubqueryPushdown.java
___________________________________________________________________
Modified: svn:mergeinfo
- /branches/7.4.x/engine/src/test/java/org/teiid/query/optimizer/TestSubqueryPushdown.java:3149-3217,3281-3325
+ /branches/7.4.x/engine/src/test/java/org/teiid/query/optimizer/TestSubqueryPushdown.java:3149-3217,3281-3325,3535-3555
Property changes on: trunk/engine/src/test/java/org/teiid/query/optimizer/TestUnionPlanning.java
___________________________________________________________________
Modified: svn:mergeinfo
- /branches/7.4.x/engine/src/test/java/org/teiid/query/optimizer/TestUnionPlanning.java:3149-3217
+ /branches/7.4.x/engine/src/test/java/org/teiid/query/optimizer/TestUnionPlanning.java:3149-3217,3535-3555
Property changes on: trunk/engine/src/test/java/org/teiid/query/optimizer/capabilities
___________________________________________________________________
Added: svn:mergeinfo
+ /branches/7.4.x/engine/src/test/java/org/teiid/query/optimizer/capabilities:3535-3555
Property changes on: trunk/engine/src/test/java/org/teiid/query/optimizer/proc
___________________________________________________________________
Added: svn:mergeinfo
+ /branches/7.4.x/engine/src/test/java/org/teiid/query/optimizer/proc:3535-3555
Property changes on: trunk/engine/src/test/java/org/teiid/query/optimizer/relational
___________________________________________________________________
Added: svn:mergeinfo
+ /branches/7.4.x/engine/src/test/java/org/teiid/query/optimizer/relational:3535-3555*
Property changes on: trunk/engine/src/test/java/org/teiid/query/optimizer/relational/TestAliasGenerator.java
___________________________________________________________________
Modified: svn:mergeinfo
- /branches/7.4.x/engine/src/test/java/org/teiid/query/optimizer/relational/TestAliasGenerator.java:3149-3217
+ /branches/7.4.x/engine/src/test/java/org/teiid/query/optimizer/relational/TestAliasGenerator.java:3149-3217,3535-3555
Property changes on: trunk/engine/src/test/java/org/teiid/query/optimizer/relational/TestMaterialization.java
___________________________________________________________________
Added: svn:mergeinfo
+ /branches/7.4.x/engine/src/test/java/org/teiid/query/optimizer/relational/TestMaterialization.java:3535-3555
Property changes on: trunk/engine/src/test/java/org/teiid/query/optimizer/relational/TestRuleStack.java
___________________________________________________________________
Added: svn:mergeinfo
+ /branches/7.4.x/engine/src/test/java/org/teiid/query/optimizer/relational/TestRuleStack.java:3535-3555
Property changes on: trunk/engine/src/test/java/org/teiid/query/optimizer/relational/plantree
___________________________________________________________________
Added: svn:mergeinfo
+ /branches/7.4.x/engine/src/test/java/org/teiid/query/optimizer/relational/plantree:3535-3555
Property changes on: trunk/engine/src/test/java/org/teiid/query/optimizer/relational/rules
___________________________________________________________________
Added: svn:mergeinfo
+ /branches/7.4.x/engine/src/test/java/org/teiid/query/optimizer/relational/rules:3535-3555
Property changes on: trunk/engine/src/test/java/org/teiid/query/optimizer/xml
___________________________________________________________________
Added: svn:mergeinfo
+ /branches/7.4.x/engine/src/test/java/org/teiid/query/optimizer/xml:3535-3555
Property changes on: trunk/engine/src/test/java/org/teiid/query/parser
___________________________________________________________________
Added: svn:mergeinfo
+ /branches/7.4.x/engine/src/test/java/org/teiid/query/parser:3535-3555
Property changes on: trunk/engine/src/test/java/org/teiid/query/processor
___________________________________________________________________
Added: svn:mergeinfo
+ /branches/7.4.x/engine/src/test/java/org/teiid/query/processor:3535-3555*
Property changes on: trunk/engine/src/test/java/org/teiid/query/processor/FakeDataManager.java
___________________________________________________________________
Modified: svn:mergeinfo
- /branches/7.4.x/engine/src/test/java/org/teiid/query/processor/FakeDataManager.java:3149-3217
+ /branches/7.4.x/engine/src/test/java/org/teiid/query/processor/FakeDataManager.java:3149-3217,3535-3555
Property changes on: trunk/engine/src/test/java/org/teiid/query/processor/FakeDataStore.java
___________________________________________________________________
Modified: svn:mergeinfo
- /branches/7.4.x/engine/src/test/java/org/teiid/query/processor/FakeDataStore.java:3149-3217
+ /branches/7.4.x/engine/src/test/java/org/teiid/query/processor/FakeDataStore.java:3149-3217,3535-3555
Property changes on: trunk/engine/src/test/java/org/teiid/query/processor/FakeProcessorPlan.java
___________________________________________________________________
Added: svn:mergeinfo
+ /branches/7.4.x/engine/src/test/java/org/teiid/query/processor/FakeProcessorPlan.java:3535-3555
Property changes on: trunk/engine/src/test/java/org/teiid/query/processor/FakeTupleSource.java
___________________________________________________________________
Added: svn:mergeinfo
+ /branches/7.4.x/engine/src/test/java/org/teiid/query/processor/FakeTupleSource.java:3535-3555
Property changes on: trunk/engine/src/test/java/org/teiid/query/processor/HardcodedDataManager.java
___________________________________________________________________
Added: svn:mergeinfo
+ /branches/7.4.x/engine/src/test/java/org/teiid/query/processor/HardcodedDataManager.java:3535-3555
Property changes on: trunk/engine/src/test/java/org/teiid/query/processor/TestAggregateProcessing.java
___________________________________________________________________
Modified: svn:mergeinfo
- /branches/7.4.x/engine/src/test/java/org/teiid/query/processor/TestAggregateProcessing.java:3149-3217,3220-3275
+ /branches/7.4.x/engine/src/test/java/org/teiid/query/processor/TestAggregateProcessing.java:3149-3217,3220-3275,3535-3555
Property changes on: trunk/engine/src/test/java/org/teiid/query/processor/TestArrayTable.java
___________________________________________________________________
Added: svn:mergeinfo
+ /branches/7.4.x/engine/src/test/java/org/teiid/query/processor/TestArrayTable.java:3535-3555
Property changes on: trunk/engine/src/test/java/org/teiid/query/processor/TestBaseProcessorPlan.java
___________________________________________________________________
Added: svn:mergeinfo
+ /branches/7.4.x/engine/src/test/java/org/teiid/query/processor/TestBaseProcessorPlan.java:3535-3555
Property changes on: trunk/engine/src/test/java/org/teiid/query/processor/TestBatchIterator.java
___________________________________________________________________
Added: svn:mergeinfo
+ /branches/7.4.x/engine/src/test/java/org/teiid/query/processor/TestBatchIterator.java:3535-3555
Property changes on: trunk/engine/src/test/java/org/teiid/query/processor/TestBatchedUpdatePlan.java
___________________________________________________________________
Added: svn:mergeinfo
+ /branches/7.4.x/engine/src/test/java/org/teiid/query/processor/TestBatchedUpdatePlan.java:3535-3555
Property changes on: trunk/engine/src/test/java/org/teiid/query/processor/TestCollectionTupleSource.java
___________________________________________________________________
Added: svn:mergeinfo
+ /branches/7.4.x/engine/src/test/java/org/teiid/query/processor/TestCollectionTupleSource.java:3535-3555
Property changes on: trunk/engine/src/test/java/org/teiid/query/processor/TestDependentJoins.java
___________________________________________________________________
Modified: svn:mergeinfo
- /branches/7.4.x/engine/src/test/java/org/teiid/query/processor/TestDependentJoins.java:3149-3217
+ /branches/7.4.x/engine/src/test/java/org/teiid/query/processor/TestDependentJoins.java:3149-3217,3535-3555
Property changes on: trunk/engine/src/test/java/org/teiid/query/processor/TestInherintlyUpdatableViews.java
___________________________________________________________________
Added: svn:mergeinfo
+ /branches/7.4.x/engine/src/test/java/org/teiid/query/processor/TestInherintlyUpdatableViews.java:3535-3555
Property changes on: trunk/engine/src/test/java/org/teiid/query/processor/TestInsertProcessing.java
___________________________________________________________________
Modified: svn:mergeinfo
- /branches/7.4.x/engine/src/test/java/org/teiid/query/processor/TestInsertProcessing.java:3149-3217
+ /branches/7.4.x/engine/src/test/java/org/teiid/query/processor/TestInsertProcessing.java:3149-3217,3535-3555
Property changes on: trunk/engine/src/test/java/org/teiid/query/processor/TestJoinWithFunction.java
___________________________________________________________________
Modified: svn:mergeinfo
- /branches/7.4.x/engine/src/test/java/org/teiid/query/processor/TestJoinWithFunction.java:3149-3217
+ /branches/7.4.x/engine/src/test/java/org/teiid/query/processor/TestJoinWithFunction.java:3149-3217,3535-3555
Property changes on: trunk/engine/src/test/java/org/teiid/query/processor/TestMaterialization.java
___________________________________________________________________
Added: svn:mergeinfo
+ /branches/7.4.x/engine/src/test/java/org/teiid/query/processor/TestMaterialization.java:3535-3555
Property changes on: trunk/engine/src/test/java/org/teiid/query/processor/TestOptionalJoins.java
___________________________________________________________________
Modified: svn:mergeinfo
- /branches/7.4.x/engine/src/test/java/org/teiid/query/processor/TestOptionalJoins.java:3149-3217
+ /branches/7.4.x/engine/src/test/java/org/teiid/query/processor/TestOptionalJoins.java:3149-3217,3535-3555
Property changes on: trunk/engine/src/test/java/org/teiid/query/processor/TestOrderByProcessing.java
___________________________________________________________________
Modified: svn:mergeinfo
- /branches/7.4.x/engine/src/test/java/org/teiid/query/processor/TestOrderByProcessing.java:3149-3217
+ /branches/7.4.x/engine/src/test/java/org/teiid/query/processor/TestOrderByProcessing.java:3149-3217,3535-3555
Modified: trunk/engine/src/test/java/org/teiid/query/processor/TestProcedureRelational.java
===================================================================
--- trunk/engine/src/test/java/org/teiid/query/processor/TestProcedureRelational.java 2011-10-18 10:45:34 UTC (rev 3556)
+++ trunk/engine/src/test/java/org/teiid/query/processor/TestProcedureRelational.java 2011-10-18 10:52:08 UTC (rev 3557)
@@ -753,4 +753,16 @@
TestProcessor.helpProcess(plan, dataManager, expected);
}
+ @Test public void testProcRelationalWithNoInputs1() {
+ String sql = "select e1 from pm1.sp1"; //$NON-NLS-1$
+
+ List<?>[] expected = new List[] {
+ Arrays.asList("c") //$NON-NLS-1$
+ };
+ HardcodedDataManager dataManager = new HardcodedDataManager();
+ dataManager.addData("EXEC pm1.sp1()", expected);
+ ProcessorPlan plan = TestProcessor.helpGetPlan(sql, RealMetadataFactory.createTransformationMetadata(RealMetadataFactory.example1Store(), "e1"));
+ TestProcessor.helpProcess(plan, dataManager, expected);
+ }
+
}
Property changes on: trunk/engine/src/test/java/org/teiid/query/processor/TestProcedureRelational.java
___________________________________________________________________
Modified: svn:mergeinfo
- /branches/7.4.x/engine/src/test/java/org/teiid/query/processor/TestProcedureRelational.java:3149-3217
+ /branches/7.4.x/engine/src/test/java/org/teiid/query/processor/TestProcedureRelational.java:3149-3217,3535-3555
Modified: trunk/engine/src/test/java/org/teiid/query/processor/TestProcessor.java
===================================================================
--- trunk/engine/src/test/java/org/teiid/query/processor/TestProcessor.java 2011-10-18 10:45:34 UTC (rev 3556)
+++ trunk/engine/src/test/java/org/teiid/query/processor/TestProcessor.java 2011-10-18 10:52:08 UTC (rev 3557)
@@ -7608,5 +7608,17 @@
helpProcess(plan, dataManager, expected);
}
+ @Test public void testCrossJoinReduction() throws Exception {
+ String sql = "select x.e2 from pm1.g2 y, pm1.g1 x where x.e1 = y.e1 and x.e1 = 'a'"; //$NON-NLS-1$
+
+ HardcodedDataManager dataManager = new HardcodedDataManager();
+ dataManager.addData("SELECT g_0.e2 FROM pm1.g1 AS g_0 WHERE g_0.e1 = 'a'", new List[] {Arrays.asList(3)});
+ dataManager.addData("SELECT 1 FROM pm1.g2 AS g_0 WHERE g_0.e1 = 'a'", new List[] {Arrays.asList(1)});
+ ProcessorPlan plan = helpGetPlan(sql, RealMetadataFactory.example1Cached(), TestOptimizer.getGenericFinder(false));
+
+ helpProcess(plan, dataManager, new List[] {
+ Arrays.asList(3)});
+ }
+
private static final boolean DEBUG = false;
}
Property changes on: trunk/engine/src/test/java/org/teiid/query/processor/TestProcessor.java
___________________________________________________________________
Modified: svn:mergeinfo
- /branches/7.4.x/engine/src/test/java/org/teiid/query/processor/TestProcessor.java:3149-3217,3220-3275
+ /branches/7.4.x/engine/src/test/java/org/teiid/query/processor/TestProcessor.java:3149-3217,3220-3275,3535-3555
Property changes on: trunk/engine/src/test/java/org/teiid/query/processor/TestQueryProcessor.java
___________________________________________________________________
Added: svn:mergeinfo
+ /branches/7.4.x/engine/src/test/java/org/teiid/query/processor/TestQueryProcessor.java:3535-3555
Property changes on: trunk/engine/src/test/java/org/teiid/query/processor/TestSQLXMLProcessing.java
___________________________________________________________________
Modified: svn:mergeinfo
- /branches/7.4.x/engine/src/test/java/org/teiid/query/processor/TestSQLXMLProcessing.java:3149-3217,3220-3275,3281-3325,3340-3349
+ /branches/7.4.x/engine/src/test/java/org/teiid/query/processor/TestSQLXMLProcessing.java:3149-3217,3220-3275,3281-3325,3340-3349,3535-3555
Property changes on: trunk/engine/src/test/java/org/teiid/query/processor/TestSecurityFunctions.java
___________________________________________________________________
Modified: svn:mergeinfo
- /branches/7.4.x/engine/src/test/java/org/teiid/query/processor/TestSecurityFunctions.java:3149-3217
+ /branches/7.4.x/engine/src/test/java/org/teiid/query/processor/TestSecurityFunctions.java:3149-3217,3535-3555
Property changes on: trunk/engine/src/test/java/org/teiid/query/processor/TestSetProcessing.java
___________________________________________________________________
Modified: svn:mergeinfo
- /branches/7.4.x/engine/src/test/java/org/teiid/query/processor/TestSetProcessing.java:3149-3217
+ /branches/7.4.x/engine/src/test/java/org/teiid/query/processor/TestSetProcessing.java:3149-3217,3535-3555
Property changes on: trunk/engine/src/test/java/org/teiid/query/processor/TestTempTables.java
___________________________________________________________________
Modified: svn:mergeinfo
- /branches/7.4.x/engine/src/test/java/org/teiid/query/processor/TestTempTables.java:3149-3217
+ /branches/7.4.x/engine/src/test/java/org/teiid/query/processor/TestTempTables.java:3149-3217,3535-3555
Property changes on: trunk/engine/src/test/java/org/teiid/query/processor/TestTextTable.java
___________________________________________________________________
Modified: svn:mergeinfo
- /branches/7.4.x/engine/src/test/java/org/teiid/query/processor/TestTextTable.java:3149-3217
+ /branches/7.4.x/engine/src/test/java/org/teiid/query/processor/TestTextTable.java:3149-3217,3535-3555
Property changes on: trunk/engine/src/test/java/org/teiid/query/processor/TestTriggerActions.java
___________________________________________________________________
Added: svn:mergeinfo
+ /branches/7.4.x/engine/src/test/java/org/teiid/query/processor/TestTriggerActions.java:3535-3555
Property changes on: trunk/engine/src/test/java/org/teiid/query/processor/TestVirtualDepJoin.java
___________________________________________________________________
Modified: svn:mergeinfo
- /branches/7.4.x/engine/src/test/java/org/teiid/query/processor/TestVirtualDepJoin.java:3149-3217
+ /branches/7.4.x/engine/src/test/java/org/teiid/query/processor/TestVirtualDepJoin.java:3149-3217,3535-3555
Property changes on: trunk/engine/src/test/java/org/teiid/query/processor/TestWindowFunctions.java
___________________________________________________________________
Added: svn:mergeinfo
+ /branches/7.4.x/engine/src/test/java/org/teiid/query/processor/TestWindowFunctions.java:3535-3555
Property changes on: trunk/engine/src/test/java/org/teiid/query/processor/TestWithClauseProcessing.java
___________________________________________________________________
Modified: svn:mergeinfo
- /branches/7.4.x/engine/src/test/java/org/teiid/query/processor/TestWithClauseProcessing.java:3149-3217
+ /branches/7.4.x/engine/src/test/java/org/teiid/query/processor/TestWithClauseProcessing.java:3149-3217,3535-3555
Property changes on: trunk/engine/src/test/java/org/teiid/query/processor/eval
___________________________________________________________________
Added: svn:mergeinfo
+ /branches/7.4.x/engine/src/test/java/org/teiid/query/processor/eval:3535-3555
Property changes on: trunk/engine/src/test/java/org/teiid/query/processor/proc
___________________________________________________________________
Added: svn:mergeinfo
+ /branches/7.4.x/engine/src/test/java/org/teiid/query/processor/proc:3535-3555
Property changes on: trunk/engine/src/test/java/org/teiid/query/processor/relational
___________________________________________________________________
Added: svn:mergeinfo
+ /branches/7.4.x/engine/src/test/java/org/teiid/query/processor/relational:3535-3555
Property changes on: trunk/engine/src/test/java/org/teiid/query/processor/xml
___________________________________________________________________
Added: svn:mergeinfo
+ /branches/7.4.x/engine/src/test/java/org/teiid/query/processor/xml:3535-3555
Property changes on: trunk/engine/src/test/java/org/teiid/query/resolver
___________________________________________________________________
Added: svn:mergeinfo
+ /branches/7.4.x/engine/src/test/java/org/teiid/query/resolver:3535-3555
Property changes on: trunk/engine/src/test/java/org/teiid/query/rewriter
___________________________________________________________________
Added: svn:mergeinfo
+ /branches/7.4.x/engine/src/test/java/org/teiid/query/rewriter:3535-3555
Property changes on: trunk/engine/src/test/java/org/teiid/query/sql
___________________________________________________________________
Added: svn:mergeinfo
+ /branches/7.4.x/engine/src/test/java/org/teiid/query/sql:3535-3555*
Property changes on: trunk/engine/src/test/java/org/teiid/query/sql/lang
___________________________________________________________________
Added: svn:mergeinfo
+ /branches/7.4.x/engine/src/test/java/org/teiid/query/sql/lang:3535-3555
Property changes on: trunk/engine/src/test/java/org/teiid/query/sql/proc
___________________________________________________________________
Added: svn:mergeinfo
+ /branches/7.4.x/engine/src/test/java/org/teiid/query/sql/proc:3535-3555
Property changes on: trunk/engine/src/test/java/org/teiid/query/sql/symbol
___________________________________________________________________
Added: svn:mergeinfo
+ /branches/7.4.x/engine/src/test/java/org/teiid/query/sql/symbol:3535-3555
Property changes on: trunk/engine/src/test/java/org/teiid/query/sql/util
___________________________________________________________________
Added: svn:mergeinfo
+ /branches/7.4.x/engine/src/test/java/org/teiid/query/sql/util:3535-3555
Property changes on: trunk/engine/src/test/java/org/teiid/query/sql/visitor
___________________________________________________________________
Added: svn:mergeinfo
+ /branches/7.4.x/engine/src/test/java/org/teiid/query/sql/visitor:3535-3555
Property changes on: trunk/engine/src/test/java/org/teiid/query/unittest
___________________________________________________________________
Added: svn:mergeinfo
+ /branches/7.4.x/engine/src/test/java/org/teiid/query/unittest:3535-3555
Property changes on: trunk/engine/src/test/java/org/teiid/query/util
___________________________________________________________________
Added: svn:mergeinfo
+ /branches/7.4.x/engine/src/test/java/org/teiid/query/util:3535-3555
Property changes on: trunk/engine/src/test/java/org/teiid/query/validator
___________________________________________________________________
Added: svn:mergeinfo
+ /branches/7.4.x/engine/src/test/java/org/teiid/query/validator:3535-3555
Property changes on: trunk/engine/src/test/java/org/teiid/vdb
___________________________________________________________________
Added: svn:mergeinfo
+ /branches/7.4.x/engine/src/test/java/org/teiid/vdb:3535-3555*
Property changes on: trunk/engine/src/test/java/org/teiid/vdb/runtime
___________________________________________________________________
Added: svn:mergeinfo
+ /branches/7.4.x/engine/src/test/java/org/teiid/vdb/runtime:3535-3555
Property changes on: trunk/engine/src/test/resources/text
___________________________________________________________________
Added: svn:mergeinfo
+ /branches/7.4.x/engine/src/test/resources/text:3535-3555*
Property changes on: trunk/engine/src/test/resources/text/TextParts_HeaderRow2.csv
___________________________________________________________________
Added: svn:mergeinfo
+ /branches/7.4.x/engine/src/test/resources/text/TextParts_HeaderRow2.csv:3535-3555
Property changes on: trunk/engine/src/test/resources/text/cdm_dos.txt
___________________________________________________________________
Added: svn:mergeinfo
+ /branches/7.4.x/engine/src/test/resources/text/cdm_dos.txt:3535-3555
Property changes on: trunk/engine/src/test/resources/text/cdm_dos_win.txt
___________________________________________________________________
Modified: svn:mergeinfo
- /branches/7.4.x/engine/src/test/resources/text/cdm_dos_win.txt:3149-3217
+ /branches/7.4.x/engine/src/test/resources/text/cdm_dos_win.txt:3149-3217,3535-3555
Property changes on: trunk/engine/src/test/resources/text/test-file.txt.csv
___________________________________________________________________
Added: svn:mergeinfo
+ /branches/7.4.x/engine/src/test/resources/text/test-file.txt.csv:3535-3555
Property changes on: trunk/metadata/src/main/resources/org
___________________________________________________________________
Deleted: svn:mergeinfo
-
Property changes on: trunk/metadata/src/main/resources/org/teiid
___________________________________________________________________
Deleted: svn:mergeinfo
-
Property changes on: trunk/metadata/src/main/resources/org/teiid/metadata/i18n.properties
___________________________________________________________________
Deleted: svn:mergeinfo
-
Property changes on: trunk/metadata/src/test/java/org/teiid/cdk
___________________________________________________________________
Added: svn:mergeinfo
+ /branches/7.4.x/metadata/src/test/java/org/teiid/cdk:3535-3555*
Property changes on: trunk/metadata/src/test/java/org/teiid/cdk/api
___________________________________________________________________
Added: svn:mergeinfo
+ /branches/7.4.x/metadata/src/test/java/org/teiid/cdk/api:3535-3555
Property changes on: trunk/metadata/src/test/java/org/teiid/cdk/unittest
___________________________________________________________________
Added: svn:mergeinfo
+ /branches/7.4.x/metadata/src/test/java/org/teiid/cdk/unittest:3535-3555
Property changes on: trunk/metadata/src/test/java/org/teiid/core
___________________________________________________________________
Added: svn:mergeinfo
+ /branches/7.4.x/metadata/src/test/java/org/teiid/core:3535-3555*
Property changes on: trunk/metadata/src/test/java/org/teiid/core/util
___________________________________________________________________
Added: svn:mergeinfo
+ /branches/7.4.x/metadata/src/test/java/org/teiid/core/util:3535-3555
Property changes on: trunk/metadata/src/test/java/org/teiid/internal
___________________________________________________________________
Added: svn:mergeinfo
+ /branches/7.4.x/metadata/src/test/java/org/teiid/internal:3535-3555*
Property changes on: trunk/metadata/src/test/java/org/teiid/internal/core
___________________________________________________________________
Added: svn:mergeinfo
+ /branches/7.4.x/metadata/src/test/java/org/teiid/internal/core:3535-3555*
Property changes on: trunk/metadata/src/test/java/org/teiid/internal/core/index
___________________________________________________________________
Added: svn:mergeinfo
+ /branches/7.4.x/metadata/src/test/java/org/teiid/internal/core/index:3535-3555
Property changes on: trunk/runtime/src/main/java/org/teiid/deployers/VirtualDatabaseException.java
___________________________________________________________________
Deleted: svn:mergeinfo
-
Property changes on: trunk/runtime/src/main/java/org/teiid/transport/SSLAwareChannelHandler.java
___________________________________________________________________
Deleted: svn:mergeinfo
-
Property changes on: trunk/runtime/src/main/java/org/teiid/transport/SSLConfiguration.java
___________________________________________________________________
Modified: svn:mergeinfo
-
+ /branches/7.4.x/runtime/src/main/java/org/teiid/transport/SSLConfiguration.java:3535-3555
Modified: trunk/runtime/src/main/java/org/teiid/transport/SocketClientInstance.java
===================================================================
--- trunk/runtime/src/main/java/org/teiid/transport/SocketClientInstance.java 2011-10-18 10:45:34 UTC (rev 3556)
+++ trunk/runtime/src/main/java/org/teiid/transport/SocketClientInstance.java 2011-10-18 10:52:08 UTC (rev 3557)
@@ -33,6 +33,7 @@
import org.teiid.core.crypto.DhKeyGenerator;
import org.teiid.core.crypto.NullCryptor;
import org.teiid.dqp.internal.process.DQPWorkContext;
+import org.teiid.dqp.internal.process.DQPWorkContext.Version;
import org.teiid.logging.LogConstants;
import org.teiid.logging.LogManager;
import org.teiid.logging.MessageLevel;
@@ -125,6 +126,8 @@
}
private void receivedHahdshake(Handshake handshake) throws CommunicationException {
+ String clientVersion = handshake.getVersion();
+ this.workContext.setClientVersion(Version.getVersion(clientVersion));
if (usingEncryption) {
byte[] returnedPublicKey = handshake.getPublicKey();
Property changes on: trunk/runtime/src/main/java/org/teiid/transport/pg
___________________________________________________________________
Added: svn:mergeinfo
+ /branches/7.4.x/runtime/src/main/java/org/teiid/transport/pg:3535-3555*
Property changes on: trunk/runtime/src/main/java/org/teiid/transport/pg/PGbytea.java
___________________________________________________________________
Added: svn:mergeinfo
+ /branches/7.4.x/runtime/src/main/java/org/teiid/transport/pg/PGbytea.java:3535-3555
Property changes on: trunk/runtime/src/main/resources/org/teiid/transport
___________________________________________________________________
Added: svn:mergeinfo
+ /branches/7.4.x/runtime/src/main/resources/org/teiid/transport:3535-3555*
Property changes on: trunk/runtime/src/test/java/org/teiid/dqp
___________________________________________________________________
Added: svn:mergeinfo
+ /branches/7.4.x/runtime/src/test/java/org/teiid/dqp:3535-3555*
Property changes on: trunk/runtime/src/test/java/org/teiid/dqp/service
___________________________________________________________________
Added: svn:mergeinfo
+ /branches/7.4.x/runtime/src/test/java/org/teiid/dqp/service:3535-3555*
Property changes on: trunk/runtime/src/test/java/org/teiid/dqp/service/buffer
___________________________________________________________________
Added: svn:mergeinfo
+ /branches/7.4.x/runtime/src/test/java/org/teiid/dqp/service/buffer:3535-3555
Property changes on: trunk/runtime/src/test/resources/dqp/config
___________________________________________________________________
Deleted: svn:mergeinfo
-
Property changes on: trunk/runtime/src/test/resources/groups.properties
___________________________________________________________________
Deleted: svn:mergeinfo
-
Property changes on: trunk/runtime/src/test/resources/permissions.xml
___________________________________________________________________
Deleted: svn:mergeinfo
-
Property changes on: trunk/runtime/src/test/resources/permissions2.xml
___________________________________________________________________
Deleted: svn:mergeinfo
-
Property changes on: trunk/runtime/src/test/resources/users.properties
___________________________________________________________________
Deleted: svn:mergeinfo
-
Property changes on: trunk/test-integration/common/src/test/java/org/teiid/cdk
___________________________________________________________________
Added: svn:mergeinfo
+ /branches/7.4.x/test-integration/common/src/test/java/org/teiid/cdk:3535-3555*
Property changes on: trunk/test-integration/common/src/test/java/org/teiid/cdk/api
___________________________________________________________________
Added: svn:mergeinfo
+ /branches/7.4.x/test-integration/common/src/test/java/org/teiid/cdk/api:3535-3555
Property changes on: trunk/test-integration/common/src/test/java/org/teiid/connector/language
___________________________________________________________________
Deleted: svn:mergeinfo
-
Property changes on: trunk/test-integration/common/src/test/java/org/teiid/connector/metadata/runtime
___________________________________________________________________
Deleted: svn:mergeinfo
-
Property changes on: trunk/test-integration/common/src/test/java/org/teiid/connector/metadata/runtime/TestMetadataObject.java
___________________________________________________________________
Deleted: svn:mergeinfo
-
Property changes on: trunk/test-integration/common/src/test/java/org/teiid/connector/visitor/util
___________________________________________________________________
Deleted: svn:mergeinfo
-
Property changes on: trunk/test-integration/common/src/test/java/org/teiid/dqp
___________________________________________________________________
Added: svn:mergeinfo
+ /branches/7.4.x/test-integration/common/src/test/java/org/teiid/dqp:3535-3555*
Property changes on: trunk/test-integration/common/src/test/java/org/teiid/dqp/internal
___________________________________________________________________
Added: svn:mergeinfo
+ /branches/7.4.x/test-integration/common/src/test/java/org/teiid/dqp/internal:3535-3555*
Property changes on: trunk/test-integration/common/src/test/java/org/teiid/dqp/internal/process
___________________________________________________________________
Added: svn:mergeinfo
+ /branches/7.4.x/test-integration/common/src/test/java/org/teiid/dqp/internal/process:3535-3555
Property changes on: trunk/test-integration/common/src/test/java/org/teiid/transport
___________________________________________________________________
Added: svn:mergeinfo
+ /branches/7.4.x/test-integration/common/src/test/java/org/teiid/transport:3535-3555*
Property changes on: trunk/test-integration/common/src/test/java/org/teiid/transport/TestJDBCSocketTransport.java
___________________________________________________________________
Modified: svn:mergeinfo
- /branches/7.4.x/test-integration/common/src/test/java/org/teiid/transport/TestJDBCSocketTransport.java:3455-3509
+ /branches/7.4.x/test-integration/common/src/test/java/org/teiid/transport/TestJDBCSocketTransport.java:3455-3509,3535-3555
Property changes on: trunk/test-integration/common/src/test/java/org/teiid/transport/TestODBCSocketTransport.java
___________________________________________________________________
Modified: svn:mergeinfo
- /branches/7.4.x/test-integration/common/src/test/java/org/teiid/transport/TestODBCSocketTransport.java:3149-3217,3281-3325
+ /branches/7.4.x/test-integration/common/src/test/java/org/teiid/transport/TestODBCSocketTransport.java:3149-3217,3281-3325,3535-3555
Property changes on: trunk/test-integration/common/src/test/resources/TestJDBCSocketTransport
___________________________________________________________________
Added: svn:mergeinfo
+ /branches/7.4.x/test-integration/common/src/test/resources/TestJDBCSocketTransport:3535-3555*
Property changes on: trunk/test-integration/common/src/test/resources/TestJDBCSocketTransport/testSelect.expected
___________________________________________________________________
Added: svn:mergeinfo
+ /branches/7.4.x/test-integration/common/src/test/resources/TestJDBCSocketTransport/testSelect.expected:3535-3555
Property changes on: trunk/test-integration/common/src/test/resources/TestODBCSocketTransport
___________________________________________________________________
Added: svn:mergeinfo
+ /branches/7.4.x/test-integration/common/src/test/resources/TestODBCSocketTransport:3535-3555*
Property changes on: trunk/test-integration/common/src/test/resources/TestODBCSocketTransport/testColumnMetadataWithAlias.expected
___________________________________________________________________
Added: svn:mergeinfo
+ /branches/7.4.x/test-integration/common/src/test/resources/TestODBCSocketTransport/testColumnMetadataWithAlias.expected:3535-3555
Property changes on: trunk/test-integration/common/src/test/resources/TestODBCSocketTransport/testPk.expected
___________________________________________________________________
Modified: svn:mergeinfo
- /branches/7.4.x/test-integration/common/src/test/resources/TestODBCSocketTransport/testPk.expected:3281-3325
+ /branches/7.4.x/test-integration/common/src/test/resources/TestODBCSocketTransport/testPk.expected:3281-3325,3535-3555
Property changes on: trunk/test-integration/common/src/test/resources/TestODBCSocketTransport/testPkPrepared.expected
___________________________________________________________________
Modified: svn:mergeinfo
- /branches/7.4.x/test-integration/common/src/test/resources/TestODBCSocketTransport/testPkPrepared.expected:3281-3325
+ /branches/7.4.x/test-integration/common/src/test/resources/TestODBCSocketTransport/testPkPrepared.expected:3281-3325,3535-3555
Property changes on: trunk/test-integration/common/src/test/resources/TestODBCSocketTransport/testSelect.expected
___________________________________________________________________
Added: svn:mergeinfo
+ /branches/7.4.x/test-integration/common/src/test/resources/TestODBCSocketTransport/testSelect.expected:3535-3555
Property changes on: trunk/test-integration/common/src/test/resources/TestSystemVirtualModel
___________________________________________________________________
Added: svn:mergeinfo
+ /branches/7.4.x/test-integration/common/src/test/resources/TestSystemVirtualModel:3535-3555*
Property changes on: trunk/test-integration/common/src/test/resources/TestSystemVirtualModel/testColumns.expected
___________________________________________________________________
Added: svn:mergeinfo
+ /branches/7.4.x/test-integration/common/src/test/resources/TestSystemVirtualModel/testColumns.expected:3535-3555
Property changes on: trunk/test-integration/common/src/test/resources/TestSystemVirtualModel/testDataTypes.expected
___________________________________________________________________
Added: svn:mergeinfo
+ /branches/7.4.x/test-integration/common/src/test/resources/TestSystemVirtualModel/testDataTypes.expected:3535-3555
Property changes on: trunk/test-integration/common/src/test/resources/TestSystemVirtualModel/testKeyColumns.expected
___________________________________________________________________
Added: svn:mergeinfo
+ /branches/7.4.x/test-integration/common/src/test/resources/TestSystemVirtualModel/testKeyColumns.expected:3535-3555
Property changes on: trunk/test-integration/common/src/test/resources/TestSystemVirtualModel/testKeys.expected
___________________________________________________________________
Added: svn:mergeinfo
+ /branches/7.4.x/test-integration/common/src/test/resources/TestSystemVirtualModel/testKeys.expected:3535-3555
Property changes on: trunk/test-integration/common/src/test/resources/TestSystemVirtualModel/testProcedureParams.expected
___________________________________________________________________
Modified: svn:mergeinfo
- /branches/7.4.x/test-integration/common/src/test/resources/TestSystemVirtualModel/testProcedureParams.expected:3220-3275
+ /branches/7.4.x/test-integration/common/src/test/resources/TestSystemVirtualModel/testProcedureParams.expected:3220-3275,3535-3555
Property changes on: trunk/test-integration/common/src/test/resources/TestSystemVirtualModel/testProcedures.expected
___________________________________________________________________
Modified: svn:mergeinfo
- /branches/7.4.x/test-integration/common/src/test/resources/TestSystemVirtualModel/testProcedures.expected:3220-3275
+ /branches/7.4.x/test-integration/common/src/test/resources/TestSystemVirtualModel/testProcedures.expected:3220-3275,3535-3555
Property changes on: trunk/test-integration/common/src/test/resources/TestSystemVirtualModel/testReferenceKeyColumns.expected
___________________________________________________________________
Added: svn:mergeinfo
+ /branches/7.4.x/test-integration/common/src/test/resources/TestSystemVirtualModel/testReferenceKeyColumns.expected:3535-3555
Property changes on: trunk/test-integration/common/src/test/resources/TestSystemVirtualModel/testSchemas.expected
___________________________________________________________________
Added: svn:mergeinfo
+ /branches/7.4.x/test-integration/common/src/test/resources/TestSystemVirtualModel/testSchemas.expected:3535-3555
Property changes on: trunk/test-integration/common/src/test/resources/TestSystemVirtualModel/testTableIsSystem.expected
___________________________________________________________________
Added: svn:mergeinfo
+ /branches/7.4.x/test-integration/common/src/test/resources/TestSystemVirtualModel/testTableIsSystem.expected:3535-3555
Property changes on: trunk/test-integration/common/src/test/resources/TestSystemVirtualModel/testTables.expected
___________________________________________________________________
Added: svn:mergeinfo
+ /branches/7.4.x/test-integration/common/src/test/resources/TestSystemVirtualModel/testTables.expected:3535-3555
Property changes on: trunk/test-integration/common/src/test/resources/TestSystemVirtualModel/testVDBResources.expected
___________________________________________________________________
Added: svn:mergeinfo
+ /branches/7.4.x/test-integration/common/src/test/resources/TestSystemVirtualModel/testVDBResources.expected:3535-3555
Property changes on: trunk/test-integration/db/src/main/java/org/teiid/internal
___________________________________________________________________
Added: svn:mergeinfo
+ /branches/7.4.x/test-integration/db/src/main/java/org/teiid/internal:3535-3555*
Property changes on: trunk/test-integration/db/src/main/java/org/teiid/internal/core
___________________________________________________________________
Added: svn:mergeinfo
+ /branches/7.4.x/test-integration/db/src/main/java/org/teiid/internal/core:3535-3555*
Property changes on: trunk/test-integration/db/src/main/java/org/teiid/internal/core/xml
___________________________________________________________________
Added: svn:mergeinfo
+ /branches/7.4.x/test-integration/db/src/main/java/org/teiid/internal/core/xml:3535-3555
Property changes on: trunk/test-integration/db/src/test/java/com
___________________________________________________________________
Added: svn:mergeinfo
+ /branches/7.4.x/test-integration/db/src/test/java/com:3535-3555*
Property changes on: trunk/test-integration/db/src/test/java/org/teiid/internal
___________________________________________________________________
Added: svn:mergeinfo
+ /branches/7.4.x/test-integration/db/src/test/java/org/teiid/internal:3535-3555*
Property changes on: trunk/test-integration/db/src/test/java/org/teiid/internal/core
___________________________________________________________________
Added: svn:mergeinfo
+ /branches/7.4.x/test-integration/db/src/test/java/org/teiid/internal/core:3535-3555*
12 years, 6 months
teiid SVN: r3556 - trunk/documentation/admin-guide/src/main/docbook/en-US/content.
by teiid-commits@lists.jboss.org
Author: shawkins
Date: 2011-10-18 06:45:34 -0400 (Tue, 18 Oct 2011)
New Revision: 3556
Modified:
trunk/documentation/admin-guide/src/main/docbook/en-US/content/security.xml
Log:
correcting program listing whitespace
Modified: trunk/documentation/admin-guide/src/main/docbook/en-US/content/security.xml
===================================================================
--- trunk/documentation/admin-guide/src/main/docbook/en-US/content/security.xml 2011-10-18 03:37:06 UTC (rev 3555)
+++ trunk/documentation/admin-guide/src/main/docbook/en-US/content/security.xml 2011-10-18 10:45:34 UTC (rev 3556)
@@ -180,53 +180,47 @@
<section>
<title>Remote Connections</title>
<para>On the server, edit the &jboss-beans; under the "SessionService" bean definition, as follows:
- <programlisting><![CDATA[
- <!-- Sets the authentication Type -->
- <property name="authenticationType">KRB5</property>
- <!-- Security domain used for kerberos authentication -->
- <property name="krb5SecurityDomain">teiid-krb5</property>
- ]]></programlisting>
+ <programlisting><![CDATA[<!-- Sets the authentication Type -->
+<property name="authenticationType">KRB5</property>
+<!-- Security domain used for kerberos authentication -->
+<property name="krb5SecurityDomain">teiid-krb5</property>]]></programlisting>
Now we need to define a security domain context for kerberos with the name mentioned in above.
Since kerberos authorization cannot define authorization roles, we'll define them using another login context.
Given below is a sample configuration to define roles using a UserRolesLoginModule.
<note><para>This configuration replaces the default Teiid login configuration, and you should change the principal
and key tab locations accordingly.</para></note>
- <programlisting><![CDATA[
- <!--login module that negotiates the login conext for kerberos -->
- <application-policy xmlns="urn:jboss:security-beans:1.0" name="teiid-krb5">
- <authentication>
- <login-module code="com.sun.security.auth.module.Krb5LoginModule" flag="required">
- <module-option name="storeKey">true</module-option>
- <module-option name="useKeyTab">true</module-option>
- <module-option name="principal">demo(a)EXAMPLE.COM</module-option>
- <module-option name="keyTab">path/to/krb5.keytab</module-option>
- <module-option name="doNotPrompt">true</module-option>
- <module-option name="debug">false</module-option>
- </login-module>
- </authentication>
- </application-policy>
-
- <!-- teiid's default security domain, replace this with your own if needs to be any other JAAS domain -->
- <application-policy xmlns="urn:jboss:security-beans:1.0" name="teiid-security">
- <authentication>
- <!-- This module assosiates kerberos user with this login set of login modules -->
- <login-module code="org.teiid.jboss.AssosiateCallerIdentityLoginModule" flag="required"/>
- <!-- Login module used for defining roles for user authencated using kerberos, keep the users file empty
- but provide roles in the roles file for users -->
- <login-module code="org.jboss.security.auth.spi.UsersRolesLoginModule" flag="required">
- <module-option name="password-stacking">useFirstPass</module-option>
- <module-option name="usersProperties">props/teiid-security-users.properties</module-option>
- <module-option name="rolesProperties">props/teiid-security-roles.properties</module-option>
- </login-module>
- </authentication>
- </application-policy>
- ]]></programlisting>
+ <programlisting><![CDATA[<!--login module that negotiates the login conext for kerberos -->
+<application-policy xmlns="urn:jboss:security-beans:1.0" name="teiid-krb5">
+ <authentication>
+ <login-module code="com.sun.security.auth.module.Krb5LoginModule" flag="required">
+ <module-option name="storeKey">true</module-option>
+ <module-option name="useKeyTab">true</module-option>
+ <module-option name="principal">demo(a)EXAMPLE.COM</module-option>
+ <module-option name="keyTab">path/to/krb5.keytab</module-option>
+ <module-option name="doNotPrompt">true</module-option>
+ <module-option name="debug">false</module-option>
+ </login-module>
+ </authentication>
+</application-policy>
+
+<!-- teiid's default security domain, replace this with your own if needs to be any other JAAS domain -->
+<application-policy xmlns="urn:jboss:security-beans:1.0" name="teiid-security">
+ <authentication>
+ <!-- This module assosiates kerberos user with this login set of login modules -->
+ <login-module code="org.teiid.jboss.AssosiateCallerIdentityLoginModule" flag="required"/>
+ <!-- Login module used for defining roles for user authencated using kerberos, keep the users file empty
+ but provide roles in the roles file for users -->
+ <login-module code="org.jboss.security.auth.spi.UsersRolesLoginModule" flag="required">
+ <module-option name="password-stacking">useFirstPass</module-option>
+ <module-option name="usersProperties">props/teiid-security-users.properties</module-option>
+ <module-option name="rolesProperties">props/teiid-security-roles.properties</module-option>
+ </login-module>
+ </authentication>
+</application-policy>]]></programlisting>
Edit the "run.conf" or "run.conf.bat" file depending upon the environment in the "${jboss-as}/bin" directory
and add the following JVM options (changing the realm and KDC settings according to your environment)
- <programlisting><![CDATA[
- JAVA_OPTS = "$JAVA_OPTS -Djava.security.krb5.realm=EXAMPLE.COM -Djava.security.krb5.kdc=kerberos.example.com -Djavax.security.auth.useSubjectCredsOnly=false"
- ]]></programlisting>
+ <programlisting><![CDATA[JAVA_OPTS = "$JAVA_OPTS -Djava.security.krb5.realm=EXAMPLE.COM -Djava.security.krb5.kdc=kerberos.example.com -Djavax.security.auth.useSubjectCredsOnly=false"]]></programlisting>
This finishes the configuration on the server side, restart the server and make sure that there were no errors during startup.
</para>
@@ -235,33 +229,27 @@
<para>In you client VM the JAAS
configuration for kerberos authentication needs to be written. A sample configuration file (client.conf) is show below
- <programlisting><![CDATA[
- Client {
- com.sun.security.auth.module.Krb5LoginModule required
- useTicketCache=true
- storeKey=true
- useKeyTab=true
- keyTab="/path/to/krb5.keytab"
- doNotPrompt=false
- debug=false
- principal="demo(a)EXAMPLE.COM";
- };
- ]]></programlisting>
+ <programlisting><![CDATA[Client {
+ com.sun.security.auth.module.Krb5LoginModule required
+ useTicketCache=true
+ storeKey=true
+ useKeyTab=true
+ keyTab="/path/to/krb5.keytab"
+ doNotPrompt=false
+ debug=false
+ principal="demo(a)EXAMPLE.COM";
+};]]></programlisting>
Add the following JVM options to your client's startup script - change Realm and KDC settings according to
your environment
- <programlisting><![CDATA[
- -Djava.security.krb5.realm=EXAMPLE.COM
- -Djava.security.krb5.kdc=kerberos.example.com
- -Djavax.security.auth.useSubjectCredsOnly=false
- -Dsun.security.krb5.debug=false
- -Djava.security.auth.login.config=/path/to/client.conf
- ]]></programlisting>
+ <programlisting><![CDATA[-Djava.security.krb5.realm=EXAMPLE.COM
+-Djava.security.krb5.kdc=kerberos.example.com
+-Djavax.security.auth.useSubjectCredsOnly=false
+-Dsun.security.krb5.debug=false
+-Djava.security.auth.login.config=/path/to/client.conf]]></programlisting>
Add the following URL connection properties to Teiid JDBC connection string
- <programlisting><![CDATA[
- authenticationType=KRB5;jaasName=Client;kerberosServicePrincipleName=demo(a)EXAMPLE.COM
- ]]></programlisting>
+ <programlisting><![CDATA[authenticationType=KRB5;jaasName=Client;kerberosServicePrincipleName=demo(a)EXAMPLE.COM]]></programlisting>
There is no need to provide the user name and password, when the application is trying to make JDBC connection it
will authenticate locally and use the same user credetinals to neogitiate service token with server and grant the
connection. See Client Developer's guide for information on connection properties and how to configure data sources.
@@ -292,31 +280,27 @@
data source. Here is a sample configuration, this needs to be configured in "teiid-jboss-beans.xml" file.
</para>
- <programlisting><![CDATA[
- <application-policy xmlns="urn:jboss:security-beans:1.0" name="teiid-security">
- <authentication>
+ <programlisting><![CDATA[<application-policy xmlns="urn:jboss:security-beans:1.0" name="teiid-security">
+ <authentication>
+
+ <login-module code="org.jboss.security.auth.spi.UsersRolesLoginModule" flag="required">
+ <module-option name = "password-stacking">useFirstPass</module-option>
+ <module-option name="usersProperties">props/teiid-security-users.properties</module-option>
+ <module-option name="rolesProperties">props/teiid-security-roles.properties</module-option>
+ </login-module>
+
+ <login-module code="org.jboss.resource.security.CallerIdentityLoginModule" flag="required">
+ <module-option name = "password-stacking">useFirstPass</module-option>
+ <module-option name = "managedConnectionFactoryName">jboss.jca:service=LocalTxCM,name=DefaultDS</module-option>
+ </login-module>
+
+ </authentication>
+</application-policy>]]></programlisting>
- <login-module code="org.jboss.security.auth.spi.UsersRolesLoginModule" flag="required">
- <module-option name = "password-stacking">useFirstPass</module-option>
- <module-option name="usersProperties">props/teiid-security-users.properties</module-option>
- <module-option name="rolesProperties">props/teiid-security-roles.properties</module-option>
- </login-module>
-
- <login-module code="org.jboss.resource.security.CallerIdentityLoginModule" flag="required">
- <module-option name = "password-stacking">useFirstPass</module-option>
- <module-option name = "managedConnectionFactoryName">jboss.jca:service=LocalTxCM,name=DefaultDS</module-option>
- </login-module>
-
- </authentication>
- </application-policy>
- ]]></programlisting>
-
<para>In the -ds.xml file that is defined as the "managedConnectionFactoryName" in the above configuration,
you need to add the following element</para>
- <programlisting><![CDATA[
- <security-domain>teiid-security</security-domain>
- ]]></programlisting>
+ <programlisting><![CDATA[<security-domain>teiid-security</security-domain>]]></programlisting>
<para>In the above configuration example, in the primary login module "UsersRolesLoginModule" is setup to hold the
passwords in the file, and when user logs in with password, the same password will be also set on the logged in Subject after
@@ -341,31 +325,27 @@
map to different roles. If a user has multiple roles, the first role that has the credential will be chosen.
Below find the sample configuration.</para>
- <programlisting><![CDATA[
- <application-policy xmlns="urn:jboss:security-beans:1.0" name="teiid-security">
- <authentication>
-
- <login-module code="org.jboss.security.auth.spi.UsersRolesLoginModule" flag="required">
- <module-option name = "password-stacking">useFirstPass</module-option>
- <module-option name="usersProperties">props/teiid-security-users.properties</module-option>
- <module-option name="rolesProperties">props/teiid-security-roles.properties</module-option>
- </login-module>
-
- <login-module code="org.teiid.jboss.RoleBasedCredentialMapIdentityLoginModule" flag="required">
- <module-option name = "password-stacking">useFirstPass</module-option>
- <module-option name="credentialMap">props/teiid-credentialmap.properties</module-option>
- <module-option name = "managedConnectionFactoryName">jboss.jca:service=LocalTxCM,name=DefaultDS</module-option>
- </login-module>
-
- </authentication>
- </application-policy>
- ]]></programlisting>
+ <programlisting><![CDATA[<application-policy xmlns="urn:jboss:security-beans:1.0" name="teiid-security">
+ <authentication>
+
+ <login-module code="org.jboss.security.auth.spi.UsersRolesLoginModule" flag="required">
+ <module-option name = "password-stacking">useFirstPass</module-option>
+ <module-option name="usersProperties">props/teiid-security-users.properties</module-option>
+ <module-option name="rolesProperties">props/teiid-security-roles.properties</module-option>
+ </login-module>
+
+ <login-module code="org.teiid.jboss.RoleBasedCredentialMapIdentityLoginModule" flag="required">
+ <module-option name = "password-stacking">useFirstPass</module-option>
+ <module-option name="credentialMap">props/teiid-credentialmap.properties</module-option>
+ <module-option name = "managedConnectionFactoryName">jboss.jca:service=LocalTxCM,name=DefaultDS</module-option>
+ </login-module>
+
+ </authentication>
+</application-policy>]]></programlisting>
<para>In the -ds.xml file that is defined as the "managedConnectionFactoryName" in the above configuration,
you need to add the following element</para>
- <programlisting><![CDATA[
- <security-domain>teiid-security</security-domain>
- ]]></programlisting>
+ <programlisting><![CDATA[<security-domain>teiid-security</security-domain>]]></programlisting>
<para>In the above configuration example, in the primary login module "UsersRolesLoginModule" is setup for logging in
the primary user and assign some roles. The "RoleBasedCredentialMap" login module is configured to hold
@@ -378,19 +358,17 @@
password in the file defined by the "credentialMap" property, and define following properties in
the "RoleBasedCredentialMap" login module.</para>
- <programlisting><![CDATA[
- <login-module code="org.teiid.jboss.RoleBasedCredentialMapIdentityLoginModule" flag="required">
- <module-option name = "password-stacking">useFirstPass</module-option>
- <module-option name="credentialMap">props/teiid-credentialmap.properties</module-option>
- <module-option name = "managedConnectionFactoryName">jboss.jca:service=LocalTxCM,name=DefaultDS</module-option>
-
- <!-- below properties are only required when passwords are encrypted -->
- <module-option name = "pbealgo">PBEWithMD5AndDES</module-option>
- <module-option name = "pbepass">testPBEIdentityLoginModule</module-option>
- <module-option name = "salt">abcdefgh</module-option>
- <module-option name = "iterationCount">19</module-option>
- </login-module>
- ]]></programlisting>
+ <programlisting><![CDATA[<login-module code="org.teiid.jboss.RoleBasedCredentialMapIdentityLoginModule" flag="required">
+ <module-option name = "password-stacking">useFirstPass</module-option>
+ <module-option name="credentialMap">props/teiid-credentialmap.properties</module-option>
+ <module-option name = "managedConnectionFactoryName">jboss.jca:service=LocalTxCM,name=DefaultDS</module-option>
+
+ <!-- below properties are only required when passwords are encrypted -->
+ <module-option name = "pbealgo">PBEWithMD5AndDES</module-option>
+ <module-option name = "pbepass">testPBEIdentityLoginModule</module-option>
+ <module-option name = "salt">abcdefgh</module-option>
+ <module-option name = "iterationCount">19</module-option>
+</login-module>]]></programlisting>
<para>For full details about encryption of the password, please follow this
<ulink url="http://community.jboss.org/docs/DOC-9703">document</ulink>'s
12 years, 6 months
teiid SVN: r3555 - in trunk/engine/src: main/java/org/teiid/common/buffer/impl and 3 other directories.
by teiid-commits@lists.jboss.org
Author: shawkins
Date: 2011-10-17 23:37:06 -0400 (Mon, 17 Oct 2011)
New Revision: 3555
Modified:
trunk/engine/src/main/java/org/teiid/common/buffer/BufferManager.java
trunk/engine/src/main/java/org/teiid/common/buffer/CacheEntry.java
trunk/engine/src/main/java/org/teiid/common/buffer/impl/BlockInputStream.java
trunk/engine/src/main/java/org/teiid/common/buffer/impl/BufferFrontedFileStoreCache.java
trunk/engine/src/main/java/org/teiid/common/buffer/impl/BufferManagerImpl.java
trunk/engine/src/main/java/org/teiid/query/processor/relational/SortUtility.java
trunk/engine/src/test/java/org/teiid/common/buffer/impl/TestBufferFrontedFileStoreCache.java
trunk/engine/src/test/java/org/teiid/query/processor/relational/TestSortNode.java
Log:
TEIID-1750 correcting a threading issue with reads during an evict and switching to mostly non-blocking reservations TEIID-1784 correcting inital sort incomplete reservations
Modified: trunk/engine/src/main/java/org/teiid/common/buffer/BufferManager.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/common/buffer/BufferManager.java 2011-10-17 18:49:11 UTC (rev 3554)
+++ trunk/engine/src/main/java/org/teiid/common/buffer/BufferManager.java 2011-10-18 03:37:06 UTC (rev 3555)
@@ -52,15 +52,11 @@
public enum BufferReserveMode {
/**
- * Claim unused buffers up to the amount requested, using a progressive decaying algorithm
- */
- WAIT,
- /**
* Claim all of the buffers requested, even if they are not available, without waiting
*/
FORCE,
/**
- * Claim unused buffers up to the amount requested witout waiting
+ * Claim unused buffers up to the amount requested without waiting
*/
NO_WAIT
}
@@ -135,5 +131,12 @@
* Set the maxActivePlans as a hint at determining the maxProcessingKB
* @param maxActivePlans
*/
- void setMaxActivePlans(int maxActivePlans);
+ void setMaxActivePlans(int maxActivePlans);
+
+ /**
+ * Wait for additional buffers to become available.
+ * @param additional
+ * @return
+ */
+ int reserveAdditionalBuffers(int additional);
}
Modified: trunk/engine/src/main/java/org/teiid/common/buffer/CacheEntry.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/common/buffer/CacheEntry.java 2011-10-17 18:49:11 UTC (rev 3554)
+++ trunk/engine/src/main/java/org/teiid/common/buffer/CacheEntry.java 2011-10-18 03:37:06 UTC (rev 3555)
@@ -42,6 +42,10 @@
this.persistent = persistent;
}
+ public void setObject(Object object) {
+ this.object = object;
+ }
+
public int getSizeEstimate() {
return sizeEstimate;
}
Modified: trunk/engine/src/main/java/org/teiid/common/buffer/impl/BlockInputStream.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/common/buffer/impl/BlockInputStream.java 2011-10-17 18:49:11 UTC (rev 3554)
+++ trunk/engine/src/main/java/org/teiid/common/buffer/impl/BlockInputStream.java 2011-10-18 03:37:06 UTC (rev 3555)
@@ -34,10 +34,12 @@
int blockIndex;
ByteBuffer buf;
boolean done;
+ private final boolean threadSafe;
- BlockInputStream(BlockManager manager, int blockCount) {
+ BlockInputStream(BlockManager manager, int blockCount, boolean threadSafe) {
this.manager = manager;
this.maxBlock = blockCount;
+ this.threadSafe = threadSafe;
}
@Override
@@ -56,6 +58,9 @@
return;
}
buf = manager.getBlock(blockIndex++);
+ if (threadSafe) {
+ buf = buf.duplicate();
+ }
}
}
Modified: trunk/engine/src/main/java/org/teiid/common/buffer/impl/BufferFrontedFileStoreCache.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/common/buffer/impl/BufferFrontedFileStoreCache.java 2011-10-17 18:49:11 UTC (rev 3554)
+++ trunk/engine/src/main/java/org/teiid/common/buffer/impl/BufferFrontedFileStoreCache.java 2011-10-18 03:37:06 UTC (rev 3555)
@@ -241,8 +241,8 @@
memoryEvictionLock.readLock().unlock();
}
}
- if (LogManager.isMessageToBeRecorded(LogConstants.CTX_DQP, MessageLevel.TRACE)) {
- LogManager.logTrace(LogConstants.CTX_DQP, "Allocating", data?"data":"index", "block", next, "to", gid, oid); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ //$NON-NLS-5$
+ if (LogManager.isMessageToBeRecorded(LogConstants.CTX_BUFFER_MGR, MessageLevel.TRACE)) {
+ LogManager.logTrace(LogConstants.CTX_BUFFER_MGR, "Allocating", data?"data":"index", "block", next, "to", gid, oid); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ //$NON-NLS-5$
}
return next;
}
@@ -254,8 +254,8 @@
}
private void freeDataBlock(int dataBlock) {
- if (LogManager.isMessageToBeRecorded(LogConstants.CTX_DQP, MessageLevel.TRACE)) {
- LogManager.logTrace(LogConstants.CTX_DQP, "freeing data block", dataBlock, "for", gid, oid); //$NON-NLS-1$ //$NON-NLS-2$
+ if (LogManager.isMessageToBeRecorded(LogConstants.CTX_BUFFER_MGR, MessageLevel.TRACE)) {
+ LogManager.logTrace(LogConstants.CTX_BUFFER_MGR, "freeing data block", dataBlock, "for", gid, oid); //$NON-NLS-1$ //$NON-NLS-2$
}
blocksInuse.clear(dataBlock);
}
@@ -267,8 +267,8 @@
if (this.inode == -1) {
throw new AssertionError("Out of inodes"); //$NON-NLS-1$
}
- if (LogManager.isMessageToBeRecorded(LogConstants.CTX_DQP, MessageLevel.DETAIL)) {
- LogManager.logDetail(LogConstants.CTX_DQP, "Allocating inode", this.inode, "to", gid, oid); //$NON-NLS-1$ //$NON-NLS-2$
+ if (LogManager.isMessageToBeRecorded(LogConstants.CTX_BUFFER_MGR, MessageLevel.DETAIL)) {
+ LogManager.logDetail(LogConstants.CTX_BUFFER_MGR, "Allocating inode", this.inode, "to", gid, oid); //$NON-NLS-1$ //$NON-NLS-2$
}
ByteBuffer bb = getInodeBlock();
bb.putInt(EMPTY_ADDRESS);
@@ -288,8 +288,8 @@
int indirectIndexBlock = bb.getInt(BYTES_PER_BLOCK_ADDRESS*DIRECT_POINTERS);
int doublyIndirectIndexBlock = bb.getInt(BYTES_PER_BLOCK_ADDRESS*(DIRECT_POINTERS+1));
boolean freedAll = freeBlock(acquire?BYTES_PER_BLOCK_ADDRESS:0, bb, DIRECT_POINTERS-(acquire?1:0), true);
- if (LogManager.isMessageToBeRecorded(LogConstants.CTX_DQP, MessageLevel.DETAIL)) {
- LogManager.logDetail(LogConstants.CTX_DQP, "freeing inode", inode, "for", gid, oid); //$NON-NLS-1$ //$NON-NLS-2$
+ if (LogManager.isMessageToBeRecorded(LogConstants.CTX_BUFFER_MGR, MessageLevel.DETAIL)) {
+ LogManager.logDetail(LogConstants.CTX_BUFFER_MGR, "freeing inode", inode, "for", gid, oid); //$NON-NLS-1$ //$NON-NLS-2$
}
inodesInuse.clear(inode);
if (!freedAll || indirectIndexBlock == EMPTY_ADDRESS) {
@@ -427,8 +427,8 @@
@SuppressWarnings("unchecked")
@Override
public boolean add(CacheEntry entry, Serializer s) {
- if (LogManager.isMessageToBeRecorded(LogConstants.CTX_DQP, MessageLevel.DETAIL)) {
- LogManager.logDetail(LogConstants.CTX_DQP, "adding object", s.getId(), entry.getId()); //$NON-NLS-1$
+ if (LogManager.isMessageToBeRecorded(LogConstants.CTX_BUFFER_MGR, MessageLevel.DETAIL)) {
+ LogManager.logDetail(LogConstants.CTX_BUFFER_MGR, "adding object", s.getId(), entry.getId()); //$NON-NLS-1$
}
boolean newEntry = false;
InodeBlockManager blockManager = null;
@@ -469,7 +469,7 @@
//proactively create freespace
if (!cleanerRunning.get()) {
if (lowBlocks(false) && cleanerRunning.compareAndSet(false, true)) {
- LogManager.logDetail(LogConstants.CTX_DQP, "Starting memory buffer cleaner"); //$NON-NLS-1$
+ LogManager.logDetail(LogConstants.CTX_BUFFER_MGR, "Starting memory buffer cleaner"); //$NON-NLS-1$
asynchPool.execute(cleaningTask);
if (lowBlocks(true)) {
//do a non-blocking removal before we're forced to block
@@ -563,21 +563,21 @@
boolean inStorage = false;
try {
synchronized (info) {
- await(info, true, false);
+ assert !info.pinned && info.loading; //load should be locked
+ await(info, true, false); //not necessary, but should make things safer
if (info.inode != EMPTY_ADDRESS) {
info.pinned = true;
memoryBufferEntries.touch(info, false);
- if (LogManager.isMessageToBeRecorded(LogConstants.CTX_DQP, MessageLevel.DETAIL)) {
- LogManager.logDetail(LogConstants.CTX_DQP, "Getting object at inode", info.inode, serializer.getId(), oid); //$NON-NLS-1$
+ if (LogManager.isMessageToBeRecorded(LogConstants.CTX_BUFFER_MGR, MessageLevel.DETAIL)) {
+ LogManager.logDetail(LogConstants.CTX_BUFFER_MGR, "Getting object at inode", info.inode, serializer.getId(), oid); //$NON-NLS-1$
}
BlockManager manager = getBlockManager(serializer.getId(), oid, info.inode);
- is = new BlockInputStream(manager, info.memoryBlockCount);
+ is = new BlockInputStream(manager, info.memoryBlockCount, info.evicting);
} else if (info.block != EMPTY_ADDRESS) {
- assert !info.pinned;
inStorage = true;
storageReads.incrementAndGet();
- if (LogManager.isMessageToBeRecorded(LogConstants.CTX_DQP, MessageLevel.DETAIL)) {
- LogManager.logDetail(LogConstants.CTX_DQP, "Getting object at block", info.block, info.sizeIndex, serializer.getId(), oid); //$NON-NLS-1$
+ if (LogManager.isMessageToBeRecorded(LogConstants.CTX_BUFFER_MGR, MessageLevel.DETAIL)) {
+ LogManager.logDetail(LogConstants.CTX_BUFFER_MGR, "Getting object at block", info.block, info.sizeIndex, serializer.getId(), oid); //$NON-NLS-1$
}
BlockStore blockStore = sizeBasedStores[info.sizeIndex];
FileStore fs = blockStore.stores[info.block/blockStore.blocksInUse.getBitsPerSegment()];
@@ -595,19 +595,17 @@
ExtensibleBufferedOutputStream os = new BlockOutputStream(manager);
ObjectConverterUtil.write(os, is, -1);
synchronized (info) {
+ assert !info.pinned;
info.inode = manager.getInode();
info.pinned = true;
memoryBufferEntries.touch(info, false);
+ is = new BlockInputStream(manager, info.memoryBlockCount, info.evicting);
}
- is = new BlockInputStream(manager, info.memoryBlockCount);
success = true;
} finally {
this.memoryWritePermits.release();
if (!success && manager != null) {
manager.free(false);
- synchronized (info) {
- info.inode = EMPTY_ADDRESS;
- }
}
}
}
@@ -707,10 +705,10 @@
synchronized (info) {
//if we're a demotion then the free flag was already checked and set
if (!demote) {
- //let a pending free finish - it would be nice if we could pre-empt
+ //let any pending finish - it would be nice if we could pre-empt
//since we can save some work, but this should be rare enough
//to just block
- await(info, false, true);
+ await(info, true, true);
info.evicting = true;
} else {
assert info.evicting;
@@ -729,11 +727,11 @@
try {
if (demote && block == EMPTY_ADDRESS) {
storageWrites.getAndIncrement();
- BlockInputStream is = new BlockInputStream(bm, memoryBlockCount);
+ BlockInputStream is = new BlockInputStream(bm, memoryBlockCount, false); //we know this can always be single threaded
BlockStore blockStore = sizeBasedStores[sizeIndex];
block = getAndSetNextClearBit(blockStore);
- if (LogManager.isMessageToBeRecorded(LogConstants.CTX_DQP, MessageLevel.DETAIL)) {
- LogManager.logDetail(LogConstants.CTX_DQP, "Allocating storage data block", info.block, "of size", blockStore.blockSize, "to", info); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-1$
+ if (LogManager.isMessageToBeRecorded(LogConstants.CTX_BUFFER_MGR, MessageLevel.DETAIL)) {
+ LogManager.logDetail(LogConstants.CTX_BUFFER_MGR, "Allocating storage data block", info.block, "of size", blockStore.blockSize, "to", info); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
}
FileStore fs = blockStore.stores[block/blockStore.blocksInUse.getBitsPerSegment()];
long blockOffset = (block%blockStore.blocksInUse.getBitsPerSegment())*blockStore.blockSize;
@@ -748,7 +746,7 @@
//shouldn't happen, but we'll invalidate this write and continue
demote = false;
//just continue to free
- LogManager.logError(LogConstants.CTX_DQP, e, "Error transferring block to storage " + oid); //$NON-NLS-1$
+ LogManager.logError(LogConstants.CTX_BUFFER_MGR, e, "Error transferring block to storage " + oid); //$NON-NLS-1$
}
}
} finally {
@@ -756,6 +754,7 @@
synchronized (info) {
//it is possible for a read to happen while evicting.
//that's ok, we'll just wait for it to finish
+ assert info.evicting;
await(info, true, false);
info.evicting = false;
info.notifyAll();
@@ -770,8 +769,8 @@
} else {
BlockStore blockStore = sizeBasedStores[info.sizeIndex];
blockStore.blocksInUse.clear(info.block);
- if (LogManager.isMessageToBeRecorded(LogConstants.CTX_DQP, MessageLevel.DETAIL)) {
- LogManager.logDetail(LogConstants.CTX_DQP, "Freed storage data block", info.block, "of size", blockStore.blockSize); //$NON-NLS-1$ //$NON-NLS-2$
+ if (LogManager.isMessageToBeRecorded(LogConstants.CTX_BUFFER_MGR, MessageLevel.DETAIL)) {
+ LogManager.logDetail(LogConstants.CTX_BUFFER_MGR, "Freed storage data block", info.block, "of size", blockStore.blockSize); //$NON-NLS-1$ //$NON-NLS-2$
}
info.block = EMPTY_ADDRESS;
}
Modified: trunk/engine/src/main/java/org/teiid/common/buffer/impl/BufferManagerImpl.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/common/buffer/impl/BufferManagerImpl.java 2011-10-17 18:49:11 UTC (rev 3554)
+++ trunk/engine/src/main/java/org/teiid/common/buffer/impl/BufferManagerImpl.java 2011-10-18 03:37:06 UTC (rev 3555)
@@ -84,6 +84,10 @@
*/
public class BufferManagerImpl implements BufferManager, StorageManager {
+ /**
+ * Asynch cleaner attempts to age out old entries and to reduce the memory size when
+ * little is reserved.
+ */
private static final class Cleaner extends TimerTask {
WeakReference<BufferManagerImpl> bufferRef;
@@ -99,7 +103,8 @@
this.cancel();
return;
}
- if (impl.reserveBatchKB.get() < impl.maxReserveKB.get()*.9 || impl.activeBatchKB.get() < (impl.maxReserveKB.get()>>3)) {
+ boolean agingOut = false;
+ if (impl.reserveBatchKB.get() < impl.maxReserveKB.get()*.9 || impl.activeBatchKB.get() < impl.maxReserveKB.get()*.7) {
CacheEntry entry = impl.evictionQueue.firstEntry(false);
if (entry == null) {
return;
@@ -114,8 +119,19 @@
if (currentTime - lastAccess < 1<<28) {
return;
}
+ agingOut = true;
}
+ if (LogManager.isMessageToBeRecorded(LogConstants.CTX_BUFFER_MGR, MessageLevel.TRACE)) {
+ LogManager.logTrace(LogConstants.CTX_BUFFER_MGR, "Asynch eviction run", impl.reserveBatchKB.get(), impl.maxReserveKB.get(), impl.activeBatchKB.get()); //$NON-NLS-1$
+ }
impl.doEvictions(0, false);
+ if (!agingOut) {
+ try {
+ Thread.sleep(100); //we don't want to evict too fast, because the processing threads are more than capable of evicting
+ } catch (InterruptedException e) {
+ throw new TeiidRuntimeException(e);
+ }
+ }
}
}
}
@@ -335,6 +351,12 @@
LrfuEvictionQueue<CacheEntry> evictionQueue = new LrfuEvictionQueue<CacheEntry>(readAttempts);
ConcurrentHashMap<Long, CacheEntry> memoryEntries = new ConcurrentHashMap<Long, CacheEntry>(16, .75f, CONCURRENCY_LEVEL);
+ private ThreadLocal<Integer> reservedByThread = new ThreadLocal<Integer>() {
+ protected Integer initialValue() {
+ return 0;
+ }
+ };
+
//limited size reference caches based upon the memory settings
private WeakReferenceHashedValueCache<CacheEntry> weakReferenceCache;
private Map<Long, BatchSoftReference> softCache = Collections.synchronizedMap(new LinkedHashMap<Long, BatchSoftReference>(16, .75f, false) {
@@ -343,13 +365,12 @@
protected boolean removeEldestEntry(Map.Entry<Long,BatchSoftReference> eldest) {
if (size() > maxSoftReferences) {
BatchSoftReference bsr = eldest.getValue();
- maxReserveKB.addAndGet(bsr.sizeEstimate);
- reserveBatchKB.addAndGet(bsr.sizeEstimate);
- bsr.clear();
+ clearSoftReference(bsr);
return true;
}
return false;
- };
+ }
+
});
private Cache cache;
@@ -366,9 +387,18 @@
private static final Timer timer = new Timer("BufferManager Cleaner", true); //$NON-NLS-1$
public BufferManagerImpl() {
- //timer.schedule(new Cleaner(this), 30000, 30000);
+ timer.schedule(new Cleaner(this), 15000, 15000);
}
+ void clearSoftReference(BatchSoftReference bsr) {
+ synchronized (bsr) {
+ maxReserveKB.addAndGet(bsr.sizeEstimate);
+ reserveBatchKB.addAndGet(bsr.sizeEstimate);
+ bsr.sizeEstimate = 0;
+ }
+ bsr.clear();
+ }
+
public long getBatchesAdded() {
return batchAdded.get();
}
@@ -389,6 +419,10 @@
public int getMaxProcessingKB() {
return maxProcessingKB;
}
+
+ public int getReserveBatchKB() {
+ return reserveBatchKB.get();
+ }
/**
* Get processor batch size
@@ -551,49 +585,88 @@
if (count < 1) {
return;
}
+ reservedByThread.set(reservedByThread.get() - count);
if (LogManager.isMessageToBeRecorded(LogConstants.CTX_BUFFER_MGR, MessageLevel.TRACE)) {
LogManager.logTrace(LogConstants.CTX_BUFFER_MGR, "Releasing buffer space", count); //$NON-NLS-1$
}
+ if (lock.tryLock()) {
+ try {
+ this.reserveBatchKB.addAndGet(count);
+ batchesFreed.signalAll();
+ } finally {
+ lock.unlock();
+ }
+ } else {
+ this.reserveBatchKB.addAndGet(count);
+ }
+ }
+
+ /**
+ * TODO: should consider other reservations by the current thread
+ */
+ @Override
+ public int reserveAdditionalBuffers(int additional) {
+ if (LogManager.isMessageToBeRecorded(LogConstants.CTX_BUFFER_MGR, MessageLevel.TRACE)) {
+ LogManager.logTrace(LogConstants.CTX_BUFFER_MGR, "Reserving buffer space", additional, "WAIT"); //$NON-NLS-1$ //$NON-NLS-2$
+ }
lock.lock();
try {
- this.reserveBatchKB.addAndGet(count);
- batchesFreed.signalAll();
+ //don't wait for more than is available
+ int waitCount = Math.min(additional, this.getMaxReserveKB() - reservedByThread.get());
+ int committed = 0;
+ while (waitCount > 0 && waitCount > this.reserveBatchKB.get() && committed < additional) {
+ int reserveBatchSample = this.reserveBatchKB.get();
+ try {
+ batchesFreed.await(100, TimeUnit.MILLISECONDS);
+ } catch (InterruptedException e) {
+ throw new TeiidRuntimeException(e);
+ }
+ if (reserveBatchSample >= this.reserveBatchKB.get()) {
+ waitCount >>= 3;
+ } else {
+ waitCount >>= 1;
+ }
+ int result = noWaitReserve(additional - committed);
+ committed += result;
+ }
+ return committed;
} finally {
lock.unlock();
+ persistBatchReferences();
}
- }
+ }
@Override
public int reserveBuffers(int count, BufferReserveMode mode) {
if (LogManager.isMessageToBeRecorded(LogConstants.CTX_BUFFER_MGR, MessageLevel.TRACE)) {
LogManager.logTrace(LogConstants.CTX_BUFFER_MGR, "Reserving buffer space", count, mode); //$NON-NLS-1$
}
- lock.lock();
- try {
- if (mode == BufferReserveMode.WAIT) {
- //don't wait for more than is available
- int waitCount = Math.min(count, this.getMaxReserveKB());
- while (waitCount > 0 && waitCount > this.reserveBatchKB.get()) {
- try {
- batchesFreed.await(100, TimeUnit.MILLISECONDS);
- } catch (InterruptedException e) {
- throw new TeiidRuntimeException(e);
- }
- waitCount /= 2;
- }
- }
- if (this.reserveBatchKB.get() >= count || mode == BufferReserveMode.FORCE) {
- this.reserveBatchKB.addAndGet(-count);
- return count;
- }
- int result = Math.max(0, this.reserveBatchKB.get());
- this.reserveBatchKB.addAndGet(-result);
- return result;
- } finally {
- lock.unlock();
- persistBatchReferences();
+ int result = count;
+ if (mode == BufferReserveMode.FORCE) {
+ this.reserveBatchKB.addAndGet(-count);
+ } else {
+ result = noWaitReserve(count);
}
+ reservedByThread.set(reservedByThread.get() + result);
+ persistBatchReferences();
+ return result;
}
+
+ private int noWaitReserve(int count) {
+ for (int i = 0; i < 2; i++) {
+ int reserveBatch = this.reserveBatchKB.get();
+ count = Math.min(count, Math.max(0, reserveBatch));
+ if (count == 0) {
+ return 0;
+ }
+ if (this.reserveBatchKB.compareAndSet(reserveBatch, reserveBatch - count)) {
+ return count;
+ }
+ }
+ //the value is changing rapidly, but we've already potentially adjusted the value twice, so just proceed
+ this.reserveBatchKB.addAndGet(-count);
+ return count;
+ }
void persistBatchReferences() {
int activeBatch = activeBatchKB.get();
@@ -706,8 +779,7 @@
if (bsr != null) {
ce = bsr.get();
if (ce != null) {
- maxReserveKB.addAndGet(bsr.sizeEstimate);
- reserveBatchKB.addAndGet(bsr.sizeEstimate);
+ clearSoftReference(bsr);
}
}
} else if (useWeakReferences) {
@@ -776,9 +848,7 @@
break;
}
softCache.remove(ref.key);
- maxReserveKB.addAndGet(ref.sizeEstimate);
- reserveBatchKB.addAndGet(ref.sizeEstimate);
- ref.clear();
+ clearSoftReference(ref);
}
}
Modified: trunk/engine/src/main/java/org/teiid/query/processor/relational/SortUtility.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/query/processor/relational/SortUtility.java 2011-10-17 18:49:11 UTC (rev 3554)
+++ trunk/engine/src/main/java/org/teiid/query/processor/relational/SortUtility.java 2011-10-18 03:37:06 UTC (rev 3555)
@@ -234,10 +234,10 @@
if (workingTuples.size() >= maxRows) {
int reserved = bufferManager.reserveBuffers(schemaSize,
(totalReservedBuffers + schemaSize <= bufferManager.getMaxProcessingKB())?BufferReserveMode.FORCE:BufferReserveMode.NO_WAIT);
+ totalReservedBuffers += reserved;
if (reserved != schemaSize) {
break;
}
- totalReservedBuffers += reserved;
maxRows += this.batchSize;
}
try {
@@ -301,7 +301,7 @@
int reserved = Math.min(desiredSpace, this.bufferManager.getMaxProcessingKB());
bufferManager.reserveBuffers(reserved, BufferReserveMode.FORCE);
if (desiredSpace > reserved) {
- reserved += bufferManager.reserveBuffers(desiredSpace - reserved, BufferReserveMode.WAIT);
+ reserved += bufferManager.reserveAdditionalBuffers(desiredSpace - reserved);
}
int maxSortIndex = Math.max(2, reserved / schemaSize); //always allow progress
//release any partial excess
Modified: trunk/engine/src/test/java/org/teiid/common/buffer/impl/TestBufferFrontedFileStoreCache.java
===================================================================
--- trunk/engine/src/test/java/org/teiid/common/buffer/impl/TestBufferFrontedFileStoreCache.java 2011-10-17 18:49:11 UTC (rev 3554)
+++ trunk/engine/src/test/java/org/teiid/common/buffer/impl/TestBufferFrontedFileStoreCache.java 2011-10-18 03:37:06 UTC (rev 3555)
@@ -131,7 +131,7 @@
private CacheEntry get(BufferFrontedFileStoreCache cache, Long oid,
Serializer<Integer> s) throws TeiidComponentException {
PhysicalInfo o = cache.lockForLoad(oid, s);
- CacheEntry ce = cache.get(o, oid, s);
+ CacheEntry ce = cache.get(o, oid, new WeakReference<Serializer<?>>(s));
cache.unlockForLoad(o);
return ce;
}
Modified: trunk/engine/src/test/java/org/teiid/query/processor/relational/TestSortNode.java
===================================================================
--- trunk/engine/src/test/java/org/teiid/query/processor/relational/TestSortNode.java 2011-10-17 18:49:11 UTC (rev 3554)
+++ trunk/engine/src/test/java/org/teiid/query/processor/relational/TestSortNode.java 2011-10-18 03:37:06 UTC (rev 3555)
@@ -37,6 +37,7 @@
import org.teiid.common.buffer.TupleBuffer;
import org.teiid.common.buffer.TupleSource;
import org.teiid.common.buffer.BufferManager.TupleSourceType;
+import org.teiid.common.buffer.impl.BufferManagerImpl;
import org.teiid.core.TeiidComponentException;
import org.teiid.core.TeiidProcessingException;
import org.teiid.core.types.DataTypeManager;
@@ -52,7 +53,8 @@
public static final int BATCH_SIZE = 100;
private void helpTestSort(List elements, List[] data, List sortElements, List sortTypes, List[] expected, Mode mode) throws TeiidComponentException, TeiidProcessingException {
- BufferManager mgr = BufferManagerFactory.getTestBufferManager(100, BATCH_SIZE, BATCH_SIZE);
+ BufferManagerImpl mgr = BufferManagerFactory.getTestBufferManager(10000, BATCH_SIZE, BATCH_SIZE);
+ int reserve = mgr.getReserveBatchKB();
CommandContext context = new CommandContext ("pid", "test", null, null, 1); //$NON-NLS-1$ //$NON-NLS-2$
BlockingFakeRelationalNode dataNode = new BlockingFakeRelationalNode(2, data);
@@ -87,6 +89,7 @@
}
}
assertEquals(expected.length, currentRow - 1);
+ assertEquals(reserve, mgr.getReserveBatchKB());
}
/*
12 years, 6 months
teiid SVN: r3554 - in trunk: client/src/main/java/org/teiid/client and 7 other directories.
by teiid-commits@lists.jboss.org
Author: shawkins
Date: 2011-10-17 14:49:11 -0400 (Mon, 17 Oct 2011)
New Revision: 3554
Added:
trunk/engine/src/test/java/org/teiid/common/buffer/impl/TestLrfuEvictionQueue.java
Modified:
trunk/build/kits/jboss-container/deploy/teiid/teiid-jboss-beans.xml
trunk/client/src/main/java/org/teiid/client/BatchSerializer.java
trunk/client/src/main/java/org/teiid/client/ResultsMessage.java
trunk/client/src/test/java/org/teiid/client/TestBatchSerializer.java
trunk/connectors/translator-jdbc/src/main/java/org/teiid/translator/jdbc/FunctionModifier.java
trunk/documentation/admin-guide/src/main/docbook/en-US/content/performance.xml
trunk/engine/src/main/java/org/teiid/common/buffer/Cache.java
trunk/engine/src/main/java/org/teiid/common/buffer/CacheEntry.java
trunk/engine/src/main/java/org/teiid/common/buffer/CacheKey.java
trunk/engine/src/main/java/org/teiid/common/buffer/impl/BufferFrontedFileStoreCache.java
trunk/engine/src/main/java/org/teiid/common/buffer/impl/BufferManagerImpl.java
trunk/engine/src/main/java/org/teiid/common/buffer/impl/LrfuEvictionQueue.java
trunk/engine/src/main/java/org/teiid/common/buffer/impl/MemoryStorageManager.java
trunk/engine/src/test/java/org/teiid/query/processor/proc/TestProcedureProcessor.java
Log:
TEIID-1750 further refinement to serialization, improving queue precision, adding a doc entry and initial asynch cleaner for buffermanager
Modified: trunk/build/kits/jboss-container/deploy/teiid/teiid-jboss-beans.xml
===================================================================
--- trunk/build/kits/jboss-container/deploy/teiid/teiid-jboss-beans.xml 2011-10-17 03:12:03 UTC (rev 3553)
+++ trunk/build/kits/jboss-container/deploy/teiid/teiid-jboss-beans.xml 2011-10-17 18:49:11 UTC (rev 3554)
@@ -49,8 +49,8 @@
property if using older clients utilizing lobs. (default true) -->
<property name="inlineLobs">true</property>
<!-- Memory buffer space used by the buffer manager in MB. -1 determines the setting automatically from the maxReserveKB (default -1).
- This value cannot be smaller than maxStorageObjectSize. -->
- <property name="maxMemoryBufferSpace">-1</property>
+ This value cannot be smaller than maxStorageObjectSize.-->
+ <property name="memoryBufferSpace">-1</property>
<!-- Set to true to hold the memory buffer off-heap. If true you must ensure that the VM can allocate that much direct memory (default false). -->
<property name="memoryBufferOffHeap">false</property>
<!-- The maximum size of a buffer managed object (typically a table page or a results batch) in bytes (default 8388608 or 8MB).
Modified: trunk/client/src/main/java/org/teiid/client/BatchSerializer.java
===================================================================
--- trunk/client/src/main/java/org/teiid/client/BatchSerializer.java 2011-10-17 03:12:03 UTC (rev 3553)
+++ trunk/client/src/main/java/org/teiid/client/BatchSerializer.java 2011-10-17 18:49:11 UTC (rev 3554)
@@ -35,6 +35,7 @@
import java.util.Arrays;
import java.util.Calendar;
import java.util.HashMap;
+import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.TimeZone;
@@ -52,7 +53,60 @@
* @since 4.2
*/
public class BatchSerializer {
+
+ /*
+ * Public sharing part for the mapping between class and type in format of Map<class->Integer>.
+ */
+ public static final int STRING = 0;
+ public static final int CHAR = 1;
+ public static final int BOOLEAN = 2;
+ public static final int BYTE = 3;
+ public static final int SHORT = 4;
+ public static final int INTEGER = 5;
+ public static final int LONG = 6;
+ public static final int BIGINTEGER = 7;
+ public static final int FLOAT = 8;
+ public static final int DOUBLE = 9;
+ public static final int BIGDECIMAL = 10;
+ public static final int DATE = 11;
+ public static final int TIME = 12;
+ public static final int TIMESTAMP = 13;
+ public static final int OBJECT = 14;
+ public static final int BLOB = 15;
+ public static final int CLOB = 16;
+ public static final int XML = 17;
+ public static final int NULL = 18;
+
+ private static final Map<Class<?>, Integer> typeMap = new LinkedHashMap<Class<?>, Integer>(64);
+ private static final List<Class<?>> typeList;
+ static {
+ typeMap.put(DataTypeManager.DefaultDataClasses.STRING, STRING);
+ typeMap.put(DataTypeManager.DefaultDataClasses.CHAR, CHAR);
+ typeMap.put(DataTypeManager.DefaultDataClasses.BOOLEAN, BOOLEAN);
+ typeMap.put(DataTypeManager.DefaultDataClasses.BYTE, BYTE);
+ typeMap.put(DataTypeManager.DefaultDataClasses.SHORT, SHORT);
+ typeMap.put(DataTypeManager.DefaultDataClasses.INTEGER, INTEGER);
+ typeMap.put(DataTypeManager.DefaultDataClasses.LONG, LONG);
+ typeMap.put(DataTypeManager.DefaultDataClasses.BIG_INTEGER, BIGINTEGER);
+ typeMap.put(DataTypeManager.DefaultDataClasses.FLOAT, FLOAT);
+ typeMap.put(DataTypeManager.DefaultDataClasses.DOUBLE, DOUBLE);
+ typeMap.put(DataTypeManager.DefaultDataClasses.BIG_DECIMAL, BIGDECIMAL);
+ typeMap.put(DataTypeManager.DefaultDataClasses.DATE, DATE);
+ typeMap.put(DataTypeManager.DefaultDataClasses.TIME, TIME);
+ typeMap.put(DataTypeManager.DefaultDataClasses.TIMESTAMP, TIMESTAMP);
+ typeMap.put(DataTypeManager.DefaultDataClasses.OBJECT, OBJECT);
+ typeMap.put(DataTypeManager.DefaultDataClasses.BLOB, BLOB);
+ typeMap.put(DataTypeManager.DefaultDataClasses.CLOB, CLOB);
+ typeMap.put(DataTypeManager.DefaultDataClasses.XML, XML);
+ typeMap.put(DataTypeManager.DefaultDataClasses.NULL, NULL);
+ typeList = new ArrayList<Class<?>>(typeMap.keySet());
+ }
+
+ public static int getCode(Class<?> source) {
+ return typeMap.get(source).intValue();
+ }
+
private BatchSerializer() {} // Uninstantiable
private static ColumnSerializer defaultSerializer = new ColumnSerializer();
@@ -83,9 +137,49 @@
version1serializers.put(DataTypeManager.DefaultDataTypes.BLOB, new BlobColumnSerializer1());
version1serializers.put(DataTypeManager.DefaultDataTypes.XML, new XmlColumnSerializer1());
version1serializers.put(DataTypeManager.DefaultDataTypes.NULL, new NullColumnSerializer1());
- //TODO: do better with just an object column
+ version1serializers.put(DataTypeManager.DefaultDataTypes.OBJECT, new ObjectColumnSerializer1());
}
+ public static final class ObjectColumnSerializer1 extends ColumnSerializer {
+
+ @Override
+ protected void writeObject(ObjectOutput out, Object obj)
+ throws IOException {
+ int code = getCode(obj.getClass());
+ out.writeByte((byte)code);
+ if (code == BOOLEAN) {
+ if (Boolean.TRUE.equals(obj)) {
+ out.write((byte)1);
+ } else {
+ out.write((byte)0);
+ }
+ } else if (code != OBJECT) {
+ ColumnSerializer s = getSerializer(DataTypeManager.getDataTypeName(obj.getClass()), (byte)1);
+ s.writeObject(out, obj);
+ } else {
+ super.writeObject(out, obj);
+ }
+ }
+
+ @Override
+ protected Object readObject(ObjectInput in) throws IOException,
+ ClassNotFoundException {
+ int code = in.readByte();
+ if (code == BOOLEAN) {
+ if (in.readByte() == (byte)0) {
+ return Boolean.FALSE;
+ }
+ return Boolean.TRUE;
+ }
+ if (code != OBJECT) {
+ ColumnSerializer s = getSerializer(DataTypeManager.getDataTypeName(typeList.get(code)), (byte)1);
+ return s.readObject(in);
+ }
+ return super.readObject(in);
+ }
+
+ }
+
private static final int MAX_UTF = 0xFFFF/3; //this is greater than the expected max length of Teiid Strings
private static class StringColumnSerializer1 extends ColumnSerializer {
Modified: trunk/client/src/main/java/org/teiid/client/ResultsMessage.java
===================================================================
--- trunk/client/src/main/java/org/teiid/client/ResultsMessage.java 2011-10-17 03:12:03 UTC (rev 3553)
+++ trunk/client/src/main/java/org/teiid/client/ResultsMessage.java 2011-10-17 18:49:11 UTC (rev 3554)
@@ -72,6 +72,8 @@
/** OPTION DEBUG log if OPTION DEBUG was used */
private String debugLog;
+
+ private byte clientSerializationVersion;
/**
* Query plan annotations, if OPTION SHOWPLAN or OPTION PLANONLY was used:
@@ -347,5 +349,13 @@
public boolean isUpdateResult() {
return isUpdateResult;
}
+
+ public byte getClientSerializationVersion() {
+ return clientSerializationVersion;
+ }
+
+ public void setClientSerializationVersion(byte clientSerializationVersion) {
+ this.clientSerializationVersion = clientSerializationVersion;
+ }
}
Modified: trunk/client/src/test/java/org/teiid/client/TestBatchSerializer.java
===================================================================
--- trunk/client/src/test/java/org/teiid/client/TestBatchSerializer.java 2011-10-17 03:12:03 UTC (rev 3553)
+++ trunk/client/src/test/java/org/teiid/client/TestBatchSerializer.java 2011-10-17 18:49:11 UTC (rev 3554)
@@ -76,7 +76,8 @@
DataTypeManager.DefaultDataTypes.SHORT,
DataTypeManager.DefaultDataTypes.STRING,
DataTypeManager.DefaultDataTypes.TIME,
- DataTypeManager.DefaultDataTypes.TIMESTAMP
+ DataTypeManager.DefaultDataTypes.TIMESTAMP,
+ DataTypeManager.DefaultDataTypes.OBJECT,
};
private static String sampleString(int length) {
char[] chars = new char[length];
@@ -86,35 +87,10 @@
return new String(chars);
}
- private static List[] sampleBatch(int rows) {
- List[] batch = new List[rows];
+ private static List<?>[] sampleBatchWithNulls(int rows) {
+ List<?>[] batch = new List[rows];
for (int i = 0; i < rows; i++) {
- java.util.Date d = new java.util.Date();
- Object[] data = { new BigDecimal("" + i), //$NON-NLS-1$
- new BigInteger(Integer.toString(i)),
- (i%2 == 0) ? Boolean.FALSE: Boolean.TRUE,
- new Byte((byte)i),
- new Character((char)i),
- TimestampWithTimezone.createDate(d),
- new Double(i),
- new Float(i),
- new Integer(i),
- new Long(i),
- new Short((short)i),
- sampleString(i),
- TimestampWithTimezone.createTime(d),
- TimestampWithTimezone.createTimestamp(d)
- };
- batch[i] = Arrays.asList(data);
- }
- return batch;
- }
-
- private static List[] sampleBatchWithNulls(int rows) {
- List[] batch = new List[rows];
-
- for (int i = 0; i < rows; i++) {
java.util.Date d = new java.util.Date();
int mod = i%14;
Object[] data = { (mod == 0) ? null : new BigDecimal("" + i), //$NON-NLS-1$
@@ -130,7 +106,8 @@
(mod == 10) ? null : new Short((short)i),
(mod == 11) ? null : sampleString(i),
(mod == 12) ? null : TimestampWithTimezone.createTime(d),
- (mod == 13) ? null : TimestampWithTimezone.createTimestamp(d)
+ (mod == 13) ? null : TimestampWithTimezone.createTimestamp(d),
+ (mod == 14) ? null : TimestampWithTimezone.createTimestamp(d),
};
batch[i] = Arrays.asList(data);
}
@@ -140,23 +117,16 @@
public void testSerializeBasicTypes() throws Exception {
// The number 8 is important here because boolean isNull information is packed into bytes,
// so we want to make sure the boundary cases are handled correctly
- helpTestSerialization(sampleBatchTypes, sampleBatch(1)); // Less than 8 rows
- helpTestSerialization(sampleBatchTypes, sampleBatch(8)); // Exactly 8 rows
- helpTestSerialization(sampleBatchTypes, sampleBatch(17)); // More than 8 rows, but not a multiple of 8
- helpTestSerialization(sampleBatchTypes, sampleBatch(120)); // A multiple of 8 rows
- helpTestSerialization(sampleBatchTypes, sampleBatch(833)); // A bunch of rows. This should also test large strings
+ helpTestSerialization(sampleBatchTypes, sampleBatchWithNulls(1)); // Less than 8 rows
+ helpTestSerialization(sampleBatchTypes, sampleBatchWithNulls(8)); // Exactly 8 rows
+ helpTestSerialization(sampleBatchTypes, sampleBatchWithNulls(17)); // More than 8 rows, but not a multiple of 8
+ helpTestSerialization(sampleBatchTypes, sampleBatchWithNulls(120)); // A multiple of 8 rows
+ helpTestSerialization(sampleBatchTypes, sampleBatchWithNulls(833)); // A bunch of rows. This should also test large strings
+ helpTestSerialization(sampleBatchTypes, sampleBatchWithNulls(4096)); // A bunch of rows. This should also test large strings
}
- public void testSerializeBasicTypesWithNulls() throws Exception {
- helpTestSerialization(sampleBatchTypes, sampleBatchWithNulls(1));
- helpTestSerialization(sampleBatchTypes, sampleBatchWithNulls(8));
- helpTestSerialization(sampleBatchTypes, sampleBatchWithNulls(17));
- helpTestSerialization(sampleBatchTypes, sampleBatchWithNulls(120));
- helpTestSerialization(sampleBatchTypes, sampleBatchWithNulls(833));
- }
-
public void testSerializeLargeStrings() throws Exception {
- List row = Arrays.asList(new Object[] {sampleString(66666)});
+ List<?> row = Arrays.asList(new Object[] {sampleString(66666)});
helpTestSerialization(new String[] {DataTypeManager.DefaultDataTypes.STRING}, new List[] {row});
}
Modified: trunk/connectors/translator-jdbc/src/main/java/org/teiid/translator/jdbc/FunctionModifier.java
===================================================================
--- trunk/connectors/translator-jdbc/src/main/java/org/teiid/translator/jdbc/FunctionModifier.java 2011-10-17 03:12:03 UTC (rev 3553)
+++ trunk/connectors/translator-jdbc/src/main/java/org/teiid/translator/jdbc/FunctionModifier.java 2011-10-17 18:49:11 UTC (rev 3554)
@@ -24,13 +24,11 @@
*/
package org.teiid.translator.jdbc;
-import java.util.HashMap;
import java.util.List;
-import java.util.Map;
+import org.teiid.client.BatchSerializer;
import org.teiid.language.Function;
import org.teiid.language.LanguageObject;
-import org.teiid.translator.TypeFacility;
/**
@@ -43,52 +41,28 @@
/*
* Public sharing part for the mapping between class and type in format of Map<class->Integer>.
*/
- public static final int STRING = 0;
- public static final int CHAR = 1;
- public static final int BOOLEAN = 2;
- public static final int BYTE = 3;
- public static final int SHORT = 4;
- public static final int INTEGER = 5;
- public static final int LONG = 6;
- public static final int BIGINTEGER = 7;
- public static final int FLOAT = 8;
- public static final int DOUBLE = 9;
- public static final int BIGDECIMAL = 10;
- public static final int DATE = 11;
- public static final int TIME = 12;
- public static final int TIMESTAMP = 13;
- public static final int OBJECT = 14;
- public static final int BLOB = 15;
- public static final int CLOB = 16;
- public static final int XML = 17;
- public static final int NULL = 18;
+ public static final int STRING = BatchSerializer.STRING;
+ public static final int CHAR = BatchSerializer.CHAR;
+ public static final int BOOLEAN = BatchSerializer.BOOLEAN;
+ public static final int BYTE = BatchSerializer.BYTE;
+ public static final int SHORT = BatchSerializer.SHORT;
+ public static final int INTEGER = BatchSerializer.INTEGER;
+ public static final int LONG = BatchSerializer.LONG;
+ public static final int BIGINTEGER = BatchSerializer.BIGINTEGER;
+ public static final int FLOAT = BatchSerializer.FLOAT;
+ public static final int DOUBLE = BatchSerializer.DOUBLE;
+ public static final int BIGDECIMAL = BatchSerializer.BIGDECIMAL;
+ public static final int DATE = BatchSerializer.DATE;
+ public static final int TIME = BatchSerializer.TIME;
+ public static final int TIMESTAMP = BatchSerializer.TIMESTAMP;
+ public static final int OBJECT = BatchSerializer.OBJECT;
+ public static final int BLOB = BatchSerializer.BLOB;
+ public static final int CLOB = BatchSerializer.CLOB;
+ public static final int XML = BatchSerializer.XML;
+ public static final int NULL = BatchSerializer.NULL;
- private static final Map<Class<?>, Integer> typeMap = new HashMap<Class<?>, Integer>();
-
- static {
- typeMap.put(TypeFacility.RUNTIME_TYPES.STRING, STRING);
- typeMap.put(TypeFacility.RUNTIME_TYPES.CHAR, CHAR);
- typeMap.put(TypeFacility.RUNTIME_TYPES.BOOLEAN, BOOLEAN);
- typeMap.put(TypeFacility.RUNTIME_TYPES.BYTE, BYTE);
- typeMap.put(TypeFacility.RUNTIME_TYPES.SHORT, SHORT);
- typeMap.put(TypeFacility.RUNTIME_TYPES.INTEGER, INTEGER);
- typeMap.put(TypeFacility.RUNTIME_TYPES.LONG, LONG);
- typeMap.put(TypeFacility.RUNTIME_TYPES.BIG_INTEGER, BIGINTEGER);
- typeMap.put(TypeFacility.RUNTIME_TYPES.FLOAT, FLOAT);
- typeMap.put(TypeFacility.RUNTIME_TYPES.DOUBLE, DOUBLE);
- typeMap.put(TypeFacility.RUNTIME_TYPES.BIG_DECIMAL, BIGDECIMAL);
- typeMap.put(TypeFacility.RUNTIME_TYPES.DATE, DATE);
- typeMap.put(TypeFacility.RUNTIME_TYPES.TIME, TIME);
- typeMap.put(TypeFacility.RUNTIME_TYPES.TIMESTAMP, TIMESTAMP);
- typeMap.put(TypeFacility.RUNTIME_TYPES.OBJECT, OBJECT);
- typeMap.put(TypeFacility.RUNTIME_TYPES.BLOB, BLOB);
- typeMap.put(TypeFacility.RUNTIME_TYPES.CLOB, CLOB);
- typeMap.put(TypeFacility.RUNTIME_TYPES.XML, XML);
- typeMap.put(TypeFacility.RUNTIME_TYPES.NULL, NULL);
- }
-
public static int getCode(Class<?> source) {
- return typeMap.get(source).intValue();
+ return BatchSerializer.getCode(source);
}
/**
Modified: trunk/documentation/admin-guide/src/main/docbook/en-US/content/performance.xml
===================================================================
--- trunk/documentation/admin-guide/src/main/docbook/en-US/content/performance.xml 2011-10-17 03:12:03 UTC (rev 3553)
+++ trunk/documentation/admin-guide/src/main/docbook/en-US/content/performance.xml 2011-10-17 18:49:11 UTC (rev 3554)
@@ -63,6 +63,38 @@
if your installation makes use of internal materialization, makes
heavy use of SQL/XML, or processes large row counts.
</para>
+ <section>
+ <title>Big Data/Memory</title>
+ <para>Usage of extremely large VM sizes and or datasets requires additional considerations.
+ Teiid has a non-negligible amount of overhead per batch/table page on the order of 100-200 bytes. Depending on the data types involved each
+ full batch/table page will represent between 64 and 4096 rows. If you are dealing with datasets with billions of rows and you run into OutOfMemory issues, consider increasing the processor
+ batch size in the &jboss-beans; file to force the allocation of larger batches and table pages. If the processor batch size is increased and/or you are dealing with extremely wide result sets (several hundred columns),
+ then the default setting of 8MB for the maxStorageObjectSize in the &jboss-beans; file may be too low. The sizing for maxStorageObjectSize is terms of serialized size, which will be much
+ closer to the raw data size then the Java memory footprint estimation used for maxReservedKB.
+ maxStorageObjectSize should not be set too large relative to memoryBufferSpace since it will reduce the performance of the memory buffer. The memory buffer supports only 1 concurrent writer for each maxStorageObjectSize of the memoryBufferSpace.
+ </para>
+ <note><para>Teiid temporary tables (also used for internal materialization) can only support 2^31-1 rows per table.</para></note>
+ <para>
+ The memoryBufferSpace setting controls the amount of on or off heap memory allocated as byte buffers for use by the Teiid buffer manager. This setting defaults to -1, which automatically determines a setting based upon whether it is on or off heap and the value for maxReserveKB.
+ </para>
+ <para>You can take advantage of the buffer manager memory buffer to access system memory without allocating it to the heap. Setting memoryBufferOffHeap to true in &jboss-beans; will allocate the
+ Teiid memory buffer off heap. Depending on whether your installation is dedicated to Teiid and the amount of system memory available, this may be perferable to on-heap allocation. The primary
+ benefit is additional memory usage for Teiid without additional garbage collection tuning. This becomes especially important in situations where more than 32GB of memory is desired for the VM.
+ Note that when using off-heap allocation, the memory must still be available to the java process and that setting the value of memoryBufferSpace too high may cause the VM to swap rather than reside in memory.
+ With large off-heap buffer sizes (greater than several gigabytes) you may also need to adjust VM settings. For Sun VMs the relevant VM settings are MaxDirectMemorySize and UseLargePages. For example adding:
+ <programlisting>-XX:MaxDirectMemorySize=12g -XX:+UseLargePages</programlisting>
+ to the VM process arguments would allow for an effective allocation of approximately an 11GB Teiid memory buffer (the memoryBufferSpace setting) accounting for any additional direct memory that may be needed
+ by the AS or applications running in the AS.
+ </section>
+ <section>
+ <title>Disk Usage</title>
+ <para>For table page and result batches the buffer manager will we a limited number of files that are dedicated to a particular storage size.
+ However, as mentioned in the installation, creation of Teiid lob values (for example through SQL/XML) will typically create one file per lob once the lob exceeds the allowable
+ in memory size of 8KB. In heavy usage scenarios, consider pointing the buffer directory on a partition that is routinely defragmented.
+ By default Teiid will use up to 50GB of disk space. This is tracked in terms of the number of bytes written by Teiid. For large data sets, you may need to increase the
+ maxBufferSpace setting in the &jboss-beans; file.
+ </para>
+ </section>
</section>
<section>
<title>Threading</title>
Modified: trunk/engine/src/main/java/org/teiid/common/buffer/Cache.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/common/buffer/Cache.java 2011-10-17 03:12:03 UTC (rev 3553)
+++ trunk/engine/src/main/java/org/teiid/common/buffer/Cache.java 2011-10-17 18:49:11 UTC (rev 3554)
@@ -22,6 +22,7 @@
package org.teiid.common.buffer;
+import java.lang.ref.WeakReference;
import java.util.Collection;
import org.teiid.core.TeiidComponentException;
@@ -74,7 +75,7 @@
* @return
* @throws TeiidComponentException
*/
- CacheEntry get(T lock, Long oid, Serializer<?> serializer) throws TeiidComponentException;
+ CacheEntry get(T lock, Long oid, WeakReference<? extends Serializer<?>> ref) throws TeiidComponentException;
/**
* Adds an entry to the cache.
Modified: trunk/engine/src/main/java/org/teiid/common/buffer/CacheEntry.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/common/buffer/CacheEntry.java 2011-10-17 03:12:03 UTC (rev 3553)
+++ trunk/engine/src/main/java/org/teiid/common/buffer/CacheEntry.java 2011-10-17 18:49:11 UTC (rev 3554)
@@ -27,36 +27,32 @@
public class CacheEntry extends BaseCacheEntry {
private boolean persistent;
private Object object;
- private int sizeEstimate;
+ private final int sizeEstimate;
private WeakReference<? extends Serializer<?>> serializer;
public CacheEntry(Long oid) {
- super(new CacheKey(oid, 0, 0));
+ this(new CacheKey(oid, 0, 0), 0, null, null, false);
}
- public CacheEntry(CacheKey key) {
+ public CacheEntry(CacheKey key, int sizeEstimate, Object object, WeakReference<? extends Serializer<?>> serializer, boolean persistent) {
super(key);
+ this.sizeEstimate = sizeEstimate;
+ this.object = object;
+ this.serializer = serializer;
+ this.persistent = persistent;
}
public int getSizeEstimate() {
return sizeEstimate;
}
- public void setSizeEstimate(int sizeEstimate) {
- this.sizeEstimate = sizeEstimate;
- }
-
public Object nullOut() {
Object result = getObject();
- setObject(null);
- setSerializer(null);
+ this.object = null;
+ this.serializer = null;
return result;
}
- public void setObject(Object object) {
- this.object = object;
- }
-
public Object getObject() {
return object;
}
Modified: trunk/engine/src/main/java/org/teiid/common/buffer/CacheKey.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/common/buffer/CacheKey.java 2011-10-17 03:12:03 UTC (rev 3553)
+++ trunk/engine/src/main/java/org/teiid/common/buffer/CacheKey.java 2011-10-17 18:49:11 UTC (rev 3554)
@@ -25,10 +25,10 @@
public class CacheKey implements Comparable<CacheKey> {
private Long id;
- protected float lastAccess;
+ protected int lastAccess;
protected float orderingValue;
- public CacheKey(Long id, float lastAccess, float orderingValue) {
+ public CacheKey(Long id, int lastAccess, float orderingValue) {
this.id = id;
this.lastAccess = lastAccess;
this.orderingValue = orderingValue;
@@ -59,7 +59,7 @@
return this.id.equals(((CacheKey)obj).getId());
}
- public float getLastAccess() {
+ public int getLastAccess() {
return lastAccess;
}
@@ -71,7 +71,7 @@
public int compareTo(CacheKey o) {
int result = (int) Math.signum(orderingValue - o.orderingValue);
if (result == 0) {
- result = (int)Math.signum(lastAccess - o.lastAccess);
+ result = (int)Math.signum((lastAccess&0xffffffffl) - (o.lastAccess&0xffffffffl));
if (result == 0) {
return Long.signum(id - o.id);
}
Modified: trunk/engine/src/main/java/org/teiid/common/buffer/impl/BufferFrontedFileStoreCache.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/common/buffer/impl/BufferFrontedFileStoreCache.java 2011-10-17 03:12:03 UTC (rev 3553)
+++ trunk/engine/src/main/java/org/teiid/common/buffer/impl/BufferFrontedFileStoreCache.java 2011-10-17 18:49:11 UTC (rev 3554)
@@ -26,6 +26,7 @@
import java.io.InputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
+import java.lang.ref.WeakReference;
import java.nio.ByteBuffer;
import java.util.ArrayList;
import java.util.Collection;
@@ -383,13 +384,13 @@
public void initialize() throws TeiidComponentException {
storageManager.initialize();
memoryBufferSpace = Math.max(memoryBufferSpace, maxStorageObjectSize);
- blocks = (int) Math.min(Integer.MAX_VALUE, (memoryBufferSpace>>LOG_BLOCK_SIZE));
+ blocks = (int) Math.min(Integer.MAX_VALUE, (memoryBufferSpace>>LOG_BLOCK_SIZE)*ADDRESSES_PER_BLOCK/(ADDRESSES_PER_BLOCK+1));
inodesInuse = new ConcurrentBitSet(blocks+1, BufferManagerImpl.CONCURRENCY_LEVEL);
blocksInuse = new ConcurrentBitSet(blocks, BufferManagerImpl.CONCURRENCY_LEVEL);
this.blockByteBuffer = new BlockByteBuffer(30, blocks, LOG_BLOCK_SIZE, direct);
//ensure that we'll run out of blocks first
this.inodeByteBuffer = new BlockByteBuffer(30, blocks+1, LOG_INODE_SIZE, direct);
- memoryWritePermits = new Semaphore(Math.max(1, (int)Math.min(memoryBufferSpace/maxStorageObjectSize, Integer.MAX_VALUE)));
+ memoryWritePermits = new Semaphore(Math.max(1, (int)Math.min((((long)blocks)<<LOG_BLOCK_SIZE)/maxStorageObjectSize, Integer.MAX_VALUE)));
maxMemoryBlocks = Math.min(MAX_DOUBLE_INDIRECT, maxStorageObjectSize>>LOG_BLOCK_SIZE);
//try to maintain enough freespace so that writers don't block in cleaning
cleaningThreshold = Math.min(maxMemoryBlocks<<4, blocks>>1);
@@ -547,10 +548,16 @@
}
@Override
- public CacheEntry get(PhysicalInfo info, Long oid, Serializer<?> serializer) throws TeiidComponentException {
+ public CacheEntry get(PhysicalInfo info, Long oid,
+ WeakReference<? extends Serializer<?>> ref)
+ throws TeiidComponentException {
if (info == null) {
return null;
}
+ Serializer<?> serializer = ref.get();
+ if (serializer == null) {
+ return null;
+ }
long currentTime = readAttempts.incrementAndGet();
InputStream is = null;
boolean inStorage = false;
@@ -604,11 +611,8 @@
}
}
}
- CacheEntry ce = new CacheEntry(new CacheKey(oid, 1, 1));
ObjectInputStream ois = new ObjectInputStream(is);
- ce.setSizeEstimate(ois.readInt());
- ce.setObject(serializer.deserialize(ois));
- ce.setPersistent(true);
+ CacheEntry ce = new CacheEntry(new CacheKey(oid, 1, 1), ois.readInt(), serializer.deserialize(ois), ref, true);
return ce;
} catch(IOException e) {
throw new TeiidComponentException(e, QueryPlugin.Util.getString("FileStoreageManager.error_reading", oid)); //$NON-NLS-1$
@@ -728,6 +732,9 @@
BlockInputStream is = new BlockInputStream(bm, memoryBlockCount);
BlockStore blockStore = sizeBasedStores[sizeIndex];
block = getAndSetNextClearBit(blockStore);
+ if (LogManager.isMessageToBeRecorded(LogConstants.CTX_DQP, MessageLevel.DETAIL)) {
+ LogManager.logDetail(LogConstants.CTX_DQP, "Allocating storage data block", info.block, "of size", blockStore.blockSize, "to", info); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-1$
+ }
FileStore fs = blockStore.stores[block/blockStore.blocksInUse.getBitsPerSegment()];
long blockOffset = (block%blockStore.blocksInUse.getBitsPerSegment())*blockStore.blockSize;
byte[] b = new byte[BLOCK_SIZE];
@@ -763,6 +770,9 @@
} else {
BlockStore blockStore = sizeBasedStores[info.sizeIndex];
blockStore.blocksInUse.clear(info.block);
+ if (LogManager.isMessageToBeRecorded(LogConstants.CTX_DQP, MessageLevel.DETAIL)) {
+ LogManager.logDetail(LogConstants.CTX_DQP, "Freed storage data block", info.block, "of size", blockStore.blockSize); //$NON-NLS-1$ //$NON-NLS-2$
+ }
info.block = EMPTY_ADDRESS;
}
}
@@ -915,6 +925,7 @@
public void setSize(int size) {
this.memoryBlockCount = (size>>BufferFrontedFileStoreCache.LOG_BLOCK_SIZE) + ((size&BufferFrontedFileStoreCache.BLOCK_MASK)>0?1:0);
int blocks = memoryBlockCount;
+ this.sizeIndex = 0;
while (blocks >= 1) {
this.sizeIndex++;
blocks>>=2;
Modified: trunk/engine/src/main/java/org/teiid/common/buffer/impl/BufferManagerImpl.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/common/buffer/impl/BufferManagerImpl.java 2011-10-17 03:12:03 UTC (rev 3553)
+++ trunk/engine/src/main/java/org/teiid/common/buffer/impl/BufferManagerImpl.java 2011-10-17 18:49:11 UTC (rev 3554)
@@ -36,6 +36,8 @@
import java.util.List;
import java.util.ListIterator;
import java.util.Map;
+import java.util.Timer;
+import java.util.TimerTask;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicBoolean;
@@ -82,6 +84,42 @@
*/
public class BufferManagerImpl implements BufferManager, StorageManager {
+ private static final class Cleaner extends TimerTask {
+ WeakReference<BufferManagerImpl> bufferRef;
+
+ public Cleaner(BufferManagerImpl bufferManagerImpl) {
+ this.bufferRef = new WeakReference<BufferManagerImpl>(bufferManagerImpl);
+ }
+
+ @Override
+ public void run() {
+ while (true) {
+ BufferManagerImpl impl = this.bufferRef.get();
+ if (impl == null) {
+ this.cancel();
+ return;
+ }
+ if (impl.reserveBatchKB.get() < impl.maxReserveKB.get()*.9 || impl.activeBatchKB.get() < (impl.maxReserveKB.get()>>3)) {
+ CacheEntry entry = impl.evictionQueue.firstEntry(false);
+ if (entry == null) {
+ return;
+ }
+ //we aren't holding too many memory entries, ensure that
+ //entries aren't old
+ int lastAccess = 0x1fffffff&entry.getKey().getLastAccess();
+ int currentTime = 0x1fffffff&(int)impl.readAttempts.get();
+ if (lastAccess > currentTime) {
+ currentTime += 1<<29;
+ }
+ if (currentTime - lastAccess < 1<<28) {
+ return;
+ }
+ }
+ impl.doEvictions(0, false);
+ }
+ }
+ }
+
final class BatchManagerImpl implements BatchManager, Serializer<List<? extends List<?>>> {
final Long id;
SizeUtility sizeUtility;
@@ -150,10 +188,7 @@
}
}
CacheKey key = new CacheKey(oid, 0, old!=null?old.getKey().getOrderingValue():0);
- CacheEntry ce = new CacheEntry(key);
- ce.setObject(batch);
- ce.setSizeEstimate(sizeEstimate);
- ce.setSerializer(this.ref);
+ CacheEntry ce = new CacheEntry(key, sizeEstimate, batch, this.ref, false);
if (LogManager.isMessageToBeRecorded(LogConstants.CTX_BUFFER_MGR, MessageLevel.TRACE)) {
LogManager.logTrace(LogConstants.CTX_BUFFER_MGR, "Add batch to BufferManager", ce.getId(), "with size estimate", ce.getSizeEstimate()); //$NON-NLS-1$ //$NON-NLS-2$
}
@@ -226,15 +261,13 @@
if (LogManager.isMessageToBeRecorded(LogConstants.CTX_BUFFER_MGR, MessageLevel.DETAIL)) {
LogManager.logDetail(LogConstants.CTX_BUFFER_MGR, id, id, "reading batch", batch, "from storage, total reads:", count); //$NON-NLS-1$ //$NON-NLS-2$
}
- ce = cache.get(o, batch, this);
+ ce = cache.get(o, batch, this.ref);
if (ce == null) {
throw new AssertionError("Batch not found in storage " + batch); //$NON-NLS-1$
}
if (!retain) {
cache.remove(this.id, batch);
}
- ce.setSerializer(this.ref);
- ce.setPersistent(true);
if (retain) {
addMemoryEntry(ce);
}
@@ -284,8 +317,8 @@
//set to acceptable defaults for testing
private int maxProcessingKB = 1 << 11;
private Integer maxProcessingKBOrig;
- private AtomicInteger maxReserveKB = new AtomicInteger(1 << 18);
- private volatile int reserveBatchKB;
+ AtomicInteger maxReserveKB = new AtomicInteger(1 << 18);
+ AtomicInteger reserveBatchKB = new AtomicInteger();
private int maxActivePlans = DQPConfiguration.DEFAULT_MAX_ACTIVE_PLANS; //used as a hint to set the reserveBatchKB
private boolean useWeakReferences = true;
private boolean inlineLobs = true;
@@ -295,7 +328,7 @@
private ReentrantLock lock = new ReentrantLock(true);
private Condition batchesFreed = lock.newCondition();
- private AtomicInteger activeBatchKB = new AtomicInteger();
+ AtomicInteger activeBatchKB = new AtomicInteger();
private AtomicLong readAttempts = new AtomicLong();
//TODO: consider the size estimate in the weighting function
@@ -311,6 +344,7 @@
if (size() > maxSoftReferences) {
BatchSoftReference bsr = eldest.getValue();
maxReserveKB.addAndGet(bsr.sizeEstimate);
+ reserveBatchKB.addAndGet(bsr.sizeEstimate);
bsr.clear();
return true;
}
@@ -329,6 +363,12 @@
private AtomicLong writeCount = new AtomicLong();
private AtomicLong referenceHit = new AtomicLong();
+ private static final Timer timer = new Timer("BufferManager Cleaner", true); //$NON-NLS-1$
+
+ public BufferManagerImpl() {
+ //timer.schedule(new Cleaner(this), 30000, 30000);
+ }
+
public long getBatchesAdded() {
return batchAdded.get();
}
@@ -470,12 +510,15 @@
public void setMaxReserveKB(int maxReserveBatchKB) {
this.maxReserveKB.set(maxReserveBatchKB);
+ if (maxReserveBatchKB > -1) {
+ this.reserveBatchKB.set(maxReserveBatchKB);
+ }
}
@Override
public void initialize() throws TeiidComponentException {
int maxMemory = (int)Math.min(Runtime.getRuntime().maxMemory() / 1024, Integer.MAX_VALUE);
- maxMemory -= 300 * 1024; //assume 300 megs of overhead for the AS/system stuff
+ maxMemory = Math.max(0, maxMemory - 300 * 1024); //assume 300 megs of overhead for the AS/system stuff
if (getMaxReserveKB() < 0) {
this.setMaxReserveKB(0);
int one_gig = 1024 * 1024;
@@ -485,7 +528,7 @@
}
this.maxReserveKB.addAndGet(((int)Math.max(0, Math.min(one_gig, maxMemory) * .5)));
}
- this.reserveBatchKB = this.getMaxReserveKB();
+ this.reserveBatchKB.set(this.getMaxReserveKB());
if (this.maxProcessingKBOrig == null) {
//store the config value so that we can be reinitialized (this is not a clean approach)
this.maxProcessingKBOrig = this.maxProcessingKB;
@@ -513,7 +556,7 @@
}
lock.lock();
try {
- this.reserveBatchKB += count;
+ this.reserveBatchKB.addAndGet(count);
batchesFreed.signalAll();
} finally {
lock.unlock();
@@ -530,7 +573,7 @@
if (mode == BufferReserveMode.WAIT) {
//don't wait for more than is available
int waitCount = Math.min(count, this.getMaxReserveKB());
- while (waitCount > 0 && waitCount > this.reserveBatchKB) {
+ while (waitCount > 0 && waitCount > this.reserveBatchKB.get()) {
try {
batchesFreed.await(100, TimeUnit.MILLISECONDS);
} catch (InterruptedException e) {
@@ -539,12 +582,12 @@
waitCount /= 2;
}
}
- if (this.reserveBatchKB >= count || mode == BufferReserveMode.FORCE) {
- this.reserveBatchKB -= count;
+ if (this.reserveBatchKB.get() >= count || mode == BufferReserveMode.FORCE) {
+ this.reserveBatchKB.addAndGet(-count);
return count;
}
- int result = Math.max(0, this.reserveBatchKB);
- this.reserveBatchKB -= result;
+ int result = Math.max(0, this.reserveBatchKB.get());
+ this.reserveBatchKB.addAndGet(-result);
return result;
} finally {
lock.unlock();
@@ -554,8 +597,9 @@
void persistBatchReferences() {
int activeBatch = activeBatchKB.get();
- if (activeBatch <= reserveBatchKB) {
- int memoryCount = activeBatch + getMaxReserveKB() - reserveBatchKB;
+ int reserveBatch = reserveBatchKB.get();
+ if (activeBatch <= reserveBatch) {
+ int memoryCount = activeBatch + getMaxReserveKB() - reserveBatch;
if (DataTypeManager.isValueCacheEnabled()) {
if (memoryCount < getMaxReserveKB() / 8) {
DataTypeManager.setValueCacheEnabled(false);
@@ -565,9 +609,13 @@
}
return;
}
- int maxToFree = Math.max(maxProcessingKB>>1, reserveBatchKB>>3);
+ int maxToFree = Math.max(maxProcessingKB>>1, reserveBatch>>3);
+ doEvictions(maxToFree, true);
+ }
+
+ void doEvictions(int maxToFree, boolean checkActiveBatch) {
int freed = 0;
- while (freed <= maxToFree && activeBatchKB.get() > reserveBatchKB * .8) {
+ while (freed <= maxToFree && (!checkActiveBatch || activeBatchKB.get() > reserveBatchKB.get() * .8)) {
CacheEntry ce = evictionQueue.firstEntry(true);
if (ce == null) {
break;
@@ -623,6 +671,7 @@
BatchSoftReference ref = new BatchSoftReference(ce, SOFT_QUEUE, ce.getSizeEstimate()/2);
softCache.put(ce.getId(), ref);
maxReserveKB.addAndGet(- ce.getSizeEstimate()/2);
+ reserveBatchKB.addAndGet(- ce.getSizeEstimate()/2);
}
/**
@@ -658,6 +707,7 @@
ce = bsr.get();
if (ce != null) {
maxReserveKB.addAndGet(bsr.sizeEstimate);
+ reserveBatchKB.addAndGet(bsr.sizeEstimate);
}
}
} else if (useWeakReferences) {
@@ -727,6 +777,7 @@
}
softCache.remove(ref.key);
maxReserveKB.addAndGet(ref.sizeEstimate);
+ reserveBatchKB.addAndGet(ref.sizeEstimate);
ref.clear();
}
}
Modified: trunk/engine/src/main/java/org/teiid/common/buffer/impl/LrfuEvictionQueue.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/common/buffer/impl/LrfuEvictionQueue.java 2011-10-17 03:12:03 UTC (rev 3553)
+++ trunk/engine/src/main/java/org/teiid/common/buffer/impl/LrfuEvictionQueue.java 2011-10-17 18:49:11 UTC (rev 3554)
@@ -47,10 +47,13 @@
protected AtomicLong clock;
//combined recency/frequency lamda value between 0 and 1 lower -> LFU, higher -> LRU
//TODO: adaptively adjust this value. more hits should move closer to lru
- protected float crfLamda = .0002f;
+ protected double crfLamda;
+ protected double inverseCrfLamda = 1 - crfLamda;
+ protected int maxInterval;
public LrfuEvictionQueue(AtomicLong clock) {
this.clock = clock;
+ setCrfLamda(.0002);
}
public boolean remove(V value) {
@@ -85,33 +88,47 @@
protected void recordAccess(V value, boolean initial) {
assert Thread.holdsLock(value);
CacheKey key = value.getKey();
- float lastAccess = key.getLastAccess();
- float currentClock = clock.get();
+ int lastAccess = key.getLastAccess();
+ long currentClock = clock.get();
if (initial && lastAccess == 0) {
return; //we just want to timestamp this as created and not give it an ordering value
}
float orderingValue = key.getOrderingValue();
orderingValue = computeNextOrderingValue(currentClock, lastAccess,
orderingValue);
- value.setKey(new CacheKey(key.getId(), currentClock, orderingValue));
+ value.setKey(new CacheKey(key.getId(), (int)currentClock, orderingValue));
}
- float computeNextOrderingValue(float currentTime,
- float lastAccess, float orderingValue) {
+ float computeNextOrderingValue(long currentTime,
+ int lastAccess, float orderingValue) {
+ long longLastAccess = lastAccess&0xffffffffl;
+ currentTime &= 0xffffffffl;
+ if (longLastAccess > currentTime) {
+ currentTime += (1l<<32);
+ }
+ long delta = currentTime - longLastAccess;
orderingValue =
(float) (//Frequency component
- orderingValue*Math.pow(1-crfLamda, currentTime - lastAccess)
+ (delta>maxInterval?0:orderingValue*Math.pow(inverseCrfLamda, delta))
//recency component
+ Math.pow(currentTime, crfLamda));
return orderingValue;
}
- public float getCrfLamda() {
+ public double getCrfLamda() {
return crfLamda;
}
- public void setCrfLamda(float crfLamda) {
+ public void setCrfLamda(double crfLamda) {
this.crfLamda = crfLamda;
+ this.inverseCrfLamda = 1 - crfLamda;
+ int i = 0;
+ for (; i < 30; i++) {
+ if ((float)Math.pow(inverseCrfLamda, 1<<i) == 0) {
+ break;
+ }
+ }
+ this.maxInterval = i-1;
}
}
Modified: trunk/engine/src/main/java/org/teiid/common/buffer/impl/MemoryStorageManager.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/common/buffer/impl/MemoryStorageManager.java 2011-10-17 03:12:03 UTC (rev 3553)
+++ trunk/engine/src/main/java/org/teiid/common/buffer/impl/MemoryStorageManager.java 2011-10-17 18:49:11 UTC (rev 3554)
@@ -22,6 +22,7 @@
package org.teiid.common.buffer.impl;
+import java.lang.ref.WeakReference;
import java.nio.ByteBuffer;
import java.util.ArrayList;
import java.util.Collection;
@@ -143,11 +144,12 @@
}
@Override
- public CacheEntry get(Long lock, Long id, Serializer<?> serializer)
+ public CacheEntry get(Long lock, Long oid,
+ WeakReference<? extends Serializer<?>> ref)
throws TeiidComponentException {
- Map<Long, CacheEntry> group = groups.get(serializer.getId());
+ Map<Long, CacheEntry> group = groups.get(ref.get().getId());
if (group != null) {
- return group.get(id);
+ return group.get(oid);
}
return null;
}
Added: trunk/engine/src/test/java/org/teiid/common/buffer/impl/TestLrfuEvictionQueue.java
===================================================================
--- trunk/engine/src/test/java/org/teiid/common/buffer/impl/TestLrfuEvictionQueue.java (rev 0)
+++ trunk/engine/src/test/java/org/teiid/common/buffer/impl/TestLrfuEvictionQueue.java 2011-10-17 18:49:11 UTC (rev 3554)
@@ -0,0 +1,44 @@
+/*
+ * JBoss, Home of Professional Open Source.
+ * See the COPYRIGHT.txt file distributed with this work for information
+ * regarding copyright ownership. Some portions may be licensed
+ * to Red Hat, Inc. under one or more contributor license agreements.
+ *
+ * This library 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 2.1 of the License, or (at your option) any later version.
+ *
+ * This library 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 this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+ * 02110-1301 USA.
+ */
+
+package org.teiid.common.buffer.impl;
+
+import static org.junit.Assert.*;
+
+import java.util.concurrent.atomic.AtomicLong;
+
+import org.junit.Test;
+import org.teiid.common.buffer.BaseCacheEntry;
+
+public class TestLrfuEvictionQueue {
+
+ @Test public void testPrecision() {
+ LrfuEvictionQueue<?> q = new LrfuEvictionQueue<BaseCacheEntry>(new AtomicLong());
+ float value = 0;
+ for (long i = Integer.MAX_VALUE; i < 10l + Integer.MAX_VALUE; i++) {
+ float valueNext = q.computeNextOrderingValue(i, (int)i-1, value);
+ assertTrue(valueNext > value);
+ value = valueNext;
+ }
+ }
+
+}
Property changes on: trunk/engine/src/test/java/org/teiid/common/buffer/impl/TestLrfuEvictionQueue.java
___________________________________________________________________
Added: svn:mime-type
+ text/plain
Modified: trunk/engine/src/test/java/org/teiid/query/processor/proc/TestProcedureProcessor.java
===================================================================
--- trunk/engine/src/test/java/org/teiid/query/processor/proc/TestProcedureProcessor.java 2011-10-17 03:12:03 UTC (rev 3553)
+++ trunk/engine/src/test/java/org/teiid/query/processor/proc/TestProcedureProcessor.java 2011-10-17 18:49:11 UTC (rev 3554)
@@ -2529,4 +2529,5 @@
}
private static final boolean DEBUG = false;
+
}
12 years, 6 months
teiid SVN: r3553 - in trunk: client/src/main/java/org/teiid/client and 5 other directories.
by teiid-commits@lists.jboss.org
Author: shawkins
Date: 2011-10-16 23:12:03 -0400 (Sun, 16 Oct 2011)
New Revision: 3553
Added:
trunk/engine/src/main/java/org/teiid/common/buffer/CacheKey.java
trunk/engine/src/main/java/org/teiid/common/buffer/impl/LrfuEvictionQueue.java
Removed:
trunk/engine/src/main/java/org/teiid/common/buffer/impl/OrderedCache.java
Modified:
trunk/build/kits/jboss-container/deploy/teiid/teiid-jboss-beans.xml
trunk/client/src/main/java/org/teiid/client/BatchSerializer.java
trunk/client/src/main/java/org/teiid/client/ResultsMessage.java
trunk/client/src/test/java/org/teiid/client/TestBatchSerializer.java
trunk/documentation/admin-guide/src/main/docbook/en-US/content/installation.xml
trunk/engine/src/main/java/org/teiid/common/buffer/BaseCacheEntry.java
trunk/engine/src/main/java/org/teiid/common/buffer/Cache.java
trunk/engine/src/main/java/org/teiid/common/buffer/CacheEntry.java
trunk/engine/src/main/java/org/teiid/common/buffer/impl/BufferFrontedFileStoreCache.java
trunk/engine/src/main/java/org/teiid/common/buffer/impl/BufferManagerImpl.java
trunk/engine/src/main/java/org/teiid/common/buffer/impl/MemoryStorageManager.java
trunk/runtime/src/main/java/org/teiid/services/BufferServiceImpl.java
Log:
TEIID-1750 correcting locking with an immutable key and updating jboss-beans
Modified: trunk/build/kits/jboss-container/deploy/teiid/teiid-jboss-beans.xml
===================================================================
--- trunk/build/kits/jboss-container/deploy/teiid/teiid-jboss-beans.xml 2011-10-14 17:31:57 UTC (rev 3552)
+++ trunk/build/kits/jboss-container/deploy/teiid/teiid-jboss-beans.xml 2011-10-17 03:12:03 UTC (rev 3553)
@@ -48,6 +48,14 @@
However inline lob values are not supported by pre-7.6 clients, so disable this
property if using older clients utilizing lobs. (default true) -->
<property name="inlineLobs">true</property>
+ <!-- Memory buffer space used by the buffer manager in MB. -1 determines the setting automatically from the maxReserveKB (default -1).
+ This value cannot be smaller than maxStorageObjectSize. -->
+ <property name="maxMemoryBufferSpace">-1</property>
+ <!-- Set to true to hold the memory buffer off-heap. If true you must ensure that the VM can allocate that much direct memory (default false). -->
+ <property name="memoryBufferOffHeap">false</property>
+ <!-- The maximum size of a buffer managed object (typically a table page or a results batch) in bytes (default 8388608 or 8MB).
+ Setting this value too high will reduce the effectiveness of the memory buffer.-->
+ <property name="maxStorageObjectSize">8388608</property>
</bean>
<bean name="CacheFactory" class="org.teiid.cache.jboss.ClusterableCacheFactory">
Modified: trunk/client/src/main/java/org/teiid/client/BatchSerializer.java
===================================================================
--- trunk/client/src/main/java/org/teiid/client/BatchSerializer.java 2011-10-14 17:31:57 UTC (rev 3552)
+++ trunk/client/src/main/java/org/teiid/client/BatchSerializer.java 2011-10-17 03:12:03 UTC (rev 3553)
@@ -22,21 +22,28 @@
package org.teiid.client;
+import java.io.Externalizable;
import java.io.IOException;
import java.io.ObjectInput;
import java.io.ObjectOutput;
+import java.io.ObjectStreamConstants;
import java.math.BigDecimal;
import java.math.BigInteger;
import java.sql.Time;
import java.sql.Timestamp;
import java.util.ArrayList;
import java.util.Arrays;
+import java.util.Calendar;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
+import java.util.TimeZone;
import org.teiid.core.TeiidRuntimeException;
+import org.teiid.core.types.BlobType;
+import org.teiid.core.types.ClobType;
import org.teiid.core.types.DataTypeManager;
+import org.teiid.core.types.XMLType;
import org.teiid.jdbc.JDBCPlugin;
@@ -67,6 +74,90 @@
serializers.put(DataTypeManager.DefaultDataTypes.TIMESTAMP, new TimestampColumnSerializer());
}
+ private static final Map<String, ColumnSerializer> version1serializers = new HashMap<String, ColumnSerializer>(128);
+ static {
+ version1serializers.put(DataTypeManager.DefaultDataTypes.DATE, new DateColumnSerializer1());
+ version1serializers.put(DataTypeManager.DefaultDataTypes.TIME, new TimeColumnSerializer1());
+ version1serializers.put(DataTypeManager.DefaultDataTypes.STRING, new StringColumnSerializer1());
+ version1serializers.put(DataTypeManager.DefaultDataTypes.CLOB, new ClobColumnSerializer1());
+ version1serializers.put(DataTypeManager.DefaultDataTypes.BLOB, new BlobColumnSerializer1());
+ version1serializers.put(DataTypeManager.DefaultDataTypes.XML, new XmlColumnSerializer1());
+ version1serializers.put(DataTypeManager.DefaultDataTypes.NULL, new NullColumnSerializer1());
+ //TODO: do better with just an object column
+ }
+
+ private static final int MAX_UTF = 0xFFFF/3; //this is greater than the expected max length of Teiid Strings
+
+ private static class StringColumnSerializer1 extends ColumnSerializer {
+ @Override
+ protected void writeObject(ObjectOutput out, Object obj) throws IOException {
+ String str = (String)obj;
+ if (str.length() <= MAX_UTF) {
+ //skip object serialization if we have a short string
+ out.writeByte(ObjectStreamConstants.TC_STRING);
+ out.writeUTF(str);
+ } else {
+ out.writeByte(ObjectStreamConstants.TC_LONGSTRING);
+ out.writeObject(obj);
+ }
+ }
+
+ @Override
+ protected Object readObject(ObjectInput in) throws IOException,
+ ClassNotFoundException {
+ if (in.readByte() == ObjectStreamConstants.TC_STRING) {
+ return in.readUTF();
+ }
+ return super.readObject(in);
+ }
+ }
+
+ private static class NullColumnSerializer1 extends ColumnSerializer {
+ @Override
+ public void writeColumn(ObjectOutput out, int col,
+ List<? extends List<?>> batch) throws IOException {
+ }
+
+ @Override
+ public void readColumn(ObjectInput in, int col,
+ List<List<Object>> batch, byte[] isNull) throws IOException,
+ ClassNotFoundException {
+ }
+ }
+
+ private static class ClobColumnSerializer1 extends ColumnSerializer {
+ protected void writeObject(ObjectOutput out, Object obj) throws IOException {
+ ((Externalizable)obj).writeExternal(out);
+ }
+ protected Object readObject(ObjectInput in) throws IOException, ClassNotFoundException {
+ ClobType ct = new ClobType();
+ ct.readExternal(in);
+ return ct;
+ }
+ }
+
+ private static class BlobColumnSerializer1 extends ColumnSerializer {
+ protected void writeObject(ObjectOutput out, Object obj) throws IOException {
+ ((Externalizable)obj).writeExternal(out);
+ }
+ protected Object readObject(ObjectInput in) throws IOException, ClassNotFoundException {
+ BlobType bt = new BlobType();
+ bt.readExternal(in);
+ return bt;
+ }
+ }
+
+ private static class XmlColumnSerializer1 extends ColumnSerializer {
+ protected void writeObject(ObjectOutput out, Object obj) throws IOException {
+ ((Externalizable)obj).writeExternal(out);
+ }
+ protected Object readObject(ObjectInput in) throws IOException, ClassNotFoundException {
+ XMLType xt = new XMLType();
+ xt.readExternal(in);
+ return xt;
+ }
+ }
+
/**
* Packs the (boolean) information about whether data values in the column are null
* into bytes so that we send ~n/8 instead of n bytes.
@@ -338,6 +429,34 @@
}
}
+ static int DATE_NORMALIZER = 0;
+
+ static {
+ Calendar c = Calendar.getInstance();
+ c.setTimeZone(TimeZone.getTimeZone("GMT")); //$NON-NLS-1$
+ c.set(1900, 0, 1, 0, 0, 0);
+ c.set(Calendar.MILLISECOND, 0);
+ DATE_NORMALIZER = -(int)(c.getTime().getTime()/60000); //support a 32 bit range starting at this value
+ }
+
+ private static class DateColumnSerializer1 extends ColumnSerializer {
+ protected void writeObject(ObjectOutput out, Object obj) throws IOException {
+ out.writeInt((int)(((java.sql.Date)obj).getTime()/60000) + DATE_NORMALIZER);
+ }
+ protected Object readObject(ObjectInput in) throws IOException {
+ return new java.sql.Date(((in.readInt()&0xffffffffL) - DATE_NORMALIZER)*60000);
+ }
+ }
+
+ private static class TimeColumnSerializer1 extends ColumnSerializer {
+ protected void writeObject(ObjectOutput out, Object obj) throws IOException {
+ out.writeInt((int)(((Time)obj).getTime()/1000));
+ }
+ protected Object readObject(ObjectInput in) throws IOException {
+ return new Time((in.readInt()&0xffffffffL)*1000);
+ }
+ }
+
private static class TimestampColumnSerializer extends ColumnSerializer {
protected void writeObject(ObjectOutput out, Object obj) throws IOException {
Timestamp ts = (Timestamp)obj;
@@ -351,15 +470,25 @@
}
}
- private static ColumnSerializer getSerializer(String type) {
- ColumnSerializer cs = serializers.get((type == null) ? DataTypeManager.DefaultDataTypes.OBJECT : type);
+ private static ColumnSerializer getSerializer(String type, byte version) {
+ ColumnSerializer cs = null;
+ if (version == 1) {
+ cs = version1serializers.get((type == null) ? DataTypeManager.DefaultDataTypes.OBJECT : type);
+ }
+ if (cs == null) {
+ cs = serializers.get((type == null) ? DataTypeManager.DefaultDataTypes.OBJECT : type);
+ }
if (cs == null) {
return defaultSerializer;
}
return cs;
}
+
+ public static void writeBatch(ObjectOutput out, String[] types, List<? extends List<?>> batch) throws IOException {
+ writeBatch(out, types, batch, (byte)1);
+ }
- public static void writeBatch(ObjectOutput out, String[] types, List<? extends List<?>> batch) throws IOException {
+ public static void writeBatch(ObjectOutput out, String[] types, List<? extends List<?>> batch, byte version) throws IOException {
if (batch == null) {
out.writeInt(-1);
} else {
@@ -368,7 +497,7 @@
int columns = types.length;
out.writeInt(columns);
for(int i = 0; i < columns; i++) {
- ColumnSerializer serializer = getSerializer(types[i]);
+ ColumnSerializer serializer = getSerializer(types[i], version);
try {
serializer.writeColumn(out, i, batch);
} catch (ClassCastException e) {
@@ -389,6 +518,10 @@
}
public static List<List<Object>> readBatch(ObjectInput in, String[] types) throws IOException, ClassNotFoundException {
+ return readBatch(in, types, (byte)1);
+ }
+
+ public static List<List<Object>> readBatch(ObjectInput in, String[] types, byte version) throws IOException, ClassNotFoundException {
int rows = in.readInt();
if (rows == 0) {
return new ArrayList<List<Object>>(0);
@@ -402,7 +535,7 @@
}
byte[] isNullBuffer = new byte[(extraRows > 0) ? numBytes + 1: numBytes];
for (int col = 0; col < columns; col++) {
- getSerializer(types[col]).readColumn(in, col, batch, isNullBuffer);
+ getSerializer(types[col], version).readColumn(in, col, batch, isNullBuffer);
}
return batch;
}
Modified: trunk/client/src/main/java/org/teiid/client/ResultsMessage.java
===================================================================
--- trunk/client/src/main/java/org/teiid/client/ResultsMessage.java 2011-10-14 17:31:57 UTC (rev 3552)
+++ trunk/client/src/main/java/org/teiid/client/ResultsMessage.java 2011-10-17 03:12:03 UTC (rev 3553)
@@ -240,7 +240,7 @@
dataTypes = ExternalizeUtil.readStringArray(in);
// Row data
- results = BatchSerializer.readBatch(in, dataTypes);
+ results = BatchSerializer.readBatch(in, dataTypes, (byte)0);
// Plan Descriptions
planDescription = (PlanNode)in.readObject();
@@ -272,7 +272,7 @@
ExternalizeUtil.writeArray(out, dataTypes);
// Results data
- BatchSerializer.writeBatch(out, dataTypes, results);
+ BatchSerializer.writeBatch(out, dataTypes, results, (byte)0);
// Plan descriptions
out.writeObject(this.planDescription);
Modified: trunk/client/src/test/java/org/teiid/client/TestBatchSerializer.java
===================================================================
--- trunk/client/src/test/java/org/teiid/client/TestBatchSerializer.java 2011-10-14 17:31:57 UTC (rev 3552)
+++ trunk/client/src/test/java/org/teiid/client/TestBatchSerializer.java 2011-10-17 03:12:03 UTC (rev 3553)
@@ -29,15 +29,13 @@
import java.io.ObjectOutputStream;
import java.math.BigDecimal;
import java.math.BigInteger;
-import java.sql.Date;
-import java.sql.Time;
-import java.sql.Timestamp;
import java.util.Arrays;
import java.util.List;
import junit.framework.TestCase;
import org.teiid.core.types.DataTypeManager;
+import org.teiid.core.util.TimestampWithTimezone;
@@ -47,22 +45,6 @@
*/
public class TestBatchSerializer extends TestCase {
- private static void assertEqual(List[] expectedBatch, List[] batch) {
- if (expectedBatch == null) {
- assertNull(batch);
- return;
- }
- assertEquals(expectedBatch.length, batch.length);
- if (expectedBatch.length > 0) {
- int columns = expectedBatch[0].size();
- for (int row = 0; row < expectedBatch.length; row++) {
- for (int col = 0; col < columns; col++) {
- assertEquals(expectedBatch[row].get(col), batch[row].get(col));
- }
- }
- }
- }
-
private static void helpTestSerialization(String[] types, List<?>[] batch) throws IOException, ClassNotFoundException {
ByteArrayOutputStream byteStream = new ByteArrayOutputStream();
ObjectOutputStream out = new ObjectOutputStream(byteStream);
@@ -108,21 +90,21 @@
List[] batch = new List[rows];
for (int i = 0; i < rows; i++) {
- long currentTime = System.currentTimeMillis();
+ java.util.Date d = new java.util.Date();
Object[] data = { new BigDecimal("" + i), //$NON-NLS-1$
new BigInteger(Integer.toString(i)),
(i%2 == 0) ? Boolean.FALSE: Boolean.TRUE,
new Byte((byte)i),
new Character((char)i),
- new Date(currentTime),
+ TimestampWithTimezone.createDate(d),
new Double(i),
new Float(i),
new Integer(i),
new Long(i),
new Short((short)i),
sampleString(i),
- new Time(currentTime),
- new Timestamp(currentTime)
+ TimestampWithTimezone.createTime(d),
+ TimestampWithTimezone.createTimestamp(d)
};
batch[i] = Arrays.asList(data);
}
@@ -133,22 +115,22 @@
List[] batch = new List[rows];
for (int i = 0; i < rows; i++) {
- long currentTime = System.currentTimeMillis();
+ java.util.Date d = new java.util.Date();
int mod = i%14;
Object[] data = { (mod == 0) ? null : new BigDecimal("" + i), //$NON-NLS-1$
(mod == 1) ? null : new BigInteger(Integer.toString(i)),
(mod == 2) ? null : ((i%2 == 0) ? Boolean.FALSE: Boolean.TRUE),
(mod == 3) ? null : new Byte((byte)i),
(mod == 4) ? null : new Character((char)i),
- (mod == 5) ? null : new Date(currentTime),
+ (mod == 5) ? null : TimestampWithTimezone.createDate(d),
(mod == 6) ? null : new Double(i),
(mod == 7) ? null : new Float(i),
(mod == 8) ? null : new Integer(i),
(mod == 9) ? null : new Long(i),
(mod == 10) ? null : new Short((short)i),
(mod == 11) ? null : sampleString(i),
- (mod == 12) ? null : new Time(currentTime),
- (mod == 13) ? null : new Timestamp(currentTime)
+ (mod == 12) ? null : TimestampWithTimezone.createTime(d),
+ (mod == 13) ? null : TimestampWithTimezone.createTimestamp(d)
};
batch[i] = Arrays.asList(data);
}
Modified: trunk/documentation/admin-guide/src/main/docbook/en-US/content/installation.xml
===================================================================
--- trunk/documentation/admin-guide/src/main/docbook/en-US/content/installation.xml 2011-10-14 17:31:57 UTC (rev 3552)
+++ trunk/documentation/admin-guide/src/main/docbook/en-US/content/installation.xml 2011-10-17 03:12:03 UTC (rev 3553)
@@ -168,8 +168,8 @@
<section>
<title>tmp/teiid</title>
<para>This directory contains temporary files created by Teiid. These are mostly created by the buffer manager.
- These files are not needed across a VM restart. Heavy usage of large data sets will create lots of temporary files.
- In heavy usage scenarios, consider pointing the buffer directory at a partition that is routinely defragmented.
+ These files are not needed across a VM restart. Creation of Teiid lob values (for example through SQL/XML) will typically create one file per lob once it exceeds the allowable
+ in memory size of 8KB. In heavy usage scenarios, consider pointing the buffer directory at a partition that is routinely defragmented.
</para>
</section>
Modified: trunk/engine/src/main/java/org/teiid/common/buffer/BaseCacheEntry.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/common/buffer/BaseCacheEntry.java 2011-10-14 17:31:57 UTC (rev 3552)
+++ trunk/engine/src/main/java/org/teiid/common/buffer/BaseCacheEntry.java 2011-10-17 03:12:03 UTC (rev 3553)
@@ -22,56 +22,34 @@
package org.teiid.common.buffer;
-public class BaseCacheEntry implements Comparable<BaseCacheEntry> {
+public class BaseCacheEntry {
- private Long id;
- protected float lastAccess;
- protected float orderingValue;
-
- public BaseCacheEntry(Long id) {
- this.id = id;
+ private CacheKey key;
+
+ public BaseCacheEntry(CacheKey key) {
+ this.key = key;
}
public Long getId() {
- return id;
+ return key.getId();
}
@Override
public int hashCode() {
- return getId().hashCode();
+ return key.hashCode();
}
@Override
public String toString() {
- return getId().toString();
+ return key.toString();
}
- public float getLastAccess() {
- return lastAccess;
+ public void setKey(CacheKey key) {
+ this.key = key;
}
- public void setLastAccess(float lastAccess) {
- this.lastAccess = lastAccess;
+ public CacheKey getKey() {
+ return key;
}
-
- public float getOrderingValue() {
- return orderingValue;
- }
-
- public void setOrderingValue(float orderingValue) {
- this.orderingValue = orderingValue;
- }
-
- @Override
- public int compareTo(BaseCacheEntry o) {
- int result = (int) Math.signum(orderingValue - o.orderingValue);
- if (result == 0) {
- result = (int)Math.signum(lastAccess - o.lastAccess);
- if (result == 0) {
- return Long.signum(id - o.id);
- }
- }
- return result;
- }
}
\ No newline at end of file
Modified: trunk/engine/src/main/java/org/teiid/common/buffer/Cache.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/common/buffer/Cache.java 2011-10-14 17:31:57 UTC (rev 3552)
+++ trunk/engine/src/main/java/org/teiid/common/buffer/Cache.java 2011-10-17 03:12:03 UTC (rev 3553)
@@ -82,7 +82,7 @@
* @param s
* @throws Exception
*/
- void add(CacheEntry entry, Serializer<?> s) throws Exception;
+ boolean add(CacheEntry entry, Serializer<?> s) throws Exception;
/**
* Remove an entry from the cache
Modified: trunk/engine/src/main/java/org/teiid/common/buffer/CacheEntry.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/common/buffer/CacheEntry.java 2011-10-14 17:31:57 UTC (rev 3552)
+++ trunk/engine/src/main/java/org/teiid/common/buffer/CacheEntry.java 2011-10-17 03:12:03 UTC (rev 3553)
@@ -30,10 +30,14 @@
private int sizeEstimate;
private WeakReference<? extends Serializer<?>> serializer;
- public CacheEntry(Long id) {
- super(id);
+ public CacheEntry(Long oid) {
+ super(new CacheKey(oid, 0, 0));
}
+ public CacheEntry(CacheKey key) {
+ super(key);
+ }
+
public int getSizeEstimate() {
return sizeEstimate;
}
@@ -42,17 +46,6 @@
this.sizeEstimate = sizeEstimate;
}
- public boolean equals(Object obj) {
- if (obj == this) {
- return true;
- }
- if (!(obj instanceof CacheEntry)) {
- return false;
- }
- return getId().equals(((CacheEntry)obj).getId());
- }
-
-
public Object nullOut() {
Object result = getObject();
setObject(null);
Added: trunk/engine/src/main/java/org/teiid/common/buffer/CacheKey.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/common/buffer/CacheKey.java (rev 0)
+++ trunk/engine/src/main/java/org/teiid/common/buffer/CacheKey.java 2011-10-17 03:12:03 UTC (rev 3553)
@@ -0,0 +1,82 @@
+/*
+ * JBoss, Home of Professional Open Source.
+ * See the COPYRIGHT.txt file distributed with this work for information
+ * regarding copyright ownership. Some portions may be licensed
+ * to Red Hat, Inc. under one or more contributor license agreements.
+ *
+ * This library 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 2.1 of the License, or (at your option) any later version.
+ *
+ * This library 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 this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+ * 02110-1301 USA.
+ */
+
+package org.teiid.common.buffer;
+
+public class CacheKey implements Comparable<CacheKey> {
+
+ private Long id;
+ protected float lastAccess;
+ protected float orderingValue;
+
+ public CacheKey(Long id, float lastAccess, float orderingValue) {
+ this.id = id;
+ this.lastAccess = lastAccess;
+ this.orderingValue = orderingValue;
+ }
+
+ public Long getId() {
+ return id;
+ }
+
+ @Override
+ public int hashCode() {
+ return id.hashCode();
+ }
+
+ @Override
+ public String toString() {
+ return id.toString();
+ }
+
+ @Override
+ public boolean equals(Object obj) {
+ if (obj == this) {
+ return true;
+ }
+ if (!(obj instanceof CacheKey)) {
+ return false;
+ }
+ return this.id.equals(((CacheKey)obj).getId());
+ }
+
+ public float getLastAccess() {
+ return lastAccess;
+ }
+
+ public float getOrderingValue() {
+ return orderingValue;
+ }
+
+ @Override
+ public int compareTo(CacheKey o) {
+ int result = (int) Math.signum(orderingValue - o.orderingValue);
+ if (result == 0) {
+ result = (int)Math.signum(lastAccess - o.lastAccess);
+ if (result == 0) {
+ return Long.signum(id - o.id);
+ }
+ }
+ return result;
+ }
+
+}
\ No newline at end of file
Property changes on: trunk/engine/src/main/java/org/teiid/common/buffer/CacheKey.java
___________________________________________________________________
Added: svn:mime-type
+ text/plain
Modified: trunk/engine/src/main/java/org/teiid/common/buffer/impl/BufferFrontedFileStoreCache.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/common/buffer/impl/BufferFrontedFileStoreCache.java 2011-10-14 17:31:57 UTC (rev 3552)
+++ trunk/engine/src/main/java/org/teiid/common/buffer/impl/BufferFrontedFileStoreCache.java 2011-10-17 03:12:03 UTC (rev 3553)
@@ -45,6 +45,7 @@
import org.teiid.common.buffer.BaseCacheEntry;
import org.teiid.common.buffer.Cache;
import org.teiid.common.buffer.CacheEntry;
+import org.teiid.common.buffer.CacheKey;
import org.teiid.common.buffer.FileStore;
import org.teiid.common.buffer.Serializer;
import org.teiid.common.buffer.StorageManager;
@@ -92,6 +93,10 @@
* we should at least reclaim tail space if the end block is removed. for now we are just relying
* on the compact option of {@link ConcurrentBitSet} to keep the blocks at the start of the
* files.
+ *
+ * The locking is as fine grained as possible to prevent contention. See {@link PhysicalInfo} for
+ * flags that are used when it is used as a lock. It is important to not access the
+ * group maps when a {@link PhysicalInfo} lock is held.
*/
public class BufferFrontedFileStoreCache implements Cache<PhysicalInfo>, StorageManager {
@@ -107,7 +112,8 @@
static final int DIRECT_POINTERS = 14;
static final int EMPTY_ADDRESS = -1;
- //TODO allow the block size to be configurable
+ //TODO allow the block size to be configurable. 8k is a reasonable default up to a gig, but we could be more efficient with larger blocks from there.
+ //the rationale for a smaller block size is to reduce internal fragmentation, which is critical when maintaining a relatively small buffer < 256MB
static final int LOG_BLOCK_SIZE = 13;
public static final long MAX_ADDRESSABLE_MEMORY = 1l<<(ADDRESS_BITS+LOG_BLOCK_SIZE);
@@ -151,7 +157,7 @@
private int getOrUpdateDataBlockIndex(int index, int value, Mode mode) {
if (index >= MAX_DOUBLE_INDIRECT || (mode == Mode.ALLOCATE && index >= maxMemoryBlocks)) {
- throw new TeiidRuntimeException("Max block number exceeded"); //$NON-NLS-1$
+ throw new TeiidRuntimeException("Max block number exceeded. Increase the maxStorageObjectSize to support larger storage objects. Alternatively you could make the processor batch size smaller."); //$NON-NLS-1$
}
int dataBlock = 0;
int position = 0;
@@ -335,7 +341,7 @@
private int maxMemoryBlocks;
private AtomicLong readAttempts = new AtomicLong();
- private OrderedCache<Long, PhysicalInfo> memoryBufferEntries = new OrderedCache<Long, PhysicalInfo>(16, .75f, BufferManagerImpl.CONCURRENCY_LEVEL, readAttempts);
+ LrfuEvictionQueue<PhysicalInfo> memoryBufferEntries = new LrfuEvictionQueue<PhysicalInfo>(readAttempts);
private Semaphore memoryWritePermits; //prevents deadlock waiting for free blocks
private ReentrantReadWriteLock memoryEvictionLock = new ReentrantReadWriteLock(true);
@@ -351,7 +357,7 @@
private BlockStore[] sizeBasedStores;
private AtomicBoolean cleanerRunning = new AtomicBoolean();
- private ExecutorService asynchPool = ExecutorUtils.newFixedThreadPool(1, 0, "FileStore Worker"); //$NON-NLS-1$
+ private ExecutorService asynchPool = ExecutorUtils.newFixedThreadPool(1, "FileStore Worker"); //$NON-NLS-1$
private final Runnable cleaningTask = new Runnable() {
@Override
@@ -410,7 +416,7 @@
boolean lowBlocks(boolean critical) {
int bitsSet = blocksInuse.getBitsSet();
- return bitsSet > 0 && (blocks - bitsSet < (critical?criticalCleaningThreshold:cleaningThreshold)) && memoryBufferEntries.firstEntry() != null;
+ return bitsSet > 0 && (blocks - bitsSet < (critical?criticalCleaningThreshold:cleaningThreshold)) && memoryBufferEntries.firstEntry(false) != null;
}
InodeBlockManager getBlockManager(long gid, long oid, int inode) {
@@ -419,10 +425,11 @@
@SuppressWarnings("unchecked")
@Override
- public void add(CacheEntry entry, Serializer s) {
+ public boolean add(CacheEntry entry, Serializer s) {
if (LogManager.isMessageToBeRecorded(LogConstants.CTX_DQP, MessageLevel.DETAIL)) {
LogManager.logDetail(LogConstants.CTX_DQP, "adding object", s.getId(), entry.getId()); //$NON-NLS-1$
}
+ boolean newEntry = false;
InodeBlockManager blockManager = null;
boolean hasPermit = false;
PhysicalInfo info = null;
@@ -430,22 +437,32 @@
try {
Map<Long, PhysicalInfo> map = physicalMapping.get(s.getId());
if (map == null) {
- return; //already removed
+ return true; //already removed
}
info = map.get(entry.getId());
if (info == null) {
- if (!map.containsKey(entry.getId())) {
- return; //already removed
+ synchronized (map) {
+ info = map.get(entry.getId());
+ if (info == null) {
+ newEntry = true;
+ if (!map.containsKey(entry.getId())) {
+ return true; //already removed
+ }
+ info = new PhysicalInfo(s.getId(), entry.getId(), EMPTY_ADDRESS);
+ map.put(entry.getId(), info);
+ }
}
- } else {
+ }
+ if (!newEntry) {
synchronized (info) {
- //we assume that serialization would be faster than a disk read
- if (info.inode != EMPTY_ADDRESS || !shouldPlaceInMemoryBuffer(0, info)) {
- success = true;
- return;
+ if (info.inode == EMPTY_ADDRESS && info.block == EMPTY_ADDRESS) {
+ return false; //someone else is responsible for adding this cache entry
}
- //we should not be in memory since there is no inode assigned
- assert !memoryBufferEntries.getEvictionQueue().containsKey(info);
+ if (info.evicting || info.inode != EMPTY_ADDRESS
+ || !shouldPlaceInMemoryBuffer(0, info)) {
+ return true; //safe to remove from tier 1
+ }
+ //second chance re-add to the cache, we assume that serialization would be faster than a disk read
}
}
//proactively create freespace
@@ -465,21 +482,18 @@
memoryWritePermits.acquire();
hasPermit = true;
blockManager = getBlockManager(s.getId(), entry.getId(), EMPTY_ADDRESS);
- ExtensibleBufferedOutputStream fsos = new BlockOutputStream(blockManager);
- ObjectOutputStream oos = new ObjectOutputStream(fsos);
+ BlockOutputStream bos = new BlockOutputStream(blockManager);
+ ObjectOutputStream oos = new ObjectOutputStream(bos);
oos.writeInt(entry.getSizeEstimate());
s.serialize(entry.getObject(), oos);
oos.close();
+ //synchronized to ensure proper cleanup from a concurrent removal
synchronized (map) {
- //synchronize to ensure proper cleanup from a concurrent removal
if (physicalMapping.containsKey(s.getId()) && map.containsKey(entry.getId())) {
- if (info == null) {
- info = new PhysicalInfo(s.getId(), entry.getId(), blockManager.getInode(), fsos.getBytesWritten());
- map.put(entry.getId(), info);
- }
synchronized (info) {
info.inode = blockManager.getInode();
- memoryBufferEntries.put(entry.getId(), info);
+ info.setSize(bos.getBytesWritten());
+ memoryBufferEntries.touch(info, newEntry);
}
success = true;
}
@@ -494,6 +508,7 @@
blockManager.free(false);
}
}
+ return true;
}
@Override
@@ -541,16 +556,17 @@
boolean inStorage = false;
try {
synchronized (info) {
+ await(info, true, false);
if (info.inode != EMPTY_ADDRESS) {
info.pinned = true;
- PhysicalInfo existing = memoryBufferEntries.get(info.getId()); //touch this entry
- assert existing == info;
+ memoryBufferEntries.touch(info, false);
if (LogManager.isMessageToBeRecorded(LogConstants.CTX_DQP, MessageLevel.DETAIL)) {
LogManager.logDetail(LogConstants.CTX_DQP, "Getting object at inode", info.inode, serializer.getId(), oid); //$NON-NLS-1$
}
BlockManager manager = getBlockManager(serializer.getId(), oid, info.inode);
is = new BlockInputStream(manager, info.memoryBlockCount);
} else if (info.block != EMPTY_ADDRESS) {
+ assert !info.pinned;
inStorage = true;
storageReads.incrementAndGet();
if (LogManager.isMessageToBeRecorded(LogConstants.CTX_DQP, MessageLevel.DETAIL)) {
@@ -574,7 +590,7 @@
synchronized (info) {
info.inode = manager.getInode();
info.pinned = true;
- memoryBufferEntries.put(info.getId(), info);
+ memoryBufferEntries.touch(info, false);
}
is = new BlockInputStream(manager, info.memoryBlockCount);
success = true;
@@ -582,15 +598,15 @@
this.memoryWritePermits.release();
if (!success && manager != null) {
manager.free(false);
- info.inode = EMPTY_ADDRESS;
+ synchronized (info) {
+ info.inode = EMPTY_ADDRESS;
+ }
}
}
}
- CacheEntry ce = new CacheEntry(oid);
+ CacheEntry ce = new CacheEntry(new CacheKey(oid, 1, 1));
ObjectInputStream ois = new ObjectInputStream(is);
ce.setSizeEstimate(ois.readInt());
- ce.setLastAccess(1);
- ce.setOrderingValue(1);
ce.setObject(serializer.deserialize(ois));
ce.setPersistent(true);
return ce;
@@ -614,10 +630,11 @@
* @return
*/
private boolean shouldPlaceInMemoryBuffer(long currentTime, PhysicalInfo info) {
- Map.Entry<PhysicalInfo, Long> lowest = memoryBufferEntries.firstEntry();
+ PhysicalInfo lowest = memoryBufferEntries.firstEntry(false);
+ CacheKey key = info.getKey();
return (blocksInuse.getTotalBits() - blocksInuse.getBitsSet()) > (criticalCleaningThreshold + info.memoryBlockCount)
- || (lowest != null && lowest.getKey().block != EMPTY_ADDRESS
- && lowest.getKey().getOrderingValue() < (currentTime>0?memoryBufferEntries.computeNextOrderingValue(currentTime, info.getLastAccess(), info.getOrderingValue()):info.getOrderingValue()));
+ || (lowest != null && lowest.block != EMPTY_ADDRESS
+ && lowest.getKey().getOrderingValue() < (currentTime>0?memoryBufferEntries.computeNextOrderingValue(currentTime, key.getLastAccess(), key.getOrderingValue()):key.getOrderingValue()));
}
@Override
@@ -650,7 +667,7 @@
return;
}
PhysicalInfo info = map.remove(id);
- free(id, info, false, false);
+ free(info, false, false);
}
@Override
@@ -661,7 +678,7 @@
}
synchronized (map) {
for (Map.Entry<Long, PhysicalInfo> entry : map.entrySet()) {
- free(entry.getKey(), entry.getValue(), false, false);
+ free(entry.getValue(), false, false);
}
return map.keySet();
}
@@ -673,28 +690,39 @@
* demote && acquireDataBlock -> push out of memory and reuse a datablock
* !demote -> full removal from memory and disk
*/
- int free(Long oid, PhysicalInfo info, boolean demote, boolean acquireDataBlock) {
+ int free(PhysicalInfo info, boolean demote, boolean acquireDataBlock) {
if (info == null) {
return EMPTY_ADDRESS;
}
+ Long oid = info.getId();
int result = EMPTY_ADDRESS;
BlockManager bm = null;
int block = EMPTY_ADDRESS;
- try {
- int memoryBlockCount;
- int sizeIndex;
- synchronized (info) {
+ int memoryBlockCount;
+ int sizeIndex;
+ synchronized (info) {
+ //if we're a demotion then the free flag was already checked and set
+ if (!demote) {
+ //let a pending free finish - it would be nice if we could pre-empt
+ //since we can save some work, but this should be rare enough
+ //to just block
+ await(info, false, true);
info.evicting = true;
- block = info.block;
- memoryBlockCount = info.memoryBlockCount;
- sizeIndex = info.sizeIndex;
- if (info.inode != EMPTY_ADDRESS) {
- bm = getBlockManager(info.gid, oid, info.inode);
- } else if (demote) {
- return EMPTY_ADDRESS;
- }
- //release the lock to perform the transfer
+ } else {
+ assert info.evicting;
}
+ block = info.block;
+ memoryBlockCount = info.memoryBlockCount;
+ sizeIndex = info.sizeIndex;
+ if (info.inode != EMPTY_ADDRESS) {
+ bm = getBlockManager(info.gid, oid, info.inode);
+ } else if (demote) {
+ return EMPTY_ADDRESS;
+ }
+ //release the lock to perform the transfer
+ //for straight removals this is a little wasteful
+ }
+ try {
if (demote && block == EMPTY_ADDRESS) {
storageWrites.getAndIncrement();
BlockInputStream is = new BlockInputStream(bm, memoryBlockCount);
@@ -724,8 +752,11 @@
await(info, true, false);
info.evicting = false;
info.notifyAll();
- info.inode = EMPTY_ADDRESS;
- memoryBufferEntries.remove(info.getId());
+ assert bm == null || info.inode != EMPTY_ADDRESS;
+ if (info.inode != EMPTY_ADDRESS) {
+ info.inode = EMPTY_ADDRESS;
+ memoryBufferEntries.remove(info);
+ }
if (block != EMPTY_ADDRESS) {
if (demote) {
info.block = block;
@@ -762,9 +793,8 @@
}
/**
- * Eviction routine. When space is exhausted datablocks are stolen from
- * memory entries
- * starvation.
+ * Eviction routine. When space is exhausted data blocks are acquired from
+ * memory entries.
* @param acquire
* @return
*/
@@ -776,10 +806,9 @@
//doing a cleanup may trigger the purging of resources
AutoCleanupUtil.doCleanup();
//scan the eviction queue looking for a victim
- Iterator<Map.Entry<PhysicalInfo, Long>> iter = memoryBufferEntries.getEvictionQueue().entrySet().iterator();
+ Iterator<PhysicalInfo> iter = memoryBufferEntries.getEvictionQueue().iterator();
while (((!acquire && lowBlocks(false)) || (acquire && (next = blocksInuse.getAndSetNextClearBit()) == EMPTY_ADDRESS)) && iter.hasNext()) {
- Map.Entry<PhysicalInfo, Long> entry = iter.next();
- PhysicalInfo info = entry.getKey();
+ PhysicalInfo info = iter.next();
synchronized (info) {
if (info.inode == EMPTY_ADDRESS) {
continue;
@@ -803,7 +832,7 @@
//mark as evicting early so that other evictFromMemoryCalls don't select this same entry
info.evicting = true;
}
- next = free(entry.getValue(), info, true, acquire);
+ next = free(info, true, acquire);
if (!acquire) {
next = 0; //let the cleaner know that we made progress
}
@@ -853,18 +882,22 @@
return storageWrites.get();
}
+ public long getMemoryBufferSpace() {
+ return memoryBufferSpace;
+ }
+
}
/**
* Represents the memory buffer and storage state of an object.
* It is important to minimize the amount of data held here.
- * Currently should be 40 bytes.
+ * Currently should be 48 bytes.
*/
final class PhysicalInfo extends BaseCacheEntry {
final Long gid;
//the memory inode and block count
int inode = BufferFrontedFileStoreCache.EMPTY_ADDRESS;
- final int memoryBlockCount;
+ int memoryBlockCount;
//the storage block and BlockStore index
int block = BufferFrontedFileStoreCache.EMPTY_ADDRESS;
byte sizeIndex = 0;
@@ -873,10 +906,13 @@
boolean evicting; //indicates that the entry will be moved out of the memory buffer
boolean loading; //used by tier 1 cache to prevent double loads
- public PhysicalInfo(Long gid, Long id, int inode, int size) {
- super(id);
+ public PhysicalInfo(Long gid, Long id, int inode) {
+ super(new CacheKey(id, 0, 0));
this.inode = inode;
this.gid = gid;
+ }
+
+ public void setSize(int size) {
this.memoryBlockCount = (size>>BufferFrontedFileStoreCache.LOG_BLOCK_SIZE) + ((size&BufferFrontedFileStoreCache.BLOCK_MASK)>0?1:0);
int blocks = memoryBlockCount;
while (blocks >= 1) {
@@ -884,4 +920,5 @@
blocks>>=2;
}
}
+
}
Modified: trunk/engine/src/main/java/org/teiid/common/buffer/impl/BufferManagerImpl.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/common/buffer/impl/BufferManagerImpl.java 2011-10-14 17:31:57 UTC (rev 3552)
+++ trunk/engine/src/main/java/org/teiid/common/buffer/impl/BufferManagerImpl.java 2011-10-17 03:12:03 UTC (rev 3553)
@@ -51,6 +51,7 @@
import org.teiid.common.buffer.BufferManager;
import org.teiid.common.buffer.Cache;
import org.teiid.common.buffer.CacheEntry;
+import org.teiid.common.buffer.CacheKey;
import org.teiid.common.buffer.FileStore;
import org.teiid.common.buffer.LobManager;
import org.teiid.common.buffer.STree;
@@ -120,7 +121,7 @@
@Override
public void setPrefersMemory(boolean prefers) {
- //TODO: it's only expected to move from not preferring to prefefring
+ //TODO: it's only expected to move from not preferring to preferring
this.prefersMemory.set(prefers);
}
@@ -140,10 +141,6 @@
throws TeiidComponentException {
int sizeEstimate = getSizeEstimate(batch);
Long oid = batchAdded.getAndIncrement();
- CacheEntry ce = new CacheEntry(oid);
- ce.setObject(batch);
- ce.setSizeEstimate(sizeEstimate);
- ce.setSerializer(this.ref);
CacheEntry old = null;
if (previous != null) {
if (removeOld) {
@@ -152,11 +149,16 @@
old = fastGet(previous, prefersMemory.get(), true);
}
}
+ CacheKey key = new CacheKey(oid, 0, old!=null?old.getKey().getOrderingValue():0);
+ CacheEntry ce = new CacheEntry(key);
+ ce.setObject(batch);
+ ce.setSizeEstimate(sizeEstimate);
+ ce.setSerializer(this.ref);
if (LogManager.isMessageToBeRecorded(LogConstants.CTX_BUFFER_MGR, MessageLevel.TRACE)) {
LogManager.logTrace(LogConstants.CTX_BUFFER_MGR, "Add batch to BufferManager", ce.getId(), "with size estimate", ce.getSizeEstimate()); //$NON-NLS-1$ //$NON-NLS-2$
}
cache.addToCacheGroup(id, ce.getId());
- addMemoryEntry(ce, old);
+ addMemoryEntry(ce);
return oid;
}
@@ -234,7 +236,7 @@
ce.setSerializer(this.ref);
ce.setPersistent(true);
if (retain) {
- addMemoryEntry(ce, null);
+ addMemoryEntry(ce);
}
} finally {
cache.unlockForLoad(o);
@@ -285,7 +287,6 @@
private AtomicInteger maxReserveKB = new AtomicInteger(1 << 18);
private volatile int reserveBatchKB;
private int maxActivePlans = DQPConfiguration.DEFAULT_MAX_ACTIVE_PLANS; //used as a hint to set the reserveBatchKB
- private long memoryBufferSpace; //used as a hint to account for batch overhead (only useful in large scenarios)
private boolean useWeakReferences = true;
private boolean inlineLobs = true;
private int targetBytesPerRow = TARGET_BYTES_PER_ROW;
@@ -297,10 +298,9 @@
private AtomicInteger activeBatchKB = new AtomicInteger();
private AtomicLong readAttempts = new AtomicLong();
- //implements a LRFU cache using the a customized crf function. we store the value with
- //the cache entry to make a better decision about reuse of the batch
//TODO: consider the size estimate in the weighting function
- private OrderedCache<Long, CacheEntry> memoryEntries = new OrderedCache<Long, CacheEntry>(16, .75f, CONCURRENCY_LEVEL, readAttempts);
+ LrfuEvictionQueue<CacheEntry> evictionQueue = new LrfuEvictionQueue<CacheEntry>(readAttempts);
+ ConcurrentHashMap<Long, CacheEntry> memoryEntries = new ConcurrentHashMap<Long, CacheEntry>(16, .75f, CONCURRENCY_LEVEL);
//limited size reference caches based upon the memory settings
private WeakReferenceHashedValueCache<CacheEntry> weakReferenceCache;
@@ -423,7 +423,7 @@
if (LogManager.isMessageToBeRecorded(LogConstants.CTX_BUFFER_MGR, MessageLevel.DETAIL)) {
LogManager.logDetail(LogConstants.CTX_BUFFER_MGR, "Creating STree:", newID); //$NON-NLS-1$
}
- return new STree(keyManager, bm, new ListNestedSortComparator(compareIndexes), getProcessorBatchSize(elements), getProcessorBatchSize(elements.subList(0, keyLength)), keyLength, lobManager);
+ return new STree(keyManager, bm, new ListNestedSortComparator(compareIndexes), getProcessorBatchSize(elements.subList(0, keyLength)), getProcessorBatchSize(elements), keyLength, lobManager);
}
private static Class<?>[] getTypeClasses(final List elements) {
@@ -464,10 +464,6 @@
this.maxActivePlans = maxActivePlans;
}
- public void setMemoryBufferSpace(long memoryBufferSpace) {
- this.memoryBufferSpace = memoryBufferSpace;
- }
-
public void setMaxProcessingKB(int maxProcessingKB) {
this.maxProcessingKB = maxProcessingKB;
}
@@ -488,8 +484,6 @@
this.maxReserveKB.addAndGet(((int)Math.max(0, (maxMemory - one_gig) * .75)));
}
this.maxReserveKB.addAndGet(((int)Math.max(0, Math.min(one_gig, maxMemory) * .5)));
- int batchOverheadKB = (int)(this.memoryBufferSpace<0?(this.maxReserveKB.get()<<8):this.memoryBufferSpace)>>20;
- this.maxReserveKB.set(Math.max(0, this.maxReserveKB.get() - batchOverheadKB));
}
this.reserveBatchKB = this.getMaxReserveKB();
if (this.maxProcessingKBOrig == null) {
@@ -574,26 +568,34 @@
int maxToFree = Math.max(maxProcessingKB>>1, reserveBatchKB>>3);
int freed = 0;
while (freed <= maxToFree && activeBatchKB.get() > reserveBatchKB * .8) {
- CacheEntry ce = memoryEntries.evict();
+ CacheEntry ce = evictionQueue.firstEntry(true);
if (ce == null) {
break;
}
- freed += ce.getSizeEstimate();
- activeBatchKB.addAndGet(-ce.getSizeEstimate());
+ if (!memoryEntries.containsKey(ce.getId())) {
+ continue; //not currently a valid eviction
+ }
+ boolean evicted = true;
try {
- evict(ce);
+ evicted = evict(ce);
} catch (Throwable e) {
LogManager.logError(LogConstants.CTX_BUFFER_MGR, e, "Error persisting batch, attempts to read batch "+ ce.getId() +" later will result in an exception"); //$NON-NLS-1$ //$NON-NLS-2$
} finally {
- this.memoryEntries.finishedEviction(ce.getId());
+ synchronized (ce) {
+ if (evicted && memoryEntries.remove(ce.getId()) != null) {
+ freed += ce.getSizeEstimate();
+ activeBatchKB.addAndGet(-ce.getSizeEstimate());
+ evictionQueue.remove(ce); //ensures that an intervening get will still be cleaned
+ }
+ }
}
}
}
- void evict(CacheEntry ce) throws Exception {
+ boolean evict(CacheEntry ce) throws Exception {
Serializer<?> s = ce.getSerializer();
if (s == null) {
- return;
+ return true;
}
boolean persist = false;
synchronized (ce) {
@@ -608,12 +610,13 @@
LogManager.logDetail(LogConstants.CTX_BUFFER_MGR, ce.getId(), "writing batch to storage, total writes: ", count); //$NON-NLS-1$
}
}
- cache.add(ce, s);
+ boolean result = cache.add(ce, s);
if (s.useSoftCache()) {
createSoftReference(ce);
} else if (useWeakReferences) {
weakReferenceCache.getValue(ce); //a get will set the value
}
+ return result;
}
private void createSoftReference(CacheEntry ce) {
@@ -633,6 +636,17 @@
ce = memoryEntries.remove(batch);
}
if (ce != null) {
+ synchronized (ce) {
+ if (retain) {
+ //there is a minute chance the batch was evicted
+ //this call ensures that we won't leak
+ if (memoryEntries.containsKey(batch)) {
+ evictionQueue.touch(ce, false);
+ }
+ } else {
+ evictionQueue.remove(ce);
+ }
+ }
if (!retain) {
BufferManagerImpl.this.remove(ce, true);
}
@@ -655,7 +669,7 @@
if (ce != null && ce.getObject() != null) {
referenceHit.getAndIncrement();
if (retain) {
- addMemoryEntry(ce, null);
+ addMemoryEntry(ce);
} else {
BufferManagerImpl.this.remove(ce, false);
}
@@ -687,13 +701,11 @@
}
}
- void addMemoryEntry(CacheEntry ce, CacheEntry previous) {
+ void addMemoryEntry(CacheEntry ce) {
persistBatchReferences();
synchronized (ce) {
- if (previous != null) {
- ce.setOrderingValue(previous.getOrderingValue());
- }
memoryEntries.put(ce.getId(), ce);
+ evictionQueue.touch(ce, true);
}
activeBatchKB.getAndAdd(ce.getSizeEstimate());
}
Added: trunk/engine/src/main/java/org/teiid/common/buffer/impl/LrfuEvictionQueue.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/common/buffer/impl/LrfuEvictionQueue.java (rev 0)
+++ trunk/engine/src/main/java/org/teiid/common/buffer/impl/LrfuEvictionQueue.java 2011-10-17 03:12:03 UTC (rev 3553)
@@ -0,0 +1,117 @@
+/*
+ * JBoss, Home of Professional Open Source.
+ * See the COPYRIGHT.txt file distributed with this work for information
+ * regarding copyright ownership. Some portions may be licensed
+ * to Red Hat, Inc. under one or more contributor license agreements.
+ *
+ * This library 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 2.1 of the License, or (at your option) any later version.
+ *
+ * This library 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 this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+ * 02110-1301 USA.
+ */
+
+package org.teiid.common.buffer.impl;
+
+import java.util.Collection;
+import java.util.Map;
+import java.util.NavigableMap;
+import java.util.concurrent.ConcurrentSkipListMap;
+import java.util.concurrent.atomic.AtomicLong;
+
+import org.teiid.common.buffer.BaseCacheEntry;
+import org.teiid.common.buffer.CacheKey;
+
+/**
+ * A Concurrent LRFU eviction queue. Has assumptions that match buffermanager usage.
+ * Null values are not allowed.
+ * @param <K>
+ * @param <V>
+ */
+public class LrfuEvictionQueue<V extends BaseCacheEntry> {
+
+ //TODO: until Java 7 ConcurrentSkipListMap has a scaling bug in that
+ //the level function limits the effective map size to ~ 2^16
+ //above which it performs comparably under multi-threaded load to a synchronized LinkedHashMap
+ //just with more CPU overhead vs. wait time.
+ protected NavigableMap<CacheKey, V> evictionQueue = new ConcurrentSkipListMap<CacheKey, V>();
+ protected AtomicLong clock;
+ //combined recency/frequency lamda value between 0 and 1 lower -> LFU, higher -> LRU
+ //TODO: adaptively adjust this value. more hits should move closer to lru
+ protected float crfLamda = .0002f;
+
+ public LrfuEvictionQueue(AtomicLong clock) {
+ this.clock = clock;
+ }
+
+ public boolean remove(V value) {
+ return evictionQueue.remove(value.getKey()) != null;
+ }
+
+ public void touch(V value, boolean initial) {
+ if (!initial) {
+ initial = evictionQueue.remove(value.getKey()) == null;
+ }
+ recordAccess(value, initial);
+ evictionQueue.put(value.getKey(), value);
+ }
+
+ public Collection<V> getEvictionQueue() {
+ return evictionQueue.values();
+ }
+
+ public V firstEntry(boolean poll) {
+ Map.Entry<CacheKey, V> entry = null;
+ if (poll) {
+ entry = evictionQueue.pollFirstEntry();
+ } else {
+ entry = evictionQueue.firstEntry();
+ }
+ if (entry != null) {
+ return entry.getValue();
+ }
+ return null;
+ }
+
+ protected void recordAccess(V value, boolean initial) {
+ assert Thread.holdsLock(value);
+ CacheKey key = value.getKey();
+ float lastAccess = key.getLastAccess();
+ float currentClock = clock.get();
+ if (initial && lastAccess == 0) {
+ return; //we just want to timestamp this as created and not give it an ordering value
+ }
+ float orderingValue = key.getOrderingValue();
+ orderingValue = computeNextOrderingValue(currentClock, lastAccess,
+ orderingValue);
+ value.setKey(new CacheKey(key.getId(), currentClock, orderingValue));
+ }
+
+ float computeNextOrderingValue(float currentTime,
+ float lastAccess, float orderingValue) {
+ orderingValue =
+ (float) (//Frequency component
+ orderingValue*Math.pow(1-crfLamda, currentTime - lastAccess)
+ //recency component
+ + Math.pow(currentTime, crfLamda));
+ return orderingValue;
+ }
+
+ public float getCrfLamda() {
+ return crfLamda;
+ }
+
+ public void setCrfLamda(float crfLamda) {
+ this.crfLamda = crfLamda;
+ }
+
+}
Property changes on: trunk/engine/src/main/java/org/teiid/common/buffer/impl/LrfuEvictionQueue.java
___________________________________________________________________
Added: svn:mime-type
+ text/plain
Modified: trunk/engine/src/main/java/org/teiid/common/buffer/impl/MemoryStorageManager.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/common/buffer/impl/MemoryStorageManager.java 2011-10-14 17:31:57 UTC (rev 3552)
+++ trunk/engine/src/main/java/org/teiid/common/buffer/impl/MemoryStorageManager.java 2011-10-17 03:12:03 UTC (rev 3553)
@@ -111,11 +111,12 @@
}
@Override
- public void add(CacheEntry entry, Serializer<?> s) {
+ public boolean add(CacheEntry entry, Serializer<?> s) {
Map<Long, CacheEntry> group = groups.get(s.getId());
if (group != null) {
group.put(entry.getId(), entry);
}
+ return true;
}
@Override
Deleted: trunk/engine/src/main/java/org/teiid/common/buffer/impl/OrderedCache.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/common/buffer/impl/OrderedCache.java 2011-10-14 17:31:57 UTC (rev 3552)
+++ trunk/engine/src/main/java/org/teiid/common/buffer/impl/OrderedCache.java 2011-10-17 03:12:03 UTC (rev 3553)
@@ -1,153 +0,0 @@
-/*
- * JBoss, Home of Professional Open Source.
- * See the COPYRIGHT.txt file distributed with this work for information
- * regarding copyright ownership. Some portions may be licensed
- * to Red Hat, Inc. under one or more contributor license agreements.
- *
- * This library 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 2.1 of the License, or (at your option) any later version.
- *
- * This library 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 this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
- * 02110-1301 USA.
- */
-
-package org.teiid.common.buffer.impl;
-
-import java.util.Map;
-import java.util.NavigableMap;
-import java.util.concurrent.ConcurrentHashMap;
-import java.util.concurrent.ConcurrentSkipListMap;
-import java.util.concurrent.atomic.AtomicLong;
-
-import org.teiid.common.buffer.BaseCacheEntry;
-
-/**
- * A Concurrent LRFU cache. Has assumptions that match buffermanager usage.
- * Null values are not allowed.
- * @param <K>
- * @param <V>
- */
-public class OrderedCache<K, V extends BaseCacheEntry> {
-
- protected Map<K, V> map;
- //TODO: until Java 7 ConcurrentSkipListMap has a scaling bug in that
- //the level limits the effective map size to ~ 2^16
- //above which it performs comparably under load to a synchronized LinkedHashMap
- //just with more CPU overhead vs. wait time.
- protected NavigableMap<V, K> evictionQueue = new ConcurrentSkipListMap<V, K>();
- protected Map<K, V> limbo;
- protected AtomicLong clock;
- //combined recency/frequency lamda value between 0 and 1 lower -> LFU, higher -> LRU
- //TODO: adaptively adjust this value. more hits should move closer to lru
- protected float crfLamda = .0002f;
-
- public OrderedCache(int initialCapacity, float loadFactor, int concurrencyLevel, AtomicLong clock) {
- map = new ConcurrentHashMap<K, V>(initialCapacity, loadFactor, concurrencyLevel);
- limbo = new ConcurrentHashMap<K, V>(initialCapacity, loadFactor, concurrencyLevel);
- this.clock = clock;
- }
-
- public V get(K key) {
- V result = map.get(key);
- if (result == null) {
- result = limbo.get(key);
- }
- if (result != null) {
- synchronized (result) {
- evictionQueue.remove(result);
- recordAccess(result, false);
- evictionQueue.put(result, key);
- }
- }
- return result;
- }
-
- public V remove(K key) {
- V result = map.remove(key);
- if (result != null) {
- synchronized (result) {
- evictionQueue.remove(result);
- }
- }
- return result;
- }
-
- public V put(K key, V value) {
- V result = map.put(key, value);
- if (result != null) {
- synchronized (result) {
- evictionQueue.remove(result);
- }
- }
- synchronized (value) {
- recordAccess(value, result == null);
- evictionQueue.put(value, key);
- }
- return result;
- }
-
- public V evict() {
- Map.Entry<V, K> entry = evictionQueue.pollFirstEntry();
- if (entry == null) {
- return null;
- }
- limbo.put(entry.getValue(), entry.getKey());
- return map.remove(entry.getValue());
- }
-
- public void finishedEviction(K key) {
- limbo.remove(key);
- }
-
- public int size() {
- return map.size();
- }
-
- public Map<V, K> getEvictionQueue() {
- return evictionQueue;
- }
-
- public Map.Entry<V, K> firstEntry() {
- return evictionQueue.firstEntry();
- }
-
- protected void recordAccess(BaseCacheEntry value, boolean initial) {
- float lastAccess = value.getLastAccess();
- value.setLastAccess(clock.get());
- if (initial && lastAccess == 0) {
- return; //we just want to timestamp this as created and not give it an ordering value
- }
- float orderingValue = value.getOrderingValue();
- orderingValue = computeNextOrderingValue(value.getLastAccess(), lastAccess,
- orderingValue);
- value.setOrderingValue(orderingValue);
- }
-
- float computeNextOrderingValue(float currentTime,
- float lastAccess, float orderingValue) {
- orderingValue =
- (float) (//Frequency component
- orderingValue*Math.pow(1-crfLamda, currentTime - lastAccess)
- //recency component
- + Math.pow(currentTime, crfLamda));
- return orderingValue;
- }
-
- public float getCrfLamda() {
- return crfLamda;
- }
-
- public void setCrfLamda(float crfLamda) {
- this.crfLamda = crfLamda;
- }
-
-}
Modified: trunk/runtime/src/main/java/org/teiid/services/BufferServiceImpl.java
===================================================================
--- trunk/runtime/src/main/java/org/teiid/services/BufferServiceImpl.java 2011-10-14 17:31:57 UTC (rev 3552)
+++ trunk/runtime/src/main/java/org/teiid/services/BufferServiceImpl.java 2011-10-17 03:12:03 UTC (rev 3553)
@@ -68,8 +68,9 @@
private int maxReserveKb = BufferManager.DEFAULT_RESERVE_BUFFER_KB;
private long maxBufferSpace = FileStorageManager.DEFAULT_MAX_BUFFERSPACE>>20;
private boolean inlineLobs = true;
- private int memoryBufferSpace = -1;
+ private long memoryBufferSpace = -1;
private int maxStorageObjectSize = BufferFrontedFileStoreCache.DEFAuLT_MAX_OBJECT_SIZE;
+ private boolean memoryBufferOffHeap;
private FileStorageManager fsm;
/**
@@ -93,7 +94,6 @@
this.bufferMgr.setProcessorBatchSize(Integer.valueOf(processorBatchSize));
this.bufferMgr.setMaxReserveKB(this.maxReserveKb);
this.bufferMgr.setMaxProcessingKB(this.maxProcessingKb);
- this.bufferMgr.setMemoryBufferSpace(Math.min(BufferFrontedFileStoreCache.MAX_ADDRESSABLE_MEMORY, this.memoryBufferSpace));
this.bufferMgr.initialize();
// If necessary, add disk storage manager
@@ -110,12 +110,20 @@
ssm.setMaxFileSize(maxFileSize);
BufferFrontedFileStoreCache fsc = new BufferFrontedFileStoreCache();
fsc.setMaxStorageObjectSize(maxStorageObjectSize);
+ fsc.setDirect(memoryBufferOffHeap);
+ int batchOverheadKB = (int)(this.memoryBufferSpace<0?(this.bufferMgr.getMaxReserveKB()<<8):this.memoryBufferSpace)>>20;
+ this.bufferMgr.setMaxReserveKB(Math.max(0, this.bufferMgr.getMaxReserveKB() - batchOverheadKB));
if (memoryBufferSpace < 0) {
//use approximately 25% of what's set aside for the reserved
- fsc.setMemoryBufferSpace(this.bufferMgr.getMaxReserveKB() << 8);
+ fsc.setMemoryBufferSpace(((long)this.bufferMgr.getMaxReserveKB()) << 8);
} else {
- fsc.setMemoryBufferSpace(memoryBufferSpace);
+ //scale from MB to bytes
+ fsc.setMemoryBufferSpace(memoryBufferSpace << 20);
}
+ if (!memoryBufferOffHeap && this.maxReserveKb < 0) {
+ //adjust the value
+ this.bufferMgr.setMaxReserveKB(this.bufferMgr.getMaxReserveKB() - (int)Math.min(this.bufferMgr.getMaxReserveKB(), (fsc.getMemoryBufferSpace()>>10)));
+ }
fsc.setStorageManager(ssm);
fsc.initialize();
this.bufferMgr.setCache(fsc);
@@ -255,20 +263,29 @@
return bufferMgr.getReadAttempts();
}
- @ManagementProperty(description="Direct memory buffer space used by the buffer manager in MB. -1 determines the setting automatically from the maxReserveKB (default -1). This value cannot be smaller than maxStorageObjectSize.")
- public int getMemoryBufferSpace() {
+ @ManagementProperty(description="Memory buffer space used by the buffer manager in MB. -1 determines the setting automatically from the maxReserveKB (default -1). This value cannot be smaller than maxStorageObjectSize.")
+ public long getMemoryBufferSpace() {
return memoryBufferSpace;
}
-
+
+ @ManagementProperty(description="The maximum size of a buffer managed object (typically a table page or a results batch) in bytes (default 8388608).")
public int getMaxStorageObjectSize() {
return maxStorageObjectSize;
}
- @ManagementProperty(description="The maximum size of a buffer managed object (typically a table page or a results batch) in bytes (default 8388608).")
- public void setMemoryBufferSpace(int maxMemoryBufferSpace) {
- this.memoryBufferSpace = maxMemoryBufferSpace;
+ @ManagementProperty(description="Set to true to hold the memory buffer off-heap. If true you must ensure that the VM can allocate that much direct memory (default false).")
+ public boolean isMemoryBufferOffHeap() {
+ return memoryBufferOffHeap;
}
+
+ public void setMemoryBufferOffHeap(boolean memoryBufferOffHeap) {
+ this.memoryBufferOffHeap = memoryBufferOffHeap;
+ }
+ public void setMemoryBufferSpace(int memoryBufferSpace) {
+ this.memoryBufferSpace = memoryBufferSpace;
+ }
+
public void setMaxStorageObjectSize(int maxStorageObjectSize) {
this.maxStorageObjectSize = maxStorageObjectSize;
}
12 years, 6 months
teiid SVN: r3552 - in trunk: engine/src/main/java/org/teiid/common/buffer/impl and 2 other directories.
by teiid-commits@lists.jboss.org
Author: shawkins
Date: 2011-10-14 13:31:57 -0400 (Fri, 14 Oct 2011)
New Revision: 3552
Modified:
trunk/engine/src/main/java/org/teiid/common/buffer/Cache.java
trunk/engine/src/main/java/org/teiid/common/buffer/impl/BlockInputStream.java
trunk/engine/src/main/java/org/teiid/common/buffer/impl/BlockManager.java
trunk/engine/src/main/java/org/teiid/common/buffer/impl/BufferFrontedFileStoreCache.java
trunk/engine/src/main/java/org/teiid/common/buffer/impl/BufferManagerImpl.java
trunk/engine/src/main/java/org/teiid/common/buffer/impl/ConcurrentBitSet.java
trunk/engine/src/main/java/org/teiid/common/buffer/impl/MemoryStorageManager.java
trunk/engine/src/test/java/org/teiid/common/buffer/impl/TestBufferFrontedFileStoreCache.java
trunk/engine/src/test/java/org/teiid/common/buffer/impl/TestConcurrentBitSet.java
trunk/runtime/src/main/java/org/teiid/services/BufferServiceImpl.java
Log:
TEIID-1750 using finer grained locking and refining the config
Modified: trunk/engine/src/main/java/org/teiid/common/buffer/Cache.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/common/buffer/Cache.java 2011-10-14 15:23:51 UTC (rev 3551)
+++ trunk/engine/src/main/java/org/teiid/common/buffer/Cache.java 2011-10-14 17:31:57 UTC (rev 3552)
@@ -29,13 +29,66 @@
/**
* Represents the storage strategy for the {@link BufferManager}
*/
-public interface Cache extends StorageManager {
- void createCacheGroup(Long gid); //called prior to adding an entry
- //TODO: this should use a callback on the buffermangaer to remove memory entries
- //without materializing all group keys
+public interface Cache<T> extends StorageManager {
+ /**
+ * Must be called prior to adding any group entries
+ * @param gid
+ */
+ void createCacheGroup(Long gid);
+
+ /**
+ * Remove an entire cache group
+ *
+ * TODO: this should use a callback on the buffermangaer to remove memory entries
+ * without materializing all group keys
+ * @param gid
+ * @return
+ */
Collection<Long> removeCacheGroup(Long gid);
+
+ /**
+ * Must be called prior to adding an entry
+ * @param gid
+ * @param oid
+ */
void addToCacheGroup(Long gid, Long oid);
- CacheEntry get(Long id, Serializer<?> serializer) throws TeiidComponentException;
+
+ /**
+ * Lock the object for load and return an identifier/lock
+ * that can be used to retrieve the object.
+ * @param oid
+ * @param serializer
+ * @return the identifier, may be null
+ */
+ T lockForLoad(Long oid, Serializer<?> serializer);
+
+ /**
+ * Must be called after lockForLoad
+ * @param o
+ */
+ void unlockForLoad(T lock);
+
+ /**
+ * Get method, must be called using the object obtained in the
+ * lockForLoad method
+ * @return
+ * @throws TeiidComponentException
+ */
+ CacheEntry get(T lock, Long oid, Serializer<?> serializer) throws TeiidComponentException;
+
+ /**
+ * Adds an entry to the cache.
+ * @param entry
+ * @param s
+ * @throws Exception
+ */
void add(CacheEntry entry, Serializer<?> s) throws Exception;
+
+ /**
+ * Remove an entry from the cache
+ * @param gid
+ * @param id
+ */
void remove(Long gid, Long id);
+
}
\ No newline at end of file
Modified: trunk/engine/src/main/java/org/teiid/common/buffer/impl/BlockInputStream.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/common/buffer/impl/BlockInputStream.java 2011-10-14 15:23:51 UTC (rev 3551)
+++ trunk/engine/src/main/java/org/teiid/common/buffer/impl/BlockInputStream.java 2011-10-14 17:31:57 UTC (rev 3552)
@@ -70,7 +70,4 @@
return len;
}
- public int free(boolean steal) {
- return manager.free(steal);
- }
}
\ No newline at end of file
Modified: trunk/engine/src/main/java/org/teiid/common/buffer/impl/BlockManager.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/common/buffer/impl/BlockManager.java 2011-10-14 15:23:51 UTC (rev 3551)
+++ trunk/engine/src/main/java/org/teiid/common/buffer/impl/BlockManager.java 2011-10-14 17:31:57 UTC (rev 3552)
@@ -43,6 +43,6 @@
void freeBlock(int index);
- int free(boolean steal);
+ int free(boolean acquireDataBlock);
}
Modified: trunk/engine/src/main/java/org/teiid/common/buffer/impl/BufferFrontedFileStoreCache.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/common/buffer/impl/BufferFrontedFileStoreCache.java 2011-10-14 15:23:51 UTC (rev 3551)
+++ trunk/engine/src/main/java/org/teiid/common/buffer/impl/BufferFrontedFileStoreCache.java 2011-10-14 17:31:57 UTC (rev 3552)
@@ -38,7 +38,6 @@
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Semaphore;
import java.util.concurrent.atomic.AtomicBoolean;
-import java.util.concurrent.atomic.AtomicInteger;
import java.util.concurrent.atomic.AtomicLong;
import java.util.concurrent.locks.ReentrantReadWriteLock;
@@ -94,8 +93,10 @@
* on the compact option of {@link ConcurrentBitSet} to keep the blocks at the start of the
* files.
*/
-public class BufferFrontedFileStoreCache implements Cache, StorageManager {
+public class BufferFrontedFileStoreCache implements Cache<PhysicalInfo>, StorageManager {
+ private static final int EVICTION_SCANS = 5;
+
public static final int DEFAuLT_MAX_OBJECT_SIZE = 1 << 23;
static final int ADDRESS_BITS = 31;
@@ -108,6 +109,9 @@
//TODO allow the block size to be configurable
static final int LOG_BLOCK_SIZE = 13;
+
+ public static final long MAX_ADDRESSABLE_MEMORY = 1l<<(ADDRESS_BITS+LOG_BLOCK_SIZE);
+
static final int BLOCK_SIZE = 1 << LOG_BLOCK_SIZE;
static final int BLOCK_MASK = BLOCK_SIZE - 1;
static final int ADDRESSES_PER_BLOCK = BLOCK_SIZE/BYTES_PER_BLOCK_ADDRESS;
@@ -125,11 +129,13 @@
private ByteBuffer inodeBuffer;
private final long gid;
private final long oid;
+ private int blockSegment;
InodeBlockManager(long gid, long oid, int inode) {
this.inode = inode;
this.gid = gid;
this.oid = oid;
+ this.blockSegment = blocksInuse.getNextSegment();
}
@Override
@@ -218,7 +224,7 @@
memoryEvictionLock.readLock().lock();
boolean readLocked = true;
try {
- if ((next = blocksInuse.getAndSetNextClearBit()) == EMPTY_ADDRESS) {
+ if ((next = blocksInuse.getAndSetNextClearBit(blockSegment)) == EMPTY_ADDRESS) {
memoryEvictionLock.readLock().unlock();
readLocked = false;
next = evictFromMemoryBuffer(true);
@@ -254,7 +260,6 @@
if (this.inode == -1) {
throw new AssertionError("Out of inodes"); //$NON-NLS-1$
}
- inodesCreated.getAndIncrement();
if (LogManager.isMessageToBeRecorded(LogConstants.CTX_DQP, MessageLevel.DETAIL)) {
LogManager.logDetail(LogConstants.CTX_DQP, "Allocating inode", this.inode, "to", gid, oid); //$NON-NLS-1$ //$NON-NLS-2$
}
@@ -267,31 +272,30 @@
}
@Override
- public int free(boolean steal) {
+ public int free(boolean acquire) {
if (this.inode == EMPTY_ADDRESS) {
return EMPTY_ADDRESS;
}
ByteBuffer bb = getInodeBlock();
- int dataBlockToSteal = bb.getInt(0);
+ int dataBlockToAcquire = bb.getInt(0);
int indirectIndexBlock = bb.getInt(BYTES_PER_BLOCK_ADDRESS*DIRECT_POINTERS);
int doublyIndirectIndexBlock = bb.getInt(BYTES_PER_BLOCK_ADDRESS*(DIRECT_POINTERS+1));
- boolean freedAll = freeBlock(steal?BYTES_PER_BLOCK_ADDRESS:0, bb, DIRECT_POINTERS-(steal?1:0), true);
+ boolean freedAll = freeBlock(acquire?BYTES_PER_BLOCK_ADDRESS:0, bb, DIRECT_POINTERS-(acquire?1:0), true);
if (LogManager.isMessageToBeRecorded(LogConstants.CTX_DQP, MessageLevel.DETAIL)) {
LogManager.logDetail(LogConstants.CTX_DQP, "freeing inode", inode, "for", gid, oid); //$NON-NLS-1$ //$NON-NLS-2$
}
inodesInuse.clear(inode);
- inodesRemoved.getAndIncrement();
if (!freedAll || indirectIndexBlock == EMPTY_ADDRESS) {
- return steal?dataBlockToSteal:EMPTY_ADDRESS;
+ return acquire?dataBlockToAcquire:EMPTY_ADDRESS;
}
freedAll = freeIndirectBlock(indirectIndexBlock);
if (!freedAll || doublyIndirectIndexBlock == EMPTY_ADDRESS) {
- return steal?dataBlockToSteal:EMPTY_ADDRESS;
+ return acquire?dataBlockToAcquire:EMPTY_ADDRESS;
}
bb = blockByteBuffer.getByteBuffer(doublyIndirectIndexBlock);
freeBlock(0, bb, ADDRESSES_PER_BLOCK, false);
freeDataBlock(doublyIndirectIndexBlock);
- return steal?dataBlockToSteal:EMPTY_ADDRESS;
+ return acquire?dataBlockToAcquire:EMPTY_ADDRESS;
}
private boolean freeIndirectBlock(int indirectIndexBlock) {
@@ -323,29 +327,7 @@
return blockByteBuffer.getByteBuffer(dataBlock);
}
}
- AtomicInteger inodesRemoved = new AtomicInteger();
- AtomicInteger inodesCreated = new AtomicInteger();
- private static class PhysicalInfo extends BaseCacheEntry {
- int inode = EMPTY_ADDRESS;
- int block = EMPTY_ADDRESS;
- int sizeIndex = 0;
- final int memoryBlockCount;
- final Long gid;
-
- public PhysicalInfo(Long gid, Long id, int inode, int size) {
- super(id);
- this.inode = inode;
- this.gid = gid;
- this.memoryBlockCount = (size>>LOG_BLOCK_SIZE) + ((size&BLOCK_MASK)>0?1:0);
- int blocks = memoryBlockCount;
- while (blocks >= 1) {
- this.sizeIndex++;
- blocks>>=2;
- }
- }
- }
-
private StorageManager storageManager;
private int maxStorageObjectSize = DEFAuLT_MAX_OBJECT_SIZE;
private long memoryBufferSpace = 1 << 26; //64MB
@@ -375,7 +357,7 @@
@Override
public void run() {
try {
- while (lowBlocks()) {
+ while (lowBlocks(false)) {
if (evictFromMemoryBuffer(false) == EMPTY_ADDRESS) {
break;
}
@@ -386,6 +368,7 @@
}
};
private int cleaningThreshold;
+ private int criticalCleaningThreshold;
private AtomicLong storageWrites = new AtomicLong();
private AtomicLong storageReads = new AtomicLong();
@@ -402,7 +385,9 @@
this.inodeByteBuffer = new BlockByteBuffer(30, blocks+1, LOG_INODE_SIZE, direct);
memoryWritePermits = new Semaphore(Math.max(1, (int)Math.min(memoryBufferSpace/maxStorageObjectSize, Integer.MAX_VALUE)));
maxMemoryBlocks = Math.min(MAX_DOUBLE_INDIRECT, maxStorageObjectSize>>LOG_BLOCK_SIZE);
- cleaningThreshold = Math.min(maxMemoryBlocks<<3, blocks>>1); //try to maintain enough freespace to hold 8 max objects
+ //try to maintain enough freespace so that writers don't block in cleaning
+ cleaningThreshold = Math.min(maxMemoryBlocks<<4, blocks>>1);
+ criticalCleaningThreshold = Math.min(maxMemoryBlocks<<2, blocks>>2);
//account for index pointer block overhead
if (maxMemoryBlocks > DIRECT_POINTERS) {
maxMemoryBlocks--;
@@ -423,9 +408,9 @@
this.sizeBasedStores = stores.toArray(new BlockStore[stores.size()]);
}
- boolean lowBlocks() {
+ boolean lowBlocks(boolean critical) {
int bitsSet = blocksInuse.getBitsSet();
- return bitsSet > 0 && (blocks - bitsSet < cleaningThreshold) && memoryBufferEntries.firstEntry() != null;
+ return bitsSet > 0 && (blocks - bitsSet < (critical?criticalCleaningThreshold:cleaningThreshold)) && memoryBufferEntries.firstEntry() != null;
}
InodeBlockManager getBlockManager(long gid, long oid, int inode) {
@@ -441,7 +426,6 @@
InodeBlockManager blockManager = null;
boolean hasPermit = false;
PhysicalInfo info = null;
- boolean newEntry = true;
boolean success = false;
try {
Map<Long, PhysicalInfo> map = physicalMapping.get(s.getId());
@@ -454,18 +438,29 @@
return; //already removed
}
} else {
- newEntry = false;
synchronized (info) {
//we assume that serialization would be faster than a disk read
if (info.inode != EMPTY_ADDRESS || !shouldPlaceInMemoryBuffer(0, info)) {
success = true;
return;
}
+ //we should not be in memory since there is no inode assigned
+ assert !memoryBufferEntries.getEvictionQueue().containsKey(info);
}
}
- if (!cleanerRunning.get() && lowBlocks() && cleanerRunning.compareAndSet(false, true)) {
- LogManager.logDetail(LogConstants.CTX_DQP, "Starting memory buffer cleaner"); //$NON-NLS-1$
- asynchPool.execute(cleaningTask);
+ //proactively create freespace
+ if (!cleanerRunning.get()) {
+ if (lowBlocks(false) && cleanerRunning.compareAndSet(false, true)) {
+ LogManager.logDetail(LogConstants.CTX_DQP, "Starting memory buffer cleaner"); //$NON-NLS-1$
+ asynchPool.execute(cleaningTask);
+ if (lowBlocks(true)) {
+ //do a non-blocking removal before we're forced to block
+ evictFromMemoryBuffer(false);
+ }
+ }
+ } else if (lowBlocks(true)) {
+ //do a non-blocking removal before we're forced to block
+ evictFromMemoryBuffer(false);
}
memoryWritePermits.acquire();
hasPermit = true;
@@ -478,15 +473,14 @@
synchronized (map) {
//synchronize to ensure proper cleanup from a concurrent removal
if (physicalMapping.containsKey(s.getId()) && map.containsKey(entry.getId())) {
- if (newEntry) {
+ if (info == null) {
info = new PhysicalInfo(s.getId(), entry.getId(), blockManager.getInode(), fsos.getBytesWritten());
map.put(entry.getId(), info);
- } else {
- synchronized (info) {
- info.inode = blockManager.getInode();
- }
}
- memoryBufferEntries.put(entry.getId(), info);
+ synchronized (info) {
+ info.inode = blockManager.getInode();
+ memoryBufferEntries.put(entry.getId(), info);
+ }
success = true;
}
}
@@ -503,28 +497,61 @@
}
@Override
- public CacheEntry get(Long oid, Serializer<?> serializer) throws TeiidComponentException {
+ public PhysicalInfo lockForLoad(Long oid, Serializer<?> serializer) {
+ Map<Long, PhysicalInfo> map = physicalMapping.get(serializer.getId());
+ if (map == null) {
+ return null;
+ }
+ PhysicalInfo info = map.get(oid);
+ if (info == null) {
+ return null;
+ }
+ synchronized (info) {
+ while (info.loading) {
+ try {
+ info.wait();
+ } catch (InterruptedException e) {
+ throw new TeiidRuntimeException(e);
+ }
+ }
+ info.loading = true;
+ }
+ return info;
+ }
+
+ @Override
+ public void unlockForLoad(PhysicalInfo info) {
+ if (info == null) {
+ return;
+ }
+ synchronized (info) {
+ assert info.loading;
+ info.loading = false;
+ info.notifyAll();
+ }
+ }
+
+ @Override
+ public CacheEntry get(PhysicalInfo info, Long oid, Serializer<?> serializer) throws TeiidComponentException {
+ if (info == null) {
+ return null;
+ }
long currentTime = readAttempts.incrementAndGet();
+ InputStream is = null;
+ boolean inStorage = false;
try {
- Map<Long, PhysicalInfo> map = physicalMapping.get(serializer.getId());
- if (map == null) {
- return null;
- }
- final PhysicalInfo info = map.get(oid);
- if (info == null) {
- return null;
- }
- CacheEntry ce = new CacheEntry(oid);
- InputStream is = null;
synchronized (info) {
if (info.inode != EMPTY_ADDRESS) {
- memoryBufferEntries.get(oid); //touch this entry
+ info.pinned = true;
+ PhysicalInfo existing = memoryBufferEntries.get(info.getId()); //touch this entry
+ assert existing == info;
if (LogManager.isMessageToBeRecorded(LogConstants.CTX_DQP, MessageLevel.DETAIL)) {
LogManager.logDetail(LogConstants.CTX_DQP, "Getting object at inode", info.inode, serializer.getId(), oid); //$NON-NLS-1$
}
BlockManager manager = getBlockManager(serializer.getId(), oid, info.inode);
is = new BlockInputStream(manager, info.memoryBlockCount);
} else if (info.block != EMPTY_ADDRESS) {
+ inStorage = true;
storageReads.incrementAndGet();
if (LogManager.isMessageToBeRecorded(LogConstants.CTX_DQP, MessageLevel.DETAIL)) {
LogManager.logDetail(LogConstants.CTX_DQP, "Getting object at block", info.block, info.sizeIndex, serializer.getId(), oid); //$NON-NLS-1$
@@ -533,29 +560,33 @@
FileStore fs = blockStore.stores[info.block/blockStore.blocksInUse.getBitsPerSegment()];
long blockOffset = (info.block%blockStore.blocksInUse.getBitsPerSegment())*blockStore.blockSize;
is = fs.createInputStream(blockOffset, info.memoryBlockCount<<LOG_BLOCK_SIZE);
- if (shouldPlaceInMemoryBuffer(currentTime, info) && this.memoryWritePermits.tryAcquire()) {
- BlockManager manager = null;
- boolean success = false;
- try {
- manager = getBlockManager(info.gid, info.getId(), EMPTY_ADDRESS);
- ExtensibleBufferedOutputStream os = new BlockOutputStream(manager);
- ObjectConverterUtil.write(os, is, -1);
- info.inode = manager.getInode();
- memoryBufferEntries.put(info.getId(), info);
- is = new BlockInputStream(manager, info.memoryBlockCount);
- success = true;
- } finally {
- this.memoryWritePermits.release();
- if (!success && manager != null) {
- manager.free(false);
- info.inode = EMPTY_ADDRESS;
- }
- }
- }
} else {
return null;
}
}
+ if (inStorage && shouldPlaceInMemoryBuffer(currentTime, info) && this.memoryWritePermits.tryAcquire()) {
+ BlockManager manager = null;
+ boolean success = false;
+ try {
+ manager = getBlockManager(info.gid, info.getId(), EMPTY_ADDRESS);
+ ExtensibleBufferedOutputStream os = new BlockOutputStream(manager);
+ ObjectConverterUtil.write(os, is, -1);
+ synchronized (info) {
+ info.inode = manager.getInode();
+ info.pinned = true;
+ memoryBufferEntries.put(info.getId(), info);
+ }
+ is = new BlockInputStream(manager, info.memoryBlockCount);
+ success = true;
+ } finally {
+ this.memoryWritePermits.release();
+ if (!success && manager != null) {
+ manager.free(false);
+ info.inode = EMPTY_ADDRESS;
+ }
+ }
+ }
+ CacheEntry ce = new CacheEntry(oid);
ObjectInputStream ois = new ObjectInputStream(is);
ce.setSizeEstimate(ois.readInt());
ce.setLastAccess(1);
@@ -567,6 +598,11 @@
throw new TeiidComponentException(e, QueryPlugin.Util.getString("FileStoreageManager.error_reading", oid)); //$NON-NLS-1$
} catch (ClassNotFoundException e) {
throw new TeiidComponentException(e, QueryPlugin.Util.getString("FileStoreageManager.error_reading", oid)); //$NON-NLS-1$
+ } finally {
+ synchronized (info) {
+ info.pinned = false;
+ info.notifyAll();
+ }
}
}
@@ -579,7 +615,7 @@
*/
private boolean shouldPlaceInMemoryBuffer(long currentTime, PhysicalInfo info) {
Map.Entry<PhysicalInfo, Long> lowest = memoryBufferEntries.firstEntry();
- return (blocksInuse.getTotalBits() - blocksInuse.getBitsSet()) > (info.memoryBlockCount<<2)
+ return (blocksInuse.getTotalBits() - blocksInuse.getBitsSet()) > (criticalCleaningThreshold + info.memoryBlockCount)
|| (lowest != null && lowest.getKey().block != EMPTY_ADDRESS
&& lowest.getKey().getOrderingValue() < (currentTime>0?memoryBufferEntries.computeNextOrderingValue(currentTime, info.getLastAccess(), info.getOrderingValue()):info.getOrderingValue()));
}
@@ -631,55 +667,90 @@
}
}
- int free(Long oid, PhysicalInfo info, boolean demote, boolean stealDataBlock) {
+ /**
+ * Multi-purpose method to free memory. Modes are:
+ * demote && !acquireDataBlock -> push out of memory buffer onto disk
+ * demote && acquireDataBlock -> push out of memory and reuse a datablock
+ * !demote -> full removal from memory and disk
+ */
+ int free(Long oid, PhysicalInfo info, boolean demote, boolean acquireDataBlock) {
if (info == null) {
return EMPTY_ADDRESS;
}
- synchronized (info) {
- memoryBufferEntries.remove(oid);
- if (demote) {
- if (info.inode == EMPTY_ADDRESS) {
+ int result = EMPTY_ADDRESS;
+ BlockManager bm = null;
+ int block = EMPTY_ADDRESS;
+ try {
+ int memoryBlockCount;
+ int sizeIndex;
+ synchronized (info) {
+ info.evicting = true;
+ block = info.block;
+ memoryBlockCount = info.memoryBlockCount;
+ sizeIndex = info.sizeIndex;
+ if (info.inode != EMPTY_ADDRESS) {
+ bm = getBlockManager(info.gid, oid, info.inode);
+ } else if (demote) {
return EMPTY_ADDRESS;
}
- BlockManager bm = getBlockManager(info.gid, oid, info.inode);
+ //release the lock to perform the transfer
+ }
+ if (demote && block == EMPTY_ADDRESS) {
+ storageWrites.getAndIncrement();
+ BlockInputStream is = new BlockInputStream(bm, memoryBlockCount);
+ BlockStore blockStore = sizeBasedStores[sizeIndex];
+ block = getAndSetNextClearBit(blockStore);
+ FileStore fs = blockStore.stores[block/blockStore.blocksInUse.getBitsPerSegment()];
+ long blockOffset = (block%blockStore.blocksInUse.getBitsPerSegment())*blockStore.blockSize;
+ byte[] b = new byte[BLOCK_SIZE];
+ int read = 0;
+ try {
+ while ((read = is.read(b, 0, b.length)) != -1) {
+ fs.write(blockOffset, b, 0, read);
+ blockOffset+=read;
+ }
+ } catch (Throwable e) {
+ //shouldn't happen, but we'll invalidate this write and continue
+ demote = false;
+ //just continue to free
+ LogManager.logError(LogConstants.CTX_DQP, e, "Error transferring block to storage " + oid); //$NON-NLS-1$
+ }
+ }
+ } finally {
+ //ensure post conditions
+ synchronized (info) {
+ //it is possible for a read to happen while evicting.
+ //that's ok, we'll just wait for it to finish
+ await(info, true, false);
+ info.evicting = false;
+ info.notifyAll();
info.inode = EMPTY_ADDRESS;
- if (info.block == EMPTY_ADDRESS) {
- storageWrites.getAndIncrement();
- BlockInputStream is = new BlockInputStream(bm, info.memoryBlockCount);
- BlockStore blockStore = sizeBasedStores[info.sizeIndex];
- info.block = getAndSetNextClearBit(blockStore);
- FileStore fs = blockStore.stores[info.block/blockStore.blocksInUse.getBitsPerSegment()];
- long blockOffset = (info.block%blockStore.blocksInUse.getBitsPerSegment())*blockStore.blockSize;
- byte[] b = new byte[BLOCK_SIZE];
- int read = 0;
- try {
- while ((read = is.read(b, 0, b.length)) != -1) {
- fs.write(blockOffset, b, 0, read);
- blockOffset+=read;
- }
- } catch (Throwable e) {
- //shouldn't happen, but we'll invalidate this write and continue
+ memoryBufferEntries.remove(info.getId());
+ if (block != EMPTY_ADDRESS) {
+ if (demote) {
+ info.block = block;
+ } else {
+ BlockStore blockStore = sizeBasedStores[info.sizeIndex];
blockStore.blocksInUse.clear(info.block);
info.block = EMPTY_ADDRESS;
- //just continue to free
- LogManager.logError(LogConstants.CTX_DQP, e, "Error transferring block to storage " + oid); //$NON-NLS-1$
}
- return is.free(stealDataBlock);
}
- return bm.free(stealDataBlock);
+ if (bm != null) {
+ result = bm.free(acquireDataBlock);
+ }
}
- if (info.inode != EMPTY_ADDRESS) {
- BlockManager bm = getBlockManager(info.gid, oid, info.inode);
- info.inode = EMPTY_ADDRESS;
- bm.free(false);
+ }
+ return result;
+ }
+
+ private void await(PhysicalInfo info, boolean pinned, boolean evicting) {
+ while ((pinned && info.pinned) || (evicting && info.evicting)) {
+ try {
+ info.wait();
+ } catch (InterruptedException e) {
+ throw new TeiidRuntimeException(e);
}
- if (info.block != EMPTY_ADDRESS) {
- BlockStore blockStore = sizeBasedStores[info.sizeIndex];
- blockStore.blocksInUse.clear(info.block);
- info.block = EMPTY_ADDRESS;
- }
}
- return EMPTY_ADDRESS;
}
static int getAndSetNextClearBit(BlockStore bs) {
@@ -690,34 +761,62 @@
return result;
}
- int evictFromMemoryBuffer(boolean steal) {
- memoryEvictionLock.writeLock().lock();
+ /**
+ * Eviction routine. When space is exhausted datablocks are stolen from
+ * memory entries
+ * starvation.
+ * @param acquire
+ * @return
+ */
+ int evictFromMemoryBuffer(boolean acquire) {
+ boolean writeLocked = false;
int next = -1;
try {
- for (int i = 0; i < 10 && next == EMPTY_ADDRESS; i++) {
+ for (int i = 0; i < EVICTION_SCANS && next == EMPTY_ADDRESS; i++) {
+ //doing a cleanup may trigger the purging of resources
AutoCleanupUtil.doCleanup();
//scan the eviction queue looking for a victim
Iterator<Map.Entry<PhysicalInfo, Long>> iter = memoryBufferEntries.getEvictionQueue().entrySet().iterator();
- while (((!steal && lowBlocks()) || (steal && (next = blocksInuse.getAndSetNextClearBit()) == EMPTY_ADDRESS)) && iter.hasNext()) {
+ while (((!acquire && lowBlocks(false)) || (acquire && (next = blocksInuse.getAndSetNextClearBit()) == EMPTY_ADDRESS)) && iter.hasNext()) {
Map.Entry<PhysicalInfo, Long> entry = iter.next();
PhysicalInfo info = entry.getKey();
synchronized (info) {
if (info.inode == EMPTY_ADDRESS) {
continue;
}
- next = free(entry.getValue(), info, true, steal);
- if (!steal) {
- next = 0;
+ if (info.pinned || info.evicting) {
+ if (!acquire || i != EVICTION_SCANS - 1) {
+ continue;
+ }
+ if (acquire && !writeLocked) {
+ //stop the world - prevent any other thread from taking a free block
+ //until this one is satisfied
+ memoryEvictionLock.writeLock().lock();
+ writeLocked = true;
+ }
+ //wait for the read/eviction to be over
+ await(info, true, true);
+ if (info.inode == EMPTY_ADDRESS) {
+ continue;
+ }
}
+ //mark as evicting early so that other evictFromMemoryCalls don't select this same entry
+ info.evicting = true;
}
+ next = free(entry.getValue(), info, true, acquire);
+ if (!acquire) {
+ next = 0; //let the cleaner know that we made progress
+ }
break;
}
}
- if (steal && next == -1) {
+ if (acquire && next == -1) {
throw new AssertionError("Could not free space for pending write"); //$NON-NLS-1$
}
} finally {
- memoryEvictionLock.writeLock().unlock();
+ if (writeLocked) {
+ memoryEvictionLock.writeLock().unlock();
+ }
}
return next;
}
@@ -731,7 +830,7 @@
}
public void setMemoryBufferSpace(long maxBufferSpace) {
- this.memoryBufferSpace = Math.min(maxBufferSpace, 1l<<(ADDRESS_BITS+LOG_BLOCK_SIZE));
+ this.memoryBufferSpace = Math.min(maxBufferSpace, MAX_ADDRESSABLE_MEMORY);
}
public int getInodesInUse() {
@@ -755,3 +854,34 @@
}
}
+
+/**
+ * Represents the memory buffer and storage state of an object.
+ * It is important to minimize the amount of data held here.
+ * Currently should be 40 bytes.
+ */
+final class PhysicalInfo extends BaseCacheEntry {
+ final Long gid;
+ //the memory inode and block count
+ int inode = BufferFrontedFileStoreCache.EMPTY_ADDRESS;
+ final int memoryBlockCount;
+ //the storage block and BlockStore index
+ int block = BufferFrontedFileStoreCache.EMPTY_ADDRESS;
+ byte sizeIndex = 0;
+ //state flags
+ boolean pinned; //indicates that the entry is being read
+ boolean evicting; //indicates that the entry will be moved out of the memory buffer
+ boolean loading; //used by tier 1 cache to prevent double loads
+
+ public PhysicalInfo(Long gid, Long id, int inode, int size) {
+ super(id);
+ this.inode = inode;
+ this.gid = gid;
+ this.memoryBlockCount = (size>>BufferFrontedFileStoreCache.LOG_BLOCK_SIZE) + ((size&BufferFrontedFileStoreCache.BLOCK_MASK)>0?1:0);
+ int blocks = memoryBlockCount;
+ while (blocks >= 1) {
+ this.sizeIndex++;
+ blocks>>=2;
+ }
+ }
+}
Modified: trunk/engine/src/main/java/org/teiid/common/buffer/impl/BufferManagerImpl.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/common/buffer/impl/BufferManagerImpl.java 2011-10-14 15:23:51 UTC (rev 3551)
+++ trunk/engine/src/main/java/org/teiid/common/buffer/impl/BufferManagerImpl.java 2011-10-14 17:31:57 UTC (rev 3552)
@@ -213,7 +213,9 @@
if (ce != null) {
return (List<List<?>>)(!retain?ce.nullOut():ce.getObject());
}
- synchronized (this) {
+ //obtain a granular lock to prevent double memory loading
+ Object o = cache.lockForLoad(batch, this);
+ try {
ce = fastGet(batch, prefersMemory.get(), retain);
if (ce != null) {
return (List<List<?>>)(!retain?ce.nullOut():ce.getObject());
@@ -222,7 +224,7 @@
if (LogManager.isMessageToBeRecorded(LogConstants.CTX_BUFFER_MGR, MessageLevel.DETAIL)) {
LogManager.logDetail(LogConstants.CTX_BUFFER_MGR, id, id, "reading batch", batch, "from storage, total reads:", count); //$NON-NLS-1$ //$NON-NLS-2$
}
- ce = cache.get(batch, this);
+ ce = cache.get(o, batch, this);
if (ce == null) {
throw new AssertionError("Batch not found in storage " + batch); //$NON-NLS-1$
}
@@ -234,7 +236,9 @@
if (retain) {
addMemoryEntry(ce, null);
}
- }
+ } finally {
+ cache.unlockForLoad(o);
+ }
return (List<List<?>>)ce.getObject();
}
@@ -281,6 +285,7 @@
private AtomicInteger maxReserveKB = new AtomicInteger(1 << 18);
private volatile int reserveBatchKB;
private int maxActivePlans = DQPConfiguration.DEFAULT_MAX_ACTIVE_PLANS; //used as a hint to set the reserveBatchKB
+ private long memoryBufferSpace; //used as a hint to account for batch overhead (only useful in large scenarios)
private boolean useWeakReferences = true;
private boolean inlineLobs = true;
private int targetBytesPerRow = TARGET_BYTES_PER_ROW;
@@ -313,7 +318,7 @@
};
});
- Cache cache;
+ private Cache cache;
private Map<String, TupleReference> tupleBufferMap = new ConcurrentHashMap<String, TupleReference>();
private ReferenceQueue<TupleBuffer> tupleBufferQueue = new ReferenceQueue<TupleBuffer>();
@@ -459,6 +464,10 @@
this.maxActivePlans = maxActivePlans;
}
+ public void setMemoryBufferSpace(long memoryBufferSpace) {
+ this.memoryBufferSpace = memoryBufferSpace;
+ }
+
public void setMaxProcessingKB(int maxProcessingKB) {
this.maxProcessingKB = maxProcessingKB;
}
@@ -479,6 +488,8 @@
this.maxReserveKB.addAndGet(((int)Math.max(0, (maxMemory - one_gig) * .75)));
}
this.maxReserveKB.addAndGet(((int)Math.max(0, Math.min(one_gig, maxMemory) * .5)));
+ int batchOverheadKB = (int)(this.memoryBufferSpace<0?(this.maxReserveKB.get()<<8):this.memoryBufferSpace)>>20;
+ this.maxReserveKB.set(Math.max(0, this.maxReserveKB.get() - batchOverheadKB));
}
this.reserveBatchKB = this.getMaxReserveKB();
if (this.maxProcessingKBOrig == null) {
Modified: trunk/engine/src/main/java/org/teiid/common/buffer/impl/ConcurrentBitSet.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/common/buffer/impl/ConcurrentBitSet.java 2011-10-14 15:23:51 UTC (rev 3551)
+++ trunk/engine/src/main/java/org/teiid/common/buffer/impl/ConcurrentBitSet.java 2011-10-14 17:31:57 UTC (rev 3552)
@@ -98,10 +98,17 @@
/**
* Makes a best effort to atomically find the next clear bit and set it
- * @return the next bit index or -1 if no clear bits are founds
+ * @return the next bit index or -1 if no clear bits are found
*/
public int getAndSetNextClearBit() {
- int start = counter.getAndIncrement();
+ return getAndSetNextClearBit(counter.getAndIncrement());
+ }
+
+ public int getNextSegment() {
+ return counter.getAndIncrement();
+ }
+
+ public int getAndSetNextClearBit(int start) {
int nextBit = -1;
for (int i = 0; i < segments.length; i++) {
Segment s = segments[(start+i)&(segments.length-1)];
Modified: trunk/engine/src/main/java/org/teiid/common/buffer/impl/MemoryStorageManager.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/common/buffer/impl/MemoryStorageManager.java 2011-10-14 15:23:51 UTC (rev 3551)
+++ trunk/engine/src/main/java/org/teiid/common/buffer/impl/MemoryStorageManager.java 2011-10-14 17:31:57 UTC (rev 3552)
@@ -38,7 +38,7 @@
import org.teiid.core.TeiidComponentException;
-public class MemoryStorageManager implements Cache {
+public class MemoryStorageManager implements Cache<Long> {
public static final int MAX_FILE_SIZE = 1 << 17;
@@ -132,7 +132,17 @@
}
@Override
- public CacheEntry get(Long id, Serializer<?> serializer)
+ public Long lockForLoad(Long oid, Serializer<?> serializer) {
+ return oid;
+ }
+
+ @Override
+ public void unlockForLoad(Long o) {
+ //nothing to do no locking
+ }
+
+ @Override
+ public CacheEntry get(Long lock, Long id, Serializer<?> serializer)
throws TeiidComponentException {
Map<Long, CacheEntry> group = groups.get(serializer.getId());
if (group != null) {
Modified: trunk/engine/src/test/java/org/teiid/common/buffer/impl/TestBufferFrontedFileStoreCache.java
===================================================================
--- trunk/engine/src/test/java/org/teiid/common/buffer/impl/TestBufferFrontedFileStoreCache.java 2011-10-14 15:23:51 UTC (rev 3551)
+++ trunk/engine/src/test/java/org/teiid/common/buffer/impl/TestBufferFrontedFileStoreCache.java 2011-10-14 17:31:57 UTC (rev 3552)
@@ -77,8 +77,7 @@
ce.setObject(cacheObject);
cache.addToCacheGroup(s.getId(), ce.getId());
cache.add(ce, s);
-
- ce = cache.get(2l, s);
+ ce = get(cache, 2l, s);
assertEquals(cacheObject, ce.getObject());
//test something that exceeds the direct inode data blocks
@@ -88,7 +87,7 @@
cache.addToCacheGroup(s.getId(), ce.getId());
cache.add(ce, s);
- ce = cache.get(3l, s);
+ ce = get(cache, 3l, s);
assertEquals(cacheObject, ce.getObject());
cache.removeCacheGroup(1l);
@@ -104,7 +103,7 @@
cache.addToCacheGroup(s.getId(), ce.getId());
cache.add(ce, s);
- ce = cache.get(3l, s);
+ ce = get(cache, 3l, s);
assertEquals(cacheObject, ce.getObject());
cache.removeCacheGroup(1l);
@@ -120,7 +119,7 @@
cache.addToCacheGroup(s.getId(), ce.getId());
cache.add(ce, s);
- ce = cache.get(3l, s);
+ ce = get(cache, 3l, s);
assertNull(ce);
cache.removeCacheGroup(1l);
@@ -128,6 +127,14 @@
assertEquals(0, cache.getDataBlocksInUse());
assertEquals(0, cache.getInodesInUse());
}
+
+ private CacheEntry get(BufferFrontedFileStoreCache cache, Long oid,
+ Serializer<Integer> s) throws TeiidComponentException {
+ PhysicalInfo o = cache.lockForLoad(oid, s);
+ CacheEntry ce = cache.get(o, oid, s);
+ cache.unlockForLoad(o);
+ return ce;
+ }
@Test public void testEviction() throws Exception {
BufferFrontedFileStoreCache cache = createLayeredCache(1<<15, 1<<15);
@@ -144,7 +151,7 @@
ce = new CacheEntry(3l);
ce.setSerializer(ref);
- cacheObject = Integer.valueOf(5000);
+ cacheObject = Integer.valueOf(5001);
ce.setObject(cacheObject);
cache.addToCacheGroup(s.getId(), ce.getId());
cache.add(ce, s);
@@ -152,8 +159,11 @@
assertEquals(3, cache.getDataBlocksInUse());
assertEquals(1, cache.getInodesInUse());
- ce = cache.get(2l, s);
+ ce = get(cache, 2l, s);
assertEquals(Integer.valueOf(5000), ce.getObject());
+
+ ce = get(cache, 3l, s);
+ assertEquals(Integer.valueOf(5001), ce.getObject());
}
private BufferFrontedFileStoreCache createLayeredCache(int bufferSpace, int objectSize) throws TeiidComponentException {
Modified: trunk/engine/src/test/java/org/teiid/common/buffer/impl/TestConcurrentBitSet.java
===================================================================
--- trunk/engine/src/test/java/org/teiid/common/buffer/impl/TestConcurrentBitSet.java 2011-10-14 15:23:51 UTC (rev 3551)
+++ trunk/engine/src/test/java/org/teiid/common/buffer/impl/TestConcurrentBitSet.java 2011-10-14 17:31:57 UTC (rev 3552)
@@ -62,6 +62,13 @@
}
}
+ @Test public void testSegmentUse() {
+ ConcurrentBitSet bst = new ConcurrentBitSet(50001, 4);
+ assertEquals(0, bst.getAndSetNextClearBit(0));
+ assertEquals(1, bst.getAndSetNextClearBit(0));
+ assertEquals(2, bst.getAndSetNextClearBit(4));
+ }
+
@Test public void testCompactBitSet() {
ConcurrentBitSet bst = new ConcurrentBitSet(100000, 1);
bst.setCompact(true);
Modified: trunk/runtime/src/main/java/org/teiid/services/BufferServiceImpl.java
===================================================================
--- trunk/runtime/src/main/java/org/teiid/services/BufferServiceImpl.java 2011-10-14 15:23:51 UTC (rev 3551)
+++ trunk/runtime/src/main/java/org/teiid/services/BufferServiceImpl.java 2011-10-14 17:31:57 UTC (rev 3552)
@@ -68,7 +68,7 @@
private int maxReserveKb = BufferManager.DEFAULT_RESERVE_BUFFER_KB;
private long maxBufferSpace = FileStorageManager.DEFAULT_MAX_BUFFERSPACE>>20;
private boolean inlineLobs = true;
- private int maxMemoryBufferSpace = -1;
+ private int memoryBufferSpace = -1;
private int maxStorageObjectSize = BufferFrontedFileStoreCache.DEFAuLT_MAX_OBJECT_SIZE;
private FileStorageManager fsm;
@@ -93,7 +93,7 @@
this.bufferMgr.setProcessorBatchSize(Integer.valueOf(processorBatchSize));
this.bufferMgr.setMaxReserveKB(this.maxReserveKb);
this.bufferMgr.setMaxProcessingKB(this.maxProcessingKb);
-
+ this.bufferMgr.setMemoryBufferSpace(Math.min(BufferFrontedFileStoreCache.MAX_ADDRESSABLE_MEMORY, this.memoryBufferSpace));
this.bufferMgr.initialize();
// If necessary, add disk storage manager
@@ -110,11 +110,11 @@
ssm.setMaxFileSize(maxFileSize);
BufferFrontedFileStoreCache fsc = new BufferFrontedFileStoreCache();
fsc.setMaxStorageObjectSize(maxStorageObjectSize);
- if (maxMemoryBufferSpace <= 0) {
- //use approximately 20% of what's set aside for the reserved
- fsc.setMemoryBufferSpace(this.bufferMgr.getMaxReserveKB() * 200);
+ if (memoryBufferSpace < 0) {
+ //use approximately 25% of what's set aside for the reserved
+ fsc.setMemoryBufferSpace(this.bufferMgr.getMaxReserveKB() << 8);
} else {
- fsc.setMemoryBufferSpace(maxMemoryBufferSpace);
+ fsc.setMemoryBufferSpace(memoryBufferSpace);
}
fsc.setStorageManager(ssm);
fsc.initialize();
@@ -254,21 +254,21 @@
public long getReadAttempts() {
return bufferMgr.getReadAttempts();
}
-
- public int getMaxMemoryBufferSpace() {
- return maxMemoryBufferSpace;
+
+ @ManagementProperty(description="Direct memory buffer space used by the buffer manager in MB. -1 determines the setting automatically from the maxReserveKB (default -1). This value cannot be smaller than maxStorageObjectSize.")
+ public int getMemoryBufferSpace() {
+ return memoryBufferSpace;
}
public int getMaxStorageObjectSize() {
return maxStorageObjectSize;
}
- @ManagementProperty(description="Max direct memory buffer space used by the buffer manager in MB. -1 determines the setting automatically from the maxReserveKB (default -1). This value cannot be smaller than maxStorageObjectSize.")
- public void setMaxMemoryBufferSpace(int maxMemoryBufferSpace) {
- this.maxMemoryBufferSpace = maxMemoryBufferSpace;
+ @ManagementProperty(description="The maximum size of a buffer managed object (typically a table page or a results batch) in bytes (default 8388608).")
+ public void setMemoryBufferSpace(int maxMemoryBufferSpace) {
+ this.memoryBufferSpace = maxMemoryBufferSpace;
}
- @ManagementProperty(description="The maximum size of a buffer managed object (typically a table page or a results batch) in bytes (default 8388608).")
public void setMaxStorageObjectSize(int maxStorageObjectSize) {
this.maxStorageObjectSize = maxStorageObjectSize;
}
12 years, 6 months
teiid SVN: r3551 - in branches/7.4.x/engine/src: test/java/org/teiid/query/processor and 1 other directory.
by teiid-commits@lists.jboss.org
Author: shawkins
Date: 2011-10-14 11:23:51 -0400 (Fri, 14 Oct 2011)
New Revision: 3551
Modified:
branches/7.4.x/engine/src/main/java/org/teiid/query/optimizer/relational/rules/RulePlanProcedures.java
branches/7.4.x/engine/src/test/java/org/teiid/query/processor/TestProcedureRelational.java
Log:
TEIID-1780 fix for proc relational with no inputs
Modified: branches/7.4.x/engine/src/main/java/org/teiid/query/optimizer/relational/rules/RulePlanProcedures.java
===================================================================
--- branches/7.4.x/engine/src/main/java/org/teiid/query/optimizer/relational/rules/RulePlanProcedures.java 2011-10-14 01:46:31 UTC (rev 3550)
+++ branches/7.4.x/engine/src/main/java/org/teiid/query/optimizer/relational/rules/RulePlanProcedures.java 2011-10-14 15:23:51 UTC (rev 3551)
@@ -134,10 +134,12 @@
Criteria crit = Criteria.combineCriteria(conjuncts);
- accessNode.setProperty(NodeConstants.Info.PROCEDURE_CRITERIA, crit);
- accessNode.setProperty(NodeConstants.Info.PROCEDURE_INPUTS, inputReferences);
- accessNode.setProperty(NodeConstants.Info.PROCEDURE_DEFAULTS, defaults);
- accessNode.setProperty(NodeConstants.Info.IS_DEPENDENT_SET, Boolean.TRUE);
+ if (crit != null) {
+ accessNode.setProperty(NodeConstants.Info.PROCEDURE_CRITERIA, crit);
+ accessNode.setProperty(NodeConstants.Info.PROCEDURE_INPUTS, inputReferences);
+ accessNode.setProperty(NodeConstants.Info.PROCEDURE_DEFAULTS, defaults);
+ accessNode.setProperty(NodeConstants.Info.IS_DEPENDENT_SET, Boolean.TRUE);
+ }
}
return plan;
Modified: branches/7.4.x/engine/src/test/java/org/teiid/query/processor/TestProcedureRelational.java
===================================================================
--- branches/7.4.x/engine/src/test/java/org/teiid/query/processor/TestProcedureRelational.java 2011-10-14 01:46:31 UTC (rev 3550)
+++ branches/7.4.x/engine/src/test/java/org/teiid/query/processor/TestProcedureRelational.java 2011-10-14 15:23:51 UTC (rev 3551)
@@ -753,4 +753,16 @@
TestProcessor.helpProcess(plan, dataManager, expected);
}
+ @Test public void testProcRelationalWithNoInputs1() {
+ String sql = "select e1 from pm1.sp1"; //$NON-NLS-1$
+
+ List<?>[] expected = new List[] {
+ Arrays.asList("c") //$NON-NLS-1$
+ };
+ HardcodedDataManager dataManager = new HardcodedDataManager();
+ dataManager.addData("EXEC pm1.sp1()", expected);
+ ProcessorPlan plan = TestProcessor.helpGetPlan(sql, RealMetadataFactory.createTransformationMetadata(RealMetadataFactory.example1Store(), "e1"));
+ TestProcessor.helpProcess(plan, dataManager, expected);
+ }
+
}
12 years, 6 months
teiid SVN: r3550 - in trunk: engine/src/main/java/org/teiid/common/buffer and 5 other directories.
by teiid-commits@lists.jboss.org
Author: shawkins
Date: 2011-10-13 21:46:31 -0400 (Thu, 13 Oct 2011)
New Revision: 3550
Removed:
trunk/engine/src/main/java/org/teiid/common/buffer/impl/FileStoreCache.java
trunk/engine/src/main/java/org/teiid/common/buffer/impl/PartiallyOrderedCache.java
trunk/engine/src/test/java/org/teiid/common/buffer/impl/TestPartiallyOrderedCache.java
Modified:
trunk/common-core/src/main/java/org/teiid/core/util/ExecutorUtils.java
trunk/engine/src/main/java/org/teiid/common/buffer/BaseCacheEntry.java
trunk/engine/src/main/java/org/teiid/common/buffer/impl/BlockInputStream.java
trunk/engine/src/main/java/org/teiid/common/buffer/impl/BlockManager.java
trunk/engine/src/main/java/org/teiid/common/buffer/impl/BlockStore.java
trunk/engine/src/main/java/org/teiid/common/buffer/impl/BufferFrontedFileStoreCache.java
trunk/engine/src/main/java/org/teiid/common/buffer/impl/BufferManagerImpl.java
trunk/engine/src/main/java/org/teiid/common/buffer/impl/ConcurrentBitSet.java
trunk/engine/src/main/java/org/teiid/common/buffer/impl/FileStorageManager.java
trunk/engine/src/main/java/org/teiid/common/buffer/impl/OrderedCache.java
trunk/engine/src/test/java/org/teiid/common/buffer/BufferManagerFactory.java
trunk/engine/src/test/java/org/teiid/common/buffer/TestSTree.java
trunk/engine/src/test/java/org/teiid/common/buffer/impl/TestConcurrentBitSet.java
trunk/runtime/src/main/java/org/teiid/services/BufferServiceImpl.java
trunk/runtime/src/test/java/org/teiid/dqp/service/buffer/TestLocalBufferService.java
Log:
TEIID-1750 wiring in the new buffer logic
Modified: trunk/common-core/src/main/java/org/teiid/core/util/ExecutorUtils.java
===================================================================
--- trunk/common-core/src/main/java/org/teiid/core/util/ExecutorUtils.java 2011-10-12 23:23:02 UTC (rev 3549)
+++ trunk/common-core/src/main/java/org/teiid/core/util/ExecutorUtils.java 2011-10-14 01:46:31 UTC (rev 3550)
@@ -25,6 +25,7 @@
import java.util.concurrent.Executor;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.LinkedBlockingQueue;
+import java.util.concurrent.SynchronousQueue;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;
@@ -38,9 +39,13 @@
* @return
*/
public static ExecutorService newFixedThreadPool(int nThreads, String name) {
+ return newFixedThreadPool(nThreads, Integer.MAX_VALUE, name);
+ }
+
+ public static ExecutorService newFixedThreadPool(int nThreads, int maxQueue, String name) {
ThreadPoolExecutor tpe = new ThreadPoolExecutor(nThreads, nThreads,
60L, TimeUnit.SECONDS,
- new LinkedBlockingQueue<Runnable>(), new NamedThreadFactory(name));
+ maxQueue==0?new SynchronousQueue<Runnable>():new LinkedBlockingQueue<Runnable>(maxQueue), new NamedThreadFactory(name));
tpe.allowCoreThreadTimeOut(true);
return tpe;
}
Modified: trunk/engine/src/main/java/org/teiid/common/buffer/BaseCacheEntry.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/common/buffer/BaseCacheEntry.java 2011-10-12 23:23:02 UTC (rev 3549)
+++ trunk/engine/src/main/java/org/teiid/common/buffer/BaseCacheEntry.java 2011-10-14 01:46:31 UTC (rev 3550)
@@ -25,8 +25,8 @@
public class BaseCacheEntry implements Comparable<BaseCacheEntry> {
private Long id;
- protected long lastAccess;
- protected double orderingValue;
+ protected float lastAccess;
+ protected float orderingValue;
public BaseCacheEntry(Long id) {
this.id = id;
@@ -46,19 +46,19 @@
return getId().toString();
}
- public long getLastAccess() {
+ public float getLastAccess() {
return lastAccess;
}
- public void setLastAccess(long lastAccess) {
+ public void setLastAccess(float lastAccess) {
this.lastAccess = lastAccess;
}
- public double getOrderingValue() {
+ public float getOrderingValue() {
return orderingValue;
}
- public void setOrderingValue(double orderingValue) {
+ public void setOrderingValue(float orderingValue) {
this.orderingValue = orderingValue;
}
@@ -66,7 +66,7 @@
public int compareTo(BaseCacheEntry o) {
int result = (int) Math.signum(orderingValue - o.orderingValue);
if (result == 0) {
- result = Long.signum(lastAccess - o.lastAccess);
+ result = (int)Math.signum(lastAccess - o.lastAccess);
if (result == 0) {
return Long.signum(id - o.id);
}
Modified: trunk/engine/src/main/java/org/teiid/common/buffer/impl/BlockInputStream.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/common/buffer/impl/BlockInputStream.java 2011-10-12 23:23:02 UTC (rev 3549)
+++ trunk/engine/src/main/java/org/teiid/common/buffer/impl/BlockInputStream.java 2011-10-14 01:46:31 UTC (rev 3550)
@@ -25,17 +25,18 @@
import java.io.InputStream;
import java.nio.ByteBuffer;
+/**
+ * TODO: support freeing of datablocks as we go
+ */
final class BlockInputStream extends InputStream {
private final BlockManager manager;
private final int maxBlock;
int blockIndex;
ByteBuffer buf;
- boolean free;
boolean done;
- BlockInputStream(BlockManager manager, int blockCount, boolean free) {
+ BlockInputStream(BlockManager manager, int blockCount) {
this.manager = manager;
- this.free = free;
this.maxBlock = blockCount;
}
@@ -52,15 +53,9 @@
if (buf == null || buf.remaining() == 0) {
if (maxBlock == blockIndex) {
done = true;
- if (blockIndex > 1 && free) {
- manager.freeBlock(blockIndex - 1, false);
- }
return;
}
buf = manager.getBlock(blockIndex++);
- if (blockIndex > 2 && free) {
- manager.freeBlock(blockIndex - 2, false);
- }
}
}
Modified: trunk/engine/src/main/java/org/teiid/common/buffer/impl/BlockManager.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/common/buffer/impl/BlockManager.java 2011-10-12 23:23:02 UTC (rev 3549)
+++ trunk/engine/src/main/java/org/teiid/common/buffer/impl/BlockManager.java 2011-10-14 01:46:31 UTC (rev 3550)
@@ -41,7 +41,7 @@
*/
ByteBuffer getBlock(int index);
- int freeBlock(int index, boolean steal);
+ void freeBlock(int index);
int free(boolean steal);
Modified: trunk/engine/src/main/java/org/teiid/common/buffer/impl/BlockStore.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/common/buffer/impl/BlockStore.java 2011-10-12 23:23:02 UTC (rev 3549)
+++ trunk/engine/src/main/java/org/teiid/common/buffer/impl/BlockStore.java 2011-10-14 01:46:31 UTC (rev 3550)
@@ -25,16 +25,20 @@
import org.teiid.common.buffer.FileStore;
import org.teiid.common.buffer.StorageManager;
+/**
+ * Represents a FileStore that holds blocks of a fixed size.
+ */
class BlockStore {
final long blockSize;
final ConcurrentBitSet blocksInUse;
final FileStore[] stores;
- public BlockStore(StorageManager storageManager, int blockSize, int blockCountLog) {
+ public BlockStore(StorageManager storageManager, int blockSize, int blockCountLog, int concurrencyLevel) {
this.blockSize = blockSize;
int blockCount = 1 << blockCountLog;
- this.blocksInUse = new ConcurrentBitSet(blockCount, BufferManagerImpl.CONCURRENCY_LEVEL/2);
- this.stores = new FileStore[BufferManagerImpl.CONCURRENCY_LEVEL/2];
+ this.blocksInUse = new ConcurrentBitSet(blockCount, concurrencyLevel);
+ this.blocksInUse.setCompact(true);
+ this.stores = new FileStore[concurrencyLevel];
for (int i = 0; i < stores.length; i++) {
this.stores[i] = storageManager.createFileStore(String.valueOf(blockSize) + '_' + i);
}
Modified: trunk/engine/src/main/java/org/teiid/common/buffer/impl/BufferFrontedFileStoreCache.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/common/buffer/impl/BufferFrontedFileStoreCache.java 2011-10-12 23:23:02 UTC (rev 3549)
+++ trunk/engine/src/main/java/org/teiid/common/buffer/impl/BufferFrontedFileStoreCache.java 2011-10-14 01:46:31 UTC (rev 3550)
@@ -35,7 +35,10 @@
import java.util.List;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.ExecutorService;
import java.util.concurrent.Semaphore;
+import java.util.concurrent.atomic.AtomicBoolean;
+import java.util.concurrent.atomic.AtomicInteger;
import java.util.concurrent.atomic.AtomicLong;
import java.util.concurrent.locks.ReentrantReadWriteLock;
@@ -48,6 +51,7 @@
import org.teiid.common.buffer.StorageManager;
import org.teiid.core.TeiidComponentException;
import org.teiid.core.TeiidRuntimeException;
+import org.teiid.core.util.ExecutorUtils;
import org.teiid.core.util.ObjectConverterUtil;
import org.teiid.logging.LogConstants;
import org.teiid.logging.LogManager;
@@ -86,9 +90,14 @@
* proportion to the number of tables/tuplebuffers in use.
*
* TODO: compact tail storage blocks. there may be dangling blocks causing us to consume disk space.
+ * we should at least reclaim tail space if the end block is removed. for now we are just relying
+ * on the compact option of {@link ConcurrentBitSet} to keep the blocks at the start of the
+ * files.
*/
public class BufferFrontedFileStoreCache implements Cache, StorageManager {
+ public static final int DEFAuLT_MAX_OBJECT_SIZE = 1 << 23;
+
static final int ADDRESS_BITS = 31;
static final int SYSTEM_MASK = 1<<ADDRESS_BITS;
static final int BYTES_PER_BLOCK_ADDRESS = 4;
@@ -212,7 +221,7 @@
if ((next = blocksInuse.getAndSetNextClearBit()) == EMPTY_ADDRESS) {
memoryEvictionLock.readLock().unlock();
readLocked = false;
- next = evictFromMemoryBuffer();
+ next = evictFromMemoryBuffer(true);
}
} finally {
if (readLocked) {
@@ -226,12 +235,9 @@
}
@Override
- public int freeBlock(int index, boolean steal) {
+ public void freeBlock(int index) {
int dataBlock = getOrUpdateDataBlockIndex(index, EMPTY_ADDRESS, Mode.UPDATE);
- if (!steal) {
- freeDataBlock(dataBlock);
- }
- return dataBlock;
+ freeDataBlock(dataBlock);
}
private void freeDataBlock(int dataBlock) {
@@ -248,6 +254,7 @@
if (this.inode == -1) {
throw new AssertionError("Out of inodes"); //$NON-NLS-1$
}
+ inodesCreated.getAndIncrement();
if (LogManager.isMessageToBeRecorded(LogConstants.CTX_DQP, MessageLevel.DETAIL)) {
LogManager.logDetail(LogConstants.CTX_DQP, "Allocating inode", this.inode, "to", gid, oid); //$NON-NLS-1$ //$NON-NLS-2$
}
@@ -268,11 +275,12 @@
int dataBlockToSteal = bb.getInt(0);
int indirectIndexBlock = bb.getInt(BYTES_PER_BLOCK_ADDRESS*DIRECT_POINTERS);
int doublyIndirectIndexBlock = bb.getInt(BYTES_PER_BLOCK_ADDRESS*(DIRECT_POINTERS+1));
- boolean freedAll = freeBlock(steal?BYTES_PER_BLOCK_ADDRESS:0, bb, DIRECT_POINTERS, true);
+ boolean freedAll = freeBlock(steal?BYTES_PER_BLOCK_ADDRESS:0, bb, DIRECT_POINTERS-(steal?1:0), true);
if (LogManager.isMessageToBeRecorded(LogConstants.CTX_DQP, MessageLevel.DETAIL)) {
LogManager.logDetail(LogConstants.CTX_DQP, "freeing inode", inode, "for", gid, oid); //$NON-NLS-1$ //$NON-NLS-2$
}
inodesInuse.clear(inode);
+ inodesRemoved.getAndIncrement();
if (!freedAll || indirectIndexBlock == EMPTY_ADDRESS) {
return steal?dataBlockToSteal:EMPTY_ADDRESS;
}
@@ -315,6 +323,8 @@
return blockByteBuffer.getByteBuffer(dataBlock);
}
}
+ AtomicInteger inodesRemoved = new AtomicInteger();
+ AtomicInteger inodesCreated = new AtomicInteger();
private static class PhysicalInfo extends BaseCacheEntry {
int inode = EMPTY_ADDRESS;
@@ -336,32 +346,16 @@
}
}
- double crfLamda = .0001;
-
- StorageManager storageManager;
- int maxStorageObjectSize = 1 << 23; //8MB
- private long memoryBufferSpace = 1 << 27;
+ private StorageManager storageManager;
+ private int maxStorageObjectSize = DEFAuLT_MAX_OBJECT_SIZE;
+ private long memoryBufferSpace = 1 << 26; //64MB
private boolean direct;
- int maxMemoryBlocks;
+ private int maxMemoryBlocks;
private AtomicLong readAttempts = new AtomicLong();
- PartiallyOrderedCache<Long, PhysicalInfo> memoryBufferEntries = new PartiallyOrderedCache<Long, PhysicalInfo>(16, .75f, BufferManagerImpl.CONCURRENCY_LEVEL) {
-
- @Override
- protected void recordAccess(Long key, PhysicalInfo value, boolean initial) {
- long lastAccess = value.getLastAccess();
- value.setLastAccess(readAttempts.get());
- if (initial && lastAccess == 0) {
- return;
- }
- double orderingValue = value.getOrderingValue();
- orderingValue = computeNextOrderingValue(value.getLastAccess(), lastAccess, orderingValue);
- value.setOrderingValue(orderingValue);
- }
-
- };
+ private OrderedCache<Long, PhysicalInfo> memoryBufferEntries = new OrderedCache<Long, PhysicalInfo>(16, .75f, BufferManagerImpl.CONCURRENCY_LEVEL, readAttempts);
private Semaphore memoryWritePermits; //prevents deadlock waiting for free blocks
- ReentrantReadWriteLock memoryEvictionLock = new ReentrantReadWriteLock();
+ private ReentrantReadWriteLock memoryEvictionLock = new ReentrantReadWriteLock(true);
private int blocks;
private ConcurrentBitSet blocksInuse;
@@ -374,18 +368,41 @@
private ConcurrentHashMap<Long, Map<Long, PhysicalInfo>> physicalMapping = new ConcurrentHashMap<Long, Map<Long, PhysicalInfo>>(16, .75f, BufferManagerImpl.CONCURRENCY_LEVEL);
private BlockStore[] sizeBasedStores;
+ private AtomicBoolean cleanerRunning = new AtomicBoolean();
+ private ExecutorService asynchPool = ExecutorUtils.newFixedThreadPool(1, 0, "FileStore Worker"); //$NON-NLS-1$
+ private final Runnable cleaningTask = new Runnable() {
+
+ @Override
+ public void run() {
+ try {
+ while (lowBlocks()) {
+ if (evictFromMemoryBuffer(false) == EMPTY_ADDRESS) {
+ break;
+ }
+ }
+ } finally {
+ cleanerRunning.set(false);
+ }
+ }
+ };
+ private int cleaningThreshold;
+
+ private AtomicLong storageWrites = new AtomicLong();
+ private AtomicLong storageReads = new AtomicLong();
+
@Override
public void initialize() throws TeiidComponentException {
storageManager.initialize();
+ memoryBufferSpace = Math.max(memoryBufferSpace, maxStorageObjectSize);
blocks = (int) Math.min(Integer.MAX_VALUE, (memoryBufferSpace>>LOG_BLOCK_SIZE));
inodesInuse = new ConcurrentBitSet(blocks+1, BufferManagerImpl.CONCURRENCY_LEVEL);
blocksInuse = new ConcurrentBitSet(blocks, BufferManagerImpl.CONCURRENCY_LEVEL);
this.blockByteBuffer = new BlockByteBuffer(30, blocks, LOG_BLOCK_SIZE, direct);
//ensure that we'll run out of blocks first
this.inodeByteBuffer = new BlockByteBuffer(30, blocks+1, LOG_INODE_SIZE, direct);
- memoryBufferSpace = Math.max(memoryBufferSpace, maxStorageObjectSize);
memoryWritePermits = new Semaphore(Math.max(1, (int)Math.min(memoryBufferSpace/maxStorageObjectSize, Integer.MAX_VALUE)));
maxMemoryBlocks = Math.min(MAX_DOUBLE_INDIRECT, maxStorageObjectSize>>LOG_BLOCK_SIZE);
+ cleaningThreshold = Math.min(maxMemoryBlocks<<3, blocks>>1); //try to maintain enough freespace to hold 8 max objects
//account for index pointer block overhead
if (maxMemoryBlocks > DIRECT_POINTERS) {
maxMemoryBlocks--;
@@ -397,20 +414,18 @@
List<BlockStore> stores = new ArrayList<BlockStore>();
int size = BLOCK_SIZE;
do {
- stores.add(new BlockStore(this.storageManager, size, 30));
+ if ((size>>1) >= maxStorageObjectSize) {
+ size>>=1; //adjust the last block size if needed
+ }
+ stores.add(new BlockStore(this.storageManager, size, 30, BufferManagerImpl.CONCURRENCY_LEVEL>>2));
size <<=2;
} while (size>>2 < maxStorageObjectSize);
this.sizeBasedStores = stores.toArray(new BlockStore[stores.size()]);
}
- double computeNextOrderingValue(long currentTime,
- long lastAccess, double orderingValue) {
- orderingValue =
- //Frequency component
- orderingValue*Math.pow(1-crfLamda, currentTime - lastAccess)
- //recency component
- + Math.pow(currentTime, crfLamda);
- return orderingValue;
+ boolean lowBlocks() {
+ int bitsSet = blocksInuse.getBitsSet();
+ return bitsSet > 0 && (blocks - bitsSet < cleaningThreshold) && memoryBufferEntries.firstEntry() != null;
}
InodeBlockManager getBlockManager(long gid, long oid, int inode) {
@@ -441,12 +456,17 @@
} else {
newEntry = false;
synchronized (info) {
- if (info.inode != EMPTY_ADDRESS || !shouldPlaceInMemoryBuffer(readAttempts.get(), info)) {
+ //we assume that serialization would be faster than a disk read
+ if (info.inode != EMPTY_ADDRESS || !shouldPlaceInMemoryBuffer(0, info)) {
success = true;
return;
}
}
}
+ if (!cleanerRunning.get() && lowBlocks() && cleanerRunning.compareAndSet(false, true)) {
+ LogManager.logDetail(LogConstants.CTX_DQP, "Starting memory buffer cleaner"); //$NON-NLS-1$
+ asynchPool.execute(cleaningTask);
+ }
memoryWritePermits.acquire();
hasPermit = true;
blockManager = getBlockManager(s.getId(), entry.getId(), EMPTY_ADDRESS);
@@ -461,8 +481,12 @@
if (newEntry) {
info = new PhysicalInfo(s.getId(), entry.getId(), blockManager.getInode(), fsos.getBytesWritten());
map.put(entry.getId(), info);
- memoryBufferEntries.put(entry.getId(), info);
+ } else {
+ synchronized (info) {
+ info.inode = blockManager.getInode();
+ }
}
+ memoryBufferEntries.put(entry.getId(), info);
success = true;
}
}
@@ -477,7 +501,7 @@
}
}
}
-
+
@Override
public CacheEntry get(Long oid, Serializer<?> serializer) throws TeiidComponentException {
long currentTime = readAttempts.incrementAndGet();
@@ -499,28 +523,34 @@
LogManager.logDetail(LogConstants.CTX_DQP, "Getting object at inode", info.inode, serializer.getId(), oid); //$NON-NLS-1$
}
BlockManager manager = getBlockManager(serializer.getId(), oid, info.inode);
- is = new BlockInputStream(manager, info.memoryBlockCount, false);
+ is = new BlockInputStream(manager, info.memoryBlockCount);
} else if (info.block != EMPTY_ADDRESS) {
+ storageReads.incrementAndGet();
if (LogManager.isMessageToBeRecorded(LogConstants.CTX_DQP, MessageLevel.DETAIL)) {
LogManager.logDetail(LogConstants.CTX_DQP, "Getting object at block", info.block, info.sizeIndex, serializer.getId(), oid); //$NON-NLS-1$
}
BlockStore blockStore = sizeBasedStores[info.sizeIndex];
FileStore fs = blockStore.stores[info.block/blockStore.blocksInUse.getBitsPerSegment()];
long blockOffset = (info.block%blockStore.blocksInUse.getBitsPerSegment())*blockStore.blockSize;
- is = fs.createInputStream(blockOffset);
+ is = fs.createInputStream(blockOffset, info.memoryBlockCount<<LOG_BLOCK_SIZE);
if (shouldPlaceInMemoryBuffer(currentTime, info) && this.memoryWritePermits.tryAcquire()) {
BlockManager manager = null;
+ boolean success = false;
try {
manager = getBlockManager(info.gid, info.getId(), EMPTY_ADDRESS);
ExtensibleBufferedOutputStream os = new BlockOutputStream(manager);
ObjectConverterUtil.write(os, is, -1);
+ info.inode = manager.getInode();
memoryBufferEntries.put(info.getId(), info);
- is = new BlockInputStream(manager, info.memoryBlockCount, false);
+ is = new BlockInputStream(manager, info.memoryBlockCount);
+ success = true;
} finally {
this.memoryWritePermits.release();
+ if (!success && manager != null) {
+ manager.free(false);
+ info.inode = EMPTY_ADDRESS;
+ }
}
- } else {
- this.toString();
}
} else {
return null;
@@ -540,11 +570,18 @@
}
}
+ /**
+ * Determine if an object should be in the memory buffer.
+ * Adds are indicated by a current time of 0.
+ * @param currentTime
+ * @param info
+ * @return
+ */
private boolean shouldPlaceInMemoryBuffer(long currentTime, PhysicalInfo info) {
Map.Entry<PhysicalInfo, Long> lowest = memoryBufferEntries.firstEntry();
- return lowest == null
- || (blocksInuse.getTotalBits() - blocksInuse.getBitsSet()) > (info.memoryBlockCount<<3)
- || lowest.getKey().getOrderingValue() < computeNextOrderingValue(currentTime, info.getLastAccess(), info.getOrderingValue());
+ return (blocksInuse.getTotalBits() - blocksInuse.getBitsSet()) > (info.memoryBlockCount<<2)
+ || (lowest != null && lowest.getKey().block != EMPTY_ADDRESS
+ && lowest.getKey().getOrderingValue() < (currentTime>0?memoryBufferEntries.computeNextOrderingValue(currentTime, info.getLastAccess(), info.getOrderingValue()):info.getOrderingValue()));
}
@Override
@@ -577,7 +614,7 @@
return;
}
PhysicalInfo info = map.remove(id);
- free(id, info, false);
+ free(id, info, false, false);
}
@Override
@@ -588,51 +625,54 @@
}
synchronized (map) {
for (Map.Entry<Long, PhysicalInfo> entry : map.entrySet()) {
- free(entry.getKey(), entry.getValue(), false);
+ free(entry.getKey(), entry.getValue(), false, false);
}
return map.keySet();
}
}
- int free(Long oid, PhysicalInfo info, boolean demote) {
- memoryBufferEntries.remove(oid);
+ int free(Long oid, PhysicalInfo info, boolean demote, boolean stealDataBlock) {
if (info == null) {
return EMPTY_ADDRESS;
}
synchronized (info) {
memoryBufferEntries.remove(oid);
- if (info.inode == EMPTY_ADDRESS) {
- return EMPTY_ADDRESS;
- }
- BlockManager bm = getBlockManager(info.gid, oid, info.inode);
- info.inode = EMPTY_ADDRESS;
if (demote) {
+ if (info.inode == EMPTY_ADDRESS) {
+ return EMPTY_ADDRESS;
+ }
+ BlockManager bm = getBlockManager(info.gid, oid, info.inode);
+ info.inode = EMPTY_ADDRESS;
if (info.block == EMPTY_ADDRESS) {
- BlockInputStream is = new BlockInputStream(bm, info.memoryBlockCount, true);
+ storageWrites.getAndIncrement();
+ BlockInputStream is = new BlockInputStream(bm, info.memoryBlockCount);
BlockStore blockStore = sizeBasedStores[info.sizeIndex];
+ info.block = getAndSetNextClearBit(blockStore);
FileStore fs = blockStore.stores[info.block/blockStore.blocksInUse.getBitsPerSegment()];
- info.block = getAndSetNextClearBit(blockStore);
long blockOffset = (info.block%blockStore.blocksInUse.getBitsPerSegment())*blockStore.blockSize;
byte[] b = new byte[BLOCK_SIZE];
int read = 0;
- boolean errored = false;
- while ((read = is.read(b, 0, b.length)) != -1) {
- if (!errored) {
- try {
- fs.write(blockOffset, b, 0, read);
- blockOffset+=read;
- } catch (Throwable e) {
- //just continue to free
- errored = true;
- LogManager.logError(LogConstants.CTX_DQP, e, "Error transferring block to storage " + oid); //$NON-NLS-1$
- }
+ try {
+ while ((read = is.read(b, 0, b.length)) != -1) {
+ fs.write(blockOffset, b, 0, read);
+ blockOffset+=read;
}
+ } catch (Throwable e) {
+ //shouldn't happen, but we'll invalidate this write and continue
+ blockStore.blocksInUse.clear(info.block);
+ info.block = EMPTY_ADDRESS;
+ //just continue to free
+ LogManager.logError(LogConstants.CTX_DQP, e, "Error transferring block to storage " + oid); //$NON-NLS-1$
}
- return is.free(true);
+ return is.free(stealDataBlock);
}
- return bm.free(true);
+ return bm.free(stealDataBlock);
}
- bm.free(false);
+ if (info.inode != EMPTY_ADDRESS) {
+ BlockManager bm = getBlockManager(info.gid, oid, info.inode);
+ info.inode = EMPTY_ADDRESS;
+ bm.free(false);
+ }
if (info.block != EMPTY_ADDRESS) {
BlockStore blockStore = sizeBasedStores[info.sizeIndex];
blockStore.blocksInUse.clear(info.block);
@@ -650,39 +690,34 @@
return result;
}
- /**
- * Stop the world eviction. Hopefully this should rarely happen.
- * @return the stole dataBlock
- */
- int evictFromMemoryBuffer() {
+ int evictFromMemoryBuffer(boolean steal) {
memoryEvictionLock.writeLock().lock();
int next = -1;
- boolean writeLocked = true;
try {
for (int i = 0; i < 10 && next == EMPTY_ADDRESS; i++) {
AutoCleanupUtil.doCleanup();
+ //scan the eviction queue looking for a victim
Iterator<Map.Entry<PhysicalInfo, Long>> iter = memoryBufferEntries.getEvictionQueue().entrySet().iterator();
- while ((next = blocksInuse.getAndSetNextClearBit()) == EMPTY_ADDRESS && iter.hasNext()) {
+ while (((!steal && lowBlocks()) || (steal && (next = blocksInuse.getAndSetNextClearBit()) == EMPTY_ADDRESS)) && iter.hasNext()) {
Map.Entry<PhysicalInfo, Long> entry = iter.next();
PhysicalInfo info = entry.getKey();
synchronized (info) {
if (info.inode == EMPTY_ADDRESS) {
continue;
}
- memoryEvictionLock.writeLock().unlock();
- writeLocked = false;
- next = free(entry.getValue(), info, true);
+ next = free(entry.getValue(), info, true, steal);
+ if (!steal) {
+ next = 0;
+ }
}
break;
}
}
- if (next == -1) {
+ if (steal && next == -1) {
throw new AssertionError("Could not free space for pending write"); //$NON-NLS-1$
}
} finally {
- if (writeLocked) {
- memoryEvictionLock.writeLock().unlock();
- }
+ memoryEvictionLock.writeLock().unlock();
}
return next;
}
@@ -711,4 +746,12 @@
this.maxStorageObjectSize = maxStorageBlockSize;
}
+ public long getStorageReads() {
+ return storageReads.get();
+ }
+
+ public long getStorageWrites() {
+ return storageWrites.get();
+ }
+
}
Modified: trunk/engine/src/main/java/org/teiid/common/buffer/impl/BufferManagerImpl.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/common/buffer/impl/BufferManagerImpl.java 2011-10-12 23:23:02 UTC (rev 3549)
+++ trunk/engine/src/main/java/org/teiid/common/buffer/impl/BufferManagerImpl.java 2011-10-14 01:46:31 UTC (rev 3550)
@@ -291,30 +291,11 @@
private AtomicInteger activeBatchKB = new AtomicInteger();
- //combined recency/frequency lamda value between 0 and 1 lower -> LFU, higher -> LRU
- //TODO: adaptively adjust this value. more hits should move closer to lru
- private final double crfLamda = .001;
+ private AtomicLong readAttempts = new AtomicLong();
//implements a LRFU cache using the a customized crf function. we store the value with
//the cache entry to make a better decision about reuse of the batch
//TODO: consider the size estimate in the weighting function
- private PartiallyOrderedCache<Long, CacheEntry> memoryEntries = new PartiallyOrderedCache<Long, CacheEntry>(16, .75f, CONCURRENCY_LEVEL) {
-
- @Override
- protected void recordAccess(Long key, CacheEntry value, boolean initial) {
- long lastAccess = value.getLastAccess();
- value.setLastAccess(readAttempts.get());
- if (initial && lastAccess == 0) {
- return;
- }
- double orderingValue = value.getOrderingValue();
- orderingValue =
- //Frequency component
- orderingValue*Math.pow(1-crfLamda, value.getLastAccess() - lastAccess)
- //recency component
- + Math.pow(value.getLastAccess(), crfLamda);
- value.setOrderingValue(orderingValue);
- }
- };
+ private OrderedCache<Long, CacheEntry> memoryEntries = new OrderedCache<Long, CacheEntry>(16, .75f, CONCURRENCY_LEVEL, readAttempts);
//limited size reference caches based upon the memory settings
private WeakReferenceHashedValueCache<CacheEntry> weakReferenceCache;
@@ -341,7 +322,6 @@
private AtomicLong batchAdded = new AtomicLong();
private AtomicLong readCount = new AtomicLong();
private AtomicLong writeCount = new AtomicLong();
- private AtomicLong readAttempts = new AtomicLong();
private AtomicLong referenceHit = new AtomicLong();
public long getBatchesAdded() {
Modified: trunk/engine/src/main/java/org/teiid/common/buffer/impl/ConcurrentBitSet.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/common/buffer/impl/ConcurrentBitSet.java 2011-10-12 23:23:02 UTC (rev 3549)
+++ trunk/engine/src/main/java/org/teiid/common/buffer/impl/ConcurrentBitSet.java 2011-10-14 01:46:31 UTC (rev 3550)
@@ -25,22 +25,29 @@
import java.util.BitSet;
import java.util.concurrent.atomic.AtomicInteger;
+import org.teiid.core.util.Assertion;
+
/**
* A segmented {@link BitSet} that supports greater concurrency
* and faster finding of clear bits.
*/
public class ConcurrentBitSet {
+ private static final int ADDRESS_BITS_PER_TOP_VALUE = 18;
+ private static final int MAX_TOP_VALUE = 1 << ADDRESS_BITS_PER_TOP_VALUE;
+
private static class Segment {
int offset;
int maxBits;
int startSearch;
int bitsSet;
- final private BitSet bitSet;
+ int[] topVals;
+ final BitSet bitSet;
public Segment(int bitCount) {
bitSet = new BitSet();
maxBits = bitCount;
+ this.topVals = new int[Math.max(1, maxBits >> ADDRESS_BITS_PER_TOP_VALUE)];
}
}
@@ -49,16 +56,14 @@
private AtomicInteger counter = new AtomicInteger();
private AtomicInteger bitsSet = new AtomicInteger();
private Segment[] segments;
+ private boolean compact;
public ConcurrentBitSet(int maxBits, int concurrencyLevel) {
- if (maxBits < concurrencyLevel) {
- concurrencyLevel = 1;
- while (maxBits > 2*concurrencyLevel) {
- concurrencyLevel <<=1;
- }
+ Assertion.assertTrue(maxBits > 0);
+ while ((bitsPerSegment = maxBits/concurrencyLevel) < concurrencyLevel) {
+ concurrencyLevel >>= 1;
}
segments = new Segment[concurrencyLevel];
- bitsPerSegment = maxBits/concurrencyLevel;
int modBits = maxBits%concurrencyLevel;
if (modBits > 0) {
bitsPerSegment++;
@@ -76,13 +81,17 @@
public void clear(int bitIndex) {
checkIndex(bitIndex);
Segment s = segments[bitIndex/bitsPerSegment];
- bitIndex = bitIndex%bitsPerSegment;
+ int segmentBitIndex = bitIndex%bitsPerSegment;
synchronized (s) {
- if (!s.bitSet.get(bitIndex)) {
+ if (!s.bitSet.get(segmentBitIndex)) {
throw new AssertionError(bitIndex + " not set"); //$NON-NLS-1$
}
- s.bitSet.clear(bitIndex);
+ if (compact) {
+ s.startSearch = Math.min(s.startSearch, segmentBitIndex);
+ }
+ s.bitSet.clear(segmentBitIndex);
s.bitsSet--;
+ s.topVals[segmentBitIndex>>ADDRESS_BITS_PER_TOP_VALUE]--;
}
bitsSet.decrementAndGet();
}
@@ -100,14 +109,35 @@
if (s.bitsSet == s.maxBits) {
continue;
}
- nextBit = s.bitSet.nextClearBit(s.startSearch);
- if (nextBit >= s.maxBits - 1) {
- s.startSearch = 0;
- nextBit = s.bitSet.nextClearBit(s.startSearch);
- if (nextBit >= s.maxBits) {
- throw new AssertionError("could not find clear bit"); //$NON-NLS-1$
+ int indexSearchStart = s.startSearch >> ADDRESS_BITS_PER_TOP_VALUE;
+ for (int j = indexSearchStart; j < s.topVals.length; j++) {
+ if (s.topVals[j] == MAX_TOP_VALUE) {
+ continue;
}
+ if (s.topVals[j] == 0) {
+ if (j == start) {
+ nextBit = s.startSearch;
+ break;
+ }
+ nextBit = j * MAX_TOP_VALUE;
+ break;
+ }
+ int index = j * MAX_TOP_VALUE;
+ if (j == indexSearchStart) {
+ index = s.startSearch;
+ }
+ nextBit = s.bitSet.nextClearBit(index);
+ if (s.startSearch > 0 && nextBit >= s.maxBits - 1) {
+ s.startSearch = 0;
+ //fallback full scan
+ nextBit = s.bitSet.nextClearBit(s.startSearch);
+ }
+ break;
}
+ if (nextBit >= s.maxBits) {
+ throw new AssertionError("could not find clear bit"); //$NON-NLS-1$
+ }
+ s.topVals[nextBit>>ADDRESS_BITS_PER_TOP_VALUE]++;
s.bitsSet++;
s.bitSet.set(nextBit);
s.startSearch = nextBit + 1;
@@ -142,4 +172,12 @@
return bitsPerSegment;
}
+ /**
+ * Set to try to always allocate against the first available block in a segment.
+ * @param compact
+ */
+ public void setCompact(boolean compact) {
+ this.compact = compact;
+ }
+
}
Modified: trunk/engine/src/main/java/org/teiid/common/buffer/impl/FileStorageManager.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/common/buffer/impl/FileStorageManager.java 2011-10-12 23:23:02 UTC (rev 3549)
+++ trunk/engine/src/main/java/org/teiid/common/buffer/impl/FileStorageManager.java 2011-10-14 01:46:31 UTC (rev 3550)
@@ -29,6 +29,7 @@
import java.util.Collections;
import java.util.LinkedHashMap;
import java.util.Map;
+import java.util.concurrent.atomic.AtomicInteger;
import java.util.concurrent.atomic.AtomicLong;
import org.teiid.common.buffer.FileStore;
@@ -50,6 +51,7 @@
private long maxBufferSpace = DEFAULT_MAX_BUFFERSPACE;
private AtomicLong usedBufferSpace = new AtomicLong();
+ private AtomicInteger fileCounter = new AtomicInteger();
private class FileInfo {
private File file;
@@ -175,6 +177,9 @@
private int maxOpenFiles = DEFAULT_MAX_OPEN_FILES;
private String directory;
private File dirFile;
+ //use subdirectories to hold the files since we may create a relatively unbounded amount of lob files and
+ //fs performance will typically degrade if a single directory is too large
+ private File[] subDirectories = new File[256];
// State
private Map<File, RandomAccessFile> fileCache = Collections.synchronizedMap(new LinkedHashMap<File, RandomAccessFile>() {
@@ -201,13 +206,20 @@
}
dirFile = new File(this.directory);
- if(dirFile.exists()) {
- if(! dirFile.isDirectory()) {
- throw new TeiidComponentException(QueryPlugin.Util.getString("FileStoreageManager.not_a_directory", dirFile.getAbsoluteFile())); //$NON-NLS-1$
-
+ makeDir(dirFile);
+ for (int i = 0; i < subDirectories.length; i++) {
+ subDirectories[i] = new File(this.directory, "b" +i); //$NON-NLS-1$
+ makeDir(subDirectories[i]);
+ }
+ }
+
+ private static void makeDir(File file) throws TeiidComponentException {
+ if(file.exists()) {
+ if(! file.isDirectory()) {
+ throw new TeiidComponentException(QueryPlugin.Util.getString("FileStoreageManager.not_a_directory", file.getAbsoluteFile())); //$NON-NLS-1$
}
- } else if(! dirFile.mkdirs()) {
- throw new TeiidComponentException(QueryPlugin.Util.getString("FileStoreageManager.error_creating", dirFile.getAbsoluteFile())); //$NON-NLS-1$
+ } else if(! file.mkdirs()) {
+ throw new TeiidComponentException(QueryPlugin.Util.getString("FileStoreageManager.error_creating", file.getAbsoluteFile())); //$NON-NLS-1$
}
}
@@ -220,7 +232,8 @@
}
File createFile(String name) throws IOException {
- File storageFile = File.createTempFile(FILE_PREFIX + name + "_", null, this.dirFile); //$NON-NLS-1$
+ //spray the files into separate different directories in a round robin fashion.
+ File storageFile = File.createTempFile(FILE_PREFIX + name + "_", null, this.subDirectories[fileCounter.getAndIncrement()&(this.subDirectories.length-1)]); //$NON-NLS-1$
if (LogManager.isMessageToBeRecorded(org.teiid.logging.LogConstants.CTX_BUFFER_MGR, MessageLevel.DETAIL)) {
LogManager.logDetail(org.teiid.logging.LogConstants.CTX_BUFFER_MGR, "Created temporary storage area file " + storageFile.getAbsoluteFile()); //$NON-NLS-1$
}
Deleted: trunk/engine/src/main/java/org/teiid/common/buffer/impl/FileStoreCache.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/common/buffer/impl/FileStoreCache.java 2011-10-12 23:23:02 UTC (rev 3549)
+++ trunk/engine/src/main/java/org/teiid/common/buffer/impl/FileStoreCache.java 2011-10-14 01:46:31 UTC (rev 3550)
@@ -1,353 +0,0 @@
-/*
- * JBoss, Home of Professional Open Source.
- * See the COPYRIGHT.txt file distributed with this work for information
- * regarding copyright ownership. Some portions may be licensed
- * to Red Hat, Inc. under one or more contributor license agreements.
- *
- * This library 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 2.1 of the License, or (at your option) any later version.
- *
- * This library 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 this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
- * 02110-1301 USA.
- */
-
-package org.teiid.common.buffer.impl;
-
-import java.io.BufferedInputStream;
-import java.io.IOException;
-import java.io.ObjectInputStream;
-import java.io.ObjectOutputStream;
-import java.nio.ByteBuffer;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.Comparator;
-import java.util.HashMap;
-import java.util.LinkedList;
-import java.util.List;
-import java.util.Map;
-import java.util.TreeSet;
-import java.util.concurrent.ConcurrentHashMap;
-import java.util.concurrent.locks.ReadWriteLock;
-import java.util.concurrent.locks.ReentrantReadWriteLock;
-
-import org.teiid.common.buffer.Cache;
-import org.teiid.common.buffer.CacheEntry;
-import org.teiid.common.buffer.FileStore;
-import org.teiid.common.buffer.Serializer;
-import org.teiid.common.buffer.StorageManager;
-import org.teiid.core.TeiidComponentException;
-import org.teiid.logging.LogConstants;
-import org.teiid.logging.LogManager;
-import org.teiid.logging.MessageLevel;
-import org.teiid.query.QueryPlugin;
-
-/**
- * A minimally blocking Cache using {@link FileStore}s.
- *
- * Storage files with significant unused space are compacted after reaching a size threshold.
- * Compacting the empty space may be costly as it is currently implemented by blocking all
- * read/write operations against the group.
- *
- * Since empty is concentrated at the beginning of the store a better approach could
- * be to users smaller file segments and move batches off of the beginning.
- *
- * There is unfortunately a significant memory footprint per group.
- */
-public class FileStoreCache implements Cache {
-
- private static class CacheGroup {
- private static final int RECLAIM_TAIL_SIZE = IO_BUFFER_SIZE << 5;
- private static final int MAX_FREE_SPACE = 1 << 11;
- FileStore store;
- long tail;
- long unusedSpace = 0;
- ReadWriteLock lock = new ReentrantReadWriteLock();
- Map<Long, long[]> physicalMapping = Collections.synchronizedMap(new HashMap<Long, long[]>());
- List<Long> freed = Collections.synchronizedList(new LinkedList<Long>());
-
- CacheGroup(FileStore store) {
- this.store = store;
- }
-
- void freeBatch(Long batch) throws IOException {
- long[] info = physicalMapping.remove(batch);
- if (info != null) {
- if (info[0] + info[1] == tail) {
- tail -= info[1];
- if (store.getLength() - tail > RECLAIM_TAIL_SIZE) {
- store.setLength(tail);
- }
- } else {
- unusedSpace += info[1];
- }
- }
- }
-
- private long getOffset(Long gid, long compactionThreshold) throws IOException {
- long currentLength = store.getLength();
- if (currentLength <= compactionThreshold || unusedSpace * 4 <= currentLength * 3) {
- return tail;
- }
- if (LogManager.isMessageToBeRecorded(LogConstants.CTX_DQP, MessageLevel.DETAIL)) {
- LogManager.logDetail(LogConstants.CTX_DQP, "Running full compaction on", gid); //$NON-NLS-1$
- }
- byte[] buffer = new byte[IO_BUFFER_SIZE];
- TreeSet<long[]> bySize = new TreeSet<long[]>(new Comparator<long[]>() {
- @Override
- public int compare(long[] o1, long[] o2) {
- int signum = Long.signum(o1[1] - o2[1]);
- if (signum == 0) {
- //take the upper address first
- return Long.signum(o2[0] - o1[0]);
- }
- return signum;
- }
- });
- TreeSet<long[]> byAddress = new TreeSet<long[]>(new Comparator<long[]>() {
-
- @Override
- public int compare(long[] o1, long[] o2) {
- return Long.signum(o1[0] - o2[0]);
- }
- });
- synchronized (physicalMapping) {
- for (long[] value : physicalMapping.values()) {
- if (value == null) {
- continue;
- }
- bySize.add(value);
- byAddress.add(value);
- }
- }
- long lastEndAddress = 0;
- long usedSpace = tail - unusedSpace;
- while (!byAddress.isEmpty()) {
- long[] info = byAddress.pollFirst();
- bySize.remove(info);
-
- long currentOffset = info[0];
- long space = currentOffset - lastEndAddress;
- boolean movedLast = false;
- while (space > 0 && !bySize.isEmpty()) {
- long[] last = byAddress.last();
- if (last[1] > space) {
- break;
- }
- movedLast = true;
- byAddress.pollLast();
- bySize.remove(last);
- move(last, lastEndAddress, buffer);
- space -= last[1];
- lastEndAddress += last[1];
- }
- if (movedLast && !byAddress.isEmpty()) {
- long[] last = byAddress.last();
- long currentLastEndAddress = last[0] + last[1];
- if (currentLastEndAddress < currentLength>>1) {
- lastEndAddress = currentLastEndAddress;
- break;
- }
- }
- while (space > 0 && !bySize.isEmpty()) {
- long[] smallest = bySize.first();
- if (smallest[1] > space) {
- break;
- }
- bySize.pollFirst();
- byAddress.remove(smallest);
- move(smallest, lastEndAddress, buffer);
- space -= smallest[1];
- lastEndAddress += smallest[1];
- }
-
- if (space > MAX_FREE_SPACE) {
- move(info, lastEndAddress, buffer);
- }
- lastEndAddress = info[0] + info[1];
- }
- store.setLength(lastEndAddress);
- tail = lastEndAddress;
- unusedSpace = lastEndAddress - usedSpace;
- if (LogManager.isMessageToBeRecorded(LogConstants.CTX_BUFFER_MGR, MessageLevel.DETAIL)) {
- LogManager.logDetail(LogConstants.CTX_BUFFER_MGR, "Compacted store", gid, "pre-size", currentLength, "post-size", lastEndAddress); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
- }
- return tail;
- }
-
- private void move(long[] toMove, long newOffset, byte[] buffer) throws IOException {
- long oldOffset = toMove[0];
- toMove[0] = newOffset;
- int size = (int)toMove[1];
- while (size > 0) {
- int toWrite = Math.min(IO_BUFFER_SIZE, size);
- store.readFully(oldOffset, buffer, 0, toWrite);
- store.write(newOffset, buffer, 0, toWrite);
- size -= toWrite;
- oldOffset += toWrite;
- newOffset += toWrite;
- }
- }
- }
-
- private static final int COMPACTION_THRESHOLD = 1 << 24; //start checking at 16 megs
- private static final int IO_BUFFER_SIZE = 1<<13;
- int compactionThreshold = COMPACTION_THRESHOLD;
- private ConcurrentHashMap<Long, CacheGroup> cacheGroups = new ConcurrentHashMap<Long, CacheGroup>();
- private StorageManager storageManager;
-
- @Override
- public void add(CacheEntry entry, Serializer s) throws Exception {
- final CacheGroup group = cacheGroups.get(s.getId());
- if (group == null) {
- return;
- }
-
- group.lock.writeLock().lock();
- try {
- synchronized (group.freed) {
- while (!group.freed.isEmpty()) {
- group.freeBatch(group.freed.remove(0));
- }
- }
- final ByteBuffer buffer = ByteBuffer.allocate(IO_BUFFER_SIZE);
- final long offset = group.getOffset(s.getId(), compactionThreshold);
- ExtensibleBufferedOutputStream fsos = new ExtensibleBufferedOutputStream() {
- @Override
- protected ByteBuffer newBuffer() {
- buffer.rewind();
- return buffer;
- }
-
- @Override
- protected int flushDirect(int i) throws IOException {
- group.store.write(offset + bytesWritten, buffer.array(), 0, i);
- return i;
- }
- };
- ObjectOutputStream oos = new ObjectOutputStream(fsos);
- oos.writeInt(entry.getSizeEstimate());
- oos.writeLong(entry.getLastAccess());
- oos.writeDouble(entry.getOrderingValue());
- s.serialize(entry.getObject(), oos);
- oos.close();
- long size = fsos.getBytesWritten();
- long[] info = new long[] {offset, size};
- group.physicalMapping.put(entry.getId(), info);
- group.tail = Math.max(group.tail, offset + size);
- if (LogManager.isMessageToBeRecorded(LogConstants.CTX_BUFFER_MGR, MessageLevel.TRACE)) {
- LogManager.logTrace(LogConstants.CTX_BUFFER_MGR, s.getId(), entry.getId(), "batch written starting at:", offset); //$NON-NLS-1$
- }
- } finally {
- group.lock.writeLock().unlock();
- }
- }
-
- @Override
- public void createCacheGroup(Long gid) {
- cacheGroups.put(gid, new CacheGroup(storageManager.createFileStore(String.valueOf(gid))));
- }
-
- @Override
- public CacheEntry get(Long id, Serializer<?> serializer)
- throws TeiidComponentException {
- CacheGroup group = cacheGroups.get(serializer.getId());
- if (group == null) {
- return null;
- }
- try {
- group.lock.readLock().lock();
- long[] info = group.physicalMapping.get(id);
- if (info == null) {
- return null;
- }
- ObjectInputStream ois = new ObjectInputStream(new BufferedInputStream(group.store.createInputStream(info[0]), IO_BUFFER_SIZE));
- CacheEntry ce = new CacheEntry(id);
- ce.setSizeEstimate(ois.readInt());
- ce.setLastAccess(ois.readLong());
- ce.setOrderingValue(ois.readDouble());
- ce.setObject(serializer.deserialize(ois));
- return ce;
- } catch(IOException e) {
- throw new TeiidComponentException(e, QueryPlugin.Util.getString("FileStoreageManager.error_reading", id)); //$NON-NLS-1$
- } catch (ClassNotFoundException e) {
- throw new TeiidComponentException(e, QueryPlugin.Util.getString("FileStoreageManager.error_reading", id)); //$NON-NLS-1$
- } finally {
- group.lock.readLock().unlock();
- }
- }
-
- @Override
- public void remove(Long gid, Long id) {
- CacheGroup group = cacheGroups.get(gid);
- if (group == null) {
- return;
- }
- if (group.lock.writeLock().tryLock()) {
- try {
- try {
- group.freeBatch(id);
- } catch (IOException e) {
- LogManager.logError(LogConstants.CTX_BUFFER_MGR, e, "Error removing batch"); //$NON-NLS-1$
- }
- } finally {
- group.lock.writeLock().unlock();
- }
- } else {
- group.freed.add(id);
- }
- }
-
- @Override
- public void addToCacheGroup(Long gid, Long oid) {
- CacheGroup group = cacheGroups.get(gid);
- if (group == null) {
- return;
- }
- group.physicalMapping.put(oid, null);
- }
-
- @Override
- public Collection<Long> removeCacheGroup(Long gid) {
- CacheGroup group = cacheGroups.remove(gid);
- if (group == null) {
- return Collections.emptyList();
- }
- group.store.remove();
- synchronized (group.physicalMapping) {
- return new ArrayList<Long>(group.physicalMapping.keySet());
- }
- }
-
- @Override
- public FileStore createFileStore(String name) {
- return storageManager.createFileStore(name);
- }
-
- @Override
- public void initialize() throws TeiidComponentException {
- this.storageManager.initialize();
- }
-
- public void setStorageManager(StorageManager storageManager) {
- this.storageManager = storageManager;
- }
-
- public StorageManager getStorageManager() {
- return storageManager;
- }
-
- public void setCompactionThreshold(int compactionThreshold) {
- this.compactionThreshold = compactionThreshold;
- }
-
-}
Modified: trunk/engine/src/main/java/org/teiid/common/buffer/impl/OrderedCache.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/common/buffer/impl/OrderedCache.java 2011-10-12 23:23:02 UTC (rev 3549)
+++ trunk/engine/src/main/java/org/teiid/common/buffer/impl/OrderedCache.java 2011-10-14 01:46:31 UTC (rev 3550)
@@ -26,12 +26,35 @@
import java.util.NavigableMap;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ConcurrentSkipListMap;
+import java.util.concurrent.atomic.AtomicLong;
-public abstract class OrderedCache<K, V> {
+import org.teiid.common.buffer.BaseCacheEntry;
+
+/**
+ * A Concurrent LRFU cache. Has assumptions that match buffermanager usage.
+ * Null values are not allowed.
+ * @param <K>
+ * @param <V>
+ */
+public class OrderedCache<K, V extends BaseCacheEntry> {
- protected Map<K, V> map = new ConcurrentHashMap<K, V>();
- protected NavigableMap<V, K> expirationQueue = new ConcurrentSkipListMap<V, K>();
- protected Map<K, V> limbo = new ConcurrentHashMap<K, V>();
+ protected Map<K, V> map;
+ //TODO: until Java 7 ConcurrentSkipListMap has a scaling bug in that
+ //the level limits the effective map size to ~ 2^16
+ //above which it performs comparably under load to a synchronized LinkedHashMap
+ //just with more CPU overhead vs. wait time.
+ protected NavigableMap<V, K> evictionQueue = new ConcurrentSkipListMap<V, K>();
+ protected Map<K, V> limbo;
+ protected AtomicLong clock;
+ //combined recency/frequency lamda value between 0 and 1 lower -> LFU, higher -> LRU
+ //TODO: adaptively adjust this value. more hits should move closer to lru
+ protected float crfLamda = .0002f;
+
+ public OrderedCache(int initialCapacity, float loadFactor, int concurrencyLevel, AtomicLong clock) {
+ map = new ConcurrentHashMap<K, V>(initialCapacity, loadFactor, concurrencyLevel);
+ limbo = new ConcurrentHashMap<K, V>(initialCapacity, loadFactor, concurrencyLevel);
+ this.clock = clock;
+ }
public V get(K key) {
V result = map.get(key);
@@ -40,9 +63,9 @@
}
if (result != null) {
synchronized (result) {
- expirationQueue.remove(result);
- recordAccess(key, result, false);
- expirationQueue.put(result, key);
+ evictionQueue.remove(result);
+ recordAccess(result, false);
+ evictionQueue.put(result, key);
}
}
return result;
@@ -52,7 +75,7 @@
V result = map.remove(key);
if (result != null) {
synchronized (result) {
- expirationQueue.remove(result);
+ evictionQueue.remove(result);
}
}
return result;
@@ -62,18 +85,18 @@
V result = map.put(key, value);
if (result != null) {
synchronized (result) {
- expirationQueue.remove(result);
+ evictionQueue.remove(result);
}
}
synchronized (value) {
- recordAccess(key, value, result == null);
- expirationQueue.put(value, key);
+ recordAccess(value, result == null);
+ evictionQueue.put(value, key);
}
return result;
}
public V evict() {
- Map.Entry<V, K> entry = expirationQueue.pollFirstEntry();
+ Map.Entry<V, K> entry = evictionQueue.pollFirstEntry();
if (entry == null) {
return null;
}
@@ -89,6 +112,42 @@
return map.size();
}
- protected abstract void recordAccess(K key, V value, boolean initial);
+ public Map<V, K> getEvictionQueue() {
+ return evictionQueue;
+ }
+ public Map.Entry<V, K> firstEntry() {
+ return evictionQueue.firstEntry();
+ }
+
+ protected void recordAccess(BaseCacheEntry value, boolean initial) {
+ float lastAccess = value.getLastAccess();
+ value.setLastAccess(clock.get());
+ if (initial && lastAccess == 0) {
+ return; //we just want to timestamp this as created and not give it an ordering value
+ }
+ float orderingValue = value.getOrderingValue();
+ orderingValue = computeNextOrderingValue(value.getLastAccess(), lastAccess,
+ orderingValue);
+ value.setOrderingValue(orderingValue);
+ }
+
+ float computeNextOrderingValue(float currentTime,
+ float lastAccess, float orderingValue) {
+ orderingValue =
+ (float) (//Frequency component
+ orderingValue*Math.pow(1-crfLamda, currentTime - lastAccess)
+ //recency component
+ + Math.pow(currentTime, crfLamda));
+ return orderingValue;
+ }
+
+ public float getCrfLamda() {
+ return crfLamda;
+ }
+
+ public void setCrfLamda(float crfLamda) {
+ this.crfLamda = crfLamda;
+ }
+
}
Deleted: trunk/engine/src/main/java/org/teiid/common/buffer/impl/PartiallyOrderedCache.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/common/buffer/impl/PartiallyOrderedCache.java 2011-10-12 23:23:02 UTC (rev 3549)
+++ trunk/engine/src/main/java/org/teiid/common/buffer/impl/PartiallyOrderedCache.java 2011-10-14 01:46:31 UTC (rev 3550)
@@ -1,149 +0,0 @@
-/*
- * JBoss, Home of Professional Open Source.
- * See the COPYRIGHT.txt file distributed with this work for information
- * regarding copyright ownership. Some portions may be licensed
- * to Red Hat, Inc. under one or more contributor license agreements.
- *
- * This library 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 2.1 of the License, or (at your option) any later version.
- *
- * This library 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 this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
- * 02110-1301 USA.
- */
-
-package org.teiid.common.buffer.impl;
-
-import java.util.Iterator;
-import java.util.LinkedHashMap;
-import java.util.Map;
-import java.util.NavigableMap;
-import java.util.TreeMap;
-import java.util.concurrent.ConcurrentHashMap;
-
-public abstract class PartiallyOrderedCache<K, V> {
-
- private int maxOrderedSize = 1 << 19;
-
- protected Map<K, V> map;
- //TODO: until Java 7 ConcurrentSkipListMap has a scaling bug in that
- //the level limits the effective map size to ~ 2^16
- //where it performs comparably under load to a synchronized LinkedHashMap
- //just with more CPU overhead vs. wait time.
- //TODO: have the concurrent version be pluggable
- protected NavigableMap<V, K> evictionQueue = new TreeMap<V, K>();
- //when we get to extreme number of entries we overflow into lru
- protected Map<V, K> evictionQueueHead = new LinkedHashMap<V, K>();
- //holds entries that are being evicted, but that might not yet be in a lower caching level
- protected Map<K, V> limbo;
-
- public PartiallyOrderedCache(int initialCapacity, float loadFactor, int concurrencyLevel) {
- map = new ConcurrentHashMap<K, V>(initialCapacity, loadFactor, concurrencyLevel);
- limbo = new ConcurrentHashMap<K, V>(initialCapacity, loadFactor, concurrencyLevel);
- }
-
- public void setMaxOrderedSize(int maxOrderedSize) {
- this.maxOrderedSize = maxOrderedSize;
- }
-
- public V get(K key) {
- V result = map.get(key);
- if (result == null) {
- result = limbo.get(key);
- }
- if (result != null) {
- maintainQueues(key, result, null);
- }
- return result;
- }
-
- public V remove(K key) {
- V result = map.remove(key);
- if (result != null) {
- synchronized (this) {
- if (evictionQueue.remove(result) != null) {
- orderedRemoved();
- } else {
- evictionQueueHead.remove(result);
- }
- }
- }
- return result;
- }
-
- private void orderedRemoved() {
- if (evictionQueue.size() < (maxOrderedSize>>1) && evictionQueueHead.size() > 0) {
- Iterator<Map.Entry<V,K>> i = evictionQueueHead.entrySet().iterator();
- if (i.hasNext()) {
- Map.Entry<V, K> entry = i.next();
- if (map.containsKey(entry.getValue())) {
- i.remove();
- evictionQueue.put(entry.getKey(), entry.getValue());
- }
- }
- }
- }
-
- public V put(K key, V value) {
- V result = map.put(key, value);
- maintainQueues(key, value, result);
- return result;
- }
-
- private void maintainQueues(K key, V value, V old) {
- synchronized (this) {
- if (old != null && evictionQueue.remove(old) == null) {
- evictionQueueHead.remove(old);
- }
- recordAccess(key, value, old == null);
- evictionQueue.put(value, key);
- if (evictionQueue.size() > maxOrderedSize) {
- Map.Entry<V, K> last = evictionQueue.pollLastEntry();
- if (last != null) {
- if (map.containsKey(last.getValue()) && !evictionQueue.containsKey(last.getKey())) {
- evictionQueueHead.put(last.getKey(), last.getValue());
- }
- }
- }
- }
- }
-
- public V evict() {
- Map.Entry<V, K> entry = evictionQueue.pollFirstEntry();
- if (entry == null) {
- return null;
- }
- synchronized (this) {
- orderedRemoved();
- }
- limbo.put(entry.getValue(), entry.getKey());
- return map.remove(entry.getValue());
- }
-
- public Map<V, K> getEvictionQueue() {
- return evictionQueue;
- }
-
- public Map.Entry<V, K> firstEntry() {
- return evictionQueue.firstEntry();
- }
-
- public void finishedEviction(K key) {
- limbo.remove(key);
- }
-
- public int size() {
- return map.size();
- }
-
- protected abstract void recordAccess(K key, V value, boolean initial);
-
-}
Modified: trunk/engine/src/test/java/org/teiid/common/buffer/BufferManagerFactory.java
===================================================================
--- trunk/engine/src/test/java/org/teiid/common/buffer/BufferManagerFactory.java 2011-10-12 23:23:02 UTC (rev 3549)
+++ trunk/engine/src/test/java/org/teiid/common/buffer/BufferManagerFactory.java 2011-10-14 01:46:31 UTC (rev 3550)
@@ -22,8 +22,8 @@
package org.teiid.common.buffer;
+import org.teiid.common.buffer.impl.BufferFrontedFileStoreCache;
import org.teiid.common.buffer.impl.BufferManagerImpl;
-import org.teiid.common.buffer.impl.FileStoreCache;
import org.teiid.common.buffer.impl.MemoryStorageManager;
import org.teiid.common.buffer.impl.SplittableStorageManager;
import org.teiid.core.TeiidComponentException;
@@ -85,7 +85,11 @@
MemoryStorageManager storageManager = new MemoryStorageManager();
SplittableStorageManager ssm = new SplittableStorageManager(storageManager);
ssm.setMaxFileSizeDirect(MemoryStorageManager.MAX_FILE_SIZE);
- FileStoreCache fsc = new FileStoreCache();
+ BufferFrontedFileStoreCache fsc = new BufferFrontedFileStoreCache();
+ //use conservative allocations
+ fsc.setDirect(false); //allow the space to be GCed easily
+ fsc.setMaxStorageObjectSize(1<<20);
+ fsc.setMemoryBufferSpace(1<<21);
fsc.setStorageManager(ssm);
fsc.initialize();
bufferManager.setCache(fsc);
Modified: trunk/engine/src/test/java/org/teiid/common/buffer/TestSTree.java
===================================================================
--- trunk/engine/src/test/java/org/teiid/common/buffer/TestSTree.java 2011-10-12 23:23:02 UTC (rev 3549)
+++ trunk/engine/src/test/java/org/teiid/common/buffer/TestSTree.java 2011-10-14 01:46:31 UTC (rev 3550)
@@ -29,8 +29,8 @@
import org.junit.Test;
import org.teiid.common.buffer.STree.InsertMode;
+import org.teiid.common.buffer.impl.BufferFrontedFileStoreCache;
import org.teiid.common.buffer.impl.BufferManagerImpl;
-import org.teiid.common.buffer.impl.FileStoreCache;
import org.teiid.core.TeiidComponentException;
import org.teiid.query.sql.symbol.ElementSymbol;
@@ -102,15 +102,14 @@
}
- /**
- * Forces the logic through several compaction cycles by using large strings
- * @throws TeiidComponentException
- */
- @Test public void testCompaction() throws TeiidComponentException {
+ @Test public void testStorageWrites() throws TeiidComponentException {
BufferManagerImpl bm = BufferManagerFactory.createBufferManager();
bm.setProcessorBatchSize(32);
bm.setMaxReserveKB(0);//force all to disk
- ((FileStoreCache)bm.getCache()).setCompactionThreshold(0);
+ BufferFrontedFileStoreCache fsc =(BufferFrontedFileStoreCache)bm.getCache();
+ fsc.setMaxStorageObjectSize(1 << 19);
+ fsc.setMemoryBufferSpace(1 << 19);
+ fsc.initialize();
bm.initialize();
ElementSymbol e1 = new ElementSymbol("x");
Modified: trunk/engine/src/test/java/org/teiid/common/buffer/impl/TestConcurrentBitSet.java
===================================================================
--- trunk/engine/src/test/java/org/teiid/common/buffer/impl/TestConcurrentBitSet.java 2011-10-12 23:23:02 UTC (rev 3549)
+++ trunk/engine/src/test/java/org/teiid/common/buffer/impl/TestConcurrentBitSet.java 2011-10-14 01:46:31 UTC (rev 3550)
@@ -62,4 +62,16 @@
}
}
+ @Test public void testCompactBitSet() {
+ ConcurrentBitSet bst = new ConcurrentBitSet(100000, 1);
+ bst.setCompact(true);
+ for (int i = 0; i < 100000; i++) {
+ assertEquals(i, bst.getAndSetNextClearBit());
+ }
+ bst.clear(50);
+ bst.clear(500);
+ bst.clear(5000);
+ assertEquals(50, bst.getAndSetNextClearBit());
+ }
+
}
Deleted: trunk/engine/src/test/java/org/teiid/common/buffer/impl/TestPartiallyOrderedCache.java
===================================================================
--- trunk/engine/src/test/java/org/teiid/common/buffer/impl/TestPartiallyOrderedCache.java 2011-10-12 23:23:02 UTC (rev 3549)
+++ trunk/engine/src/test/java/org/teiid/common/buffer/impl/TestPartiallyOrderedCache.java 2011-10-14 01:46:31 UTC (rev 3550)
@@ -1,61 +0,0 @@
-/*
- * JBoss, Home of Professional Open Source.
- * See the COPYRIGHT.txt file distributed with this work for information
- * regarding copyright ownership. Some portions may be licensed
- * to Red Hat, Inc. under one or more contributor license agreements.
- *
- * This library 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 2.1 of the License, or (at your option) any later version.
- *
- * This library 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 this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
- * 02110-1301 USA.
- */
-
-package org.teiid.common.buffer.impl;
-
-import static org.junit.Assert.*;
-
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.List;
-
-import org.junit.Test;
-
-public class TestPartiallyOrderedCache {
-
- @Test public void testQueueMaintenance() {
- PartiallyOrderedCache<Integer, Integer> cache = new PartiallyOrderedCache<Integer, Integer>(16, .75f, 16) {
-
- @Override
- protected void recordAccess(Integer key, Integer value, boolean initial) {
-
- }
- };
-
- cache.setMaxOrderedSize(5);
-
- for (int i = 0; i < 10; i++) {
- cache.put(i, i);
- }
-
- cache.get(8);
- cache.get(1);
-
- List<Integer> evictions = new ArrayList<Integer>();
- for (int i = 0; i < 10; i++) {
- evictions.add(i);
- }
- //we expect natural order because the lru is converted into the sorted on natural key
- assertEquals(Arrays.asList(0, 1, 2, 3, 4, 5, 6, 7, 8, 9), evictions);
- }
-
-}
Modified: trunk/runtime/src/main/java/org/teiid/services/BufferServiceImpl.java
===================================================================
--- trunk/runtime/src/main/java/org/teiid/services/BufferServiceImpl.java 2011-10-12 23:23:02 UTC (rev 3549)
+++ trunk/runtime/src/main/java/org/teiid/services/BufferServiceImpl.java 2011-10-14 01:46:31 UTC (rev 3550)
@@ -31,9 +31,9 @@
import org.jboss.managed.api.annotation.ManagementProperties;
import org.jboss.managed.api.annotation.ManagementProperty;
import org.teiid.common.buffer.BufferManager;
+import org.teiid.common.buffer.impl.BufferFrontedFileStoreCache;
import org.teiid.common.buffer.impl.BufferManagerImpl;
import org.teiid.common.buffer.impl.FileStorageManager;
-import org.teiid.common.buffer.impl.FileStoreCache;
import org.teiid.common.buffer.impl.MemoryStorageManager;
import org.teiid.common.buffer.impl.SplittableStorageManager;
import org.teiid.core.TeiidComponentException;
@@ -68,6 +68,8 @@
private int maxReserveKb = BufferManager.DEFAULT_RESERVE_BUFFER_KB;
private long maxBufferSpace = FileStorageManager.DEFAULT_MAX_BUFFERSPACE>>20;
private boolean inlineLobs = true;
+ private int maxMemoryBufferSpace = -1;
+ private int maxStorageObjectSize = BufferFrontedFileStoreCache.DEFAuLT_MAX_OBJECT_SIZE;
private FileStorageManager fsm;
/**
@@ -106,7 +108,14 @@
fsm.setMaxBufferSpace(maxBufferSpace*MB);
SplittableStorageManager ssm = new SplittableStorageManager(fsm);
ssm.setMaxFileSize(maxFileSize);
- FileStoreCache fsc = new FileStoreCache();
+ BufferFrontedFileStoreCache fsc = new BufferFrontedFileStoreCache();
+ fsc.setMaxStorageObjectSize(maxStorageObjectSize);
+ if (maxMemoryBufferSpace <= 0) {
+ //use approximately 20% of what's set aside for the reserved
+ fsc.setMemoryBufferSpace(this.bufferMgr.getMaxReserveKB() * 200);
+ } else {
+ fsc.setMemoryBufferSpace(maxMemoryBufferSpace);
+ }
fsc.setStorageManager(ssm);
fsc.initialize();
this.bufferMgr.setCache(fsc);
@@ -245,4 +254,22 @@
public long getReadAttempts() {
return bufferMgr.getReadAttempts();
}
+
+ public int getMaxMemoryBufferSpace() {
+ return maxMemoryBufferSpace;
+ }
+
+ public int getMaxStorageObjectSize() {
+ return maxStorageObjectSize;
+ }
+
+ @ManagementProperty(description="Max direct memory buffer space used by the buffer manager in MB. -1 determines the setting automatically from the maxReserveKB (default -1). This value cannot be smaller than maxStorageObjectSize.")
+ public void setMaxMemoryBufferSpace(int maxMemoryBufferSpace) {
+ this.maxMemoryBufferSpace = maxMemoryBufferSpace;
+ }
+
+ @ManagementProperty(description="The maximum size of a buffer managed object (typically a table page or a results batch) in bytes (default 8388608).")
+ public void setMaxStorageObjectSize(int maxStorageObjectSize) {
+ this.maxStorageObjectSize = maxStorageObjectSize;
+ }
}
Modified: trunk/runtime/src/test/java/org/teiid/dqp/service/buffer/TestLocalBufferService.java
===================================================================
--- trunk/runtime/src/test/java/org/teiid/dqp/service/buffer/TestLocalBufferService.java 2011-10-12 23:23:02 UTC (rev 3549)
+++ trunk/runtime/src/test/java/org/teiid/dqp/service/buffer/TestLocalBufferService.java 2011-10-14 01:46:31 UTC (rev 3550)
@@ -29,9 +29,9 @@
import org.junit.Test;
import org.teiid.common.buffer.BufferManager;
+import org.teiid.common.buffer.impl.BufferFrontedFileStoreCache;
import org.teiid.common.buffer.impl.BufferManagerImpl;
import org.teiid.common.buffer.impl.FileStorageManager;
-import org.teiid.common.buffer.impl.FileStoreCache;
import org.teiid.common.buffer.impl.SplittableStorageManager;
import org.teiid.core.types.DataTypeManager;
import org.teiid.core.util.UnitTestUtil;
@@ -55,7 +55,7 @@
assertTrue(svc.isUseDisk());
BufferManagerImpl mgr = svc.getBufferManager();
- SplittableStorageManager ssm = (SplittableStorageManager)((FileStoreCache)mgr.getCache()).getStorageManager();
+ SplittableStorageManager ssm = (SplittableStorageManager)((BufferFrontedFileStoreCache)mgr.getCache()).getStorageManager();
assertTrue(((FileStorageManager)ssm.getStorageManager()).getDirectory().endsWith(svc.getBufferDirectory().getName()));
}
12 years, 6 months