[Core] Ownership-based Object Directory: Consolidate location table and reference table. (#13220)

* Added owned object reference before Plasma put on Create() + Seal() path.

* Consolidated location table and reference table in reference counter.

* Restore type in definition.

* Clean up owned reference on failed Seal().

* Added RemoveOwnedObject test for reference counter.

* Guard against ref going out of scope before location RPCs.

* Add 'owner must have ref in scope' precondition to documentation for object location methods.

* Move to separate Create() + Seal() methods for existing objects.

* Clearer distinction between Create() and Seal() methods.

* Make it clear that references will normally be cleaned up by reference counting.
This commit is contained in:
Clark Zinzow
2021-01-14 13:48:10 -08:00
committed by GitHub
parent d1e9887be2
commit 9a658b568f
12 changed files with 219 additions and 115 deletions
+18 -11
View File
@@ -915,13 +915,13 @@ cdef class CoreWorker:
CObjectID *c_object_id, shared_ptr[CBuffer] *data):
if object_ref is None:
with nogil:
check_status(CCoreWorkerProcess.GetCoreWorker().Create(
check_status(CCoreWorkerProcess.GetCoreWorker().CreateOwned(
metadata, data_size, contained_ids,
c_object_id, data))
else:
c_object_id[0] = object_ref.native()
with nogil:
check_status(CCoreWorkerProcess.GetCoreWorker().Create(
check_status(CCoreWorkerProcess.GetCoreWorker().CreateExisting(
metadata, data_size, c_object_id[0],
CCoreWorkerProcess.GetCoreWorker().GetRpcAddress(),
data))
@@ -933,7 +933,7 @@ cdef class CoreWorker:
return data.get() == NULL
def put_file_like_object(
self, metadata, data_size, file_like, ObjectRef object_ref=None):
self, metadata, data_size, file_like, ObjectRef object_ref):
"""Directly create a new Plasma Store object from a file like
object. This avoids extra memory copy.
@@ -971,8 +971,9 @@ cdef class CoreWorker:
# Using custom object refs is not supported because we
# can't track their lifecycle, so we don't pin the object
# in this case.
check_status(CCoreWorkerProcess.GetCoreWorker().Seal(
c_object_id, pin_object=False))
check_status(
CCoreWorkerProcess.GetCoreWorker().SealExisting(
c_object_id, pin_object=False))
def put_serialized_object(self, serialized_object,
ObjectRef object_ref=None,
@@ -1007,12 +1008,18 @@ cdef class CoreWorker:
c_object_id_vector, c_object_id))
else:
with nogil:
# Using custom object refs is not supported because we
# can't track their lifecycle, so we don't pin the object
# in this case.
check_status(CCoreWorkerProcess.GetCoreWorker().Seal(
c_object_id,
pin_object and object_ref is None))
if object_ref is None:
check_status(
CCoreWorkerProcess.GetCoreWorker().SealOwned(
c_object_id,
pin_object))
else:
# Using custom object refs is not supported because we
# can't track their lifecycle, so we don't pin the
# object in this case.
check_status(
CCoreWorkerProcess.GetCoreWorker().SealExisting(
c_object_id, pin_object=False))
return c_object_id.Binary()