~ubuntu-branches/ubuntu/vivid/389-ds-base/vivid

« back to all changes in this revision

Viewing changes to ldap/servers/plugins/replication/repl5_replica.c

  • Committer: Package Import Robot
  • Author(s): Timo Aaltonen
  • Date: 2014-08-08 10:48:55 UTC
  • mfrom: (0.2.3)
  • Revision ID: package-import@ubuntu.com-20140808104855-exq8xfg6rirkvipk
Tags: 1.3.2.21-1
* New upstream release.
  - CVE-2014-3562 (Closes: #757437)

Show diffs side-by-side

added added

removed removed

Lines of Context:
74
74
        void *csn_pl_reg_id;            /* registration assignment for csn callbacks */
75
75
        unsigned long repl_state_flags; /* state flags                                                  */
76
76
        PRUint32    repl_flags;         /* persistent, externally visible flags */
77
 
        PRLock  *repl_lock;                             /* protects entire structure                    */
 
77
        PRMonitor *repl_lock;                   /* protects entire structure                    */
78
78
        Slapi_Eq_Context repl_eqcxt_rs; /* context to cancel event that saves ruv */    
79
79
        Slapi_Eq_Context repl_eqcxt_tr; /* context to cancel event that reaps tombstones */     
80
80
        Object *repl_csngen;                    /* CSN generator for this replica */
126
126
static void _delete_tombstone(const char *tombstone_dn, const char *uniqueid, int ext_op_flags);
127
127
static void replica_strip_cleaned_rids(Replica *r);
128
128
 
129
 
/* Allocates new replica and reads its state and state of its component from
 
129
static void
 
130
replica_lock(PRMonitor *lock)
 
131
{
 
132
        PR_EnterMonitor(lock);
 
133
}
 
134
 
 
135
static void
 
136
replica_unlock(PRMonitor *lock)
 
137
{
 
138
        PR_ExitMonitor(lock);
 
139
}
 
140
/*
 
141
 * Allocates new replica and reads its state and state of its component from
130
142
 * various parts of the DIT. 
131
143
 */
132
144
Replica *
189
201
                goto done;
190
202
        }
191
203
 
192
 
        if ((r->repl_lock = PR_NewLock()) == NULL)
 
204
        if ((r->repl_lock = PR_NewMonitor()) == NULL)
193
205
        {
194
206
                if (NULL != errortext)
195
207
                {
295
307
        PR_ASSERT(NULL != r);
296
308
        if (NULL != r)
297
309
        {
298
 
                PR_Lock(r->repl_lock);
 
310
                replica_lock(r->repl_lock);
299
311
                /* Make sure we dump the CSNGen state */
300
312
                r->repl_csn_assigned = PR_TRUE;
301
 
                PR_Unlock(r->repl_lock);
 
313
                replica_unlock(r->repl_lock);
302
314
                /* This function take the Lock Inside */
303
315
                /* And also write the RUV */
304
316
                replica_update_state((time_t)0, r->repl_name);
308
320
void
309
321
replica_set_csn_assigned(Replica *r)
310
322
{
311
 
    PR_Lock(r->repl_lock);
 
323
        replica_lock(r->repl_lock);
312
324
    r->repl_csn_assigned = PR_TRUE;
313
 
    PR_Unlock(r->repl_lock);
 
325
    replica_unlock(r->repl_lock);
314
326
}
315
327
 
316
328
/* 
374
386
 
375
387
        if (r->repl_lock)
376
388
        {
377
 
                PR_DestroyLock(r->repl_lock);
 
389
                PR_DestroyMonitor(r->repl_lock);
378
390
                r->repl_lock = NULL;
379
391
        }
380
392
 
437
449
 
438
450
        PR_ASSERT(r);
439
451
 
440
 
        PR_Lock(r->repl_lock);
 
452
        replica_lock(r->repl_lock);
441
453
        if (r->repl_state_flags & REPLICA_IN_USE)
442
454
        {
443
455
                if (isInc)
478
490
                slapi_ch_free_string(&r->locking_purl);
479
491
                r->locking_purl = slapi_ch_strdup(locking_purl);
480
492
        }
481
 
        PR_Unlock(r->repl_lock);
 
493
        replica_unlock(r->repl_lock);
482
494
        return rval;
483
495
}
484
496
 
492
504
 
493
505
        PR_ASSERT(r);
494
506
        
495
 
        PR_Lock(r->repl_lock);
 
507
        replica_lock(r->repl_lock);
496
508
        isInc = (r->repl_state_flags & REPLICA_INCREMENTAL_IN_PROGRESS);
497
509
        /* check to see if the replica is in use and log a warning if not */
498
510
        if (!(r->repl_state_flags & REPLICA_IN_USE))
517
529
                else
518
530
                        r->repl_state_flags &= ~(REPLICA_TOTAL_IN_PROGRESS);
519
531
        }
520
 
        PR_Unlock(r->repl_lock);
 
532
        replica_unlock(r->repl_lock);
521
533
}
522
534
 
523
535
/* 
564
576
        ReplicaId rid;
565
577
        PR_ASSERT(r);
566
578
 
567
 
        PR_Lock(r->repl_lock);
 
579
        replica_lock(r->repl_lock);
568
580
        rid = r->repl_rid;
569
 
        PR_Unlock(r->repl_lock);
 
581
        replica_unlock(r->repl_lock);
570
582
        return rid;
571
583
}
572
584
 
578
590
{
579
591
        PR_ASSERT(r);
580
592
 
581
 
        PR_Lock(r->repl_lock);
 
593
        replica_lock(r->repl_lock);
582
594
        r->repl_rid = rid;
583
 
        PR_Unlock(r->repl_lock);
 
595
        replica_unlock(r->repl_lock);
584
596
}
585
597
 
586
598
/* Returns true if replica was initialized through ORC or import;
605
617
 
606
618
        PR_ASSERT(r);
607
619
 
608
 
        PR_Lock(r->repl_lock);
 
620
        replica_lock(r->repl_lock);
609
621
 
610
622
        PR_ASSERT (r->repl_ruv);
611
623
 
613
625
 
614
626
        ruv = r->repl_ruv;
615
627
 
616
 
        PR_Unlock(r->repl_lock);
 
628
        replica_unlock(r->repl_lock);
617
629
 
618
630
        return ruv;
619
631
}
628
640
{
629
641
        PR_ASSERT(r && ruv);
630
642
 
631
 
        PR_Lock(r->repl_lock);
 
643
        replica_lock(r->repl_lock);
632
644
 
633
645
        if(NULL != r->repl_ruv) 
634
646
        {
664
676
        r->repl_ruv = object_new((void*)ruv, (FNFree)ruv_destroy);
665
677
        r->repl_ruv_dirty = PR_TRUE;
666
678
 
667
 
        PR_Unlock(r->repl_lock);
 
679
        replica_unlock(r->repl_lock);
668
680
}
669
681
 
670
682
/*
702
714
        else
703
715
        {
704
716
                RUV *ruv;
705
 
                PR_Lock(r->repl_lock);
 
717
                replica_lock(r->repl_lock);
706
718
                
707
719
                if (r->repl_ruv != NULL)
708
720
                {
769
781
                                slapi_sdn_get_dn(r->repl_root));
770
782
                        rc = RUV_NOTFOUND;
771
783
                }
772
 
                PR_Unlock(r->repl_lock);
 
784
                replica_unlock(r->repl_lock);
773
785
        }
774
786
        return rc;
775
787
}
785
797
 
786
798
        PR_ASSERT(r);
787
799
 
788
 
        PR_Lock(r->repl_lock);
 
800
        replica_lock(r->repl_lock);
789
801
 
790
802
        object_acquire (r->repl_csngen);
791
803
        csngen = r->repl_csngen;
792
804
 
793
 
        PR_Unlock(r->repl_lock);
 
805
        replica_unlock(r->repl_lock);
794
806
 
795
807
        return csngen;
796
808
}
831
843
{
832
844
        PR_ASSERT(r);
833
845
 
834
 
        PR_Lock(r->repl_lock);
 
846
        replica_lock(r->repl_lock);
835
847
        r->repl_type = type;
836
 
        PR_Unlock(r->repl_lock);
 
848
        replica_unlock(r->repl_lock);
837
849
}
838
850
 
839
851
/* 
859
871
        char *replstate = NULL;
860
872
        PR_ASSERT(r);
861
873
 
862
 
    PR_Lock(r->repl_lock);
 
874
    replica_lock(r->repl_lock);
863
875
 
864
876
    legacy2mmr = r->legacy_consumer && !legacy_consumer;
865
877
 
881
893
    }
882
894
 
883
895
    r->legacy_consumer = legacy_consumer;
884
 
        repl_root_sdn = slapi_sdn_dup(r->repl_root);
885
 
    PR_Unlock(r->repl_lock);
 
896
    repl_root_sdn = slapi_sdn_dup(r->repl_root);
 
897
    replica_unlock(r->repl_lock);
886
898
 
887
899
    if (legacy2mmr)
888
900
    {
901
913
{
902
914
    char *purl;
903
915
 
904
 
    PR_Lock (r->repl_lock);
 
916
    replica_lock(r->repl_lock);
905
917
 
906
918
    PR_ASSERT (r->legacy_consumer);
907
919
 
908
 
    purl = slapi_ch_strdup (r->legacy_purl);
 
920
    purl = slapi_ch_strdup(r->legacy_purl);
909
921
 
910
 
    PR_Unlock (r->repl_lock);
 
922
    replica_unlock(r->repl_lock);
911
923
 
912
924
    return purl;
913
925
}
915
927
void 
916
928
replica_set_legacy_purl (Replica *r, const char *purl)
917
929
{
918
 
    PR_Lock (r->repl_lock);
 
930
    replica_lock(r->repl_lock);
919
931
 
920
932
    PR_ASSERT (r->legacy_consumer);
921
933
 
922
 
        /* slapi_ch_free accepts NULL pointer */
923
 
        slapi_ch_free ((void**)&r->legacy_purl);
 
934
    /* slapi_ch_free accepts NULL pointer */
 
935
    slapi_ch_free ((void**)&r->legacy_purl);
924
936
 
925
937
    r->legacy_purl = slapi_ch_strdup (purl);
926
938
 
927
 
    PR_Unlock (r->repl_lock);
 
939
    replica_unlock(r->repl_lock);
928
940
}
929
941
 
930
942
/* 
937
949
 
938
950
        PR_ASSERT (r);
939
951
 
940
 
        PR_Lock(r->repl_lock);
 
952
        replica_lock(r->repl_lock);
941
953
 
942
954
    if (sdn == NULL)
943
955
    {
952
964
                result = replica_updatedn_list_ismember(r->updatedn_list, sdn);
953
965
    }
954
966
 
955
 
        PR_Unlock(r->repl_lock);
 
967
        replica_unlock(r->repl_lock);
956
968
 
957
969
        return result;
958
970
}
965
977
{
966
978
        PR_ASSERT (r);
967
979
 
968
 
        PR_Lock(r->repl_lock);
 
980
        replica_lock(r->repl_lock);
969
981
 
970
982
        if (!r->updatedn_list)
971
983
                r->updatedn_list = replica_updatedn_list_new(NULL);
978
990
        else if (SLAPI_IS_MOD_ADD(mod_op))
979
991
                replica_updatedn_list_add(r->updatedn_list, vs);
980
992
 
981
 
        PR_Unlock(r->repl_lock);
 
993
        replica_unlock(r->repl_lock);
982
994
}
983
995
 
984
996
void
985
997
replica_reset_csn_pl(Replica *r)
986
998
{
987
 
    PR_Lock(r->repl_lock);
 
999
    replica_lock(r->repl_lock);
988
1000
 
989
1001
    if (NULL != r->min_csn_pl){
990
1002
        csnplFree (&r->min_csn_pl);
991
1003
    }
992
1004
    r->min_csn_pl = csnplNew();
993
1005
 
994
 
    PR_Unlock(r->repl_lock);
 
1006
    replica_unlock(r->repl_lock);
995
1007
}
996
1008
 
997
1009
/* gets current replica generation for this replica */
1000
1012
    int rc = 0;
1001
1013
    char *gen = NULL;
1002
1014
 
1003
 
    if (r)
 
1015
    if (r && r->repl_ruv)
1004
1016
    {        
1005
 
        PR_Lock(r->repl_lock);
1006
 
 
1007
 
        PR_ASSERT (r->repl_ruv);
 
1017
        replica_lock(r->repl_lock);
1008
1018
                
1009
1019
        if (rc == 0)
1010
1020
            gen = ruv_get_replica_generation ((RUV*)object_get_data (r->repl_ruv));
1011
1021
 
1012
 
        PR_Unlock(r->repl_lock);    
 
1022
        replica_unlock(r->repl_lock);
1013
1023
    }
1014
1024
 
1015
1025
    return gen;
1028
1038
    if (r == NULL)
1029
1039
        return;
1030
1040
 
1031
 
        PR_Lock(r->repl_lock);
 
1041
    replica_lock(r->repl_lock);
1032
1042
 
1033
1043
    if (clear)
1034
1044
    {
1039
1049
        r->repl_flags |= flag;
1040
1050
    }
1041
1051
 
1042
 
        PR_Unlock(r->repl_lock);
 
1052
    replica_unlock(r->repl_lock);
1043
1053
}
1044
1054
 
1045
1055
void replica_replace_flags (Replica *r, PRUint32 flags)
1046
1056
{
1047
1057
    if (r)
1048
1058
    {
1049
 
                PR_Lock(r->repl_lock);
 
1059
        replica_lock(r->repl_lock);
1050
1060
        r->repl_flags = flags;
1051
 
                PR_Unlock(r->repl_lock);
 
1061
        replica_unlock(r->repl_lock);
1052
1062
    }
1053
1063
}
1054
1064
 
1055
1065
void
1056
1066
replica_get_referrals(const Replica *r, char ***referrals)
1057
1067
{
1058
 
    PR_Lock(r->repl_lock);
 
1068
    replica_lock(r->repl_lock);
1059
1069
    replica_get_referrals_nolock (r, referrals);
1060
 
    PR_Unlock(r->repl_lock);
 
1070
    replica_unlock(r->repl_lock);
1061
1071
}
1062
1072
 
1063
1073
void
1141
1151
        csn = (CSN*)extracsn; /* use this csn to do the update */
1142
1152
    }
1143
1153
 
1144
 
    PR_Lock(r->repl_lock);
 
1154
    replica_lock(r->repl_lock);
1145
1155
 
1146
1156
    gen = (CSNGen *)object_get_data (r->repl_csngen);
1147
1157
    PR_ASSERT (gen);
1151
1161
 
1152
1162
/* done: */
1153
1163
 
1154
 
    PR_Unlock(r->repl_lock);
 
1164
    replica_unlock(r->repl_lock);
1155
1165
    if (csn != extracsn) /* do not free the given csn */
1156
1166
    {
1157
1167
        csn_free (&csn);
1172
1182
void
1173
1183
replica_dump(Replica *r)
1174
1184
{
1175
 
        char *updatedn_list = NULL;
1176
 
        PR_ASSERT (r);
 
1185
    char *updatedn_list = NULL;
 
1186
    PR_ASSERT (r);
1177
1187
 
1178
 
        PR_Lock(r->repl_lock);
 
1188
    replica_lock(r->repl_lock);
1179
1189
 
1180
1190
    slapi_log_error(SLAPI_LOG_REPL, repl_plugin_name, "Replica state:\n");      
1181
1191
    slapi_log_error(SLAPI_LOG_REPL, repl_plugin_name, "\treplica root: %s\n",
1185
1195
    slapi_log_error(SLAPI_LOG_REPL, repl_plugin_name, "\treplica id: %d\n", r->repl_rid);
1186
1196
    slapi_log_error(SLAPI_LOG_REPL, repl_plugin_name, "\tflags: %d\n", r->repl_flags);
1187
1197
    slapi_log_error(SLAPI_LOG_REPL, repl_plugin_name, "\tstate flags: %lu\n", r->repl_state_flags);
1188
 
        if (r->updatedn_list)
1189
 
                updatedn_list = replica_updatedn_list_to_string(r->updatedn_list, "\n\t\t");
 
1198
    if (r->updatedn_list)
 
1199
        updatedn_list = replica_updatedn_list_to_string(r->updatedn_list, "\n\t\t");
1190
1200
    slapi_log_error(SLAPI_LOG_REPL, repl_plugin_name, "\tupdate dn: %s\n",
1191
1201
            updatedn_list? updatedn_list : "not configured");
1192
 
        slapi_ch_free_string(&updatedn_list);
 
1202
    slapi_ch_free_string(&updatedn_list);
1193
1203
    slapi_log_error(SLAPI_LOG_REPL, repl_plugin_name, "\truv: %s configured and is %sdirty\n",
1194
1204
                    r->repl_ruv ? "" : "not", r->repl_ruv_dirty ? "" : "not ");
1195
1205
    slapi_log_error(SLAPI_LOG_REPL, repl_plugin_name, "\tCSN generator: %s configured\n",
1196
1206
                    r->repl_csngen ? "" : "not");
1197
1207
        /* JCMREPL - Dump Referrals */
1198
1208
 
1199
 
        PR_Unlock(r->repl_lock);
 
1209
    replica_unlock(r->repl_lock);
1200
1210
}
1201
1211
 
1202
1212
 
1212
1222
{
1213
1223
    CSN *csn;
1214
1224
 
1215
 
    PR_Lock(r->repl_lock);
 
1225
    replica_lock(r->repl_lock);
1216
1226
 
1217
1227
    csn= _replica_get_purge_csn_nolock(r);
1218
1228
 
1219
 
    PR_Unlock(r->repl_lock);
 
1229
    replica_unlock(r->repl_lock);
1220
1230
 
1221
1231
    return csn;
1222
1232
}
1239
1249
    
1240
1250
    PR_ASSERT (r);
1241
1251
 
1242
 
    PR_Lock(r->repl_lock);
 
1252
    replica_lock(r->repl_lock);
1243
1253
 
1244
1254
    rc = replica_log_ruv_elements_nolock (r);
1245
1255
 
1246
 
    PR_Unlock(r->repl_lock);
 
1256
    replica_unlock(r->repl_lock);
1247
1257
 
1248
1258
    return rc;
1249
1259
}
1258
1268
        int state_backend = -1;
1259
1269
        const char *mtn_state = NULL;
1260
1270
        
1261
 
    PR_Lock (r->repl_lock);
 
1271
        replica_lock(r->repl_lock);
1262
1272
 
1263
1273
        if ( supplierRuv == NULL )
1264
1274
        {
1284
1294
                state_backend = 1;
1285
1295
        }
1286
1296
        /* Unlock to avoid changing MTN state under repl lock */
1287
 
    PR_Unlock (r->repl_lock);
 
1297
        replica_unlock(r->repl_lock);
1288
1298
 
1289
1299
        if(state_backend == 0 )
1290
1300
        {
1311
1321
 
1312
1322
    PR_ASSERT (r);
1313
1323
 
1314
 
    PR_Lock (r->repl_lock);
 
1324
    replica_lock(r->repl_lock);
1315
1325
 
1316
1326
    if (enable)
1317
1327
    {
1333
1343
        }   
1334
1344
    }
1335
1345
 
1336
 
    PR_Unlock (r->repl_lock);
 
1346
    replica_unlock(r->repl_lock);
1337
1347
}
1338
1348
 
1339
1349
/* This function is generally called when replica's data store
1357
1367
 
1358
1368
    PR_ASSERT (r);
1359
1369
 
1360
 
    PR_Lock (r->repl_lock);
 
1370
    replica_lock(r->repl_lock);
1361
1371
 
1362
1372
    old_ruv_obj = r->repl_ruv;
1363
1373
 
1365
1375
 
1366
1376
    rc = _replica_configure_ruv (r, PR_TRUE);
1367
1377
 
1368
 
    PR_Unlock (r->repl_lock);
 
1378
    replica_unlock(r->repl_lock);
1369
1379
 
1370
1380
    if (rc != 0)
1371
1381
    {
1386
1396
           up to date using this changelog and hence will need to be reinitialized */
1387
1397
 
1388
1398
        /* replace ruv to make sure we work with the correct changelog file */
1389
 
        PR_Lock (r->repl_lock);
 
1399
        replica_lock(r->repl_lock);
1390
1400
 
1391
1401
        new_ruv_obj = r->repl_ruv;
1392
1402
        r->repl_ruv = old_ruv_obj;
1393
1403
 
1394
 
        PR_Unlock (r->repl_lock);
 
1404
        replica_unlock(r->repl_lock);
1395
1405
 
1396
1406
        rc = cl5GetUpperBoundRUV (r, &upper_bound_ruv);
1397
1407
        if (rc != CL5_SUCCESS && rc != CL5_NOTFOUND)
1423
1433
                rc = cl5DeleteDBSync (r_obj);
1424
1434
 
1425
1435
                /* reinstate new ruv */
1426
 
                PR_Lock (r->repl_lock);
 
1436
                replica_lock(r->repl_lock);
1427
1437
 
1428
1438
                r->repl_ruv = new_ruv_obj;                
1429
1439
 
1435
1445
                    rc = replica_log_ruv_elements_nolock (r);
1436
1446
                }
1437
1447
 
1438
 
                PR_Unlock (r->repl_lock);
 
1448
                replica_unlock(r->repl_lock);
1439
1449
            } 
1440
1450
            else
1441
1451
            {
1442
1452
                /* we just need to reinstate new ruv */
1443
 
                PR_Lock (r->repl_lock);
 
1453
                replica_lock(r->repl_lock);
1444
1454
 
1445
1455
                r->repl_ruv = new_ruv_obj;
1446
1456
 
1447
 
                PR_Unlock (r->repl_lock);
 
1457
                replica_unlock(r->repl_lock);
1448
1458
            }                           
1449
1459
        }
1450
1460
        else    /* upper bound vector is not there - we have no changes logged */
1451
1461
        {
1452
1462
            /* reinstate new ruv */
1453
 
            PR_Lock (r->repl_lock);
 
1463
            replica_lock(r->repl_lock);
1454
1464
 
1455
1465
            r->repl_ruv = new_ruv_obj;
1456
1466
 
1458
1468
               a starting point for iteration through the changes */
1459
1469
            rc = replica_log_ruv_elements_nolock (r);
1460
1470
 
1461
 
            PR_Unlock (r->repl_lock);                    
 
1471
            replica_unlock(r->repl_lock);
1462
1472
        }        
1463
1473
    }
1464
1474
 
2301
2311
 
2302
2312
                                        /* Update also the directory entry */
2303
2313
                                        if (RUV_UPDATE_PARTIAL == need_update) {
2304
 
                                                /* richm 20010821 bug 556498
2305
 
                                                   replica_replace_ruv_tombstone acquires the repl_lock, so release
2306
 
                                                   the lock then reacquire it if locked */
2307
 
                                                if (isLocked) PR_Unlock(r->repl_lock);
2308
2314
                                                replica_replace_ruv_tombstone(r);
2309
 
                                                if (isLocked) PR_Lock(r->repl_lock);
2310
2315
                                        } else if (RUV_UPDATE_FULL == need_update) {
2311
2316
                                                _delete_tombstone(slapi_sdn_get_dn(r->repl_root), 
2312
2317
                                                                  RUV_STORAGE_ENTRY_UNIQUEID, 
2490
2495
                goto done;
2491
2496
        }
2492
2497
 
2493
 
        PR_Lock(r->repl_lock);
 
2498
        replica_lock(r->repl_lock);
2494
2499
 
2495
2500
        /* replica state is currently being updated
2496
2501
           or no CSN was assigned - bail out */
2497
2502
        if (r->state_update_inprogress)
2498
2503
        {
2499
 
                PR_Unlock(r->repl_lock); 
 
2504
                replica_unlock(r->repl_lock);
2500
2505
                goto done;
2501
2506
        }
2502
2507
 
2504
2509
        if (!r->repl_csn_assigned)
2505
2510
        {
2506
2511
                /* EY: the consumer needs to flush ruv to disk. */
2507
 
                PR_Unlock(r->repl_lock);
 
2512
                replica_unlock(r->repl_lock);
2508
2513
                if (replica_write_ruv(r)) {
2509
2514
                        slapi_log_error(SLAPI_LOG_REPL, repl_plugin_name,
2510
2515
                                "_replica_update_state: failed write RUV for %s\n",
2519
2524
        rc = csngen_get_state ((CSNGen*)object_get_data (r->repl_csngen), &smod);
2520
2525
        if (rc != 0)
2521
2526
        {
2522
 
                PR_Unlock(r->repl_lock);
 
2527
                replica_unlock(r->repl_lock);
2523
2528
                goto done;
2524
2529
        }
2525
2530
 
2531
2536
                slapi_log_error(SLAPI_LOG_FATAL, repl_plugin_name,
2532
2537
                        "replica_update_state: failed to get the config dn for %s\n",
2533
2538
                        slapi_sdn_get_dn (r->repl_root));
2534
 
                PR_Unlock(r->repl_lock);
 
2539
                replica_unlock(r->repl_lock);
2535
2540
                goto done;
2536
2541
        }
2537
2542
        pb = slapi_pblock_new();
2540
2545
        /* we don't want to held lock during operations since it causes lock contention
2541
2546
       and sometimes deadlock. So releasing lock here */
2542
2547
 
2543
 
    PR_Unlock(r->repl_lock);
 
2548
        replica_unlock(r->repl_lock);
2544
2549
 
2545
2550
        /* replica repl_name and new_name attributes do not get changed once
2546
2551
       the replica is configured - so it is ok that they are outside replica lock */
2611
2616
 
2612
2617
        PR_ASSERT(r);
2613
2618
 
2614
 
    PR_Lock(r->repl_lock);
 
2619
        replica_lock(r->repl_lock);
2615
2620
 
2616
 
    if (!r->repl_ruv_dirty)
2617
 
    {
2618
 
        PR_Unlock(r->repl_lock);
2619
 
        return rc;
2620
 
    }
 
2621
        if (!r->repl_ruv_dirty)
 
2622
        {
 
2623
                replica_unlock(r->repl_lock);
 
2624
                return rc;
 
2625
        }
2621
2626
 
2622
2627
        PR_ASSERT (r->repl_ruv);
2623
2628
        
2624
2629
        ruv_to_smod ((RUV*)object_get_data(r->repl_ruv), &smod);
2625
2630
        ruv_last_modified_to_smod ((RUV*)object_get_data(r->repl_ruv), &smod_last_modified);
2626
2631
 
2627
 
    PR_Unlock (r->repl_lock);
 
2632
        replica_unlock (r->repl_lock);
2628
2633
 
2629
2634
        mods [0] = (LDAPMod *)slapi_mod_get_ldapmod_byref(&smod);
2630
2635
        mods [1] = (LDAPMod *)slapi_mod_get_ldapmod_byref(&smod_last_modified);
2631
2636
        mods [2] = NULL;
2632
2637
        pb = slapi_pblock_new();
2633
2638
 
2634
 
    /* replica name never changes so it is ok to reference it outside the lock */
 
2639
        /* replica name never changes so it is ok to reference it outside the lock */
2635
2640
        slapi_modify_internal_set_pb_ext(
2636
2641
                pb,
2637
2642
                r->repl_root, /* only used to select be */
2646
2651
        slapi_pblock_get(pb, SLAPI_PLUGIN_INTOP_RESULT, &rc);
2647
2652
 
2648
2653
    /* ruv does not exist - create one */
2649
 
    PR_Lock(r->repl_lock);
 
2654
    replica_lock(r->repl_lock);
2650
2655
 
2651
2656
    if (rc == LDAP_SUCCESS)
2652
2657
    {
2668
2673
                        slapi_sdn_get_dn(r->repl_root), rc);
2669
2674
        }
2670
2675
 
2671
 
    PR_Unlock(r->repl_lock);    
 
2676
        replica_unlock(r->repl_lock);
2672
2677
        
2673
2678
        slapi_mod_done (&smod);
2674
2679
        slapi_mod_done (&smod_last_modified);
3016
3021
done:
3017
3022
        if (replica)
3018
3023
        {
3019
 
                PR_Lock(replica->repl_lock);
 
3024
                replica_lock(replica->repl_lock);
3020
3025
                replica->tombstone_reap_active = PR_FALSE;
3021
 
                PR_Unlock(replica->repl_lock);
 
3026
                replica_unlock(replica->repl_lock);
3022
3027
        }
3023
3028
 
3024
3029
        if (NULL != purge_csn)
3072
3077
                        if (replica)
3073
3078
                        {
3074
3079
 
3075
 
                                PR_Lock(replica->repl_lock);
 
3080
                                replica_lock(replica->repl_lock);
3076
3081
 
3077
3082
                                /* No action if purge is disabled or the previous purge is not done yet */
3078
3083
                                if (replica->tombstone_reap_interval != 0 &&
3093
3098
                                        }
3094
3099
                                }
3095
3100
                                /* reap thread will wait until this lock is released */
3096
 
                                PR_Unlock(replica->repl_lock);
 
3101
                                replica_unlock(replica->repl_lock);
3097
3102
                        }
3098
3103
                        object_release(replica_object);
3099
3104
                        replica_object = NULL;
3236
3241
    ruv = (RUV*)object_get_data (ruv_obj);
3237
3242
    PR_ASSERT (ruv);
3238
3243
 
3239
 
    PR_Lock(r->repl_lock);
 
3244
    replica_lock(r->repl_lock);
3240
3245
 
3241
3246
    r->repl_csn_assigned = PR_TRUE;
3242
3247
        
3258
3263
 
3259
3264
    ruv_add_csn_inprogress (ruv, csn);
3260
3265
 
3261
 
    PR_Unlock(r->repl_lock);
 
3266
    replica_unlock(r->repl_lock);
3262
3267
 
3263
3268
    object_release (ruv_obj);
3264
3269
}
3280
3285
    ruv = (RUV*)object_get_data (ruv_obj);
3281
3286
    PR_ASSERT (ruv);
3282
3287
 
3283
 
        PR_Lock(r->repl_lock);
 
3288
    replica_lock(r->repl_lock);
3284
3289
 
3285
3290
        if (NULL != r->min_csn_pl)
3286
3291
        {
3289
3294
        }
3290
3295
 
3291
3296
    ruv_cancel_csn_inprogress (ruv, csn);
3292
 
        PR_Unlock(r->repl_lock);
 
3297
    replica_unlock(r->repl_lock);
3293
3298
 
3294
3299
    object_release (ruv_obj);
3295
3300
}
3451
3456
replica_set_purge_delay(Replica *r, PRUint32 purge_delay)
3452
3457
{
3453
3458
        PR_ASSERT(r);
3454
 
        PR_Lock(r->repl_lock);
 
3459
        replica_lock(r->repl_lock);
3455
3460
        r->repl_purge_delay = purge_delay;
3456
 
        PR_Unlock(r->repl_lock);
 
3461
        replica_unlock(r->repl_lock);
3457
3462
}
3458
3463
 
3459
3464
void
3461
3466
{
3462
3467
        char *repl_name;
3463
3468
 
3464
 
        PR_Lock(r->repl_lock);
 
3469
        replica_lock(r->repl_lock);
3465
3470
 
3466
3471
        /*
3467
3472
         * Leave the event there to purge the existing tombstones
3490
3495
                        "tombstone_reap event (interval=%ld) was %s\n",
3491
3496
                        r->tombstone_reap_interval, (r->repl_eqcxt_tr ? "scheduled" : "not scheduled successfully"));
3492
3497
        }
3493
 
        PR_Unlock(r->repl_lock);
 
3498
        replica_unlock(r->repl_lock);
3494
3499
}
3495
3500
 
3496
3501
static void
3531
3536
 
3532
3537
    replica_strip_cleaned_rids(r);
3533
3538
 
3534
 
    PR_Lock(r->repl_lock);
 
3539
    replica_lock(r->repl_lock);
3535
3540
 
3536
3541
    PR_ASSERT (r->repl_ruv);
3537
3542
    ruv_to_smod ((RUV*)object_get_data(r->repl_ruv), &smod);
3543
3548
            "replica_replace_ruv_tombstone: "
3544
3549
            "failed to get the config dn for %s\n",
3545
3550
            slapi_sdn_get_dn (r->repl_root));
3546
 
        PR_Unlock(r->repl_lock);
 
3551
        replica_unlock(r->repl_lock);
3547
3552
        goto bail;
3548
3553
    }
3549
3554
    mods[0] = (LDAPMod*)slapi_mod_get_ldapmod_byref(&smod);
3550
3555
    mods[1] = (LDAPMod*)slapi_mod_get_ldapmod_byref(&smod_last_modified);
3551
3556
 
3552
 
    PR_Unlock (r->repl_lock);
 
3557
    replica_unlock(r->repl_lock);
3553
3558
 
3554
3559
    mods [2] = NULL;
3555
3560
    pb = slapi_pblock_new();
3594
3599
        {
3595
3600
                RUV *local_ruv = NULL;
3596
3601
 
3597
 
                PR_Lock(r->repl_lock);
 
3602
                replica_lock(r->repl_lock);
3598
3603
 
3599
3604
                local_ruv =  (RUV*)object_get_data (r->repl_ruv);
3600
3605
 
3601
3606
                if(is_cleaned_rid(supplier_id) || local_ruv == NULL){
3602
 
                        PR_Unlock(r->repl_lock);
 
3607
                        replica_unlock(r->repl_lock);
3603
3608
                        return;
3604
3609
                }
3605
3610
 
3621
3626
                        /* Replace it */
3622
3627
                        ruv_replace_replica_purl(local_ruv, supplier_id, supplier_purl);
3623
3628
                }
3624
 
                PR_Unlock(r->repl_lock);
 
3629
                replica_unlock(r->repl_lock);
3625
3630
 
3626
3631
                /* Update also the directory entry */
3627
3632
                replica_replace_ruv_tombstone(r);
3632
3637
replica_set_ruv_dirty(Replica *r)
3633
3638
{
3634
3639
        PR_ASSERT(r);
3635
 
        PR_Lock(r->repl_lock);
 
3640
        replica_lock(r->repl_lock);
3636
3641
        r->repl_ruv_dirty = PR_TRUE;
3637
 
        PR_Unlock(r->repl_lock);
 
3642
        replica_unlock(r->repl_lock);
3638
3643
}
3639
3644
 
3640
3645
PRBool
3653
3658
    if (r == NULL)
3654
3659
        return;
3655
3660
 
3656
 
        PR_Lock(r->repl_lock);
 
3661
    replica_lock(r->repl_lock);
3657
3662
 
3658
3663
    if (clear)
3659
3664
    {
3664
3669
        r->repl_state_flags |= flag;
3665
3670
    }
3666
3671
 
3667
 
        PR_Unlock(r->repl_lock);
 
3672
    replica_unlock(r->repl_lock);
3668
3673
}
3669
3674
 
3670
3675
/**
3678
3683
    if (r == NULL)
3679
3684
        return;
3680
3685
 
3681
 
        PR_Lock(r->repl_lock);
3682
 
        r->tombstone_reap_stop = val;
3683
 
        PR_Unlock(r->repl_lock);
 
3686
    replica_lock(r->repl_lock);
 
3687
    r->tombstone_reap_stop = val;
 
3688
    replica_unlock(r->repl_lock);
3684
3689
}
3685
3690
 
3686
3691
/* replica just came back online, probably after data was reloaded */