Skip to content

Commit 49714fb

Browse files
shengjun.lipcmoritz
shengjun.li
authored andcommitted
ARROW-5283: [C++][Plasma] Erase object id in client when abort object
Author: shengjun.li <[email protected]> Closes #4272 from shengjun1985/master and squashes the following commits: 126a60e <shengjun.li> Add a comment. f7113c2 <shengjun.li> ARROW-5283: erase object id in client when abort object
1 parent 9fe728c commit 49714fb

File tree

2 files changed

+35
-1
lines changed

2 files changed

+35
-1
lines changed

cpp/src/plasma/store.cc

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -604,6 +604,7 @@ int PlasmaStore::AbortObject(const ObjectID& object_id, Client* client) {
604604
} else {
605605
// The client requesting the abort is the creator. Free the object.
606606
EraseFromObjectTable(object_id);
607+
client->object_ids.erase(it);
607608
return 1;
608609
}
609610
}
@@ -727,7 +728,8 @@ void PlasmaStore::DisconnectClient(int client_fd) {
727728
sealed_objects[it->first] = it->second.get();
728729
} else {
729730
// Abort unsealed object.
730-
AbortObject(it->first, client);
731+
// Don't call AbortObject() because client->object_ids would be modified.
732+
EraseFromObjectTable(object_id);
731733
}
732734
}
733735

cpp/src/plasma/test/client_tests.cc

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -387,6 +387,38 @@ TEST_F(TestPlasmaStore, AbortTest) {
387387
AssertObjectBufferEqual(object_buffers[0], {42, 43}, {1, 2, 3, 4, 5});
388388
}
389389

390+
TEST_F(TestPlasmaStore, OneIdCreateRepeatedlyTest) {
391+
const int64_t loop_times = 5;
392+
393+
ObjectID object_id = random_object_id();
394+
std::vector<ObjectBuffer> object_buffers;
395+
396+
// Test for object non-existence.
397+
ARROW_CHECK_OK(client_.Get({object_id}, 0, &object_buffers));
398+
ASSERT_FALSE(object_buffers[0].data);
399+
400+
int64_t data_size = 20;
401+
uint8_t metadata[] = {5};
402+
int64_t metadata_size = sizeof(metadata);
403+
404+
// Test the sequence: create -> release -> abort -> ...
405+
for (int64_t i = 0; i < loop_times; i++) {
406+
std::shared_ptr<Buffer> data;
407+
ARROW_CHECK_OK(client_.Create(object_id, data_size, metadata, metadata_size, &data));
408+
ARROW_CHECK_OK(client_.Release(object_id));
409+
ARROW_CHECK_OK(client_.Abort(object_id));
410+
}
411+
412+
// Test the sequence: create -> seal -> release -> delete -> ...
413+
for (int64_t i = 0; i < loop_times; i++) {
414+
std::shared_ptr<Buffer> data;
415+
ARROW_CHECK_OK(client_.Create(object_id, data_size, metadata, metadata_size, &data));
416+
ARROW_CHECK_OK(client_.Seal(object_id));
417+
ARROW_CHECK_OK(client_.Release(object_id));
418+
ARROW_CHECK_OK(client_.Delete(object_id));
419+
}
420+
}
421+
390422
TEST_F(TestPlasmaStore, MultipleClientTest) {
391423
ObjectID object_id = random_object_id();
392424
std::vector<ObjectBuffer> object_buffers;

0 commit comments

Comments
 (0)