diff --git a/db/crud.go b/db/crud.go index 77edde760a..94d62f01c4 100644 --- a/db/crud.go +++ b/db/crud.go @@ -2685,7 +2685,7 @@ func (db *DatabaseCollectionWithUser) RevDiff(ctx context.Context, docid string, doc, err := db.GetDocSyncDataNoImport(ctx, docid, DocUnmarshalHistory) if err != nil { - if !base.IsDocNotFoundError(err) && !errors.Is(err, base.ErrXattrNotFound) { + if !base.IsDocNotFoundError(err) && !base.IsXattrNotFoundError(err) { base.WarnfCtx(ctx, "RevDiff(%q) --> %T %v", base.UD(docid), err, err) } missing = revids @@ -2747,7 +2747,7 @@ func (db *DatabaseCollectionWithUser) CheckProposedRev(ctx context.Context, doci } doc, err := db.GetDocSyncDataNoImport(ctx, docid, level) if err != nil { - if !base.IsDocNotFoundError(err) && !errors.Is(err, base.ErrXattrNotFound) { + if !base.IsDocNotFoundError(err) && !base.IsXattrNotFoundError(err) { base.WarnfCtx(ctx, "CheckProposedRev(%q) --> %T %v", base.UD(docid), err, err) return ProposedRev_Error, "" } diff --git a/db/crud_test.go b/db/crud_test.go index 85109295a6..413431383f 100644 --- a/db/crud_test.go +++ b/db/crud_test.go @@ -1806,3 +1806,24 @@ func TestDocUpdateCorruptSequence(t *testing.T) { return db.DbStats.Database().CorruptSequenceCount.Value() }, 1) } + +func TestPutResurrection(t *testing.T) { + base.SetUpTestLogging(t, base.LevelDebug, base.KeyAll) + + db, ctx := setupTestDB(t) + defer db.Close(ctx) + + startWarnCount := base.SyncGatewayStats.GlobalStats.ResourceUtilization.WarnCount.Value() + collection, ctx := GetSingleDatabaseCollectionWithUser(ctx, t, db) + + const docID = "doc1" + _, _, err := collection.Put(ctx, docID, Body{"foo": "bar"}) + require.NoError(t, err) + + require.NoError(t, collection.Purge(ctx, docID, false)) + // assert no warnings when re-pushing a resurrection + _, _, err = collection.Put(ctx, docID, Body{"resurrect": true}) + require.NoError(t, err) + + require.Equal(t, startWarnCount, base.SyncGatewayStats.GlobalStats.ResourceUtilization.WarnCount.Value()) +} diff --git a/db/document.go b/db/document.go index b8a6b82646..e31fb05794 100644 --- a/db/document.go +++ b/db/document.go @@ -272,7 +272,6 @@ func (doc *Document) Body(ctx context.Context) Body { } if doc._rawBody == nil { - base.WarnfCtx(ctx, "Null doc body/rawBody %s/%s from %s", base.UD(doc.ID), base.UD(doc.RevID), caller) return nil } @@ -319,17 +318,11 @@ func (doc *Document) HasBody() bool { } func (doc *Document) BodyBytes(ctx context.Context) ([]byte, error) { - var caller string - if base.ConsoleLogLevel().Enabled(base.LevelTrace) { - caller = base.GetCallersName(1, true) - } - if doc._rawBody != nil { return doc._rawBody, nil } if doc._body == nil { - base.WarnfCtx(ctx, "Null doc body/rawBody %s/%s from %s", base.UD(doc.ID), base.UD(doc.RevID), caller) return nil, nil } diff --git a/rest/blip_api_crud_test.go b/rest/blip_api_crud_test.go index e7cddae4c6..3a22773de7 100644 --- a/rest/blip_api_crud_test.go +++ b/rest/blip_api_crud_test.go @@ -3243,3 +3243,37 @@ func TestChangesFeedExitDisconnect(t *testing.T) { }, time.Second*10, time.Millisecond*100) }) } + +func TestBlipPushRevOnResurrection(t *testing.T) { + for _, allowConflicts := range []bool{true, false} { + t.Run(fmt.Sprintf("allowConflicts=%t", allowConflicts), func(t *testing.T) { + btcRunner := NewBlipTesterClientRunner(t) + btcRunner.Run(func(t *testing.T, SupportedBLIPProtocols []string) { + rt := NewRestTester(t, &RestTesterConfig{ + PersistentConfig: true, + }) + defer rt.Close() + + dbConfig := rt.NewDbConfig() + dbConfig.AllowConflicts = base.Ptr(allowConflicts) + RequireStatus(t, rt.CreateDatabase("db", dbConfig), http.StatusCreated) + startWarnCount := base.SyncGatewayStats.GlobalStats.ResourceUtilization.WarnCount.Value() + docID := "doc1" + rt.CreateTestDoc(docID) + + rt.PurgeDoc(docID) + + RequireStatus(t, rt.SendAdminRequest(http.MethodGet, "/{{.keyspace}}/"+docID, ""), http.StatusNotFound) + + opts := &BlipTesterClientOpts{SupportedBLIPProtocols: SupportedBLIPProtocols, Username: "alice"} + btc := btcRunner.NewBlipTesterClientOptsWithRT(rt, opts) + defer btc.Close() + + docVersion, err := btcRunner.PushRev(btc.id, docID, EmptyDocVersion(), []byte(`{"resurrect":true}`)) + require.NoError(t, err) + require.NoError(t, rt.WaitForVersion(docID, docVersion)) + require.Equal(t, startWarnCount, base.SyncGatewayStats.GlobalStats.ResourceUtilization.WarnCount.Value()) + }) + }) + } +}