// Attempt partial rollback. Implementation sketch: walk through // previous mossStore snapshots until we reach to a point at or before // the wanted rollbackSeq. If found, revert to that prevous snapshot. func (t *BleveDest) partialRollbackLOCKED(partition string, rollbackSeq uint64) (bool, bool, error) { if t.bindex == nil { return false, false, nil } _, kvstore, err := t.bindex.Advanced() if err != nil { return false, false, err } llsh, ok := kvstore.(LowerLevelStoreHolder) if !ok { return false, false, fmt.Errorf("kvstore not a llsh, kvstore: %#v", kvstore) } lls := llsh.LowerLevelStore() if lls == nil { return false, false, fmt.Errorf("lls nil") } msah, ok := lls.(MossStoreActualHolder) if !ok { return false, false, fmt.Errorf("llsh not a msah, llsh: %#v", llsh) } store := msah.Actual() if store == nil { return false, false, nil // No moss store, so no partial rollback. } store.AddRef() defer store.Close() // TODO: Handle non-upsidedown bleve index types some day. seqMaxKey := upsidedown.NewInternalRow([]byte(partition), nil).Key() totSnapshotsExamined := 0 defer func() { log.Printf("pindex_bleve_rollback: path: %s, totSnapshotsExamined: %d", t.path, totSnapshotsExamined) }() var ss, ssPrev moss.Snapshot ss, err = store.Snapshot() for err == nil && ss != nil { totSnapshotsExamined++ var tryRevert bool tryRevert, err = snapshotAtOrBeforeSeq(t.path, ss, seqMaxKey, rollbackSeq) if err != nil { ss.Close() return false, false, err } if tryRevert { log.Printf("pindex_bleve_rollback: trying revert, path: %s", t.path) // Close the bleve index, but keep our ref-counts on the // underlying store and snapshot until after the revert. t.closeLOCKED() err = store.SnapshotRevert(ss) ss.Close() return true, err == nil, err } ssPrev, err = store.SnapshotPrevious(ss) ss.Close() ss = ssPrev } return false, false, err }