1
+ /* ------------------------------------------------------------------------
2
+ *
3
+ * pl_funcs.c
4
+ *Utility C functions for stored procedures
5
+ *
6
+ * Copyright (c) 2015-2016, Postgres Professional
7
+ *
8
+ * ------------------------------------------------------------------------
9
+ */
1
10
#include "pathman.h"
2
11
#include "utils/lsyscache.h"
3
12
#include "utils/typcache.h"
@@ -29,13 +38,13 @@ PG_FUNCTION_INFO_V1( get_max_range_value );
29
38
Datum
30
39
on_partitions_created (PG_FUNCTION_ARGS )
31
40
{
32
- LWLockAcquire (load_config_lock ,LW_EXCLUSIVE );
41
+ LWLockAcquire (pmstate -> load_config_lock ,LW_EXCLUSIVE );
33
42
34
43
/* Reload config */
35
44
/* TODO: reload just the specified relation */
36
45
load_relations_hashtable (false);
37
46
38
- LWLockRelease (load_config_lock );
47
+ LWLockRelease (pmstate -> load_config_lock );
39
48
40
49
PG_RETURN_NULL ();
41
50
}
@@ -51,10 +60,10 @@ on_partitions_updated(PG_FUNCTION_ARGS)
51
60
prel = get_pathman_relation_info (relid ,NULL );
52
61
if (prel != NULL )
53
62
{
54
- LWLockAcquire (load_config_lock ,LW_EXCLUSIVE );
63
+ LWLockAcquire (pmstate -> load_config_lock ,LW_EXCLUSIVE );
55
64
remove_relation_info (relid );
56
65
load_relations_hashtable (false);
57
- LWLockRelease (load_config_lock );
66
+ LWLockRelease (pmstate -> load_config_lock );
58
67
}
59
68
60
69
PG_RETURN_NULL ();
@@ -65,13 +74,13 @@ on_partitions_removed(PG_FUNCTION_ARGS)
65
74
{
66
75
Oid relid ;
67
76
68
- LWLockAcquire (load_config_lock ,LW_EXCLUSIVE );
77
+ LWLockAcquire (pmstate -> load_config_lock ,LW_EXCLUSIVE );
69
78
70
79
/* parent relation oid */
71
80
relid = DatumGetInt32 (PG_GETARG_DATUM (0 ));
72
81
remove_relation_info (relid );
73
82
74
- LWLockRelease (load_config_lock );
83
+ LWLockRelease (pmstate -> load_config_lock );
75
84
76
85
PG_RETURN_NULL ();
77
86
}
@@ -129,10 +138,10 @@ find_or_create_range_partition(PG_FUNCTION_ARGS)
129
138
Oid child_oid ;
130
139
131
140
/* Lock config before appending new partitions */
132
- LWLockAcquire (load_config_lock ,LW_EXCLUSIVE );
141
+ LWLockAcquire (pmstate -> load_config_lock ,LW_EXCLUSIVE );
133
142
134
143
/* Restrict concurrent partition creation */
135
- LWLockAcquire (edit_partitions_lock ,LW_EXCLUSIVE );
144
+ LWLockAcquire (pmstate -> edit_partitions_lock ,LW_EXCLUSIVE );
136
145
137
146
/*
138
147
* Check if someone else has already created partition.
@@ -141,8 +150,8 @@ find_or_create_range_partition(PG_FUNCTION_ARGS)
141
150
pos = range_binary_search (rangerel ,& cmp_func ,value ,& found );
142
151
if (found )
143
152
{
144
- LWLockRelease (edit_partitions_lock );
145
- LWLockRelease (load_config_lock );
153
+ LWLockRelease (pmstate -> edit_partitions_lock );
154
+ LWLockRelease (pmstate -> load_config_lock );
146
155
PG_RETURN_OID (ranges [pos ].child_oid );
147
156
}
148
157
@@ -155,8 +164,8 @@ find_or_create_range_partition(PG_FUNCTION_ARGS)
155
164
// elog(WARNING, "Worker finished");
156
165
157
166
/* Release locks */
158
- LWLockRelease (edit_partitions_lock );
159
- LWLockRelease (load_config_lock );
167
+ LWLockRelease (pmstate -> edit_partitions_lock );
168
+ LWLockRelease (pmstate -> load_config_lock );
160
169
161
170
/* Repeat binary search */
162
171
ranges = dsm_array_get_pointer (& rangerel -> ranges );
@@ -361,17 +370,13 @@ check_overlap(PG_FUNCTION_ARGS)
361
370
Datum
362
371
acquire_partitions_lock (PG_FUNCTION_ARGS )
363
372
{
364
- // int relid = DatumGetInt32(PG_GETARG_DATUM(0));
365
- // LockRelationOid(relid, AccessExclusiveLock);
366
- LWLockAcquire (edit_partitions_lock ,LW_EXCLUSIVE );
373
+ LWLockAcquire (pmstate -> edit_partitions_lock ,LW_EXCLUSIVE );
367
374
PG_RETURN_NULL ();
368
375
}
369
376
370
377
Datum
371
378
release_partitions_lock (PG_FUNCTION_ARGS )
372
379
{
373
- // int relid = DatumGetInt32(PG_GETARG_DATUM(0));
374
- // UnlockRelationOid(relid, AccessExclusiveLock);
375
- LWLockRelease (edit_partitions_lock );
380
+ LWLockRelease (pmstate -> edit_partitions_lock );
376
381
PG_RETURN_NULL ();
377
382
}