segment.go 15.7 KB
Newer Older
1
package querynode
B
bigsheeper 已提交
2

B
bigsheeper 已提交
3 4
/*

5
#cgo CFLAGS: -I${SRCDIR}/../core/output/include
B
bigsheeper 已提交
6

G
GuoRentong 已提交
7
#cgo LDFLAGS: -L${SRCDIR}/../core/output/lib -lmilvus_segcore -Wl,-rpath=${SRCDIR}/../core/output/lib
B
bigsheeper 已提交
8

F
FluorineDog 已提交
9 10 11
#include "segcore/collection_c.h"
#include "segcore/plan_c.h"
#include "segcore/reduce_c.h"
B
bigsheeper 已提交
12
*/
B
bigsheeper 已提交
13
import "C"
14
import (
Z
zhenshan.cao 已提交
15
	"fmt"
Z
zhenshan.cao 已提交
16
	"strconv"
B
bigsheeper 已提交
17
	"sync"
B
bigsheeper 已提交
18
	"unsafe"
Z
zhenshan.cao 已提交
19

20
	"github.com/stretchr/testify/assert"
B
bigsheeper 已提交
21
	"go.uber.org/zap"
22

S
sunby 已提交
23 24
	"errors"

B
bigsheeper 已提交
25
	"github.com/zilliztech/milvus-distributed/internal/log"
N
neza2017 已提交
26
	"github.com/zilliztech/milvus-distributed/internal/proto/commonpb"
27 28
)

29 30
type segmentType int32

Z
zhenshan.cao 已提交
31
const (
32 33 34
	segmentTypeInvalid segmentType = iota
	segmentTypeGrowing
	segmentTypeSealed
Z
zhenshan.cao 已提交
35
	segmentTypeIndexing
Z
zhenshan.cao 已提交
36 37
)

B
bigsheeper 已提交
38 39
type indexParam = map[string]string

B
bigsheeper 已提交
40
type Segment struct {
41 42
	segmentPtr C.CSegmentInterface

Q
quicksilver 已提交
43
	segmentID    UniqueID
Z
zhenshan.cao 已提交
44
	partitionID  UniqueID
Q
quicksilver 已提交
45 46 47 48
	collectionID UniqueID
	lastMemSize  int64
	lastRowCount int64

49 50 51
	once             sync.Once // guards enableIndex
	enableIndex      bool
	enableLoadBinLog bool
52

Q
quicksilver 已提交
53
	rmMutex          sync.Mutex // guards recentlyModified
B
bigsheeper 已提交
54
	recentlyModified bool
Q
quicksilver 已提交
55

56
	typeMu      sync.Mutex // guards builtIndex
57
	segmentType segmentType
58

B
bigsheeper 已提交
59
	paramMutex sync.RWMutex // guards index
Q
quicksilver 已提交
60
	indexParam map[int64]indexParam
B
bigsheeper 已提交
61 62
	indexName  string
	indexID    UniqueID
B
bigsheeper 已提交
63 64
}

Z
zhenshan.cao 已提交
65
//-------------------------------------------------------------------------------------- common interfaces
66 67 68 69
func (s *Segment) ID() UniqueID {
	return s.segmentID
}

70 71 72 73 74 75 76 77 78 79 80 81
func (s *Segment) setEnableIndex(enable bool) {
	setOnce := func() {
		s.enableIndex = enable
	}

	s.once.Do(setOnce)
}

func (s *Segment) getEnableIndex() bool {
	return s.enableIndex
}

82
func (s *Segment) setRecentlyModified(modify bool) {
Q
quicksilver 已提交
83 84
	s.rmMutex.Lock()
	defer s.rmMutex.Unlock()
B
bigsheeper 已提交
85 86 87
	s.recentlyModified = modify
}

88
func (s *Segment) getRecentlyModified() bool {
Q
quicksilver 已提交
89 90
	s.rmMutex.Lock()
	defer s.rmMutex.Unlock()
B
bigsheeper 已提交
91 92 93
	return s.recentlyModified
}

B
bigsheeper 已提交
94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117
func (s *Segment) setIndexName(name string) {
	s.rmMutex.Lock()
	defer s.rmMutex.Unlock()
	s.indexName = name
}

func (s *Segment) getIndexName() string {
	s.rmMutex.Lock()
	defer s.rmMutex.Unlock()
	return s.indexName
}

func (s *Segment) setIndexID(id UniqueID) {
	s.rmMutex.Lock()
	defer s.rmMutex.Unlock()
	s.indexID = id
}

func (s *Segment) getIndexID() UniqueID {
	s.rmMutex.Lock()
	defer s.rmMutex.Unlock()
	return s.indexID
}

118 119 120 121 122 123 124 125 126 127
func (s *Segment) setType(segType segmentType) {
	s.typeMu.Lock()
	defer s.typeMu.Unlock()
	s.segmentType = segType
}

func (s *Segment) getType() segmentType {
	s.typeMu.Lock()
	defer s.typeMu.Unlock()
	return s.segmentType
128 129
}

Z
zhenshan.cao 已提交
130 131 132 133 134 135
func newSegment(collection *Collection, segmentID int64, partitionID UniqueID, collectionID UniqueID, segType segmentType) *Segment {
	/*
		CSegmentInterface
		NewSegment(CCollection collection, uint64_t segment_id, SegmentType seg_type);
	*/
	initIndexParam := make(map[int64]indexParam)
B
bigsheeper 已提交
136 137
	var segmentPtr C.CSegmentInterface
	switch segType {
138
	case segmentTypeInvalid:
B
bigsheeper 已提交
139
		log.Error("illegal segment type when create segment")
B
bigsheeper 已提交
140
		return nil
141
	case segmentTypeSealed:
B
bigsheeper 已提交
142
		segmentPtr = C.NewSegment(collection.collectionPtr, C.ulong(segmentID), C.Sealed)
143
	case segmentTypeGrowing:
B
bigsheeper 已提交
144 145
		segmentPtr = C.NewSegment(collection.collectionPtr, C.ulong(segmentID), C.Growing)
	default:
B
bigsheeper 已提交
146
		log.Error("illegal segment type when create segment")
B
bigsheeper 已提交
147 148 149
		return nil
	}

B
bigsheeper 已提交
150 151
	log.Debug("create segment", zap.Int64("segmentID", segmentID))

Z
zhenshan.cao 已提交
152
	var newSegment = &Segment{
153 154 155 156 157 158 159
		segmentPtr:       segmentPtr,
		segmentType:      segType,
		segmentID:        segmentID,
		partitionID:      partitionID,
		collectionID:     collectionID,
		indexParam:       initIndexParam,
		enableLoadBinLog: false,
Z
zhenshan.cao 已提交
160 161 162 163 164
	}

	return newSegment
}

165 166 167
func deleteSegment(segment *Segment) {
	/*
		void
X
XuanYang-cn 已提交
168
		deleteSegment(CSegmentInterface segment);
169 170 171
	*/
	cPtr := segment.segmentPtr
	C.DeleteSegment(cPtr)
172
	segment.segmentPtr = nil
B
bigsheeper 已提交
173 174 175

	log.Debug("delete segment", zap.Int64("segmentID", segment.ID()))

176
	segment = nil
177 178
}

B
bigsheeper 已提交
179
func (s *Segment) getRowCount() int64 {
B
bigsheeper 已提交
180
	/*
B
bigsheeper 已提交
181
		long int
X
XuanYang-cn 已提交
182
		getRowCount(CSegmentInterface c_segment);
B
bigsheeper 已提交
183
	*/
184 185 186
	if s.segmentPtr == nil {
		return -1
	}
187
	var rowCount = C.GetRowCount(s.segmentPtr)
B
bigsheeper 已提交
188
	return int64(rowCount)
B
bigsheeper 已提交
189 190
}

B
bigsheeper 已提交
191
func (s *Segment) getDeletedCount() int64 {
B
bigsheeper 已提交
192
	/*
B
bigsheeper 已提交
193
		long int
X
XuanYang-cn 已提交
194
		getDeletedCount(CSegmentInterface c_segment);
B
bigsheeper 已提交
195
	*/
196 197 198
	if s.segmentPtr == nil {
		return -1
	}
199
	var deletedCount = C.GetDeletedCount(s.segmentPtr)
B
bigsheeper 已提交
200 201 202
	return int64(deletedCount)
}

B
bigsheeper 已提交
203
func (s *Segment) getMemSize() int64 {
B
bigsheeper 已提交
204
	/*
B
bigsheeper 已提交
205
		long int
X
XuanYang-cn 已提交
206
		GetMemoryUsageInBytes(CSegmentInterface c_segment);
207
	*/
208 209 210
	if s.segmentPtr == nil {
		return -1
	}
211
	var memoryUsageInBytes = C.GetMemoryUsageInBytes(s.segmentPtr)
212

Z
zhenshan.cao 已提交
213
	return int64(memoryUsageInBytes)
214 215
}

Z
zhenshan.cao 已提交
216
func (s *Segment) segmentSearch(plan *Plan,
217
	searchRequests []*searchRequest,
Z
zhenshan.cao 已提交
218 219 220 221 222 223 224 225 226 227
	timestamp []Timestamp) (*SearchResult, error) {
	/*
		CStatus
		Search(void* plan,
			void* placeholder_groups,
			uint64_t* timestamps,
			int num_groups,
			long int* result_ids,
			float* result_distances);
	*/
228 229 230
	if s.segmentPtr == nil {
		return nil, errors.New("null seg core pointer")
	}
Z
zhenshan.cao 已提交
231
	cPlaceholderGroups := make([]C.CPlaceholderGroup, 0)
232
	for _, pg := range searchRequests {
Z
zhenshan.cao 已提交
233 234 235 236 237 238
		cPlaceholderGroups = append(cPlaceholderGroups, (*pg).cPlaceholderGroup)
	}

	var searchResult SearchResult
	var cTimestamp = (*C.ulong)(&timestamp[0])
	var cPlaceHolder = (*C.CPlaceholderGroup)(&cPlaceholderGroups[0])
239
	var cNumGroups = C.int(len(searchRequests))
Z
zhenshan.cao 已提交
240

241
	log.Debug("do search on segment", zap.Int64("segmentID", s.segmentID), zap.Int32("segmentType", int32(s.segmentType)))
X
xige-16 已提交
242
	var status = C.Search(s.segmentPtr, plan.cPlan, cPlaceHolder, cTimestamp, cNumGroups, &searchResult.cQueryResult)
Z
zhenshan.cao 已提交
243 244 245 246 247 248 249 250 251 252 253 254 255
	errorCode := status.error_code

	if errorCode != 0 {
		errorMsg := C.GoString(status.error_msg)
		defer C.free(unsafe.Pointer(status.error_msg))
		return nil, errors.New("Search failed, C runtime error detected, error code = " + strconv.Itoa(int(errorCode)) + ", error msg = " + errorMsg)
	}

	return &searchResult, nil
}

func (s *Segment) fillTargetEntry(plan *Plan,
	result *SearchResult) error {
256 257 258
	if s.segmentPtr == nil {
		return errors.New("null seg core pointer")
	}
Z
zhenshan.cao 已提交
259

260
	log.Debug("segment fill target entry, ", zap.Int64("segment ID = ", s.segmentID))
Z
zhenshan.cao 已提交
261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277
	var status = C.FillTargetEntry(s.segmentPtr, plan.cPlan, result.cQueryResult)
	errorCode := status.error_code

	if errorCode != 0 {
		errorMsg := C.GoString(status.error_msg)
		defer C.free(unsafe.Pointer(status.error_msg))
		return errors.New("FillTargetEntry failed, C runtime error detected, error code = " + strconv.Itoa(int(errorCode)) + ", error msg = " + errorMsg)
	}

	return nil
}

func (s *Segment) setIndexParam(fieldID int64, indexParamKv []*commonpb.KeyValuePair) error {
	s.paramMutex.Lock()
	defer s.paramMutex.Unlock()
	indexParamMap := make(indexParam)
	if indexParamKv == nil {
278
		return errors.New("empty loadIndexMsg's indexParam")
Z
zhenshan.cao 已提交
279 280 281 282 283 284 285 286
	}
	for _, param := range indexParamKv {
		indexParamMap[param.Key] = param.Value
	}
	s.indexParam[fieldID] = indexParamMap
	return nil
}

287
func (s *Segment) matchIndexParam(fieldID int64, indexParams indexParam) bool {
Z
zhenshan.cao 已提交
288 289 290 291 292 293 294 295
	s.paramMutex.RLock()
	defer s.paramMutex.RUnlock()
	fieldIndexParam := s.indexParam[fieldID]
	if fieldIndexParam == nil {
		return false
	}
	paramSize := len(s.indexParam)
	matchCount := 0
296 297
	for k, v := range indexParams {
		value, ok := fieldIndexParam[k]
Z
zhenshan.cao 已提交
298 299 300
		if !ok {
			return false
		}
301
		if v != value {
Z
zhenshan.cao 已提交
302 303 304 305 306 307 308 309
			return false
		}
		matchCount++
	}
	return paramSize == matchCount
}

//-------------------------------------------------------------------------------------- interfaces for growing segment
310
func (s *Segment) segmentPreInsert(numOfRecords int) (int64, error) {
B
bigsheeper 已提交
311
	/*
B
bigsheeper 已提交
312
		long int
X
XuanYang-cn 已提交
313
		PreInsert(CSegmentInterface c_segment, long int size);
314
	*/
315 316 317 318 319 320
	if s.segmentType != segmentTypeGrowing || s.enableLoadBinLog {
		return 0, nil
	}
	var offset int64
	cOffset := C.long(offset)
	status := C.PreInsert(s.segmentPtr, C.long(int64(numOfRecords)), &cOffset)
321

322 323 324 325 326 327 328 329
	errorCode := status.error_code

	if errorCode != 0 {
		errorMsg := C.GoString(status.error_msg)
		defer C.free(unsafe.Pointer(status.error_msg))
		return 0, errors.New("PreInsert failed, C runtime error detected, error code = " + strconv.Itoa(int(errorCode)) + ", error msg = " + errorMsg)
	}
	return offset, nil
330 331
}

B
bigsheeper 已提交
332
func (s *Segment) segmentPreDelete(numOfRecords int) int64 {
B
bigsheeper 已提交
333
	/*
B
bigsheeper 已提交
334
		long int
X
XuanYang-cn 已提交
335
		PreDelete(CSegmentInterface c_segment, long int size);
336
	*/
337
	var offset = C.PreDelete(s.segmentPtr, C.long(int64(numOfRecords)))
338

Z
zhenshan.cao 已提交
339
	return int64(offset)
340 341
}

B
bigsheeper 已提交
342
func (s *Segment) segmentInsert(offset int64, entityIDs *[]UniqueID, timestamps *[]Timestamp, records *[]*commonpb.Blob) error {
B
bigsheeper 已提交
343
	/*
N
neza2017 已提交
344
		CStatus
X
XuanYang-cn 已提交
345
		Insert(CSegmentInterface c_segment,
B
bigsheeper 已提交
346 347 348 349 350 351 352
		           long int reserved_offset,
		           signed long int size,
		           const long* primary_keys,
		           const unsigned long* timestamps,
		           void* raw_data,
		           int sizeof_per_row,
		           signed long int count);
B
bigsheeper 已提交
353
	*/
B
bigsheeper 已提交
354 355 356 357
	if s.segmentType != segmentTypeGrowing || s.enableLoadBinLog {
		return nil
	}

358 359 360
	if s.segmentPtr == nil {
		return errors.New("null seg core pointer")
	}
361
	// Blobs to one big blob
B
bigsheeper 已提交
362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380
	var numOfRow = len(*entityIDs)
	var sizeofPerRow = len((*records)[0].Value)

	assert.Equal(nil, numOfRow, len(*records))

	var rawData = make([]byte, numOfRow*sizeofPerRow)
	var copyOffset = 0
	for i := 0; i < len(*records); i++ {
		copy(rawData[copyOffset:], (*records)[i].Value)
		copyOffset += sizeofPerRow
	}

	var cOffset = C.long(offset)
	var cNumOfRows = C.long(numOfRow)
	var cEntityIdsPtr = (*C.long)(&(*entityIDs)[0])
	var cTimestampsPtr = (*C.ulong)(&(*timestamps)[0])
	var cSizeofPerRow = C.int(sizeofPerRow)
	var cRawDataVoidPtr = unsafe.Pointer(&rawData[0])

381
	var status = C.Insert(s.segmentPtr,
B
bigsheeper 已提交
382 383 384 385 386 387 388 389
		cOffset,
		cNumOfRows,
		cEntityIdsPtr,
		cTimestampsPtr,
		cRawDataVoidPtr,
		cSizeofPerRow,
		cNumOfRows)

N
neza2017 已提交
390 391 392 393 394 395
	errorCode := status.error_code

	if errorCode != 0 {
		errorMsg := C.GoString(status.error_msg)
		defer C.free(unsafe.Pointer(status.error_msg))
		return errors.New("Insert failed, C runtime error detected, error code = " + strconv.Itoa(int(errorCode)) + ", error msg = " + errorMsg)
B
bigsheeper 已提交
396
	}
397

398
	s.setRecentlyModified(true)
399
	return nil
400 401
}

B
bigsheeper 已提交
402
func (s *Segment) segmentDelete(offset int64, entityIDs *[]UniqueID, timestamps *[]Timestamp) error {
B
bigsheeper 已提交
403
	/*
N
neza2017 已提交
404
		CStatus
X
XuanYang-cn 已提交
405
		Delete(CSegmentInterface c_segment,
B
bigsheeper 已提交
406 407 408 409
		           long int reserved_offset,
		           long size,
		           const long* primary_keys,
		           const unsigned long* timestamps);
B
bigsheeper 已提交
410
	*/
411 412 413
	if s.segmentPtr == nil {
		return errors.New("null seg core pointer")
	}
414 415
	var cOffset = C.long(offset)
	var cSize = C.long(len(*entityIDs))
Z
zhenshan.cao 已提交
416
	var cEntityIdsPtr = (*C.long)(&(*entityIDs)[0])
417
	var cTimestampsPtr = (*C.ulong)(&(*timestamps)[0])
B
bigsheeper 已提交
418

419
	var status = C.Delete(s.segmentPtr, cOffset, cSize, cEntityIdsPtr, cTimestampsPtr)
420

N
neza2017 已提交
421 422 423 424 425 426
	errorCode := status.error_code

	if errorCode != 0 {
		errorMsg := C.GoString(status.error_msg)
		defer C.free(unsafe.Pointer(status.error_msg))
		return errors.New("Delete failed, C runtime error detected, error code = " + strconv.Itoa(int(errorCode)) + ", error msg = " + errorMsg)
427
	}
B
bigsheeper 已提交
428

429
	return nil
430 431
}

Z
zhenshan.cao 已提交
432
//-------------------------------------------------------------------------------------- interfaces for sealed segment
C
cai.zhang 已提交
433
func (s *Segment) segmentLoadFieldData(fieldID int64, rowCount int, data interface{}) error {
434
	/*
N
neza2017 已提交
435
		CStatus
Z
zhenshan.cao 已提交
436
		LoadFieldData(CSegmentInterface c_segment, CLoadFieldDataInfo load_field_data_info);
437
	*/
438 439 440
	if s.segmentPtr == nil {
		return errors.New("null seg core pointer")
	}
441
	if s.segmentType != segmentTypeSealed {
Z
zhenshan.cao 已提交
442 443
		errMsg := fmt.Sprintln("segmentLoadFieldData failed, illegal segment type ", s.segmentType, "segmentID = ", s.ID())
		return errors.New(errMsg)
N
neza2017 已提交
444 445
	}

C
cai.zhang 已提交
446 447 448 449 450 451 452 453 454
	// data interface check
	var dataPointer unsafe.Pointer
	emptyErr := errors.New("null field data to be loaded")
	switch d := data.(type) {
	case []bool:
		if len(d) <= 0 {
			return emptyErr
		}
		dataPointer = unsafe.Pointer(&d[0])
X
xige-16 已提交
455 456 457 458 459
	case []byte:
		if len(d) <= 0 {
			return emptyErr
		}
		dataPointer = unsafe.Pointer(&d[0])
C
cai.zhang 已提交
460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496
	case []int8:
		if len(d) <= 0 {
			return emptyErr
		}
		dataPointer = unsafe.Pointer(&d[0])
	case []int16:
		if len(d) <= 0 {
			return emptyErr
		}
		dataPointer = unsafe.Pointer(&d[0])
	case []int32:
		if len(d) <= 0 {
			return emptyErr
		}
		dataPointer = unsafe.Pointer(&d[0])
	case []int64:
		if len(d) <= 0 {
			return emptyErr
		}
		dataPointer = unsafe.Pointer(&d[0])
	case []float32:
		if len(d) <= 0 {
			return emptyErr
		}
		dataPointer = unsafe.Pointer(&d[0])
	case []float64:
		if len(d) <= 0 {
			return emptyErr
		}
		dataPointer = unsafe.Pointer(&d[0])
	case []string:
		// TODO: support string type
		return errors.New("we cannot support string type now")
	default:
		return errors.New("illegal field data type")
	}

Z
zhenshan.cao 已提交
497
	/*
C
cai.zhang 已提交
498
		typedef struct CLoadFieldDataInfo {
Z
zhenshan.cao 已提交
499 500 501
		    int64_t field_id;
		    void* blob;
		    int64_t row_count;
C
cai.zhang 已提交
502
		} CLoadFieldDataInfo;
Z
zhenshan.cao 已提交
503 504 505
	*/
	loadInfo := C.CLoadFieldDataInfo{
		field_id:  C.int64_t(fieldID),
C
cai.zhang 已提交
506
		blob:      dataPointer,
Z
zhenshan.cao 已提交
507
		row_count: C.int64_t(rowCount),
508 509
	}

Z
zhenshan.cao 已提交
510
	var status = C.LoadFieldData(s.segmentPtr, loadInfo)
511 512 513 514
	errorCode := status.error_code
	if errorCode != 0 {
		errorMsg := C.GoString(status.error_msg)
		defer C.free(unsafe.Pointer(status.error_msg))
Z
zhenshan.cao 已提交
515
		return errors.New("LoadFieldData failed, C runtime error detected, error code = " + strconv.Itoa(int(errorCode)) + ", error msg = " + errorMsg)
516 517
	}

Z
zhenshan.cao 已提交
518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570 571 572 573 574 575 576 577 578 579 580 581 582 583 584 585 586 587 588 589 590 591 592 593 594 595 596 597
	log.Debug("load field done",
		zap.Int64("fieldID", fieldID),
		zap.Int("row count", rowCount),
		zap.Int64("segmentID", s.ID()))

	return nil
}

func (s *Segment) dropFieldData(fieldID int64) error {
	/*
		CStatus
		DropFieldData(CSegmentInterface c_segment, int64_t field_id);
	*/
	if s.segmentPtr == nil {
		return errors.New("null seg core pointer")
	}
	if s.segmentType != segmentTypeIndexing {
		errMsg := fmt.Sprintln("dropFieldData failed, illegal segment type ", s.segmentType, "segmentID = ", s.ID())
		return errors.New(errMsg)
	}

	var status = C.DropFieldData(s.segmentPtr, C.long(fieldID))
	errorCode := status.error_code
	if errorCode != 0 {
		errorMsg := C.GoString(status.error_msg)
		defer C.free(unsafe.Pointer(status.error_msg))
		return errors.New("dropFieldData failed, C runtime error detected, error code = " + strconv.Itoa(int(errorCode)) + ", error msg = " + errorMsg)
	}

	log.Debug("dropFieldData done", zap.Int64("fieldID", fieldID), zap.Int64("segmentID", s.ID()))

	return nil
}

func (s *Segment) updateSegmentIndex(loadIndexInfo *LoadIndexInfo) error {
	if s.segmentPtr == nil {
		return errors.New("null seg core pointer")
	}

	if s.segmentType != segmentTypeSealed {
		errMsg := fmt.Sprintln("updateSegmentIndex failed, illegal segment type ", s.segmentType, "segmentID = ", s.ID())
		return errors.New(errMsg)
	}

	status := C.UpdateSealedSegmentIndex(s.segmentPtr, loadIndexInfo.cLoadIndexInfo)
	errorCode := status.error_code
	if errorCode != 0 {
		errorMsg := C.GoString(status.error_msg)
		defer C.free(unsafe.Pointer(status.error_msg))
		return errors.New("updateSegmentIndex failed, C runtime error detected, error code = " + strconv.Itoa(int(errorCode)) + ", error msg = " + errorMsg)
	}

	s.setType(segmentTypeIndexing)
	log.Debug("updateSegmentIndex done", zap.Int64("segmentID", s.ID()))

	return nil
}

func (s *Segment) dropSegmentIndex(fieldID int64) error {
	/*
		CStatus
		DropSealedSegmentIndex(CSegmentInterface c_segment, int64_t field_id);
	*/
	if s.segmentPtr == nil {
		return errors.New("null seg core pointer")
	}
	if s.segmentType != segmentTypeIndexing {
		errMsg := fmt.Sprintln("dropFieldData failed, illegal segment type ", s.segmentType, "segmentID = ", s.ID())
		return errors.New(errMsg)
	}

	var status = C.DropSealedSegmentIndex(s.segmentPtr, C.long(fieldID))
	errorCode := status.error_code
	if errorCode != 0 {
		errorMsg := C.GoString(status.error_msg)
		defer C.free(unsafe.Pointer(status.error_msg))
		return errors.New("dropSegmentIndex failed, C runtime error detected, error code = " + strconv.Itoa(int(errorCode)) + ", error msg = " + errorMsg)
	}

	log.Debug("dropSegmentIndex done", zap.Int64("fieldID", fieldID), zap.Int64("segmentID", s.ID()))
B
bigsheeper 已提交
598

599 600
	return nil
}
601 602 603 604

func (s *Segment) setLoadBinLogEnable(enable bool) {
	s.enableLoadBinLog = enable
}