Re: Get bytes sent to client
От | Alexander Pyhalov |
---|---|
Тема | Re: Get bytes sent to client |
Дата | |
Msg-id | 4B2F3DB8.5080404@rsu.ru обсуждение исходный текст |
Ответ на | Re: Get bytes sent to client (Alexander Pyhalov <alp@rsu.ru>) |
Список | pgsql-jdbc |
Hello. Extending VisibleBufferedInputStream was not a good idea - work with buffer (like ensureBytes() calls ) can't be accounted. So, I modified it. Results are more precise now. Alexander Pyhalov wrote: > Good day.. > I've just made new patch - extended BufferedOutputStream and > VisibleBufferedInputStream, as you suggested. It works, and results are > comparable with tcpdump data (for received traffic). For sent traffic > they are incorrect, because I can't account all ACK, but only PGSQL > traffic. > It's suprising, that received traffic is more then tcpdump shows ( 2%, > butt more). I thought it would be a bit smaller then actual data. > However, this data gives good approximation (2% for 100MB traffic is not > a lot). > > Craig Ringer wrote: >> On 18/12/2009 2:34 PM, Alexander Pyhalov wrote: >>> >>> I've made patch for Postgres JDBC driver. Now driver accounts bytes >>> sent/received from client ing PGStream. >> >> Can't you extend or wrap the pg_input / pg_output streams to do the >> accounting in their read(...) / write(...) method instead? The way >> you've done it is rather fragile and is very prone to bitrot as other >> parts of the driver are changed. >> >> -- >> Craig Ringer > > > > ------------------------------------------------------------------------ > > -- С уважением, Александр Пыхалов, системный администратор ЮГИНФО ЮФУ. diff -urN postgresql-jdbc-8.4-701.src/org/postgresql/core/BaseConnection.java postgresql-jdbc-8.4-701.src_mod2/org/postgresql/core/BaseConnection.java --- postgresql-jdbc-8.4-701.src/org/postgresql/core/BaseConnection.java 2008-04-15 08:23:54.000000000 +0400 +++ postgresql-jdbc-8.4-701.src_mod2/org/postgresql/core/BaseConnection.java 2009-12-19 12:22:19.707859272 +0300 @@ -139,4 +139,8 @@ // Get the bind-string-as-varchar config flag public boolean getStringVarcharFlag(); + + public int getSentBytes(); + + public int getRecvdBytes(); } diff -Nru postgresql-jdbc-8.4-701.src/org/postgresql/core/CalculatingBOutputStream.java postgresql-jdbc-8.4-701.src_mod3/org/postgresql/core/CalculatingBOutputStream.java --- postgresql-jdbc-8.4-701.src/org/postgresql/core/CalculatingBOutputStream.java 1970-01-01 03:00:00.000000000 +0300 +++ postgresql-jdbc-8.4-701.src_mod3/org/postgresql/core/CalculatingBOutputStream.java 2009-12-21 11:46:45.075261312 +0300 @@ -0,0 +1,58 @@ +/* + * To change this template, choose Tools | Templates + * and open the template in the editor. + */ + +package org.postgresql.core; + +import java.io.BufferedOutputStream; +import java.io.OutputStream; +import java.io.IOException; +/** + * + * @author alp + */ +public class CalculatingBOutputStream extends BufferedOutputStream{ + + protected int sentBytes; + + public CalculatingBOutputStream(OutputStream out){ + super(out); + sentBytes=0; + } + + public CalculatingBOutputStream(OutputStream out, int size){ + super(out,size); + sentBytes=0; + } + + /** + * {@inheritDoc} + */ + public void write(int b) throws IOException{ + super.write(b); + sentBytes++; + } + + /** + * {@inheritDoc} + */ + public void write(byte[] b) throws IOException{ + super.write(b); + sentBytes+=b.length; + } + + public void write(byte[] b, int off, int len) throws IOException{ + super.write(b,off,len); + sentBytes+=len; + } + + /** + * Get number of bytes sent to this stream + * @return - number of bytes sent + */ + public int getSentBytes() + { + return sentBytes; + } +} diff -Nru postgresql-jdbc-8.4-701.src/org/postgresql/core/PGStream.java postgresql-jdbc-8.4-701.src_mod3/org/postgresql/core/PGStream.java --- postgresql-jdbc-8.4-701.src/org/postgresql/core/PGStream.java 2008-01-08 09:56:27.000000000 +0300 +++ postgresql-jdbc-8.4-701.src_mod3/org/postgresql/core/PGStream.java 2009-12-21 11:46:45.067081118 +0300 @@ -109,7 +109,7 @@ // Buffer sizes submitted by Sverre H Huseby <sverrehu@online.no> pg_input = new VisibleBufferedInputStream(connection.getInputStream(), 8192); - pg_output = new BufferedOutputStream(connection.getOutputStream(), 8192); + pg_output = new CalculatingBOutputStream(connection.getOutputStream(), 8192); if (encoding != null) setEncoding(encoding); @@ -534,4 +534,23 @@ pg_input.close(); connection.close(); } + + public int getRecvdBytes() { + if(pg_input!=null){ + return pg_input.getRecvdBytes(); + } + else { + return 0; + } + } + + public int getSentBytes() { + if(pg_output!=null){ + return ((CalculatingBOutputStream)pg_output).getSentBytes(); + } + else { + return 0; + } + } + } diff -Nru postgresql-jdbc-8.4-701.src/org/postgresql/core/ProtocolConnection.java postgresql-jdbc-8.4-701.src_mod3/org/postgresql/core/ProtocolConnection.java --- postgresql-jdbc-8.4-701.src/org/postgresql/core/ProtocolConnection.java 2008-01-08 09:56:27.000000000 +0300 +++ postgresql-jdbc-8.4-701.src_mod3/org/postgresql/core/ProtocolConnection.java 2009-12-21 11:46:45.075261312 +0300 @@ -132,4 +132,8 @@ * @return the version of the implementation */ public int getProtocolVersion(); + + public int getRecvdBytes(); + + public int getSentBytes(); } diff -Nru postgresql-jdbc-8.4-701.src/org/postgresql/core/VisibleBufferedInputStream.java postgresql-jdbc-8.4-701.src_mod3/org/postgresql/core/VisibleBufferedInputStream.java --- postgresql-jdbc-8.4-701.src/org/postgresql/core/VisibleBufferedInputStream.java 2008-01-08 09:56:27.000000000 +0300 +++ postgresql-jdbc-8.4-701.src_mod3/org/postgresql/core/VisibleBufferedInputStream.java 2009-12-21 11:46:45.074235505+0300 @@ -55,6 +55,11 @@ private int endIndex; /** + * How many bytes was read from wrapped stream + */ + protected int rcvdBytes; + + /** * Creates a new buffer around the given stream. * * @param in The stream to buffer. @@ -64,6 +69,7 @@ wrapped = in; buffer = new byte[bufferSize < MINIMUM_READ ? MINIMUM_READ : bufferSize]; + rcvdBytes=0; } /** @@ -135,7 +141,8 @@ int read = wrapped.read(buffer, endIndex, canFit); if (read < 0) { return false; - } + } + rcvdBytes +=read; endIndex += read; return true; } @@ -210,6 +217,7 @@ if (r <= 0) { return (read == 0) ? r : read; } + rcvdBytes+=r; read += r; off += r; len -= r; @@ -222,6 +230,7 @@ * {@inheritDoc} */ public long skip(long n) throws IOException { + long skipped; int avail = endIndex - index; if (avail >= n) { index += n; @@ -230,7 +239,9 @@ n -= avail; index = 0; endIndex = 0; - return avail + wrapped.skip(n); + skipped=wrapped.skip(n); + rcvdBytes+=skipped; + return avail + skipped; } /** @@ -290,4 +301,10 @@ pos = index; } } + + public int getRecvdBytes() + { + return rcvdBytes; + } + } diff -Nru postgresql-jdbc-8.4-701.src/org/postgresql/core/v2/ProtocolConnectionImpl.java postgresql-jdbc-8.4-701.src_mod3/org/postgresql/core/v2/ProtocolConnectionImpl.java --- postgresql-jdbc-8.4-701.src/org/postgresql/core/v2/ProtocolConnectionImpl.java 2008-04-01 11:19:20.000000000 +0400 +++ postgresql-jdbc-8.4-701.src_mod3/org/postgresql/core/v2/ProtocolConnectionImpl.java 2009-12-21 11:46:45.050828561+0300 @@ -200,6 +200,20 @@ { return 2; } + + public int getRecvdBytes() { + if(pgStream==null) + return 0; + else + return pgStream.getRecvdBytes(); + } + + public int getSentBytes() { + if(pgStream==null) + return 0; + else + return pgStream.getSentBytes(); + } private String serverVersion; private int cancelPid; diff -Nru postgresql-jdbc-8.4-701.src/org/postgresql/core/v3/ProtocolConnectionImpl.java postgresql-jdbc-8.4-701.src_mod3/org/postgresql/core/v3/ProtocolConnectionImpl.java --- postgresql-jdbc-8.4-701.src/org/postgresql/core/v3/ProtocolConnectionImpl.java 2008-04-01 11:19:20.000000000 +0400 +++ postgresql-jdbc-8.4-701.src_mod3/org/postgresql/core/v3/ProtocolConnectionImpl.java 2009-12-21 11:46:45.051828667+0300 @@ -200,6 +200,20 @@ return 3; } + public int getRecvdBytes() { + if(pgStream==null) + return 0; + else + return pgStream.getRecvdBytes(); + } + + public int getSentBytes() { + if(pgStream==null) + return 0; + else + return pgStream.getSentBytes(); + } + private String serverVersion; private int cancelPid; private int cancelKey; diff -Nru postgresql-jdbc-8.4-701.src/org/postgresql/jdbc2/AbstractJdbc2Connection.java postgresql-jdbc-8.4-701.src_mod3/org/postgresql/jdbc2/AbstractJdbc2Connection.java --- postgresql-jdbc-8.4-701.src/org/postgresql/jdbc2/AbstractJdbc2Connection.java 2009-07-01 09:00:40.000000000 +0400 +++ postgresql-jdbc-8.4-701.src_mod3/org/postgresql/jdbc2/AbstractJdbc2Connection.java 2009-12-21 11:46:45.091416093 +0300 @@ -1068,4 +1068,19 @@ copyManager = new CopyManager(this); return copyManager; } + + public int getRecvdBytes() { + if(protoConnection==null) + return 0; + else + return protoConnection.getRecvdBytes(); + } + + public int getSentBytes() { + if(protoConnection==null) + return 0; + else + return protoConnection.getSentBytes(); + } + }
В списке pgsql-jdbc по дате отправления:
Предыдущее
От: Oliver JowettДата:
Сообщение: Re: Issue with the JDBC driver doing timezone conversions on "java.sql.Date"?
Следующее
От:Дата:
Сообщение: Re: Cheapest way to poll for notifications? & Driver improvement question re SSL and notify