Identifying Hotspots in the PostgreSQL Build Process

Preview:

DESCRIPTION

Software developers rely on a fast and correct build system to compile their source code changes and produce modified deliverables for testing and deployment. The scale and complexity of the PostgreSQL build process makes build performance an important topic to discuss and address. In this talk, we will introduce a new build performance analysis technique that identifies "build hotspots", i.e., files that are slow to rebuild (by analyzing a build dependency graph), yet change often (by analyzing version control history). We will discuss the identified hotspots in the 9.2.4 release of PostgreSQL.

Citation preview

Identifying Hotspots in the PostgreSQL Build Processes

Shane McIntosh

Ahmed E. Hassan

Bram Adams

Meiyappan Nagappan

@shane_mcintoshshanemcintosh@acm.org

Source code

What is a build system?

!2

Source code

Deliverable

What is a build system?

!2

.tex

.c

.cc

.o

.o

.dvi

.a

.exe

.pdf

.deb

Build systems describe how sources are translated into deliverables

!3

(4) Test

(1) Think

(2) Edit

(3) Build

The developer’s work cycle

All builds are equal…

!4

…But some builds are more equal than others

http://xkcd.com/303/

Why is the gtk build so abysmally slow? This hinders our ability to run gtk bots

and keep the gtk build green. :( ”!5

Refactoring can improve build performance

deliverable1 deliverable2

del1.o del2.olibrary.a

del1.c del2.cutil1.o util2.o

util1.c util2.c

!6

Refactoring can improve build performance

deliverable1 deliverable2

del1.o del2.olibrary.a

del1.c del2.cutil1.o util2.o

util1.c util2.c

!6

Refactoring can improve build performance

deliverable1 deliverable2

del1.o del2.olibrary.a

del1.c del2.cutil1.o util2.o

util1.c util2.c

!6

Refactoring can improve build performance

deliverable1 deliverable2

del1.o del2.olibrary.a

del1.c del2.cutil1.o util2.o

util1.c util2.c

!6

Refactoring can improve build performance

deliverable1 deliverable2

del1.o del2.olibrary.a

del1.c del2.cutil1.o util2.o

util1.c util2.c

!6

Refactoring can improve build performance

deliverable1 deliverable2

del1.o del2.olibrary.a

del1.c del2.cutil1.o util2.o

util1.c util2.c

!6

Before refactoring:!4 commands!

triggered

Refactoring can improve build performance

deliverable1 deliverable2

del1.o del2.olibrary.a

del1.c del2.cutil1.o util2.o

util1.c util2.c

!6

Refactoring can improve build performance

deliverable1 deliverable2

del1.o del2.o

del1.c del2.c

util1.o util2.o

util1.c util2.c

!7

Refactoring can improve build performance

deliverable1 deliverable2

del1.o del2.o

del1.c del2.c

util1.o util2.o

util1.c util2.c

!7

Refactoring can improve build performance

deliverable1 deliverable2

del1.o del2.o

del1.c del2.c

util1.o util2.o

util1.c util2.c

!7

Refactoring can improve build performance

deliverable1 deliverable2

del1.o del2.o

del1.c del2.c

util1.o util2.o

util1.c util2.c

!7

Refactoring can improve build performance

deliverable1 deliverable2

del1.o del2.o

del1.c del2.c

util1.o util2.o

util1.c util2.c

!7

After refactoring:!2 commands!

triggered

…But where should we focus refactoring effort?

Files that rebuild the slowest?

!8

(1)Dependency

Graph Construction

(2)Dependency

GraphAnalysis

Graphanalysis results

(1)Dependency

Graph Construction (3)

Build Hotspot

DetectionQuadrant Plot

Build Activity

File

Chu

rn

(2)Dependency

GraphAnalysisDep. Graph

VersionControlSystem

An approach to detect slowly rebuilding files

!9

MAKAO tool extracts build dependency graphs

(1)Dependency

Graph Construction

(2)Dependency

GraphAnalysis

Design recovery and maintenance of build systems B. Adams, Herman Tromp, Kris De Schutter, Wolfgang De Meuter

[ICSM 2007]

!10

The cost of traversing an edge is derived by timing its build command

(1)Dependency

Graph Construction

(2)Dependency

GraphAnalysis

!11

Median of 10 repetitions

Open source case studies!!

!

!

!12

0 750,000 1,500,000 2,250,000 3,000,000

2,752,225

38,102

Build dependency graph properties

0 35,000 70,000 105,000 140,000

60,170

121,710

5,131

3,375

# Nodes# Edges

!13

Incremental build performance

!14

0 100 200 300 400 500 600

02

46

810

12

File ID

Build

Tim

e (s

)

0 100 200 300 400

050

100

150

File ID

Build

Tim

e (s

)

.c files .h files

Incremental build performance

!15

.c files .h files0 200 400 600 800 1000

0.0

0.5

1.0

1.5

2.0

File ID

Build

Tim

e (s

)

0 100 200 300 400 500 600

050

100

150

File ID

Build

Tim

e (s

)

Incremental build performance

!16

.c files .h files0 2000 4000 6000 8000 10000

050

100

150

File ID

Build

Tim

e (s

)

0 2000 4000 6000 8000 10000

020

0040

0060

0080

00

File ID

Build

Tim

e (s

)

So, refactoring should target the slow files!

!17

0 100 200 300 400 500 600

050

100

150

File ID

Build

Tim

e (s

)

So, refactoring should target the slow files!

!17

0 100 200 300 400 500 600

050

100

150

File ID

Build

Tim

e (s

)

So, refactoring should target the slow files!

!17

0 100 200 300 400 500 600

050

100

150

File ID

Build

Tim

e (s

)

So, refactoring should target the slow files!

!17

0 100 200 300 400 500 600

050

100

150

File ID

Build

Tim

e (s

)

!18

> Please answer the following questions for each source file listed above:!> (1) Is this source code file a performance bottleneck? Y/N!!For all of them no...

Let’s see what developers think!

!19

> Please answer the following questions for each source file listed above:!> (1) Is this source code file a performance bottleneck? Y/N!!For all of them no...!!> (2) Why do you believe this file is or is not a performance bottleneck?!!...because none of these headers change often.

Let’s see what developers think!

…But where should we focus refactoring effort?

Files that rebuild the slowest?

!20

…But where should we focus refactoring effort?

Files that rebuild the slowest?

…but they may only rarely change!

!20

…But where should we focus refactoring effort?

Files that rebuild the slowest?

Files that change the most often?

…but they may only rarely change!

!20

!21

Mining frequently changing files from version control

Terminal

$ git clone … … $ git checkout <some_tag> … $ git log --oneline <some_file>

!21

Mining frequently changing files from version control

Terminal

$ git clone … … $ git checkout <some_tag> … $ git log --oneline <some_file>

But many of these files already build quickly!

…But where should we focus refactoring effort?

Files that rebuild the slowest?

Files that change the most often?

…but they may only rarely change!

!22

…But where should we focus refactoring effort?

Files that rebuild the slowest?

Files that change the most often?

…but they may only rarely change!

…but they may already be optimal!

!22

…But where should we focus refactoring effort?

Files that rebuild the slowest?

Files that change the most often?

…but they may only rarely change!

…but they may already be optimal!

!22

Focus on build hotspots:

Files that rebuild slowly and change often

(1)Dependency

Graph Construction

(2)Dependency

GraphAnalysis

Graphanalysis results

(1)Dependency

Graph Construction (3)

Build Hotspot

DetectionQuadrant Plot

Build Activity

File

Chu

rn

(2)Dependency

GraphAnalysisDep. Graph

VersionControlSystem

An approach to detect slowly rebuilding files

!23

(3)Build

Hotspot Detection

(1)Dependency

Graph Construction

(2)Dependency

GraphAnalysis

Graphanalysis results

(1)Dependency

Graph Construction (3)

Build Hotspot

DetectionQuadrant Plot

Build Activity

File

Chu

rn

(2)Dependency

GraphAnalysisDep. Graph

VersionControlSystem

Hotspot detection approach

!24

(1)Dependency

Graph Construction

(2)Dependency

GraphAnalysis

(3)Build

Hotspot Detection

Quadrant plots highlight build hotspots

Rebuild cost

Num

ber o

f cha

nges

!25

(1)Dependency

Graph Construction

(2)Dependency

GraphAnalysis

(3)Build

Hotspot Detection

Quadrant plots highlight build hotspots

Rebuild cost

Num

ber o

f cha

nges

!25

(1)Dependency

Graph Construction

(2)Dependency

GraphAnalysis

(3)Build

Hotspot Detection

Quadrant plots highlight build hotspots

Rebuild cost

Num

ber o

f cha

nges

!25

(1)Dependency

Graph Construction

(2)Dependency

GraphAnalysis

(3)Build

Hotspot Detection

Quadrant plots highlight build hotspots

Rebuild cost

Num

ber o

f cha

nges

Refactor

these first!

!25

Open source case studies!!

!

!

Rebuild cost 90 seconds

Number of changes Median

Thresholds

!26

●●

●●

●●

●●

●●

●●

●●

●●

●●

●●

●●

●●

●●●

●●

●●●

●●

●●

●●

●●

●●

●●

●●

●●

●●

●●

●●

●●

●●

●●

●●

●●

●●●

●●

●●

●●

●●

●●

●●

●●

●●●

●●

●●

●●●●

●●

●●●

●●

●●

●●●

●●●

●●

●●

●●

●●●

●●

●●●●

●●●

●●●

●●

●●

●●

●●

●●

●●

●●

●●

●●

●●

●●

●●

●●

●●

●●

●●●

●●●

●●●

●●

●●●

●●

●●

●●●

●●

●●●

●●

●●●

●●

●●●

●●

●●

●●

●●●

●●

●●●●●

●●●●

●●

●●

0.25

0.50

0.75

1.00

0 50 100 150Build Time

Nor

mal

ized

File

Chu

rn

Rebuild cost (seconds)

Num

ber o

f cha

nges

(N

orm

aliz

ed)

65 hotspots!(7% of

source files)

!27

glib/glib.hglib/glib-object.h

Main culprits

Rebuild cost (seconds)

Num

ber o

f cha

nges

(N

orm

aliz

ed)

●●

●●

●●

●●

●●

●●

●●

●●

●●

●●

●●

●●●

●●

●●●●

●●

●●

●●

●●

●●

●●

●●

●●

●●

●●

●●●

●●

●●

●●

●●

●●

●●

●●

●●

●●

●●●

●●●●

●●

●●

●●

●●

●●●●●

●●

●●

●●

●●

●●●

●●●●●

●●

●●

●●

●●●●●●●●●●●

●●●●●●●●●●●

●●●●●●●●●

●●●●●●●●●●●●●●●

●●●

●●●

●●

●●

●●

●●

●●

●●●●

●●

●●●●●●

●●

●●

●●●●●

●●

●●●●

●●

●●

●●

●●●

●●●

●●

●●●●

●●●●●

●●●●●

●●●●●●●

●●●●●

●●●●●●●●

●●

●●●●●●●●

●●●●●●●

●●●●●●●

●●

●●

●●

●●●●●●●

●●

●●●●●●●●

●●

●●●●

●●

●●

●●

●●

●●

●●●

●●

●●

●●

●●

●●

●●

●●●

●●●

●●●●

●●

●●

●●

●●

●●●

●●●●●●●●●●●●●

●●●●

●●●

●●

●●

●●

●●

●●●●●●●●●●●●●●

●●●

●●●●●

●●

●●

●●●

●●

●●

●●

●●

●●

●●●●

●●

●●

●●

●●●

●●

●●

●●

●●

●●

●●●●●

●●

●●

●●●

●●●

●●

●●

●●

●●●●

●●

●●

●●●

●●

●●

●●

●●

●●

●●●

●●●

●●

●●

●●

●●

●●

●●

●●

●●

●●

●●

●●

●●

●●

●●●●

●●

●●

●●

●●

●●

●●

●●

●●

●●

●●

●●

●●

●●

●●

●●

●●

●●●

●●

●●

●●

●●

●●

●●

●●

●●

●●●

●●

●●

●●

●●

●●

●●●●

●●

●●

●●

●●

●●

●●

●●

●●

●●

●●●

●●●●●

●●

●●

●●

●●

●●

●●

●●

●●

●●

●●

●●

●●

●●

●●

●●

●●

●●

●●

●●

●●

●●

●●

●●●

●●

●●●

●●

●●

●●

●●

●●

●●

●●

●●

●●

●●

●●

●●

●●

●●●

●●

●●

●●

●●

●●

●●●●

●●

●●

●●

●●

●●

●●●

●●●

●●

●●

●●

●●

●●

●●●●

●●

●●

●●●

●●

●●

●●

●●

●●

●●

●●

●●

●●●●●

●●●

●●

●●

●●

●●●

●●

●●

●●

●●

●●●

●●●●●

●●●

●●

●●●

●●

●●

●●

●●

●●

●●

●●

●●●

●●

●●

●●

●●●●●

●●

●●●

●●

●●●

●●

●●

●●

●●

●●

●●

●●

●●

●●

●●

●●

●●

●●

●●

●●

●●

●●

●●

●●

●●

●●

●●

●●●

●●

●●

●●

●●

●●

●●

●●

●●

●●

●●

●●●

●●

●●

●●

●●

●●

●●

●●●

●●●●

●●

●●●●

●●●●

●●●

●●●

●●

●●

●●

●●

●●

●●

●●

●●

●●

●●

●●

●●●

●●

●●

●●

●●●

●●

●●

●●

●●

●●

●●●●

●●

●●

●●●

●●

●●

●●

●●●

●●

●●●

●●

●●

●●

●●

●●●

●●●

●●

●●●

●●

●●

●●

●●

●●●

●●

●●●

●●

●●●

●●

●●●●

●●

●●

●●

●●●

●●

●●●

●●

●●

●●●●

●●●●

●●

●●●●

●●

●●●

●●●

●●●●●

●●

●●●●●●

●●

●●

●●●

●●●

●●

●●

●●●

●●●●●

●●●●●

●●●●●

●●

●●●●●●●●

●●●●

●●●●

●●

●●●

●●●

●●●●●●●●●●●●●●●●

●●●

●●

●●●●●●●●●●

●●

●●

●●●●●

●●●●●

●●●●●●

●●●●

●●

●●●●●●●●●●●

●●●●●

●●●●●●●●

●●

●●●●●●

●●●

●●●

●●●

●●●●

●●●●●

●●

●●●●

●●

●●

●●

●●●

●●●●●●

●●●●●

●●

●●●●●

●●

●●

●●

●●

●●

●●

●●

●●●

●●

●●

●●

●●

●●

●●●●●

●●

●●●●

●●

●●●

●●

●●

●●

●●

●●

●●

●●

●●

●●

●●●

●●

●●

●●

●●

●●●●●

●●

●●●

●●

●●

●●

●●

●●

●●

●●

●●

●●●

●●●

●●

●●

●●

●●●

●●

●●

●●

●●

●●●

●●

●●

●●

●●

●●●

●●

●●●

●●

●●●●

●●

●●

●●●

●●

●●

●●●

●●

●●

●●

●●

●●

●●

●●

●●

●●

●●

●●

●●

●●

●●

●●

●●

●●●●●●

●●

●●

●●

●●

●●

●●

●●

●●

●●

●●

●●

●●

●●●

●●

●●●

●●●

●●

●●

●●

●●

●●

●●

●●

●●

●●

●●

●●●

●●

●●

●●●

●●

●●

●●

●●

●●

●●

●●

●●

●●

●●

●●

●●

●●

●●

●●

●●

●●●●●

●●

●●

●●

●●●

●●●

●●●

●●

●●

●●

●●●

●●

●●

●●

●●

●●

●●

●●

●●

●●

●●

●●

●●

●●

●●

●●

●●

●●

●●

●●

●●

●●●

●●●

●●

●●●

●●

●●

●●●

●●

●●

●●

●●

●●●

●●●

●●

●●●●

●●

●●

●●●

●●●●

●●

●●●

●●

●●

●●●●●

●●

●●●

●●

●●●

●●

●●

●●●

●●●

●●

●●●

●●

●●

●●

●●

●●

●●

●●

●●●

●●

●●

●●

●●

●●

●●

●●

●●

●●

●●

●●

●●

●●

●●

●●

●●

●●

●●

●●

●●

●●●

●●●

●●

●●

●●●

●●

●●

●●

●●

●●

●●

●●

●●

●●●

●●

●●

●●

●●●●●●●●●●●●●●●

●●

●●●●●

●●

●●●●

●●

●●

●●

●●●

●●

●●

●●

●●

●●

●●●●

●●●●●

●●●

●●

●●

●●

●●

●●

●●

●●

●●

●●●

●●

●●

●●

●●

●●

●●●●

●●

●●

●●

●●

●●

●●

●●

●●

●●●

●●●●

●●

●●

●●

●●●●

●●●

●●●

●●●

●●

●●●

●●●

●●

●●

●●

●●

●●

●●

●●●

●●

●●

●●

●●

●●

●●

●●

●●

●●

●●

●●●

●●

●●

●●

●●●

●●

●●

●●

●●●●

●●

●●

●●

●●

●●

●●

●●

●●●

●●

●●

●●

●●

●●

●●●

●●

●●

●●

●●

●●

●●

●●●●●

●●

●●

●●●

●●

●●

●●●

●●

●●

●●

●●

●●

●●

●●●

●●

●●

●●

●●

●●

●●

●●

●●●●●●

●●●●●

●●

●●●●

●●

●●●●●

●●●●●●

●●●

●●

●●

●●

●●

●●

●●

●●

●●●

●●

●●

●●

●●

●●

●●

●●

●●

●●●●

●●

●●

●●

●●

●●

●●

●●●

●●

●●●

●●

●●

●●

●●

●●

●●

●●

●●

●●●●

●●

●●●

●●

●●●

●●●●

●●

●●

●●

●●●●●●●●●

●●

●●

●●

●●

●●

●●

●●

●●

●●

●●●

●●

●●●

●●

●●

●●

●●

●●

●●

●●●●

●●●

●●

●●●

●●

●●

●●

●●

●●

●●

●●●

●●

●●

●●

●●

●●●

●●

●●●●

●●●

●●

●●●●●

●●

●●●

●●

●●

●●

●●

●●

●●

●●

●●

●●

●●

●●

●●●

●●

●●●

●●

●●

●●

●●●

●●●

●●

●●

●●

●●●

●●

●●

●●●

●●

●●

●●

●●

●●

●●●●

●●

●●

●●●●

●●●

●●

●●

●●●

●●●●●

●●●

●●

●●

●●●

●●

●●●●

●●

●●●●

●●

●●

●●

●●●

●●

●●

●●●●●●●

●●

●●●

●●●

●●●

●●

●●●●

●●

●●●

●●

●●

●●

●●●

●●

●●

●●

●●

●●

●●

●●

●●●

●●

●●

●●

●●

●●

●●

●●

●●

●●

●●●

●●

●●●

●●●

●●●

●●

●●

●●●●●

●●●

●●

●●●

●●

●●

●●●

●●

●●

●●

●●●

●●●

●●●●●●●●●●●●

●●

●●●●●●●●

●●●

●●

●●

●●●

●●

●●

●●●●●●●●●●●●●

●●●

●●

●●●●●●●●●●

●●●●●●●●●

●●●

●●●

●●

●●

●●●

●●

●●

●●

●●●

●●●

●●

●●●

●●

●●

●●

●●●

●●

●●

●●

●●

●●

●●

●●

●●

●●

●●

●●

●●

●●

●●●

●●●●

●●

●●●

●●

●●

●●

●●

●●

●●●

●●

●●

●●

●●

●●

●●●

●●●

●●

●●●

●●●●●

●●●

●●

●●

●●●●

●●

●●

●●

●●●

●●

●●●

●●

●●●●

●●

●●

●●●●

●●●●

●●

●●

●●

●●

●●

●●

●●

●●●

●●

●●

●●

●●

●●

●●●

●●●●

●●●●

●●●

●●

●●

●●

●●

●●

●●●

●●

●●

●●●

●●●●

●●

●●●

●●

●●●●

●●

●●●

●●●●●●●

●●

●●●●

●●●●●

●●

●●●●●●●●●●●●●●●●●●●●●

●●●●

●●

●●

●●●●

●●

●●●●●●●●●●●●●●●●●●●●●●

●●

●●●●

●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●

●●

●●●

●●●

●●●●

0.25

0.50

0.75

1.00

0 2000 4000 6000 8000Build Time (s)

Nor

mal

ized

File

Chu

rn 732 hotspots!(8% of source files)

!28

qtxmlpatterns

High hotspot!concentration

qtbase/…/corelib

Main culpritstmtm

Rebuild cost (seconds)

Num

ber o

f cha

nges

(N

orm

aliz

ed)

●●

●●

●●

●●

●●

●●

●●

●●

●●

●●

●●

●●

●●●

●●

●●

●●

●●

●●

●●

●●

●●

●●

●●●●

●●

●●

●●

●●

●●

●●●●

●●

●●

●●

●●

●●●

●●●

●●

●●

●●

●●

●●

●●

●●

●●●

●●

●●●

●●

●●●

●●

●●

●●

●●●

●●

●●

●●

●●

●●

●●

●●●

●●●●

●●

●●●

●●

●●

●●●

●●●

●●

●●●

●●

●●●

●●●●●

●●

●●

●●

●●●●

●●

●●

●●

●●●

●●

●●

●●●

●●

●●

●●●●●

●●

●●

●●

●●●●●

●●

●●

●●

●●

●●●

●●●

●●●

●●

●●

●●

●●●●

●●

●●

●●

●●

●●

●●

●●

●●

●●

●●●

●●●●

●●

●●

●●●

●●●

●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●

●●

●●

●●

●●

●●●●●●●●

●●●

●●

●●

●●

●●

●●

●●

●●

●●●

●●

●●

●●

●●●

●●

●●

●●●

●●●

●●

●●

●●

●●

●●

●●

●●

●●

●●

0.25

0.50

0.75

1.00

0 50 100 150 200Build Time (s)

Nor

mal

ized

File

Chu

rn27 hotspots!

(2% of source files)

!29

postgres.haccess/htup.h

Main culprits

access/genam.haccess/xact.hutils/builtins.h

hot.c

...1 2

hot.o

nn-1

!30

General trends Transitive property of build hotspots

hot.c

...1 2

hot.o

nn-1

!30

General trends Transitive property of build hotspots

x.h

hot.c

...1 2

hot.o

nn-1

!30

General trends Transitive property of build hotspots

x.h

hot.c

...1 2

hot.o

nn-1

!30

General trends Transitive property of build hotspots

x.h

hot.c

...1 2

hot.o

nn-1

General trends Transitive property of build hotspots

!31

x.h

hot.c

...1 2

hot.o

nn-1

General trends Transitive property of build hotspots

!31

hub.h

x.h

hot.c

...1 2

hot.o

nn-1

General trends Transitive property of build hotspots

!31

hub.h

x.h

hot.c

...1 2

hot.o

nn-1

a.h b.h y.h z.h

General trends Transitive property of build hotspots

!31

hub.h

x.h

hot.c

...1 2

hot.o

nn-1

a.h b.h y.h z.h

General trends Transitive property of build hotspots

!31

hub.h

x.h

hot.c

...1 2

hot.o

nn-1

a.h b.h y.h z.h

General trends Transitive property of build hotspots

!31

hub.h

x.h

hot.c

...1 2

hot.o

nn-1

Limit internal use of “header file hubs” as much as possible!

a.h b.h y.h z.h

General trends Transitive property of build hotspots

!31

RELENG 2014

2nd International Workshop on Release Engineering

http://releng.polymtl.ca

?

?

RELENG 2014

2nd International Workshop on Release Engineering

http://releng.polymtl.caDeadline: February 28, 2014

Event: April 11, 2014

?

talks on research

and practice

keynotes

poster session

and panel

?

RELENG 2014

2nd International Workshop on Release Engineering

http://releng.polymtl.caDeadline: February 28, 2014

Event: April 11, 2014

?

talks on research

and practice

keynotes

poster session

and panel

hosted in Mountainview (CA, US)

by?

RELENG 2014

2nd International Workshop on Release Engineering

http://releng.polymtl.caDeadline: February 28, 2014

Event: April 11, 2014

?

talks on research

and practice

keynotes

poster session

and panel

hosted in Mountainview (CA, US)

by

Dinah McNutt

(Google)

@shane_mcintoshshanemcintosh@acm.org

!34

Bonus!

!35

postgres.h

src/include/c.h src/include/port.h src/include/utils/elog.h src/include/utils/palloc.h src/include/pg_config_manual.h

!36

htup_details.h

src/include/access/htup.h src/include/storage/itemptr.h src/include/storage/itemid.h src/include/storage/bufpage.h src/include/access/tupdesc.h src/include/catalog/pg_attribute.h src/include/access/tupmacs.h

!37

genam.h

src/include/access/skey.h src/include/storage/lock.h src/include/storage/shmem.h src/include/utils/hsearch.h src/include/storage/lwlock.h src/include/utils/relcache.h

!38

src/include/access/xlog.h src/include/access/xlogdefs.h src/include/nodes/pg_list.h src/include/lib/stringinfo.h

xact.h

!39

src/include/fmgr.h src/include/nodes/parsenodes.h src/include/nodes/primnodes.h src/include/nodes/pg_list.h src/include/nodes/nodes.h

builtins.h

Recommended