[
https://issues.apache.org/jira/browse/DERBY-1275?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
]
Mamta A. Satoor updated DERBY-1275:
-----------------------------------
Attachment: DERBY1275EnableClientTracingStatV2.txt
DERBY1275EnableClientTracingDiffV2.txt
I have attached an updated review package
DERBY1275EnableClientTracingDiffV1.txt As mentioned with the earlier patch, I
am adding 2 client-side system properties, derby.client.traceLevel and
derby.client.traceDirectory. This 2 properties will allow a user to start
client tracing without having to change the actual client application.
Summary of the patch
1)Added an attribute for the client property prefix in Attribute.java This
prefix and traceLevel or traceDirectory will define the 2 new system property
names. Rather than introducing 2 new attributes with derby.client.traceLevel
and derby.client.traceDirectory, I thought it will be better to just intorduce
a prefix which can be used with the existing attributes for traceLevel and
traceDirectory.
2)At this point, the system property derby.client.traceLevel will only accept
int values. The existing documentation at
http://db.apache.org/derby/docs/10.2/adminguide/cadminappsclienttracing.html
talks about symbolic values or the hex values but the new system property
derby.client.traceLevel will not accept any of these 2 documented ways.
Instead, the user will need to use the base 10 equivalent of the hex numbers.
This behavior is same as what happens inside ij. More info can be found at
http://www.nabble.com/Specifying-the-traceLevel-property-through-ij-tf3021545.html#a8391955
Specifying non-int value will result in following exception
ERROR XJ213: The traceLevel connection property does not have a valid format
for a number.
3)I added a new junit test, ClientSideSystemProperties under tests/derbynet
directory. This class relies on the decorator SystemPropertyTestSetup to set up
the trace related jvm properties(derby.client.traceLevel and
derby.client.traceDirectory). This property setting code happens in the suite()
method. Once these properties are set, the test establishes a database
connection. At the time of the test tear down, in tearDown() method, the test
needs to look in the trace directory specified by derby.client.traceDirectory
to see if any new files were created. If yes, then that means that the jvm
properties were correctly picked by the test and tracing happened correctly.
The tearDown() method then deletes the trace files and deletes the
traceDirectory so that the test environment is clean.
Now, since this test runs under security manager, the directory access part
needs to happen in a privileged block. I wanted to have
ClientSideSystemProperties implement java.security.PrivilegedExceptionAction
and include the public synchronized final Object run() throws IOException
method in ClientSideSystemProperties to write the privilege code but I kept
getting compile error. The compiler was getting confused with the run() method
in java.security.PrivilegedExceptionAction and the run() method in
junit.framework.TestCase.
[javac]
C:\p4clients\maintest3\opensource\java\testing\org\apache\derbyTesting\functionTests\tests\derbynet\ClientSideSystemProperties.java:57:
run() in
org.apache.derbyTesting.functionTests.tests.derbynet.ClientSideSystemProperties
cannot override run() in junit.framework.TestCase; attempting to use
incompatible return type
[javac] found : java.lang.Object
[javac] required: junit.framework.TestResult
[javac] public synchronized final Object run() throws IOException {
[javac] ^
[javac] 1 error
[javac] Compile failed; see the compiler error output for details.
To work around this compile time error, I decided to create a new class,
DirReadAndDeletePrivledgeBlock, which extends
java.security.PrivilegedExceptionAction and this new class has the directory
lookup, cleanup code. An object of this class is then used by the tearDown
method in , as shown below ClientSideSystemProperties
java.security.AccessController.doPrivileged(new
DirReadAndDeletePrivledgeBlock(traceDirectory));
4)Changes in ClientBaseDataSource.java
I have changed getTraceDirectory method to first check for the jvm properties
derby.client.traceDirectory. If not found, then look for traceDirectory in the
jdbc url. Similar change has been made for method getTraceLevel. Since these 2
methods now require looking at system properties, part of their code needs to
be inside a privileged block. But since the methods getTraceLevel and
getTraceDirectory are
static, I can't pass an instance of their class to
java.security.AccessController.doPrivileged call. To get around this, I
introduced a
new class which just implements java.security.PrivilegedExceptionAction and
it's run method does the job of looking at the system properties.
In addition, I took out some unused imports from ClientBaseDataSource.java
5)Changes in LogWriter.java
I had to change the PrintWriter related code in this file to run inside a
privileged block. The existing code for PrintWrite is in the static method
getPrintWriter. For the reasons similar to #4 above (for
ClientBaseDataSource.java), I had to create a new class to do the PrintWriter
code and have the LogWriter.getPrintWriter use an instance of the new class in
it's java.security.AccessController.doPrivileged call.
May be there is a better way to accomplish #4 and #5 above w/o introducing the
new classes. If anyone has any ideas, please let me know. I could have created
a new instance of the current class even when inside the static method but the
classes LogWriter and ClientBaseDataSource are pretty big. I thought it would
be better to have smaller welldefined classes to do the privileged code rather
than instantiating objects of large classes.
Items to do
1)Since these 2 properties won't be documented in the official Derby
ocumentation, I will add a wiki page for them so we don't loose track of these
undocumented properties. I will mention on the page that system properties will
override the same properties provided through JDBC url. I will also add that at
this point, onlt int values can be specified for the system property
derby.client.traceLevel.
The existing documentation at
http://db.apache.org/derby/docs/10.2/adminguide/cadminappsclienttracing.html
talks about symbolic values or the hex values but the new system property
derby.client.traceLevel will not accept any of these 2 documented ways.
Instead, the
user will need to use the base 10 equivalent of the hext numbers.
Disclaimer: A user can use these properties but since they are not in the
official documentation, they can be changed at any point without providing any
backward compatibility.
svn stat -q is attached as DERBY1275EnableClientTracingStatV2.txt
I have finished running the junit test suite and there were no new failures
caused by this patch. The run of derbyall shows NSinSameJVM failure but from
the actual diff, it doesn't look like it is related to my changes.
Any feedback on the patch will be much appreciated.
> Provide a way to enable client tracing without changing the application
> -----------------------------------------------------------------------
>
> Key: DERBY-1275
> URL: https://issues.apache.org/jira/browse/DERBY-1275
> Project: Derby
> Issue Type: Improvement
> Components: Network Client
> Affects Versions: 10.1.3.1, 10.2.1.6
> Reporter: Kathey Marsden
> Assigned To: Mamta A. Satoor
> Priority: Minor
> Fix For: 10.2.3.0
>
> Attachments: DERBY1275EnableClientTracingDiffV1.txt,
> DERBY1275EnableClientTracingDiffV2.txt,
> DERBY1275EnableClientTracingStatV1.txt, DERBY1275EnableClientTracingStatV2.txt
>
>
> Currently the client tracing can be enabled by setting attributes on the
> client url, setXXX methods on the DataSource or calling
> DriverManager.setLogWriter(), but it often cannot be enabled in a deployed
> client application because all of these API's require modification of the
> application or its configuration files.
> It would be good to have a global way to turn on client tracing. A system
> property pointing to a property file is one possibility but probably not
> ideal because of the impact in class loader contexts. I am not sure what
> the other possiblities are,
--
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.