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)
721 first = false;
723 }
724
727}
728
729
730
731
732
733
734
735bool
737{
739 bool first = true;
740
741 for (;;)
742 {
745
747
749 logLockFailure)
751 return false;
752
754
756 break;
757
758
759 if (!first)
761 first = false;
763 }
764
765 return true;
766}
767
768
769
770
771
772
773
774
775
776
777
778
781{
783
785
786
787
788
791
793
795
797}
798
799
800
801
802
803
804
805void
807{
809
811
813}
814
815
816
817
818
819
820
821void
823{
825
827
830
833}
834
835
836
837
838
839static void
841{
843
844
845
846
847
850 {
851 const char *cxt;
852
853 switch (info->oper)
854 {
856 cxt = gettext_noop("while updating tuple (%u,%u) in relation \"%s\"");
857 break;
859 cxt = gettext_noop("while deleting tuple (%u,%u) in relation \"%s\"");
860 break;
862 cxt = gettext_noop("while locking tuple (%u,%u) in relation \"%s\"");
863 break;
865 cxt = gettext_noop("while locking updated version (%u,%u) of tuple in relation \"%s\"");
866 break;
868 cxt = gettext_noop("while inserting index tuple (%u,%u) in relation \"%s\"");
869 break;
871 cxt = gettext_noop("while checking uniqueness of tuple (%u,%u) in relation \"%s\"");
872 break;
874 cxt = gettext_noop("while rechecking updated tuple (%u,%u) in relation \"%s\"");
875 break;
877 cxt = gettext_noop("while checking exclusion constraint on tuple (%u,%u) in relation \"%s\"");
878 break;
879
880 default:
881 return;
882 }
883
888 }
889}
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904void
906{
909 int total = 0;
910 int done = 0;
911
912
913 if (locktags == NIL)
914 return;
915
916
917 foreach(lc, locktags)
918 {
920 int count;
921
922 holders = lappend(holders,
926 total += count;
927 }
928
931
932
933
934
935
936
937
938 foreach(lc, holders)
939 {
941
943 {
944
946 {
948
949 if (holder)
951 holder->pid);
952 }
954 lockholders++;
955
958 }
959 }
961 {
962 const int index[] = {
966 };
968 0, 0, 0
969 };
970
972 }
973
975}
976
977
978
979
980
981
982void
984{
986
990}
991
992
993
994
995
996
997
998
999
1000
1001void
1004{
1006
1009 classid,
1010 objid,
1011 objsubid);
1012
1013 (void) LockAcquire(&tag, lockmode, false, false);
1014
1015
1017}
1018
1019
1020
1021
1022
1023
1024
1025bool
1028{
1032
1035 classid,
1036 objid,
1037 objsubid);
1038
1039 res = LockAcquireExtended(&tag, lockmode, false, true, true, &locallock,
1040 false);
1041
1043 return false;
1044
1045
1046
1047
1048
1050 {
1053 }
1054
1055 return true;
1056}
1057
1058
1059
1060
1061void
1064{
1066
1069 classid,
1070 objid,
1071 objsubid);
1072
1074}
1075
1076
1077
1078
1079
1080
1081void
1084{
1086
1089 classid,
1090 objid,
1091 objsubid);
1092
1093 (void) LockAcquire(&tag, lockmode, false, false);
1094
1095
1097}
1098
1099
1100
1101
1102
1103
1104
1105bool
1108{
1112
1115 classid,
1116 objid,
1117 objsubid);
1118
1119 res = LockAcquireExtended(&tag, lockmode, false, true, true, &locallock,
1120 false);
1121
1123 return false;
1124
1125
1126
1127
1128
1130 {
1133 }
1134
1135 return true;
1136}
1137
1138
1139
1140
1141void
1144{
1146
1149 classid,
1150 objid,
1151 objsubid);
1152
1154}
1155
1156
1157
1158
1159
1160
1161
1162void
1165{
1167
1170 classid,
1171 objid,
1172 objsubid);
1173
1174 (void) LockAcquire(&tag, lockmode, true, false);
1175}
1176
1177
1178
1179
1180void
1183{
1185
1188 classid,
1189 objid,
1190 objsubid);
1191
1193}
1194
1195
1196
1197
1198
1199
1200
1201
1202void
1205{
1207
1210 suboid,
1211 xid,
1212 objid);
1213
1214 (void) LockAcquire(&tag, lockmode, true, false);
1215}
1216
1217
1218
1219
1220void
1223{
1225
1228 suboid,
1229 xid,
1230 objid);
1231
1233}
1234
1235
1236
1237
1238
1239
1240
1241
1242void
1244{
1246 {
1249 _("relation %u of database %u"),
1252 break;
1255 _("extension of relation %u of database %u"),
1258 break;
1261 _("pg_database.datfrozenxid of database %u"),
1263 break;
1266 _("page %u of relation %u of database %u"),
1270 break;
1273 _("tuple (%u,%u) of relation %u of database %u"),
1278 break;
1281 _("transaction %u"),
1283 break;
1286 _("virtual transaction %d/%u"),
1289 break;
1292 _("speculative token %u of transaction %u"),
1295 break;
1298 _("object %u of class %u of database %u"),
1302 break;
1304
1306 _("user lock [%u,%u,%u]"),
1310 break;
1313 _("advisory lock [%u,%u,%u,%u]"),
1318 break;
1321 _("remote transaction %u of subscription %u of database %u"),
1325 break;
1326 default:
1328 _("unrecognized locktag type %d"),
1330 break;
1331 }
1332}
1333
1334
1335
1336
1337
1338
1339const char *
1341{
1343 return "???";
1345}
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 XactLockTableWait(TransactionId xid, Relation rel, ItemPointer ctid, XLTW_Oper oper)
void LockSharedObject(Oid classid, Oid objid, uint16 objsubid, LOCKMODE lockmode)
bool ConditionalLockTuple(Relation relation, ItemPointer tid, LOCKMODE lockmode, bool logLockFailure)
bool ConditionalLockPage(Relation relation, BlockNumber blkno, LOCKMODE lockmode)
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 LockTuple(Relation relation, ItemPointer tid, LOCKMODE lockmode)
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
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 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)
void UnlockTuple(Relation relation, ItemPointer tid, LOCKMODE lockmode)
@ 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[]
Operator oper(ParseState *pstate, List *opname, Oid ltypeId, Oid rtypeId, bool noError, int location)
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,...)
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)