Skip to content

Commit 09b44b1

Browse files
Lindsey Reddkarmi
authored andcommitted
Util: Reinstate item.Body after it is consumed in BulkIndexer
To allow accessing the item body in success/error callbacks, reinstate it when the callbacks are defined. Closes #161 (cherry picked from commit 55d65cdfc77a15b545e12339d613f9a7270fef2f)
1 parent d51b862 commit 09b44b1

File tree

2 files changed

+46
-5
lines changed

2 files changed

+46
-5
lines changed

esutil/bulk_indexer.go

Lines changed: 20 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ import (
1010
"encoding/json"
1111
"fmt"
1212
"io"
13+
"io/ioutil"
1314
"net/http"
1415
"runtime"
1516
"strconv"
@@ -354,7 +355,7 @@ func (w *worker) run() {
354355
continue
355356
}
356357

357-
if err := w.writeBody(item); err != nil {
358+
if err := w.writeBody(&item); err != nil {
358359
if item.OnFailure != nil {
359360
item.OnFailure(ctx, item, BulkIndexerResponseItem{}, err)
360361
}
@@ -410,15 +411,32 @@ func (w *worker) writeMeta(item BulkIndexerItem) error {
410411

411412
// writeBody writes the item body to the buffer; it must be called under a lock.
412413
//
413-
func (w *worker) writeBody(item BulkIndexerItem) error {
414+
func (w *worker) writeBody(item *BulkIndexerItem) error {
414415
if item.Body != nil {
416+
417+
var getBody func() io.Reader
418+
419+
if item.OnSuccess != nil || item.OnFailure != nil {
420+
var buf bytes.Buffer
421+
buf.ReadFrom(item.Body)
422+
getBody = func() io.Reader {
423+
r := buf
424+
return ioutil.NopCloser(&r)
425+
}
426+
item.Body = getBody()
427+
}
428+
415429
if _, err := w.buf.ReadFrom(item.Body); err != nil {
416430
if w.bi.config.OnError != nil {
417431
w.bi.config.OnError(context.Background(), err)
418432
}
419433
return err
420434
}
421435
w.buf.WriteRune('\n')
436+
437+
if getBody != nil && (item.OnSuccess != nil || item.OnFailure != nil) {
438+
item.Body = getBody()
439+
}
422440
}
423441
return nil
424442
}

esutil/bulk_indexer_internal_test.go

Lines changed: 26 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -232,9 +232,11 @@ func TestBulkIndexer(t *testing.T) {
232232

233233
t.Run("Item Callbacks", func(t *testing.T) {
234234
var (
235-
countSuccessful uint64
236-
countFailed uint64
237-
failedIDs []string
235+
countSuccessful uint64
236+
countFailed uint64
237+
failedIDs []string
238+
successfulItemBodies []string
239+
failedItemBodies []string
238240

239241
numItems = 4
240242
numFailed = 2
@@ -256,10 +258,22 @@ func TestBulkIndexer(t *testing.T) {
256258

257259
successFunc := func(ctx context.Context, item BulkIndexerItem, res BulkIndexerResponseItem) {
258260
atomic.AddUint64(&countSuccessful, 1)
261+
262+
buf, err := ioutil.ReadAll(item.Body)
263+
if err != nil {
264+
t.Fatalf("Unexpected error: %s", err)
265+
}
266+
successfulItemBodies = append(successfulItemBodies, string(buf))
259267
}
260268
failureFunc := func(ctx context.Context, item BulkIndexerItem, res BulkIndexerResponseItem, err error) {
261269
atomic.AddUint64(&countFailed, 1)
262270
failedIDs = append(failedIDs, item.DocumentID)
271+
272+
buf, err := ioutil.ReadAll(item.Body)
273+
if err != nil {
274+
t.Fatalf("Unexpected error: %s", err)
275+
}
276+
failedItemBodies = append(failedItemBodies, string(buf))
263277
}
264278

265279
if err := bi.Add(context.Background(), BulkIndexerItem{
@@ -285,6 +299,7 @@ func TestBulkIndexer(t *testing.T) {
285299
if err := bi.Add(context.Background(), BulkIndexerItem{
286300
Action: "delete",
287301
DocumentID: "2",
302+
Body: strings.NewReader(`{"title":"baz"}`),
288303
OnSuccess: successFunc,
289304
OnFailure: failureFunc,
290305
}); err != nil {
@@ -343,6 +358,14 @@ func TestBulkIndexer(t *testing.T) {
343358
if !reflect.DeepEqual(failedIDs, []string{"1", "2"}) {
344359
t.Errorf("Unexpected failedIDs: %#v", failedIDs)
345360
}
361+
362+
if !reflect.DeepEqual(successfulItemBodies, []string{`{"title":"foo"}`, `{"doc":{"title":"qux"}}`}) {
363+
t.Errorf("Unexpected successfulItemBodies: %#v", successfulItemBodies)
364+
}
365+
366+
if !reflect.DeepEqual(failedItemBodies, []string{`{"title":"bar"}`, `{"title":"baz"}`}) {
367+
t.Errorf("Unexpected failedItemBodies: %#v", failedItemBodies)
368+
}
346369
})
347370

348371
t.Run("OnFlush callbacks", func(t *testing.T) {

0 commit comments

Comments
 (0)