PostgreSQL Source Code: src/backend/storage/lmgr/lmgr.c Source File (original) (raw)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
17
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
46
47
48
49
50
51
52
53
55{
60
62
63
64
65
66
67
68
69void
71{
74
76
77 if (relation->rd_rel->relisshared)
79 else
81}
82
83
84
85
86
87static inline void
89{
91
94 else
96
98}
99
100
101
102
103
104
105
106void
108{
112
114
115 res = LockAcquireExtended(&tag, lockmode, false, false, true, &locallock,
116 false);
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
135 {
138 }
139}
140
141
142
143
144
145
146
147
148
149
150bool
152{
156
158
160 false);
161
163 return false;
164
165
166
167
168
170 {
173 }
174
175 return true;
176}
177
178
179
180
181
182
183
184void
186{
190
192
193 res = LockAcquireExtended(&tag, lockmode, false, false, true, &locallock,
194 false);
195
196
197
198
199
201 {
204 }
205}
206
207
208
209
210
211
212
213void
215{
217
219
221}
222
223
224
225
226
227
228void
230{
232
234
236}
237
238
239
240
241
242
243
244
245void
247{
251
255
256 res = LockAcquireExtended(&tag, lockmode, false, false, true, &locallock,
257 false);
258
259
260
261
262
264 {
267 }
268}
269
270
271
272
273
274
275
276
277bool
279{
283
287
289 false);
290
292 return false;
293
294
295
296
297
299 {
302 }
303
304 return true;
305}
306
307
308
309
310
311
312
313void
315{
317
321
323}
324
325
326
327
328
329
330
331
332
333bool
335{
337
341
342 return LockHeldByMe(&tag, lockmode, orstronger);
343}
344
345
346
347
348
349
350bool
352{
354
356
357 return LockHeldByMe(&tag, lockmode, orstronger);
358}
359
360
361
362
363
364
365
366bool
368{
370
374
376}
377
378
379
380
381
382
383
384
385
386
387
388
389
390void
392{
394
396
397 (void) LockAcquire(&tag, lockmode, true, false);
398}
399
400
401
402
403void
405{
407
409
411}
412
413
414
415
416
417
418
419
420
421
422
423void
425{
427
431
432 (void) LockAcquire(&tag, lockmode, false, false);
433}
434
435
436
437
438
439
440
441bool
443{
445
449
451}
452
453
454
455
456
457
458int
460{
462
466
468}
469
470
471
472
473void
475{
477
481
483}
484
485
486
487
488
489
490void
492{
494
496
497 (void) LockAcquire(&tag, lockmode, false, false);
498}
499
500
501
502
503
504
505
506void
508{
510
514 blkno);
515
516 (void) LockAcquire(&tag, lockmode, false, false);
517}
518
519
520
521
522
523
524
525bool
527{
529
533 blkno);
534
536}
537
538
539
540
541void
543{
545
549 blkno);
550
552}
553
554
555
556
557
558
559
560
561void
563{
565
571
572 (void) LockAcquire(&tag, lockmode, false, false);
573}
574
575
576
577
578
579
580
581bool
583 bool logLockFailure)
584{
586
592
595}
596
597
598
599
600void
602{
604
610
612}
613
614
615
616
617
618
619
620
621void
623{
625
627
629}
630
631
632
633
634
635
636
637
638void
640{
642
644
646}
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662void
665{
669 bool first = true;
670
671
672
673
674
676 {
679
680 info.rel = rel;
681 info.ctid = ctid;
683
688 }
689
690 for (;;)
691 {
694
696
698
700
702 break;
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719 if (!first)
720 {
723 }
724 first = false;
726 }
727
730}
731
732
733
734
735
736
737
738bool
740{
742 bool first = true;
743
744 for (;;)
745 {
748
750
752 logLockFailure)
754 return false;
755
757
759 break;
760
761
762 if (!first)
763 {
766 }
767 first = false;
769 }
770
771 return true;
772}
773
774
775
776
777
778
779
780
781
782
783
784
787{
789
791
792
793
794
797
799
801
803}
804
805
806
807
808
809
810
811void
813{
815
817
819}
820
821
822
823
824
825
826
827void
829{
831
833
836
839}
840
841
842
843
844
845static void
847{
849
850
851
852
853
856 {
857 const char *cxt;
858
859 switch (info->oper)
860 {
862 cxt = gettext_noop("while updating tuple (%u,%u) in relation \"%s\"");
863 break;
865 cxt = gettext_noop("while deleting tuple (%u,%u) in relation \"%s\"");
866 break;
868 cxt = gettext_noop("while locking tuple (%u,%u) in relation \"%s\"");
869 break;
871 cxt = gettext_noop("while locking updated version (%u,%u) of tuple in relation \"%s\"");
872 break;
874 cxt = gettext_noop("while inserting index tuple (%u,%u) in relation \"%s\"");
875 break;
877 cxt = gettext_noop("while checking uniqueness of tuple (%u,%u) in relation \"%s\"");
878 break;
880 cxt = gettext_noop("while rechecking updated tuple (%u,%u) in relation \"%s\"");
881 break;
883 cxt = gettext_noop("while checking exclusion constraint on tuple (%u,%u) in relation \"%s\"");
884 break;
885
886 default:
887 return;
888 }
889
894 }
895}
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910void
912{
915 int total = 0;
916 int done = 0;
917
918
919 if (locktags == NIL)
920 return;
921
922
923 foreach(lc, locktags)
924 {
926 int count;
927
928 holders = lappend(holders,
932 total += count;
933 }
934
937
938
939
940
941
942
943
944 foreach(lc, holders)
945 {
947
949 {
950
952 {
954
955 if (holder)
957 holder->pid);
958 }
960 lockholders++;
961
964 }
965 }
967 {
968 const int index[] = {
972 };
974 0, 0, 0
975 };
976
978 }
979
981}
982
983
984
985
986
987
988void
990{
992
996}
997
998
999
1000
1001
1002
1003
1004
1005
1006
1007void
1010{
1012
1015 classid,
1016 objid,
1017 objsubid);
1018
1019 (void) LockAcquire(&tag, lockmode, false, false);
1020
1021
1023}
1024
1025
1026
1027
1028
1029
1030
1031bool
1034{
1038
1041 classid,
1042 objid,
1043 objsubid);
1044
1045 res = LockAcquireExtended(&tag, lockmode, false, true, true, &locallock,
1046 false);
1047
1049 return false;
1050
1051
1052
1053
1054
1056 {
1059 }
1060
1061 return true;
1062}
1063
1064
1065
1066
1067void
1070{
1072
1075 classid,
1076 objid,
1077 objsubid);
1078
1080}
1081
1082
1083
1084
1085
1086
1087void
1090{
1092
1095 classid,
1096 objid,
1097 objsubid);
1098
1099 (void) LockAcquire(&tag, lockmode, false, false);
1100
1101
1103}
1104
1105
1106
1107
1108
1109
1110
1111bool
1114{
1118
1121 classid,
1122 objid,
1123 objsubid);
1124
1125 res = LockAcquireExtended(&tag, lockmode, false, true, true, &locallock,
1126 false);
1127
1129 return false;
1130
1131
1132
1133
1134
1136 {
1139 }
1140
1141 return true;
1142}
1143
1144
1145
1146
1147void
1150{
1152
1155 classid,
1156 objid,
1157 objsubid);
1158
1160}
1161
1162
1163
1164
1165
1166
1167
1168void
1171{
1173
1176 classid,
1177 objid,
1178 objsubid);
1179
1180 (void) LockAcquire(&tag, lockmode, true, false);
1181}
1182
1183
1184
1185
1186void
1189{
1191
1194 classid,
1195 objid,
1196 objsubid);
1197
1199}
1200
1201
1202
1203
1204
1205
1206
1207
1208void
1211{
1213
1216 suboid,
1217 xid,
1218 objid);
1219
1220 (void) LockAcquire(&tag, lockmode, true, false);
1221}
1222
1223
1224
1225
1226void
1229{
1231
1234 suboid,
1235 xid,
1236 objid);
1237
1239}
1240
1241
1242
1243
1244
1245
1246
1247
1248void
1250{
1252 {
1255 _("relation %u of database %u"),
1258 break;
1261 _("extension of relation %u of database %u"),
1264 break;
1267 _("pg_database.datfrozenxid of database %u"),
1269 break;
1272 _("page %u of relation %u of database %u"),
1276 break;
1279 _("tuple (%u,%u) of relation %u of database %u"),
1284 break;
1287 _("transaction %u"),
1289 break;
1292 _("virtual transaction %d/%u"),
1295 break;
1298 _("speculative token %u of transaction %u"),
1301 break;
1304 _("object %u of class %u of database %u"),
1308 break;
1310
1312 _("user lock [%u,%u,%u]"),
1316 break;
1319 _("advisory lock [%u,%u,%u,%u]"),
1324 break;
1327 _("remote transaction %u of subscription %u of database %u"),
1331 break;
1332 default:
1334 _("unrecognized locktag type %d"),
1336 break;
1337 }
1338}
1339
1340
1341
1342
1343
1344
1345const char *
1347{
1349 return "???";
1351}
void pgstat_progress_update_param(int index, int64 val)
void pgstat_progress_update_multi_param(int nparam, const int *index, const int64 *val)
static Datum values[MAXATTR]
#define OidIsValid(objectId)
bool IsSharedRelation(Oid relationId)
ErrorContextCallback * error_context_stack
Assert(PointerIsAligned(start, uint64))
void AcceptInvalidationMessages(void)
static OffsetNumber ItemPointerGetOffsetNumber(const ItemPointerData *pointer)
static BlockNumber ItemPointerGetBlockNumber(const ItemPointerData *pointer)
static bool ItemPointerIsValid(const ItemPointerData *pointer)
List * lappend(List *list, void *datum)
void list_free(List *list)
void list_free_deep(List *list)
bool ConditionalLockRelationOid(Oid relid, LOCKMODE lockmode)
void UnlockTuple(Relation relation, const ItemPointerData *tid, LOCKMODE lockmode)
void LockSharedObject(Oid classid, Oid objid, uint16 objsubid, LOCKMODE lockmode)
bool ConditionalLockPage(Relation relation, BlockNumber blkno, LOCKMODE lockmode)
bool ConditionalLockTuple(Relation relation, const ItemPointerData *tid, LOCKMODE lockmode, bool logLockFailure)
void UnlockRelationOid(Oid relid, LOCKMODE lockmode)
void LockDatabaseObject(Oid classid, Oid objid, uint16 objsubid, LOCKMODE lockmode)
void UnlockRelation(Relation relation, LOCKMODE lockmode)
void DescribeLockTag(StringInfo buf, const LOCKTAG *tag)
void SpeculativeInsertionWait(TransactionId xid, uint32 token)
bool ConditionalLockSharedObject(Oid classid, Oid objid, uint16 objsubid, LOCKMODE lockmode)
void UnlockSharedObjectForSession(Oid classid, Oid objid, uint16 objsubid, LOCKMODE lockmode)
void WaitForLockersMultiple(List *locktags, LOCKMODE lockmode, bool progress)
void LockRelationIdForSession(LockRelId *relid, LOCKMODE lockmode)
void RelationInitLockInfo(Relation relation)
void LockRelationOid(Oid relid, LOCKMODE lockmode)
void LockRelation(Relation relation, LOCKMODE lockmode)
void UnlockRelationId(LockRelId *relid, LOCKMODE lockmode)
void WaitForLockers(LOCKTAG heaplocktag, LOCKMODE lockmode, bool progress)
bool ConditionalXactLockTableWait(TransactionId xid, bool logLockFailure)
void XactLockTableDelete(TransactionId xid)
void XactLockTableInsert(TransactionId xid)
uint32 SpeculativeInsertionLockAcquire(TransactionId xid)
void LockRelationForExtension(Relation relation, LOCKMODE lockmode)
bool CheckRelationLockedByMe(Relation relation, LOCKMODE lockmode, bool orstronger)
void UnlockApplyTransactionForSession(Oid suboid, TransactionId xid, uint16 objid, LOCKMODE lockmode)
void SpeculativeInsertionLockRelease(TransactionId xid)
static void XactLockTableWaitErrorCb(void *arg)
void LockPage(Relation relation, BlockNumber blkno, LOCKMODE lockmode)
bool ConditionalLockRelationForExtension(Relation relation, LOCKMODE lockmode)
bool CheckRelationOidLockedByMe(Oid relid, LOCKMODE lockmode, bool orstronger)
static void SetLocktagRelationOid(LOCKTAG *tag, Oid relid)
void UnlockPage(Relation relation, BlockNumber blkno, LOCKMODE lockmode)
void UnlockRelationIdForSession(LockRelId *relid, LOCKMODE lockmode)
bool ConditionalLockRelation(Relation relation, LOCKMODE lockmode)
static uint32 speculativeInsertionToken
void LockTuple(Relation relation, const ItemPointerData *tid, LOCKMODE lockmode)
bool ConditionalLockDatabaseObject(Oid classid, Oid objid, uint16 objsubid, LOCKMODE lockmode)
void LockDatabaseFrozenIds(LOCKMODE lockmode)
struct XactLockTableWaitInfo XactLockTableWaitInfo
void UnlockRelationForExtension(Relation relation, LOCKMODE lockmode)
const char * GetLockNameFromTagType(uint16 locktag_type)
void UnlockSharedObject(Oid classid, Oid objid, uint16 objsubid, LOCKMODE lockmode)
void XactLockTableWait(TransactionId xid, Relation rel, const ItemPointerData *ctid, XLTW_Oper oper)
void LockApplyTransactionForSession(Oid suboid, TransactionId xid, uint16 objid, LOCKMODE lockmode)
void LockSharedObjectForSession(Oid classid, Oid objid, uint16 objsubid, LOCKMODE lockmode)
void LockRelationId(LockRelId *relid, LOCKMODE lockmode)
bool LockHasWaitersRelation(Relation relation, LOCKMODE lockmode)
void UnlockDatabaseObject(Oid classid, Oid objid, uint16 objsubid, LOCKMODE lockmode)
int RelationExtensionLockWaiterCount(Relation relation)
@ XLTW_RecheckExclusionConstr
LockAcquireResult LockAcquire(const LOCKTAG *locktag, LOCKMODE lockmode, bool sessionLock, bool dontWait)
bool LockHeldByMe(const LOCKTAG *locktag, LOCKMODE lockmode, bool orstronger)
int LockWaiterCount(const LOCKTAG *locktag)
bool LockRelease(const LOCKTAG *locktag, LOCKMODE lockmode, bool sessionLock)
bool VirtualXactLock(VirtualTransactionId vxid, bool wait)
VirtualTransactionId * GetLockConflicts(const LOCKTAG *locktag, LOCKMODE lockmode, int *countp)
LockAcquireResult LockAcquireExtended(const LOCKTAG *locktag, LOCKMODE lockmode, bool sessionLock, bool dontWait, bool reportMemoryError, LOCALLOCK **locallockp, bool logLockFailure)
bool LockHasWaiters(const LOCKTAG *locktag, LOCKMODE lockmode, bool sessionLock)
void MarkLockClear(LOCALLOCK *locallock)
#define SET_LOCKTAG_DATABASE_FROZEN_IDS(locktag, dboid)
#define SET_LOCKTAG_RELATION_EXTEND(locktag, dboid, reloid)
@ LOCKTAG_RELATION_EXTEND
@ LOCKTAG_SPECULATIVE_TOKEN
@ LOCKTAG_APPLY_TRANSACTION
@ LOCKTAG_DATABASE_FROZEN_IDS
@ LOCKTAG_VIRTUALTRANSACTION
#define SET_LOCKTAG_APPLY_TRANSACTION(locktag, dboid, suboid, xid, objid)
#define VirtualTransactionIdIsValid(vxid)
#define SET_LOCKTAG_TRANSACTION(locktag, xid)
#define SET_LOCKTAG_RELATION(locktag, dboid, reloid)
#define SET_LOCKTAG_SPECULATIVE_INSERTION(locktag, xid, token)
#define LOCKTAG_LAST_TYPE
#define SET_LOCKTAG_PAGE(locktag, dboid, reloid, blocknum)
#define SET_LOCKTAG_TUPLE(locktag, dboid, reloid, blocknum, offnum)
#define SET_LOCKTAG_OBJECT(locktag, dboid, classoid, objoid, objsubid)
@ LOCKACQUIRE_ALREADY_CLEAR
const char *const LockTagTypeNames[]
#define CHECK_FOR_INTERRUPTS()
Operator oper(ParseState *pstate, List *opname, Oid ltypeId, Oid rtypeId, bool noError, int location)
static char buf[DEFAULT_XLOG_SEG_SIZE]
PGPROC * ProcNumberGetProc(ProcNumber procNumber)
bool TransactionIdIsInProgress(TransactionId xid)
#define PROGRESS_WAITFOR_DONE
#define PROGRESS_WAITFOR_TOTAL
#define PROGRESS_WAITFOR_CURRENT_PID
#define RelationGetRelid(relation)
#define RelationGetRelationName(relation)
#define RelationIsValid(relation)
void pg_usleep(long microsec)
void appendStringInfo(StringInfo str, const char *fmt,...)
const ItemPointerData * ctid
TransactionId SubTransGetTopmostTransaction(TransactionId xid)
static void callback(struct sockaddr *addr, struct sockaddr *mask, void *unused)
#define TransactionIdEquals(id1, id2)
#define TransactionIdIsValid(xid)
TransactionId GetTopTransactionIdIfAny(void)