Skip to content

Commit 33dbe7b

Browse files
authored
Merge pull request #279 from TileDB-Inc/new-delete-fragments-endpoints
New delete fragments endpoints
2 parents 3d5f732 + 0087e4f commit 33dbe7b

File tree

9 files changed

+193
-5
lines changed

9 files changed

+193
-5
lines changed
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
11
set -e -x
2-
curl --location -o tiledb.tar.gz https://github.com/TileDB-Inc/TileDB/releases/download/2.17.3/tiledb-linux-x86_64-2.17.3-0c2de58.tar.gz \
2+
curl --location -o tiledb.tar.gz https://github.com/TileDB-Inc/TileDB/releases/download/2.18.0/tiledb-linux-x86_64-2.18.0-71ca8b4.tar.gz \
33
&& sudo tar -C /usr/local -xf tiledb.tar.gz
44
sudo ldconfig /usr/local/lib

.github/scripts/install_tiledb_linux_debug.sh

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
set -e -x
2-
git clone https://github.com/TileDB-Inc/TileDB.git -b 2.17.3
2+
git clone https://github.com/TileDB-Inc/TileDB.git -b 2.18.0
33
cd TileDB
44
mkdir build && cd build
55
cmake -DTILEDB_WERROR=OFF -DTILEDB_VCPKG=ON -DSANITIZER=leak -DTILEDB_VERBOSE=OFF -DTILEDB_S3=ON -DTILEDB_SERIALIZATION=ON -DCMAKE_BUILD_TYPE=Debug -DCMAKE_INSTALL_PREFIX=/usr/local ..
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,3 @@
11
set -e -x
2-
curl --location -o tiledb.tar.gz https://github.com/TileDB-Inc/TileDB/releases/download/2.17.3/tiledb-macos-x86_64-2.17.3-0c2de58.tar.gz \
2+
curl --location -o tiledb.tar.gz https://github.com/TileDB-Inc/TileDB/releases/download/2.18.0/tiledb-macos-x86_64-2.18.0-71ca8b4.tar.gz \
33
&& sudo tar -C /usr/local -xf tiledb.tar.gz

.github/scripts/install_tiledb_source_linux.sh

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
set -e -x
2-
git clone https://github.com/TileDB-Inc/TileDB.git -b 2.17.3
2+
git clone https://github.com/TileDB-Inc/TileDB.git -b 2.18.0
33
cd TileDB
44
mkdir build && cd build
55
cmake -DTILEDB_WERROR=OFF -DTILEDB_VCPKG=ON -DTILEDB_VERBOSE=OFF -DTILEDB_S3=ON -DTILEDB_SERIALIZATION=ON -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX=/usr/local ..

.github/scripts/install_tiledb_source_macos.sh

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
set -e -x
2-
git clone https://github.com/TileDB-Inc/TileDB.git -b 2.17.3
2+
git clone https://github.com/TileDB-Inc/TileDB.git -b 2.18.0
33
cd TileDB
44
mkdir build && cd build
55
cmake -DTILEDB_WERROR=OFF -DTILEDB_VCPKG=ON -DTILEDB_VERBOSE=OFF -DTILEDB_S3=ON -DTILEDB_SERIALIZATION=ON -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX=/usr/local ..

README.md

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -79,6 +79,7 @@ as such the below table reference which versions are compatible.
7979
| 0.21.0 | 2.15.X |
8080
| 0.22.0 | 2.16.X |
8181
| 0.23.0 | 2.17.X |
82+
| 0.24.0 | 2.18.X |
8283

8384

8485
## Missing Functionality
@@ -102,3 +103,8 @@ removed in release 0.23. It is recommended to use the proper combination of
102103
The query methods `(Add|Get)?Range` are deprecated because they are deprecated in TileDB core.
103104
It is recommend to use the `Subarray` type for building queries.
104105
The methods will be removed in the release following their removal from TileDB core.
106+
107+
### 0.24.0
108+
109+
`Array.DeleteFragments` is deprecated in favor of `tiledb.DeleteFragments` which binds to
110+
`C.tiledb_array_delete_fragments_v2` the preferred method to delete fragments in TileDB 2.18.0.

array.go

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1080,6 +1080,7 @@ func (a *Array) Config() (*Config, error) {
10801080
}
10811081

10821082
// DeleteFragments delete the range of fragments from startTimestamp to endTimestamp. The array needs to be opened modify exclusive.
1083+
// Deprecated: Use the module DeleteFragments
10831084
func (a *Array) DeleteFragments(startTimestamp, endTimestamp uint64) error {
10841085
curi := C.CString(a.uri)
10851086
defer C.free(unsafe.Pointer(curi))
@@ -1092,3 +1093,39 @@ func (a *Array) DeleteFragments(startTimestamp, endTimestamp uint64) error {
10921093

10931094
return nil
10941095
}
1096+
1097+
// DeleteFragments deletes the range of fragments from startTimestamp to endTimestamp
1098+
func DeleteFragments(tdbCtx *Context, uri string, startTimestamp, endTimestamp uint64) error {
1099+
curi := C.CString(uri)
1100+
defer C.free(unsafe.Pointer(curi))
1101+
1102+
ret := C.tiledb_array_delete_fragments_v2(tdbCtx.tiledbContext, curi,
1103+
C.uint64_t(startTimestamp), C.uint64_t(endTimestamp))
1104+
if ret != C.TILEDB_OK {
1105+
return fmt.Errorf("Error deleting fragments from array: %s", tdbCtx.LastError())
1106+
}
1107+
1108+
return nil
1109+
}
1110+
1111+
// DeleteFragmentsList deletes the fragments of the list
1112+
func DeleteFragmentsList(tdbCtx *Context, uri string, fragmentURIs []string) error {
1113+
curi := C.CString(uri)
1114+
defer C.free(unsafe.Pointer(curi))
1115+
1116+
var list []*C.char
1117+
for _, furi := range fragmentURIs {
1118+
cfuri := C.CString(furi)
1119+
defer C.free(unsafe.Pointer(cfuri))
1120+
list = append(list, cfuri)
1121+
}
1122+
1123+
ret := C.tiledb_array_delete_fragments_list(tdbCtx.tiledbContext, curi, (**C.char)(unsafe.Pointer(&list[0])), C.size_t(len(list)))
1124+
if ret != C.TILEDB_OK {
1125+
return fmt.Errorf("Error deleting fragments list from array: %s", tdbCtx.LastError())
1126+
}
1127+
1128+
runtime.KeepAlive(list)
1129+
1130+
return nil
1131+
}

array_test.go

Lines changed: 121 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -461,6 +461,127 @@ func TestArray_DeleteFragments(t *testing.T) {
461461
require.Equal(t, int8(10), bounds[1])
462462
}
463463

464+
func TestDeleteFragments(t *testing.T) {
465+
// Create an array with domain [1, 10].
466+
// Create fragments [1,2] [3,4] [5,6] [7,8] [9,10]
467+
// Delete the first 2 fragments and verify the non empty domain is [5, 10]
468+
469+
// create an array and write 5 fragments
470+
array, err := newTestArray(t)
471+
require.NoError(t, err)
472+
473+
testStarted := time.Now()
474+
var fragmentCreatedAt []time.Time
475+
476+
context, err := NewContext(nil)
477+
require.NoError(t, err)
478+
require.NoError(t, array.Open(TILEDB_WRITE))
479+
for i := 1; i <= 10; i += 2 {
480+
time.Sleep(100 * time.Millisecond) // give fragments some time distance
481+
482+
query, err := NewQuery(context, array)
483+
require.NoError(t, err)
484+
require.NotNil(t, query)
485+
486+
err = query.AddRangeByName("dim1", int32(i), int32(i+1))
487+
require.NoError(t, err)
488+
_, err = query.SetBuffer("a1", []int32{int32(i), int32(i + 1)})
489+
_, _, err = query.SetBufferVar("a2", []uint64{0, 1}, []byte("aa"))
490+
require.NoError(t, err)
491+
492+
err = query.Submit()
493+
require.NoError(t, err)
494+
495+
status, err := query.Status()
496+
require.NoError(t, err)
497+
assert.Equal(t, TILEDB_COMPLETED, status)
498+
499+
fragmentCreatedAt = append(fragmentCreatedAt, time.Now())
500+
}
501+
err = array.Close()
502+
require.NoError(t, err)
503+
504+
// delete the first two fragments
505+
uri, err := array.URI()
506+
require.NoError(t, err)
507+
err = DeleteFragments(context, uri, uint64(testStarted.UnixMilli()), uint64(fragmentCreatedAt[1].UnixMilli()))
508+
require.NoError(t, err)
509+
510+
// verify deletion
511+
err = array.Open(TILEDB_READ)
512+
require.NoError(t, err)
513+
domain, _, err := array.NonEmptyDomainFromName("dim1")
514+
require.NoError(t, err)
515+
bounds := domain.Bounds.([]int8)
516+
require.Equal(t, int8(5), bounds[0])
517+
require.Equal(t, int8(10), bounds[1])
518+
}
519+
520+
func TestDeleteFragmentsList(t *testing.T) {
521+
// Create an array with domain [1, 10].
522+
// Create fragments [1,2] [3,4] [5,6] [7,8] [9,10]
523+
// Delete the first 2 fragments and verify the others
524+
525+
// create an array and write 5 fragments
526+
array, err := newTestArray(t)
527+
require.NoError(t, err)
528+
529+
context, err := NewContext(nil)
530+
require.NoError(t, err)
531+
err = array.Open(TILEDB_WRITE)
532+
require.NoError(t, err)
533+
for i := 1; i <= 10; i += 2 {
534+
time.Sleep(100 * time.Millisecond)
535+
536+
query, err := NewQuery(context, array)
537+
require.NoError(t, err)
538+
require.NotNil(t, query)
539+
540+
err = query.AddRangeByName("dim1", int32(i), int32(i+1))
541+
require.NoError(t, err)
542+
_, err = query.SetBuffer("a1", []int32{int32(i), int32(i + 1)})
543+
_, _, err = query.SetBufferVar("a2", []uint64{0, 1}, []byte("aa"))
544+
require.NoError(t, err)
545+
546+
err = query.Submit()
547+
require.NoError(t, err)
548+
549+
status, err := query.Status()
550+
require.NoError(t, err)
551+
assert.Equal(t, TILEDB_COMPLETED, status)
552+
}
553+
err = array.Close()
554+
require.NoError(t, err)
555+
556+
uri, err := array.URI()
557+
require.NoError(t, err)
558+
559+
getFragments := func() []string {
560+
var fragmentURIs []string
561+
fragmentInfo, err := NewFragmentInfo(context, uri)
562+
require.NoError(t, err)
563+
err = fragmentInfo.Load()
564+
require.NoError(t, err)
565+
fragmentNum, err := fragmentInfo.GetFragmentNum()
566+
require.NoError(t, err)
567+
for i := uint32(0); i < fragmentNum; i++ {
568+
uri, err := fragmentInfo.GetFragmentURI(i)
569+
require.NoError(t, err)
570+
fragmentURIs = append(fragmentURIs, uri)
571+
}
572+
return fragmentURIs
573+
}
574+
fragmentURIsInitial := getFragments()
575+
576+
// delete the first two fragments
577+
err = DeleteFragmentsList(context, uri, fragmentURIsInitial[0:2])
578+
require.NoError(t, err)
579+
580+
// verify deletion
581+
fragmentURIsAfter := getFragments()
582+
require.ElementsMatch(t, fragmentURIsInitial[2:], fragmentURIsAfter)
583+
}
584+
464585
func newTestArray(t *testing.T) (*Array, error) {
465586
// Create configuration
466587
config, err := NewConfig()

serialize.go

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -510,3 +510,27 @@ func DeserializeQueryAndArray(context *Context, buffer *Buffer, serializationTyp
510510
runtime.KeepAlive(buffer)
511511
return array, query, nil
512512
}
513+
514+
// HandleArrayDeleteFragmentsTimestampsRequest is used by TileDB cloud to handle DeleteFragments with tiledb:// uris
515+
func HandleArrayDeleteFragmentsTimestampsRequest(context *Context, array *Array, buffer *Buffer, serializationType SerializationType) error {
516+
ret := C.tiledb_handle_array_delete_fragments_timestamps_request(context.tiledbContext, array.tiledbArray,
517+
C.tiledb_serialization_type_t(serializationType), buffer.tiledbBuffer)
518+
if ret != C.TILEDB_OK {
519+
return fmt.Errorf("error deserializing delete fragments timestamps: %s", context.LastError())
520+
}
521+
522+
runtime.KeepAlive(buffer)
523+
return nil
524+
}
525+
526+
// HandleArrayDeleteFragmentsListRequest is used by TileDB cloud to handle DeleteFragmentsList with tiledb:// uris
527+
func HandleArrayDeleteFragmentsListRequest(context *Context, array *Array, buffer *Buffer, serializationType SerializationType) error {
528+
ret := C.tiledb_handle_array_delete_fragments_list_request(context.tiledbContext, array.tiledbArray,
529+
C.tiledb_serialization_type_t(serializationType), buffer.tiledbBuffer)
530+
if ret != C.TILEDB_OK {
531+
return fmt.Errorf("error deserializing delete fragments list: %s", context.LastError())
532+
}
533+
534+
runtime.KeepAlive(buffer)
535+
return nil
536+
}

0 commit comments

Comments
 (0)