Unix Technical Forum

Re: about monitoring the input stream

This is a discussion on Re: about monitoring the input stream within the pgsql Interfaces jdbc forums, part of the PostgreSQL category; --> Mark, The relevant parts of the code for monitoring the PGStream are attached below. This code is part of ...


Go Back   Unix Technical Forum > Database Server Software > PostgreSQL > pgsql Interfaces jdbc

Register FAQ Members List Calendar Search Today's Posts Mark Forums Read
  #1 (permalink)  
Old 04-16-2008, 12:17 AM
Albert Cardona
 
Posts: n/a
Default Re: about monitoring the input stream


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().getSuperclas s();
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



---------------------------(end of broadcast)---------------------------
TIP 3: Have you checked our extensive FAQ?

http://www.postgresql.org/docs/faq

Digg this Post!Add Post to del.icio.usBookmark Post in TechnoratiFurl this Post!
Reply With Quote
  #2 (permalink)  
Old 04-16-2008, 12:17 AM
Dave Cramer
 
Posts: n/a
Default Re: about monitoring the input stream

Hi Albert,

Could you release your code with a freebsd like license. I'm afraid
that we can't accept any GPL'd code.

I'd greatly love to see your code included.

Dave

On 16-Sep-06, at 6:08 AM, Albert Cardona wrote:

>
> 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().getSuperclas s();
> 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
>
>
>
> ---------------------------(end of
> broadcast)---------------------------
> TIP 3: Have you checked our extensive FAQ?
>
> http://www.postgresql.org/docs/faq
>



---------------------------(end of broadcast)---------------------------
TIP 5: don't forget to increase your free space map settings

Digg this Post!Add Post to del.icio.usBookmark Post in TechnoratiFurl this Post!
Reply With Quote
Reply


Thread Tools
Display Modes

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

vB code is On
Smilies are On
[IMG] code is On
HTML code is Off
Trackbacks are On
Pingbacks are On
Refbacks are On
Forum Jump


All times are GMT. The time now is 08:42 AM.


Powered by vBulletin® Version 3.6.5
Copyright ©2000 - 2008, Jelsoft Enterprises Ltd.
SEO by vBSEO 3.2.0
www.UnixAdminTalk.com