Re: about monitoring the input stream

From: Albert Cardona <acardona(at)ini(dot)phys(dot)ethz(dot)ch>
To: pgsql-jdbc(at)postgresql(dot)org
Subject: Re: about monitoring the input stream
Date: 2006-09-16 10:08:43
Message-ID: 200609161208.43680.acardona@ini.phys.ethz.ch
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-jdbc


Mark,

The relevant parts of the code for monitoring the PGStream are attached below.

This code is part of TrakEM2, an ImageJ/postgresql -based application (GPL
applies) for managing an arbitrarily large set of images, segmented profiles
and metadata in general, for the purpose of extracting 3D models and a
hierarchical structure of objects present in the sample represented by the
images. See all details here:
http://www.ini.unizh.ch/~acardona/trakem2.html

The code below belongs to the current svn snapshot, which won't be available
until the end of this month.

/** Extract from private inner class Monitor. GPL applies, see the
TrakEM2-src.zip file, class ini.trakem2.persistence.DBLoader, at
http://www.ini.unizh.ch/~acardona/trakem2.html */

public Monitor(Connection con) {
connection = con;
LoggingInputStream lis = null;
try {
AbstractJdbc2Connection a2 =
(AbstractJdbc2Connection)connection;
Class c2 =
connection.getClass().getSuperclass().getSuperclass();
java.lang.reflect.Field f_proto =
c2.getDeclaredField("protoConnection");
f_proto.setAccessible(true);
// protoConnection is a ProtocolConnection interface,
implemented in core.v3.ProtocolConnectionImpl !
//ProtocolConnectionImpl pci =
(ProtocolConnectionImpl)m_proto.get(c2); // class is private to the package,
can't cast!
Object pci = f_proto.get(a2);
// finally, get the PGStream
java.lang.reflect.Field f_pgstream =
pci.getClass().getDeclaredField("pgStream");
f_pgstream.setAccessible(true);
PGStream pgstream = (PGStream)f_pgstream.get(pci);
// now the InputStream
java.lang.reflect.Field f_i =
pgstream.getClass().getDeclaredField("pg_input");
f_i.setAccessible(true);
InputStream stream = (InputStream)f_i.get(pgstream);
lis = new LoggingInputStream(stream);
f_i.set(pgstream, lis); // TADA! Many thanks to the
PGSQL JDBC mailing list for this last tip on not just monitoring the PGStream
as I was doing, but on replacing the inputstream altogether with a logging
copy! ("CountingInputStream", they called it).

} catch (Exception e) {
new IJError(e);
}
this.lis = lis;
makeWindow();
}

/** ===================== */

/** The class below exists as ini.trakem2.io.LoggingInputStream in TrakEM2.
The GPL applies, see the TrakEM2-src.zip downloadable at
http://www.ini.unizh.ch/~acardona/trakem2.html */

import java.io.BufferedInputStream;
import java.io.InputStream;
import java.io.IOException;

/** A class to monitor an input stream for speed and total byte download. */
public class LoggingInputStream extends BufferedInputStream {

private long last;
private long n = 0;
private long accum_time = 0;
private long accum_bytes = 0;

public LoggingInputStream(InputStream in) {
super(in);
last = System.currentTimeMillis();
}

public int read() throws IOException {
int m = super.read();
n += m;
return m;
}

public int read(byte[] b) throws IOException {
int m = super.read(b);
n += m;
return m;
}

public int read(byte[] b, int off, int len) throws IOException {
int m = super.read(b, off, len);
n += m;
return m;
}

/** Put the accumulated count to zero. */
public void resetInfo() { // to work perfect, this would need a
synchronized clause, but no such perfection is needed, and there are
perfomance issues.
accum_bytes = n = 0;
last = System.currentTimeMillis();
accum_time = 0;
}

/** Returns info as
* [0] = current time in ms
* [1] = elapsed time in ms since last call to getInfo(long[])
* [2] = n_bytes_read since last call to getInfo(long[])
* [3] = accumulated time in ms since last call to resetInfo()
* [4] = accumulated bytes since last call to resetInfo()
*
* So current speed = info[2]/info[1] Kb/s
*/
public void getInfo(long[] info) {
long now = System.currentTimeMillis();
accum_time += now - last;
accum_bytes += n;
info[0] = now;
info[1] = now - last; // elapsed time
info[2] = n;
info[3] = accum_time; // total time since last call to
resetInfo()
info[4] = accum_bytes; // total bytes since last call to
resetInfo()
// reset cycle vars:
n = 0;
last = now;
}
}

--
Albert Cardona
Molecular Cell Developmental Biology
University of California Los Angeles
Tel +1 310 2067376
Programming: http://www.ini.unizh.ch/~acardona/trakem2.html
Research: http://www.mcdb.ucla.edu/Research/Hartenstein/
Web design: http://www.pixelets.com

Responses

Browse pgsql-jdbc by date

  From Date Subject
Next Message Dave Cramer 2006-09-16 12:12:24 Re: about monitoring the input stream
Previous Message Markus Schaber 2006-09-16 08:26:48 Re: idle in transaction