Benchmark 100% rev cache miss scenario
(b *testing.B)
| 118 | |
| 119 | // Benchmark 100% rev cache miss scenario |
| 120 | func BenchmarkReadOps_GetRevCacheMisses(b *testing.B) { |
| 121 | |
| 122 | base.DisableTestLogging(b) |
| 123 | |
| 124 | rt := NewRestTesterDefaultCollection(b, nil) // use non default in CBG-2618 |
| 125 | defer rt.Close() |
| 126 | defer PurgeDoc(rt, "doc1k") |
| 127 | |
| 128 | // Get database handle |
| 129 | rtDatabase := rt.GetDatabase() |
| 130 | revCacheSize := rtDatabase.Options.RevisionCacheOptions.MaxItemCount |
| 131 | |
| 132 | doc1k_putDoc := fmt.Sprintf(doc_1k_format, "") |
| 133 | numDocs := int(revCacheSize + 1) |
| 134 | var revid string |
| 135 | for i := 0; i < numDocs; i++ { |
| 136 | response := rt.SendAdminRequest("PUT", fmt.Sprintf("/{{.keyspace}}/doc1k_%d", i), doc1k_putDoc) |
| 137 | // revid will be the same for all docs |
| 138 | if i == 0 { |
| 139 | var body db.Body |
| 140 | require.NoError(b, base.JSONUnmarshal(response.Body.Bytes(), &body)) |
| 141 | revid = body["rev"].(string) |
| 142 | } |
| 143 | } |
| 144 | |
| 145 | // Create user |
| 146 | username := "user1" |
| 147 | rt.SendAdminRequest("PUT", "/{{.db}}/_user/"+username, fmt.Sprintf(`{"name":"%s", "password":"letmein", "admin_channels":["channel_1"]}`, username)) |
| 148 | |
| 149 | getBenchmarks := []struct { |
| 150 | name string |
| 151 | URI string |
| 152 | asUser string |
| 153 | }{ |
| 154 | {"Admin_Simple", "/{{.keyspace}}/doc1k", ""}, |
| 155 | {"Admin_WithRev", fmt.Sprintf("/{{.keyspace}}/doc1k?rev=%s", revid), ""}, |
| 156 | {"Admin_OpenRevsAll", fmt.Sprintf("/{{.keyspace}}/doc1k?open_revs=all&rev=%s", revid), ""}, |
| 157 | {"User_Simple", "/{{.keyspace}}/doc1k", username}, |
| 158 | {"User_WithRev", fmt.Sprintf("/{{.keyspace}}/doc1k?rev=%s", revid), username}, |
| 159 | {"User_OpenRevsAll", fmt.Sprintf("/{{.keyspace}}/doc1k?open_revs=all&rev=%s", revid), username}, |
| 160 | } |
| 161 | |
| 162 | for _, bm := range getBenchmarks { |
| 163 | b.Run(bm.name, func(b *testing.B) { |
| 164 | var getResponse *TestResponse |
| 165 | rt.GetDatabase().FlushRevisionCacheForTest() |
| 166 | for i := 0; i < b.N; i++ { |
| 167 | // update key in URI |
| 168 | docNum := i % numDocs |
| 169 | newDocID := fmt.Sprintf("doc1k_%d", docNum) |
| 170 | docURI := strings.Replace(bm.URI, "doc1k", newDocID, 1) |
| 171 | |
| 172 | if bm.asUser == "" { |
| 173 | getResponse = rt.SendAdminRequest("GET", docURI, "") |
| 174 | } else { |
| 175 | getResponse = rt.SendUserRequest("GET", docURI, "", bm.asUser) |
| 176 | } |
| 177 | b.StopTimer() |
nothing calls this directly
no test coverage detected