Movatterモバイル変換


[0]ホーム

URL:


Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit77f2775

Browse files
committed
Replace poorly-coded vac_find_eq routine with call to standard bsearch
library code. Tweak progress messages to include elapsed real time,not only CPU time.
1 parent6c18300 commit77f2775

File tree

1 file changed

+102
-92
lines changed

1 file changed

+102
-92
lines changed

‎src/backend/commands/vacuum.c

Lines changed: 102 additions & 92 deletions
Original file line numberDiff line numberDiff line change
@@ -8,22 +8,23 @@
88
*
99
*
1010
* IDENTIFICATION
11-
* $Header: /cvsroot/pgsql/src/backend/commands/vacuum.c,v 1.190 2001/05/07 00:43:18 tgl Exp $
11+
* $Header: /cvsroot/pgsql/src/backend/commands/vacuum.c,v 1.191 2001/05/17 01:28:50 tgl Exp $
1212
*
1313
*-------------------------------------------------------------------------
1414
*/
1515
#include"postgres.h"
1616

17+
#include<fcntl.h>
18+
#include<unistd.h>
19+
#include<time.h>
20+
#include<sys/time.h>
1721
#include<sys/types.h>
1822
#include<sys/file.h>
1923
#include<sys/stat.h>
20-
#include<fcntl.h>
21-
#include<unistd.h>
2224

2325
#ifndefHAVE_GETRUSAGE
2426
#include"rusagestub.h"
2527
#else
26-
#include<sys/time.h>
2728
#include<sys/resource.h>
2829
#endif
2930

@@ -113,6 +114,11 @@ typedef struct VRelStats
113114
VTupleLinkvtlinks;
114115
}VRelStats;
115116

117+
typedefstructVacRUsage
118+
{
119+
structtimevaltv;
120+
structrusageru;
121+
}VacRUsage;
116122

117123
staticMemoryContextvac_context=NULL;
118124

@@ -144,13 +150,15 @@ static void get_indices(Relation relation, int *nindices, Relation **Irel);
144150
staticvoidclose_indices(intnindices,Relation*Irel);
145151
staticIndexInfo**get_index_desc(Relationonerel,intnindices,
146152
Relation*Irel);
147-
staticvoid*vac_find_eq(void*bot,intnelem,intsize,void*elm,
148-
int (*compar) (constvoid*,constvoid*));
153+
staticvoid*vac_bsearch(constvoid*key,constvoid*base,
154+
size_tnelem,size_tsize,
155+
int (*compar) (constvoid*,constvoid*));
149156
staticintvac_cmp_blk(constvoid*left,constvoid*right);
150157
staticintvac_cmp_offno(constvoid*left,constvoid*right);
151158
staticintvac_cmp_vtlinks(constvoid*left,constvoid*right);
152159
staticboolenough_space(VacPagevacpage,Sizelen);
153-
staticchar*show_rusage(structrusage*ru0);
160+
staticvoidinit_rusage(VacRUsage*ru0);
161+
staticchar*show_rusage(VacRUsage*ru0);
154162

155163

156164
/*
@@ -635,9 +643,9 @@ scan_heap(VRelStats *vacrelstats, Relation onerel,
635643
VTupleLinkvtlinks= (VTupleLink)palloc(100*sizeof(VTupleLinkData));
636644
intnum_vtlinks=0;
637645
intfree_vtlinks=100;
638-
structrusageru0;
646+
VacRUsageru0;
639647

640-
getrusage(RUSAGE_SELF,&ru0);
648+
init_rusage(&ru0);
641649

642650
relname=RelationGetRelationName(onerel);
643651
elog(MESSAGE_LEVEL,"--Relation %s--",relname);
@@ -1062,9 +1070,9 @@ repair_frag(VRelStats *vacrelstats, Relation onerel,
10621070
boolisempty,
10631071
dowrite,
10641072
chain_tuple_moved;
1065-
structrusageru0;
1073+
VacRUsageru0;
10661074

1067-
getrusage(RUSAGE_SELF,&ru0);
1075+
init_rusage(&ru0);
10681076

10691077
myXID=GetCurrentTransactionId();
10701078
myCID=GetCurrentCommandId();
@@ -1360,10 +1368,10 @@ repair_frag(VRelStats *vacrelstats, Relation onerel,
13601368

13611369
vtld.new_tid=tp.t_self;
13621370
vtlp= (VTupleLink)
1363-
vac_find_eq((void*) (vacrelstats->vtlinks),
1371+
vac_bsearch((void*)&vtld,
1372+
(void*) (vacrelstats->vtlinks),
13641373
vacrelstats->num_vtlinks,
13651374
sizeof(VTupleLinkData),
1366-
(void*)&vtld,
13671375
vac_cmp_vtlinks);
13681376
if (vtlp==NULL)
13691377
elog(ERROR,"Parent tuple was not found");
@@ -2134,9 +2142,9 @@ scan_index(Relation indrel, long num_tuples)
21342142
IndexScanDesciscan;
21352143
longnitups;
21362144
intnipages;
2137-
structrusageru0;
2145+
VacRUsageru0;
21382146

2139-
getrusage(RUSAGE_SELF,&ru0);
2147+
init_rusage(&ru0);
21402148

21412149
/* walk through the entire index */
21422150
iscan=index_beginscan(indrel, false,0, (ScanKey)NULL);
@@ -2189,9 +2197,9 @@ vacuum_index(VacPageList vacpagelist, Relation indrel,
21892197
longnum_index_tuples;
21902198
intnum_pages;
21912199
VacPagevp;
2192-
structrusageru0;
2200+
VacRUsageru0;
21932201

2194-
getrusage(RUSAGE_SELF,&ru0);
2202+
init_rusage(&ru0);
21952203

21962204
/* walk through the entire index */
21972205
iscan=index_beginscan(indrel, false,0, (ScanKey)NULL);
@@ -2264,30 +2272,35 @@ tid_reaped(ItemPointer itemptr, VacPageList vacpagelist)
22642272
ioffno=ItemPointerGetOffsetNumber(itemptr);
22652273

22662274
vp=&vacpage;
2267-
vpp= (VacPage*)vac_find_eq((void*) (vacpagelist->pagedesc),
2268-
vacpagelist->num_pages,sizeof(VacPage), (void*)&vp,
2275+
vpp= (VacPage*)vac_bsearch((void*)&vp,
2276+
(void*) (vacpagelist->pagedesc),
2277+
vacpagelist->num_pages,
2278+
sizeof(VacPage),
22692279
vac_cmp_blk);
22702280

22712281
if (vpp== (VacPage*)NULL)
22722282
return (VacPage)NULL;
2273-
vp=*vpp;
22742283

2275-
/* ok - we are on true page */
2284+
/* ok - we are on a partially or fully reaped page */
2285+
vp=*vpp;
22762286

22772287
if (vp->offsets_free==0)
2278-
{/* this is EmptyPage !!! */
2288+
{
2289+
/* this is EmptyPage, so claim all tuples on it are reaped!!! */
22792290
returnvp;
22802291
}
22812292

2282-
voff= (OffsetNumber*)vac_find_eq((void*) (vp->offsets),
2283-
vp->offsets_free,sizeof(OffsetNumber), (void*)&ioffno,
2293+
voff= (OffsetNumber*)vac_bsearch((void*)&ioffno,
2294+
(void*) (vp->offsets),
2295+
vp->offsets_free,
2296+
sizeof(OffsetNumber),
22842297
vac_cmp_offno);
22852298

22862299
if (voff== (OffsetNumber*)NULL)
22872300
return (VacPage)NULL;
22882301

2302+
/* tid is reaped */
22892303
returnvp;
2290-
22912304
}
22922305

22932306
/*
@@ -2393,64 +2406,47 @@ vpage_insert(VacPageList vacpagelist, VacPage vpnew)
23932406
}
23942407
vacpagelist->pagedesc[vacpagelist->num_pages]=vpnew;
23952408
(vacpagelist->num_pages)++;
2396-
23972409
}
23982410

2411+
/*
2412+
* vac_bsearch: just like standard C library routine bsearch(),
2413+
* except that we first test to see whether the target key is outside
2414+
* the range of the table entries. This case is handled relatively slowly
2415+
* by the normal binary search algorithm (ie, no faster than any other key)
2416+
* but it occurs often enough in VACUUM to be worth optimizing.
2417+
*/
23992418
staticvoid*
2400-
vac_find_eq(void*bot,intnelem,intsize,void*elm,
2419+
vac_bsearch(constvoid*key,constvoid*base,
2420+
size_tnelem,size_tsize,
24012421
int (*compar) (constvoid*,constvoid*))
24022422
{
24032423
intres;
2404-
intlast=nelem-1;
2405-
intcelm=nelem /2;
2406-
boollast_move,
2407-
first_move;
2408-
2409-
last_move=first_move= true;
2410-
for (;;)
2424+
constvoid*last;
2425+
2426+
if (nelem==0)
2427+
returnNULL;
2428+
res=compar(key,base);
2429+
if (res<0)
2430+
returnNULL;
2431+
if (res==0)
2432+
return (void*)base;
2433+
if (nelem>1)
24112434
{
2412-
if (first_move== true)
2413-
{
2414-
res=compar(bot,elm);
2415-
if (res>0)
2416-
returnNULL;
2417-
if (res==0)
2418-
returnbot;
2419-
first_move= false;
2420-
}
2421-
if (last_move== true)
2422-
{
2423-
res=compar(elm, (void*) ((char*)bot+last*size));
2424-
if (res>0)
2425-
returnNULL;
2426-
if (res==0)
2427-
return (void*) ((char*)bot+last*size);
2428-
last_move= false;
2429-
}
2430-
res=compar(elm, (void*) ((char*)bot+celm*size));
2431-
if (res==0)
2432-
return (void*) ((char*)bot+celm*size);
2433-
if (res<0)
2434-
{
2435-
if (celm==0)
2436-
returnNULL;
2437-
last=celm-1;
2438-
celm=celm /2;
2439-
last_move= true;
2440-
continue;
2441-
}
2442-
2443-
if (celm==last)
2435+
last= (constvoid*) ((constchar*)base+ (nelem-1)*size);
2436+
res=compar(key,last);
2437+
if (res>0)
24442438
returnNULL;
2445-
2446-
last=last-celm-1;
2447-
bot= (void*) ((char*)bot+ (celm+1)*size);
2448-
celm= (last+1) /2;
2449-
first_move= true;
2439+
if (res==0)
2440+
return (void*)last;
24502441
}
2451-
2442+
if (nelem <=2)
2443+
returnNULL;/* already checked 'em all */
2444+
returnbsearch(key,base,nelem,size,compar);
24522445
}
24532446

2447+
/*
2448+
* Comparator routines for use with qsort() and bsearch().
2449+
*/
24542450
staticint
24552451
vac_cmp_blk(constvoid*left,constvoid*right)
24562452
{
@@ -2465,25 +2461,21 @@ vac_cmp_blk(const void *left, const void *right)
24652461
if (lblk==rblk)
24662462
return0;
24672463
return1;
2468-
24692464
}
24702465

24712466
staticint
24722467
vac_cmp_offno(constvoid*left,constvoid*right)
24732468
{
2474-
24752469
if (*(OffsetNumber*)left<*(OffsetNumber*)right)
24762470
return-1;
24772471
if (*(OffsetNumber*)left==*(OffsetNumber*)right)
24782472
return0;
24792473
return1;
2480-
24812474
}
24822475

24832476
staticint
24842477
vac_cmp_vtlinks(constvoid*left,constvoid*right)
24852478
{
2486-
24872479
if (((VTupleLink)left)->new_tid.ip_blkid.bi_hi<
24882480
((VTupleLink)right)->new_tid.ip_blkid.bi_hi)
24892481
return-1;
@@ -2505,7 +2497,6 @@ vac_cmp_vtlinks(const void *left, const void *right)
25052497
((VTupleLink)right)->new_tid.ip_posid)
25062498
return1;
25072499
return0;
2508-
25092500
}
25102501

25112502

@@ -2602,37 +2593,56 @@ enough_space(VacPage vacpage, Size len)
26022593
}
26032594

26042595

2596+
/*
2597+
* Initialize usage snapshot.
2598+
*/
2599+
staticvoid
2600+
init_rusage(VacRUsage*ru0)
2601+
{
2602+
structtimezonetz;
2603+
2604+
getrusage(RUSAGE_SELF,&ru0->ru);
2605+
gettimeofday(&ru0->tv,&tz);
2606+
}
2607+
26052608
/*
26062609
* Compute elapsed time since ru0 usage snapshot, and format into
26072610
* a displayable string. Result is in a static string, which is
26082611
* tacky, but no one ever claimed that the Postgres backend is
26092612
* threadable...
26102613
*/
26112614
staticchar*
2612-
show_rusage(structrusage*ru0)
2615+
show_rusage(VacRUsage*ru0)
26132616
{
2614-
staticcharresult[64];
2615-
structrusageru1;
2617+
staticcharresult[100];
2618+
VacRUsageru1;
26162619

2617-
getrusage(RUSAGE_SELF,&ru1);
2620+
init_rusage(&ru1);
26182621

2619-
if (ru1.ru_stime.tv_usec<ru0->ru_stime.tv_usec)
2622+
if (ru1.tv.tv_usec<ru0->tv.tv_usec)
2623+
{
2624+
ru1.tv.tv_sec--;
2625+
ru1.tv.tv_usec+=1000000;
2626+
}
2627+
if (ru1.ru.ru_stime.tv_usec<ru0->ru.ru_stime.tv_usec)
26202628
{
2621-
ru1.ru_stime.tv_sec--;
2622-
ru1.ru_stime.tv_usec+=1000000;
2629+
ru1.ru.ru_stime.tv_sec--;
2630+
ru1.ru.ru_stime.tv_usec+=1000000;
26232631
}
2624-
if (ru1.ru_utime.tv_usec<ru0->ru_utime.tv_usec)
2632+
if (ru1.ru.ru_utime.tv_usec<ru0->ru.ru_utime.tv_usec)
26252633
{
2626-
ru1.ru_utime.tv_sec--;
2627-
ru1.ru_utime.tv_usec+=1000000;
2634+
ru1.ru.ru_utime.tv_sec--;
2635+
ru1.ru.ru_utime.tv_usec+=1000000;
26282636
}
26292637

26302638
snprintf(result,sizeof(result),
2631-
"CPU %d.%02ds/%d.%02du sec.",
2632-
(int) (ru1.ru_stime.tv_sec-ru0->ru_stime.tv_sec),
2633-
(int) (ru1.ru_stime.tv_usec-ru0->ru_stime.tv_usec) /10000,
2634-
(int) (ru1.ru_utime.tv_sec-ru0->ru_utime.tv_sec),
2635-
(int) (ru1.ru_utime.tv_usec-ru0->ru_utime.tv_usec) /10000);
2639+
"CPU %d.%02ds/%d.%02du sec elapsed %d.%02d sec.",
2640+
(int) (ru1.ru.ru_stime.tv_sec-ru0->ru.ru_stime.tv_sec),
2641+
(int) (ru1.ru.ru_stime.tv_usec-ru0->ru.ru_stime.tv_usec) /10000,
2642+
(int) (ru1.ru.ru_utime.tv_sec-ru0->ru.ru_utime.tv_sec),
2643+
(int) (ru1.ru.ru_utime.tv_usec-ru0->ru.ru_utime.tv_usec) /10000,
2644+
(int) (ru1.tv.tv_sec-ru0->tv.tv_sec),
2645+
(int) (ru1.tv.tv_usec-ru0->tv.tv_usec) /10000);
26362646

26372647
returnresult;
26382648
}

0 commit comments

Comments
 (0)

[8]ページ先頭

©2009-2025 Movatter.jp