On Mon, 2007-03-12 at 09:14 +0000, Simon Riggs wrote: > On Mon, 2007-03-12 at 16:21 +0900, ITAGAKI Takahiro wrote:
> > With the default > > value of scan_recycle_buffers(=0), VACUUM seems to use all of buffers in > > pool, > > just like existing sequential scans. Is this intended? > > Yes, but its not very useful for testing to have done that. I'll do > another version within the hour that sets N=0 (only) back to current > behaviour for VACUUM. New test version enclosed, where scan_recycle_buffers = 0 doesn't change existing VACUUM behaviour. -- Simon Riggs EnterpriseDB http://www.enterprisedb.com
? .swo ? .swp ? GNUmakefile ? RUIP-Oct12.patch ? UIP-datetime.patch ? WAL_notes.txt ? autovac.patch ? backup_minor_changes.patch ? backup_single_transaction.patch ? backup_typo.patch ? bufmgr_cyclic_reuse.v1.patch ? bufmgr_cyclic_reuse.v2.patch ? bufmgr_cyclic_reuse.v3.patch ? c2 ? cache_option.sql ? cacheinval.v1.patch ? check ? check2 ? checl ? commit_nowait.wip1.patch ? commit_nowait.wip2.patch ? commit_options.wip.v1.patch ? commitsiblings.v1.patch ? config.log ? config.status ? copy_noWAL.patch ? copy_noWAL2.patch ? copy_nowal.v1.patch ? copy_nowal.v2.patch ? copy_nowal_prep.sql ? copy_nowal_test.sql ? crc ? d.out ? datatype_frequency.sql ? dbtValidate.sql ? ddl_caveats.patch ? deadlock.patch ? edbDataValidation.sql ? error.sql ? executestricttest ? explain_analyze_timer.v1.patch ? f.sql ? faq.patch ? faq_tab.patch ? fast_cluster.v1.patch ? fast_cluster.v2.patch ? fastcopytest.sql ? funcs ? heap_diag_funcs.v1.patch ? heap_page_func.v1.patch ? hot ? iub_doc.patch ? iubackup.patch ? keepcache.patch ? last_restart_point.v1.patch ? last_restart_point.v2.patch ? log_autovacuum.v1.patch ? log_autovacuum.v2.patch ? log_lock_waits.v1.patch ? logfile ? makefile.custom ? mi ? mj.sql ? mj_circular.v1.patch ? mj_circular.v2.patch ? mj_circular.v3.patch ? mk.out ? mk.tmp ? mki.out ? mkinfo ? mkt.tmp ? mlog ? notintransblock.patch ? num_commits++ ? on.sql ? perf_doc.v1.patch ? pg_dump_analyze.v1.patch ? pg_dump_analyze.v1a.patch ? pg_standby.v2.tar ? pg_standby.v3.tar ? pg_standby.v4.tar ? pg_standby.v5.tar ? pg_standby.v6.tar ? pgbenchValidate.sql ? pgre.tar ? pgs.tar ? pgtrace_idle.REL8_3-20070104.v1.patch ? pgtrace_newprobes.REL8_3-20070104.v1.patch ? pgtrace_newprobes.v2.patch ? pitr_cleanup.patch ? portals_per_user.v1.patch ? ps.txt ? raw_page_funcs.v1.patch ? raw_page_funcs.v2.patch ? relationkeepcache.patch ? relopt ? restartablerecovery_docs.patch ? ri_initial_check.sql ? scan_recycle_buffers.v1.patch ? scan_recycle_buffers.v2.patch ? scan_recycle_buffers.v3.patch ? sel.patch ? singletransdocpatch.patch ? sss ? table_options.patch ? test_warm_standby.tar ? testcrc ? toast_options.sql ? toast_relopts.pgsql.v2.patch ? toast_relopts.v1.patch ? toast_tuning_ideas.patch ? toast_tuple_threshold_fixed.patch ? toastcache.patch ? trace_wal_flush.v1.patch ? tracedocs.patch ? transaction_guarantee.v1.patch ? transaction_guarantee.v2.patch ? transaction_guarantee.v3.patch ? transaction_guarantee.v4.patch ? transaction_guarantee.v5.patch ? transaction_guarantee.v6.patch ? uip_both.patch ? unlink_pg_internal_at_startup.patch ? vac_full_reindex.v1.patch ? vac_hint.v1.patch ? vac_hint.v2.patch ? vacstrategy.v1.patch ? vacstrategy.v2.patch ? vacstrategy_simple.v1.patch ? wal_checksum.v1.patch ? wal_checksum.v2.patch ? wrap_limit.patch ? xlog_clog_truncate.patch ? xlog_relcache.patch ? xlogswitchtuning.patch ? xlogswitchtuning2.patch ? xlogviewer.tar ? contrib/pg_relation_extend ? contrib/pgbench/.runtest.sh.swp ? contrib/pgbench/tpc_b.sql ? contrib/pgbench/truckin.pgb ? contrib/pgstattuple/pgstatheap.c ? doc/src/sgml/check ? doc/src/sgml/trace.sgml ? src/Makefile.global ? src/backend/postgres ? src/backend/access/common/rawpage.c ? src/backend/access/nbtree/nbttuple.c ? src/backend/catalog/.catalog.c.swp ? src/backend/catalog/postgres.bki ? src/backend/catalog/postgres.description ? src/backend/catalog/postgres.shdescription ? src/backend/commands/.tablespace.c.swp ? src/backend/postmaster/walwriter.c ? src/backend/storage/lmgr/.deadlock.c.swp ? src/backend/utils/mb/conversion_procs/conversion_create.sql ? src/backend/utils/mb/conversion_procs/ascii_and_mic/libascii_and_mic.so.0.0 ? src/backend/utils/mb/conversion_procs/cyrillic_and_mic/libcyrillic_and_mic.so.0.0 ? src/backend/utils/mb/conversion_procs/euc_cn_and_mic/libeuc_cn_and_mic.so.0.0 ? src/backend/utils/mb/conversion_procs/euc_jp_and_sjis/libeuc_jp_and_sjis.so.0.0 ? src/backend/utils/mb/conversion_procs/euc_kr_and_mic/libeuc_kr_and_mic.so.0.0 ? src/backend/utils/mb/conversion_procs/euc_tw_and_big5/libeuc_tw_and_big5.so.0.0 ? src/backend/utils/mb/conversion_procs/latin2_and_win1250/liblatin2_and_win1250.so.0.0 ? src/backend/utils/mb/conversion_procs/latin_and_mic/liblatin_and_mic.so.0.0 ? src/backend/utils/mb/conversion_procs/utf8_and_ascii/libutf8_and_ascii.so.0.0 ? src/backend/utils/mb/conversion_procs/utf8_and_big5/libutf8_and_big5.so.0.0 ? src/backend/utils/mb/conversion_procs/utf8_and_cyrillic/libutf8_and_cyrillic.so.0.0 ? src/backend/utils/mb/conversion_procs/utf8_and_euc_cn/libutf8_and_euc_cn.so.0.0 ? src/backend/utils/mb/conversion_procs/utf8_and_euc_jp/libutf8_and_euc_jp.so.0.0 ? src/backend/utils/mb/conversion_procs/utf8_and_euc_kr/libutf8_and_euc_kr.so.0.0 ? src/backend/utils/mb/conversion_procs/utf8_and_euc_tw/libutf8_and_euc_tw.so.0.0 ? src/backend/utils/mb/conversion_procs/utf8_and_gb18030/libutf8_and_gb18030.so.0.0 ? src/backend/utils/mb/conversion_procs/utf8_and_gbk/libutf8_and_gbk.so.0.0 ? src/backend/utils/mb/conversion_procs/utf8_and_iso8859/libutf8_and_iso8859.so.0.0 ? src/backend/utils/mb/conversion_procs/utf8_and_iso8859_1/libutf8_and_iso8859_1.so.0.0 ? src/backend/utils/mb/conversion_procs/utf8_and_johab/libutf8_and_johab.so.0.0 ? src/backend/utils/mb/conversion_procs/utf8_and_sjis/libutf8_and_sjis.so.0.0 ? src/backend/utils/mb/conversion_procs/utf8_and_uhc/libutf8_and_uhc.so.0.0 ? src/backend/utils/mb/conversion_procs/utf8_and_win/libutf8_and_win.so.0.0 ? src/backend/utils/sort/tuplestore_mod.c ? src/bin/initdb/initdb ? src/bin/ipcclean/ipcclean ? src/bin/pg_config/pg_config ? src/bin/pg_controldata/pg_controldata ? src/bin/pg_ctl/pg_ctl ? src/bin/pg_dump/pg_dump ? src/bin/pg_dump/pg_dumpall ? src/bin/pg_dump/pg_restore ? src/bin/pg_resetxlog/pg_resetxlog ? src/bin/psql/psql ? src/bin/scripts/clusterdb ? src/bin/scripts/createdb ? src/bin/scripts/createlang ? src/bin/scripts/createuser ? src/bin/scripts/dropdb ? src/bin/scripts/droplang ? src/bin/scripts/dropuser ? src/bin/scripts/reindexdb ? src/bin/scripts/vacuumdb ? src/include/pg_config.h ? src/include/stamp-h ? src/include/access/rawpage.h ? src/include/postmaster/walwriter.h ? src/interfaces/ecpg/compatlib/libecpg_compat.so.2.2 ? src/interfaces/ecpg/compatlib/libecpg_compat.so.2.3 ? src/interfaces/ecpg/ecpglib/libecpg.so.5.2 ? src/interfaces/ecpg/ecpglib/libecpg.so.5.3 ? src/interfaces/ecpg/include/ecpg_config.h ? src/interfaces/ecpg/pgtypeslib/libpgtypes.so.2.2 ? src/interfaces/ecpg/pgtypeslib/libpgtypes.so.2.3 ? src/interfaces/ecpg/preproc/ecpg ? src/interfaces/ecpg/test/complex/test1 ? src/interfaces/ecpg/test/complex/test1.c ? src/interfaces/ecpg/test/complex/test2 ? src/interfaces/ecpg/test/complex/test2.c ? src/interfaces/ecpg/test/complex/test3 ? src/interfaces/ecpg/test/complex/test3.c ? src/interfaces/libpq/exports.list ? src/interfaces/libpq/libpq.so.5.0 ? src/interfaces/libpq/libpq.so.5.1 ? src/pl/plpgsql/src/libplpgsql.so.1.0 ? src/port/pg_config_paths.h ? src/test/regress/libregress.so.0.0 ? src/test/regress/pg_regress ? src/test/regress/results ? src/test/regress/testtablespace ? src/test/regress/expected/btree_insert.out ? src/test/regress/expected/btree_misc.out ? src/test/regress/expected/btree_search.out ? src/test/regress/expected/btree_unique.out ? src/test/regress/expected/btree_vacuum.out ? src/test/regress/expected/constraints.out ? src/test/regress/expected/copy.out ? src/test/regress/expected/create_function_1.out ? src/test/regress/expected/create_function_2.out ? src/test/regress/expected/largeobject.out ? src/test/regress/expected/largeobject_1.out ? src/test/regress/expected/misc.out ? src/test/regress/expected/tablespace.out ? src/test/regress/sql/btree_insert.sql ? src/test/regress/sql/btree_misc.sql ? src/test/regress/sql/btree_search.sql ? src/test/regress/sql/btree_unique.sql ? src/test/regress/sql/btree_vacuum.sql ? src/test/regress/sql/constraints.sql ? src/test/regress/sql/copy.sql ? src/test/regress/sql/create_function_1.sql ? src/test/regress/sql/create_function_2.sql ? src/test/regress/sql/largeobject.sql ? src/test/regress/sql/misc.sql ? src/test/regress/sql/tablespace.sql ? src/timezone/zic Index: contrib/pgstattuple/Makefile =================================================================== RCS file: /projects/cvsroot/pgsql/contrib/pgstattuple/Makefile,v retrieving revision 1.7 diff -c -r1.7 Makefile *** contrib/pgstattuple/Makefile 19 Oct 2006 17:40:03 -0000 1.7 --- contrib/pgstattuple/Makefile 12 Mar 2007 10:07:28 -0000 *************** *** 7,13 **** #------------------------------------------------------------------------- MODULE_big = pgstattuple ! OBJS = pgstattuple.o pgstatindex.o DOCS = README.pgstattuple README.pgstattuple.euc_jp DATA_built = pgstattuple.sql DATA = uninstall_pgstattuple.sql --- 7,13 ---- #------------------------------------------------------------------------- MODULE_big = pgstattuple ! OBJS = pgstattuple.o pgstatindex.o pgstatheap.o DOCS = README.pgstattuple README.pgstattuple.euc_jp DATA_built = pgstattuple.sql DATA = uninstall_pgstattuple.sql Index: contrib/pgstattuple/pgstattuple.sql.in =================================================================== RCS file: /projects/cvsroot/pgsql/contrib/pgstattuple/pgstattuple.sql.in,v retrieving revision 1.12 diff -c -r1.12 pgstattuple.sql.in *** contrib/pgstattuple/pgstattuple.sql.in 4 Sep 2006 02:03:04 -0000 1.12 --- contrib/pgstattuple/pgstattuple.sql.in 12 Mar 2007 10:07:28 -0000 *************** *** 107,109 **** --- 107,118 ---- RETURNS int AS 'MODULE_PATHNAME', 'pg_relpages' LANGUAGE 'C' STRICT; + + -- + -- heap_block_get_raw_page() + -- + CREATE OR REPLACE FUNCTION heap_block_get_raw_page(text, int4) + RETURNS bytea + AS 'MODULE_PATHNAME', 'heap_block_get_raw_page' + LANGUAGE 'C' STRICT; + Index: src/backend/commands/copy.c =================================================================== RCS file: /projects/cvsroot/pgsql/src/backend/commands/copy.c,v retrieving revision 1.277 diff -c -r1.277 copy.c *** src/backend/commands/copy.c 3 Mar 2007 19:32:54 -0000 1.277 --- src/backend/commands/copy.c 12 Mar 2007 10:07:46 -0000 *************** *** 1865,1870 **** --- 1865,1872 ---- && !XLogArchivingActive()) use_wal = false; + StrategyHintRecycleBuffers(NScanRecycleBuffers); + /* Initialize state variables */ cstate->fe_eof = false; cstate->eol_type = EOL_UNKNOWN; *************** *** 2115,2120 **** --- 2117,2124 ---- } } + StrategyHintRecycleBuffers(0); + /* * If we skipped writing WAL for heaps, then we need to sync */ Index: src/backend/executor/nodeSeqscan.c =================================================================== RCS file: /projects/cvsroot/pgsql/src/backend/executor/nodeSeqscan.c,v retrieving revision 1.63 diff -c -r1.63 nodeSeqscan.c *** src/backend/executor/nodeSeqscan.c 5 Jan 2007 22:19:28 -0000 1.63 --- src/backend/executor/nodeSeqscan.c 12 Mar 2007 10:07:46 -0000 *************** *** 24,29 **** --- 24,30 ---- */ #include "postgres.h" + #include "miscadmin.h" #include "access/heapam.h" #include "executor/execdebug.h" #include "executor/nodeSeqscan.h" *************** *** 154,159 **** --- 155,166 ---- estate->es_snapshot, 0, NULL); + /* + * For scans larger than shared buffer cache enable + * buffer recycling, if the user has requested it + */ + if (currentScanDesc->rs_nblocks > NBuffers && NScanRecycleBuffers > 0) + StrategyHintRecycleBuffers(NScanRecycleBuffers); node->ss_currentRelation = currentRelation; node->ss_currentScanDesc = currentScanDesc; *************** *** 272,277 **** --- 279,286 ---- * close the heap relation. */ ExecCloseScanRelation(relation); + + StrategyHintRecycleBuffers(0); } /* ---------------------------------------------------------------- Index: src/backend/storage/buffer/bufmgr.c =================================================================== RCS file: /projects/cvsroot/pgsql/src/backend/storage/buffer/bufmgr.c,v retrieving revision 1.215 diff -c -r1.215 bufmgr.c *** src/backend/storage/buffer/bufmgr.c 1 Feb 2007 19:10:27 -0000 1.215 --- src/backend/storage/buffer/bufmgr.c 12 Mar 2007 10:07:56 -0000 *************** *** 320,325 **** --- 320,326 ---- int buf_id; volatile BufferDesc *buf; bool valid; + bool lock_held = false; /* create a tag so we can lookup the buffer */ INIT_BUFFERTAG(newTag, reln, blockNum); *************** *** 384,390 **** * it would be bad to hold the spinlock while possibly waking up other * processes. */ ! buf = StrategyGetBuffer(); Assert(buf->refcount == 0); --- 385,391 ---- * it would be bad to hold the spinlock while possibly waking up other * processes. */ ! buf = StrategyGetBuffer(&lock_held); Assert(buf->refcount == 0); *************** *** 395,401 **** PinBuffer_Locked(buf); /* Now it's safe to release the freelist lock */ ! LWLockRelease(BufFreelistLock); /* * If the buffer was dirty, try to write it out. There is a race --- 396,403 ---- PinBuffer_Locked(buf); /* Now it's safe to release the freelist lock */ ! if (lock_held) ! LWLockRelease(BufFreelistLock); /* * If the buffer was dirty, try to write it out. There is a race *************** *** 907,913 **** else { /* VACUUM accesses don't bump usage count, instead... */ ! if (buf->refcount == 0 && buf->usage_count == 0) immed_free_buffer = true; } } --- 909,916 ---- else { /* VACUUM accesses don't bump usage count, instead... */ ! if (buf->refcount == 0 && buf->usage_count == 0 && ! !strategy_hint_recycle) immed_free_buffer = true; } } Index: src/backend/storage/buffer/freelist.c =================================================================== RCS file: /projects/cvsroot/pgsql/src/backend/storage/buffer/freelist.c,v retrieving revision 1.58 diff -c -r1.58 freelist.c *** src/backend/storage/buffer/freelist.c 5 Jan 2007 22:19:37 -0000 1.58 --- src/backend/storage/buffer/freelist.c 12 Mar 2007 10:07:56 -0000 *************** *** 39,47 **** /* Pointers to shared state */ static BufferStrategyControl *StrategyControl = NULL; /* Backend-local state about whether currently vacuuming */ bool strategy_hint_vacuum = false; ! /* * StrategyGetBuffer --- 39,57 ---- /* Pointers to shared state */ static BufferStrategyControl *StrategyControl = NULL; + /* Buffer Recycling */ + #define MAX_RECYCLE_BUF_IDS 128 + static volatile int LocalRecycleBufIds[MAX_RECYCLE_BUF_IDS]; + + #define BUF_ID_NOT_SET -1 + int nextVictimRecycleBufId = BUF_ID_NOT_SET; + + int NScanRecycleBuffers = 0; + int ThisScanRecycleBuffers = 0; + /* Backend-local state about whether currently vacuuming */ bool strategy_hint_vacuum = false; ! bool strategy_hint_recycle = false; /* * StrategyGetBuffer *************** *** 56,66 **** * the caller must release that lock once the spinlock is dropped. */ volatile BufferDesc * ! StrategyGetBuffer(void) { volatile BufferDesc *buf; int trycounter; LWLockAcquire(BufFreelistLock, LW_EXCLUSIVE); /* --- 66,118 ---- * the caller must release that lock once the spinlock is dropped. */ volatile BufferDesc * ! StrategyGetBuffer(bool *lock_held) { volatile BufferDesc *buf; int trycounter; + if (strategy_hint_recycle) + { + /* + * Get the next buffer from our local cyclic cache. + * Note that we don't need to hold the BufFreelistLock + * to get this buffer, because we aren't accessing any + * shared memory. + * + * Run private "clock cycle" + */ + if (++nextVictimRecycleBufId >= ThisScanRecycleBuffers) + nextVictimRecycleBufId = 0; + + /* + * If that slot hasn't been filled yet, use a new buffer + * allocated via the main shared buffer allocation strategy + */ + if (LocalRecycleBufIds[nextVictimRecycleBufId] != BUF_ID_NOT_SET) + { + buf = &BufferDescriptors[LocalRecycleBufIds[nextVictimRecycleBufId]]; + /* + * If the buffer is pinned we cannot use it in any circumstance. + * If usage_count == 0 then the buffer is fair game. + * + * We also choose this buffer if usage_count == 1. Strictly, this + * might sometimes be the wrong thing to do, but we rely on the + * high probability that it was this process that last touched + * the buffer. We do have to pick a victim, so it may as well be + * this one as any of the seldom touched blocks in the buffer pool. + */ + *lock_held = false; + LockBufHdr(buf); + if (buf->refcount == 0 && buf->usage_count <= 1) + return buf; + UnlockBufHdr(buf); + } + } + + /* + * If our selected buffer wasn't available, pick another... + */ + *lock_held = true; LWLockAcquire(BufFreelistLock, LW_EXCLUSIVE); /* *************** *** 86,96 **** */ LockBufHdr(buf); if (buf->refcount == 0 && buf->usage_count == 0) return buf; UnlockBufHdr(buf); } ! /* Nothing on the freelist, so run the "clock sweep" algorithm */ trycounter = NBuffers; for (;;) { --- 138,152 ---- */ LockBufHdr(buf); if (buf->refcount == 0 && buf->usage_count == 0) + { + if (strategy_hint_recycle) + LocalRecycleBufIds[nextVictimRecycleBufId] = buf->buf_id; return buf; + } UnlockBufHdr(buf); } ! /* Nothing on the freelist, so run the shared "clock sweep" algorithm */ trycounter = NBuffers; for (;;) { *************** *** 105,111 **** --- 161,171 ---- */ LockBufHdr(buf); if (buf->refcount == 0 && buf->usage_count == 0) + { + if (strategy_hint_recycle) + LocalRecycleBufIds[nextVictimRecycleBufId] = buf->buf_id; return buf; + } if (buf->usage_count > 0) { buf->usage_count--; *************** *** 197,204 **** --- 257,309 ---- StrategyHintVacuum(bool vacuum_active) { strategy_hint_vacuum = vacuum_active; + if (vacuum_active) + StrategyHintRecycleBuffers(NScanRecycleBuffers); + else + StrategyHintRecycleBuffers(0); } + /* + * StrategyHintRecycleOwnBuffers -- tell us whether to recycle buffers + * originally filled by this process. This is intended for use by + * callers who access blocks in a sequential pattern. Non-sequential + * access patterns could be disrupted severely by using this hint. + * + * Initial data suggests + * nRecycleBuffers = 16 for read-only scans (Mark Kirkwood) + * nRecycleBuffers = 32 for VACUUMs (Itagaki Takahiro) + * probably + * nRecycleBuffers >=128 for normal write-intensive tasks + * to allow for bgwriter activity + */ + void + StrategyHintRecycleBuffers(int nRecycleBuffers) + { + int i; + + if (nRecycleBuffers < 0 || nRecycleBuffers > NBuffers + || nRecycleBuffers > NScanRecycleBuffers) + nRecycleBuffers = 0; + + if (nRecycleBuffers > NScanRecycleBuffers) + ThisScanRecycleBuffers = NScanRecycleBuffers; + else + ThisScanRecycleBuffers = nRecycleBuffers; + + if (ThisScanRecycleBuffers > 0) + { + strategy_hint_recycle = true; + + /* just before 1st element, to allow for preincrement */ + nextVictimRecycleBufId = -1; + + /* prepare the cyclic buffer */ + for (i = 0; i < MAX_RECYCLE_BUF_IDS; i++) + LocalRecycleBufIds[i] = BUF_ID_NOT_SET; + } + else + strategy_hint_recycle = false; + } /* * StrategyShmemSize Index: src/backend/utils/misc/guc.c =================================================================== RCS file: /projects/cvsroot/pgsql/src/backend/utils/misc/guc.c,v retrieving revision 1.379 diff -c -r1.379 guc.c *** src/backend/utils/misc/guc.c 6 Mar 2007 02:06:14 -0000 1.379 --- src/backend/utils/misc/guc.c 12 Mar 2007 10:08:06 -0000 *************** *** 1184,1189 **** --- 1184,1199 ---- }, { + {"scan_recycle_buffers", PGC_USERSET, RESOURCES_MEM, + gettext_noop("Sets the number of buffers to recycle during scans"), + NULL, + GUC_UNIT_BLOCKS + }, + &NScanRecycleBuffers, + 0, 0, 128, NULL, NULL + }, + + { {"port", PGC_POSTMASTER, CONN_AUTH_SETTINGS, gettext_noop("Sets the TCP port the server listens on."), NULL Index: src/include/miscadmin.h =================================================================== RCS file: /projects/cvsroot/pgsql/src/include/miscadmin.h,v retrieving revision 1.193 diff -c -r1.193 miscadmin.h *** src/include/miscadmin.h 1 Mar 2007 14:52:04 -0000 1.193 --- src/include/miscadmin.h 12 Mar 2007 10:08:07 -0000 *************** *** 128,133 **** --- 128,134 ---- extern DLLIMPORT char *DataDir; extern DLLIMPORT int NBuffers; + extern DLLIMPORT int NScanRecycleBuffers; extern int MaxBackends; extern DLLIMPORT int MyProcPid; Index: src/include/storage/buf_internals.h =================================================================== RCS file: /projects/cvsroot/pgsql/src/include/storage/buf_internals.h,v retrieving revision 1.89 diff -c -r1.89 buf_internals.h *** src/include/storage/buf_internals.h 5 Jan 2007 22:19:57 -0000 1.89 --- src/include/storage/buf_internals.h 12 Mar 2007 10:08:08 -0000 *************** *** 169,174 **** --- 169,175 ---- /* in freelist.c */ extern bool strategy_hint_vacuum; + extern bool strategy_hint_recycle; /* event counters in buf_init.c */ extern long int ReadBufferCount; *************** *** 184,190 **** */ /* freelist.c */ ! extern volatile BufferDesc *StrategyGetBuffer(void); extern void StrategyFreeBuffer(volatile BufferDesc *buf, bool at_head); extern int StrategySyncStart(void); extern Size StrategyShmemSize(void); --- 185,191 ---- */ /* freelist.c */ ! extern volatile BufferDesc *StrategyGetBuffer(bool *lock_held); extern void StrategyFreeBuffer(volatile BufferDesc *buf, bool at_head); extern int StrategySyncStart(void); extern Size StrategyShmemSize(void); Index: src/include/storage/bufmgr.h =================================================================== RCS file: /projects/cvsroot/pgsql/src/include/storage/bufmgr.h,v retrieving revision 1.102 diff -c -r1.102 bufmgr.h *** src/include/storage/bufmgr.h 5 Jan 2007 22:19:57 -0000 1.102 --- src/include/storage/bufmgr.h 12 Mar 2007 10:08:08 -0000 *************** *** 133,138 **** --- 133,140 ---- extern void DropRelFileNodeBuffers(RelFileNode rnode, bool istemp, BlockNumber firstDelBlock); extern void DropDatabaseBuffers(Oid dbid); + extern void DropAllSharedBuffers(void); + #ifdef NOT_USED extern void PrintPinnedBufs(void); *************** *** 157,161 **** --- 159,164 ---- /* in freelist.c */ extern void StrategyHintVacuum(bool vacuum_active); + extern void StrategyHintRecycleBuffers(int nRecycleBuffers); #endif ? contrib/xlogviewer/libxlogviewer.so.0.0 ? contrib/xlogviewer/xlogviewer.sql
---------------------------(end of broadcast)--------------------------- TIP 3: Have you checked our extensive FAQ? http://www.postgresql.org/docs/faq