Skip to content

Commit 323ae3e

Browse files
committed
Improve BlipTesterClient locking
1 parent 93a7ff0 commit 323ae3e

File tree

1 file changed

+27
-12
lines changed

1 file changed

+27
-12
lines changed

rest/utilities_testing_blip_client.go

Lines changed: 27 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -206,6 +206,11 @@ func (cd *clientDoc) _docRevSeqsNewestToOldest() []clientSeq {
206206
func (cd *clientDoc) latestRev() (*clientDocRev, error) {
207207
cd.lock.RLock()
208208
defer cd.lock.RUnlock()
209+
return cd._latestRev()
210+
}
211+
212+
// _latestRev returns the latest revision of the document.
213+
func (cd *clientDoc) _latestRev() (*clientDocRev, error) {
209214
if cd._latestSeq == 0 {
210215
return nil, nil
211216
}
@@ -220,6 +225,11 @@ func (cd *clientDoc) latestRev() (*clientDocRev, error) {
220225
func (cd *clientDoc) addNewRev(rev clientDocRev) {
221226
cd.lock.Lock()
222227
defer cd.lock.Unlock()
228+
cd._addNewRev(rev)
229+
}
230+
231+
// addNewRev adds a new revision to the document.
232+
func (cd *clientDoc) _addNewRev(rev clientDocRev) {
223233
cd._latestSeq = rev.clientSeq
224234
cd._revisionsBySeq[rev.clientSeq] = rev
225235
cd._seqsByVersions[rev.version] = rev.clientSeq
@@ -550,6 +560,9 @@ func (btr *BlipTesterReplicator) initHandlers(btc *BlipTesterClient) {
550560
}
551561
}
552562

563+
doc.lock.Lock()
564+
defer doc.lock.Unlock()
565+
553566
var newVersion DocVersion
554567
var hlv db.HybridLogicalVector
555568
if btc.UseHLV() {
@@ -576,8 +589,8 @@ func (btr *BlipTesterReplicator) initHandlers(btc *BlipTesterClient) {
576589
}
577590

578591
// remove existing entry and replace with new seq
579-
delete(btcr._seqStore, doc.latestSeq())
580-
doc.addNewRev(docRev)
592+
delete(btcr._seqStore, doc._latestSeq)
593+
doc._addNewRev(docRev)
581594
btcr._seqStore[newClientSeq] = doc
582595
btcr._seqFromDocID[docID] = newClientSeq
583596

@@ -591,11 +604,9 @@ func (btr *BlipTesterReplicator) initHandlers(btc *BlipTesterClient) {
591604
replacedVersion = DocVersion{RevTreeID: revID}
592605
}
593606
// store the new sequence for a replaced rev for tests waiting for this specific rev
594-
doc.lock.Lock()
595607
doc._seqsByVersions[replacedVersion] = newClientSeq
596-
doc.lock.Unlock()
597608
}
598-
doc.setLatestServerVersion(newVersion)
609+
doc._latestServerVersion = newVersion
599610

600611
if !msg.NoReply() {
601612
response := msg.Response()
@@ -772,6 +783,8 @@ func (btr *BlipTesterReplicator) initHandlers(btc *BlipTesterClient) {
772783
_seqsByVersions: make(map[DocVersion]clientSeq),
773784
}
774785
}
786+
doc.lock.Lock()
787+
defer doc.lock.Unlock()
775788

776789
var newVersion DocVersion
777790
var hlv db.HybridLogicalVector
@@ -797,8 +810,8 @@ func (btr *BlipTesterReplicator) initHandlers(btc *BlipTesterClient) {
797810
}
798811

799812
// remove existing entry and replace with new seq
800-
delete(btcr._seqStore, doc.latestSeq())
801-
doc.addNewRev(docRev)
813+
delete(btcr._seqStore, doc._latestSeq)
814+
doc._addNewRev(docRev)
802815
btcr._seqStore[newClientSeq] = doc
803816
btcr._seqFromDocID[docID] = newClientSeq
804817

@@ -812,11 +825,9 @@ func (btr *BlipTesterReplicator) initHandlers(btc *BlipTesterClient) {
812825
replacedVersion = DocVersion{RevTreeID: replacedRev}
813826
}
814827
// store the new sequence for a replaced rev for tests waiting for this specific rev
815-
doc.lock.Lock()
816828
doc._seqsByVersions[replacedVersion] = newClientSeq
817-
doc.lock.Unlock()
818829
}
819-
doc.setLatestServerVersion(newVersion)
830+
doc._latestServerVersion = newVersion
820831

821832
if !msg.NoReply() {
822833
response := msg.Response()
@@ -1493,11 +1504,15 @@ func (btc *BlipTesterCollectionClient) upsertDoc(docID string, parentVersion *Do
14931504
_seqsByVersions: make(map[DocVersion]clientSeq, 1),
14941505
}
14951506
}
1507+
1508+
doc.lock.Lock()
1509+
defer doc.lock.Unlock()
1510+
14961511
newGen := 1
14971512
var hlv db.HybridLogicalVector
14981513
if parentVersion != nil {
14991514
// grab latest version for this doc and make sure we're doing an upsert on top of it to avoid branching revisions
1500-
latestRev, err := doc.latestRev()
1515+
latestRev, err := doc._latestRev()
15011516
require.NoError(btc.TB(), err)
15021517
latestVersion := latestRev.version
15031518
// CV or RevTreeID match is enough to ensure we're updating the latest revision
@@ -1526,7 +1541,7 @@ func (btc *BlipTesterCollectionClient) upsertDoc(docID string, parentVersion *Do
15261541
btc._seqLast++
15271542
newSeq := btc._seqLast
15281543
rev := clientDocRev{clientSeq: newSeq, version: docVersion, body: body, HLV: hlv, isDelete: body == nil}
1529-
doc.addNewRev(rev)
1544+
doc._addNewRev(rev)
15301545

15311546
btc._seqStore[newSeq] = doc
15321547
btc._seqFromDocID[docID] = newSeq

0 commit comments

Comments
 (0)