diff -cpr LDC/src/backend/storage/buffer/bufmgr.c sorted-ckpt/src/backend/storage/buffer/bufmgr.c
*** LDC/src/backend/storage/buffer/bufmgr.c	Thu Jun 14 14:55:33 2007
--- sorted-ckpt/src/backend/storage/buffer/bufmgr.c	Thu Jun 14 14:55:52 2007
*************** UnpinBuffer(volatile BufferDesc *buf, bo
*** 997,1002 ****
--- 997,1026 ----
  	}
  }
  
+ typedef struct BufAndTag
+ {
+ 	int			buf_id;
+ 	BufferTag	tag;
+ } BufAndTag;
+ 
+ static int
+ bufcmp(const void *a, const void *b)
+ {
+ 	const BufAndTag *lhs = (const BufAndTag *) a;
+ 	const BufAndTag *rhs = (const BufAndTag *) b;
+ 	int		r;
+ 
+ 	r = memcmp(&lhs->tag.rnode, &rhs->tag.rnode, sizeof(lhs->tag.rnode));
+ 	if (r != 0)
+ 		return r;
+ 	if (lhs->tag.blockNum < rhs->tag.blockNum)
+ 		return -1;
+ 	else if (lhs->tag.blockNum > rhs->tag.blockNum)
+ 		return 1;
+ 	else
+ 		return 0;
+ }
+ 
  /*
   * BufferSync -- Write out all dirty buffers in the pool.
   *
*************** void
*** 1006,1034 ****
  BufferSync(bool immediate)
  {
  	int			buf_id;
- 	int			num_to_scan;
  	int			num_written;
  	int			absorb_counter;
  	int			writes_per_nap = checkpoint_write_rate;
  	int			num_to_write;
- 	int			start_id;
  	int			num_written_since_nap;
! 
! 	/*
! 	 * Find out where to start the circular scan.
! 	 */
! 	start_id = StrategySyncStart();
! 
! 	/* Make sure we can handle the pin inside SyncOneBuffer */
! 	ResourceOwnerEnlargeBuffers(CurrentResourceOwner);
  
  	/*
  	 * Loop over all buffers, and mark the ones that need to be written.
  	 */
! 	num_to_scan = NBuffers;
  	num_to_write = 0;
! 	buf_id = start_id;
! 	while (num_to_scan-- > 0)
  	{
  		volatile BufferDesc *bufHdr = &BufferDescriptors[buf_id];
  		LockBufHdr(bufHdr);
--- 1030,1049 ----
  BufferSync(bool immediate)
  {
  	int			buf_id;
  	int			num_written;
  	int			absorb_counter;
  	int			writes_per_nap = checkpoint_write_rate;
  	int			num_to_write;
  	int			num_written_since_nap;
! 	BufAndTag  *buf_to_write;
! 	int			i;
  
  	/*
  	 * Loop over all buffers, and mark the ones that need to be written.
  	 */
! 	buf_to_write = (BufAndTag *) palloc(sizeof(BufAndTag) * NBuffers);
  	num_to_write = 0;
! 	for (buf_id = 0; buf_id < NBuffers; buf_id++)
  	{
  		volatile BufferDesc *bufHdr = &BufferDescriptors[buf_id];
  		LockBufHdr(bufHdr);
*************** BufferSync(bool immediate)
*** 1036,1041 ****
--- 1051,1058 ----
  		if (bufHdr->flags & BM_DIRTY)
  		{
  			bufHdr->flags |= BM_CHECKPOINT_NEEDED;
+ 			buf_to_write[num_to_write].buf_id = buf_id;
+ 			buf_to_write[num_to_write].tag = bufHdr->tag;
  			num_to_write++;
  		}
  		else
*************** BufferSync(bool immediate)
*** 1051,1075 ****
  		}
  
  		UnlockBufHdr(bufHdr);
- 
- 		if (++buf_id >= NBuffers)
- 			buf_id = 0;
  	}
  
  	elog(DEBUG1, "CHECKPOINT: %d / %d buffers to write", num_to_write, NBuffers);
  
  	/*
  	 * Loop over all buffers.
  	 */
- 	num_to_scan = NBuffers;
  	num_written = num_written_since_nap = 0;
  	absorb_counter = WRITES_PER_ABSORB;
! 	buf_id = start_id;
! 	while (num_to_scan-- > 0 && num_written < num_to_write)
  	{
! 		volatile BufferDesc *bufHdr = &BufferDescriptors[buf_id];
  		bool needs_flush;
  
  		LockBufHdr(bufHdr);
  
  		needs_flush = (bufHdr->flags & BM_CHECKPOINT_NEEDED) != 0;
--- 1068,1094 ----
  		}
  
  		UnlockBufHdr(bufHdr);
  	}
  
  	elog(DEBUG1, "CHECKPOINT: %d / %d buffers to write", num_to_write, NBuffers);
+ 	qsort(buf_to_write, num_to_write, sizeof(*buf_to_write), bufcmp);
+ 
+ 	/* Make sure we can handle the pin inside SyncOneBuffer */
+ 	ResourceOwnerEnlargeBuffers(CurrentResourceOwner);
  
  	/*
  	 * Loop over all buffers.
  	 */
  	num_written = num_written_since_nap = 0;
  	absorb_counter = WRITES_PER_ABSORB;
! 	for (i = 0; i < num_to_write; i++)
  	{
! 		volatile BufferDesc *bufHdr;
  		bool needs_flush;
  
+ 		buf_id = buf_to_write[i].buf_id;
+ 		bufHdr = &BufferDescriptors[buf_id];
+ 
  		LockBufHdr(bufHdr);
  
  		needs_flush = (bufHdr->flags & BM_CHECKPOINT_NEEDED) != 0;
*************** BufferSync(bool immediate)
*** 1100,1108 ****
  				absorb_counter = WRITES_PER_ABSORB;
  			}
  		}
- 		if (++buf_id >= NBuffers)
- 			buf_id = 0;
  	}
  }
  
  /*
--- 1119,1127 ----
  				absorb_counter = WRITES_PER_ABSORB;
  			}
  		}
  	}
+ 
+ 	pfree(buf_to_write);
  }
  
  /*
