Hi Sue,
Thanks for the comments. The status on the issues you addressed seem ok
to me.
thanks,
sarah
***
> Hi Sarah,
>
> I'll address the comments towards the bottom.
>
> On 12/18/09 09:30, Sarah Jelinek wrote:
>> Hi Keith and all,
>>
>> My code review comments for the library code. I reviewed all files in:
>>
>> libtarget_pymod
>> libtd
>> libzoneinfo
>>
>> If a file is not listed I had no comments for it. I will send my
>> review of the profile code later today.
>>
>> thanks,
>> sarah
>> ****
>>
>> libtarget_pymod/discover.c:
>>> 69 //PyThreadState *_save;
>>> 70 //_save = PyEval_SaveThread();
>>
>> These need to be removed or used.
>>
>>
>>> 319 if (attrl != NULL)
>>> 320 td_attribute_list_free(attrl);
>>
>> Not sure you need to check for attrl != NULL here. Looks like the
>> function will do the right thing, either way. Ditto for other places
>> you are checking for this.
>>
>>> 483 disk = Tgt_NEW(TgtDisk);
>>> 484 if (disk == NULL) {
>>> 485 PyErr_NoMemory();
>>> 486 goto TgtDisk_Create_CLEANUP;
>>> 487 }
>>> 488
>>
>>
>> disk.c:
>>
>> Seems like you could just return the PyErr_NoMemory() here. No need to
>> do the 'goto'. I don't think you need to call the Py_XDECREF() on this.
>>
>>> 97 PyObject *blocks = NULL; /* Python2.4 missing uint64_t
>>> fmt spec */
>>
>> This reference to an issue in python 2.4 should no longer be an issue,
>> right?
>>
>>> 136 /* Python 2.4 has no scan code for a potentially 64-bit
>>> value */
>>
>> So, does python 2.6 have scan code for a potential 64-bit value?
>>
>> instantiate.c:
>>
>> -General: I am a bit confused here. Why do we have libti code in the
>> libtarget_pymod library? I know we need to translate the text
>> installer objects to libti type of attributes, but in looking at the
>> libti_pymod, it seems that there are already functions in there to do
>> what we need to do. Specifically, py_ti_create_target(). You would
>> have to translate the text installer object tuples to the TI
>> attributes and create a new tuple. Is there a reason you felt that
>> setting up the nvlist and calling ti_create_target() here was
>> required, instead of setting up the tuple and calling the libti_pymod
>> functions? If there are gaps in the libti_pymod code, or you plan to
>> merge this in, can you please file a bug to move/merge this code with
>> that as we move forward?
>>
>>
>> partition.c:
>>> 33 /*
>>> 34 * NOTE: libdiskmgmt has labelled partition data incorrectly. We
>>> correct it here
>>> 35 * in the Python names. TgtPartition data structure still
>>> use the
>>> 36 * libdiskmgmt naming scheme. Here is the conversion:
>>> 37 *
>>> 38 * libdiskmgmt | Python | example
>>> 39 * --------------+--------+----------------
>>> 40 * id | number | 1
>>> 41 * type | id | 0xBF (Solaris2)
>>> 42 * typetypething | type | ??? (Primary)
>>> 43 *
>>> 44 * libdiskmgt doesn't yet recognize anything but Primary
>>> partitions but will
>>> 45 * soon change.
>>> 46 */
>>
>> Two things.. if there are bugs in libdiskmgt, please file a bug
>> report. The last comment is no longer valid, so please remove.
>>
>>> 57 * XXX until extended partitions project goes back 1-4 are only
>>> partition
>>> 58 * "id" libdiskmgmt understands.
>>> 59 */
>>> 60 #define MAXID 4
>>> 61 #define STR_MAXID STRINGIZE(MAXID)
>>
>> This needs to be changed. And, we should use the fdisk defines for
>> this, not our own. Extended partition support has been integrated into
>> libdiskmgt.
>>
>>> 502 assert(result != NULL);
>>
>> We are asserting here that there are always slice objects as children
>> of a partition. Is this always true?
>>
>> General question:
>> -Is it possible to have more than one 'label' in python for goto's? It
>> seems like the answer is no, but I see that we have errors handled
>> sometimes inline and sometimes with a 'goto'. I actually find this
>> confusing. Especially, when we have an error label but we don't always
>> use it. For example:
>>> f (newblk % geo->cylsz != 0) {
>>> 603 PyErr_SetString(PyExc_ValueError,
>>> 604 "\"blocks\" must be a multiple of "
>>> 605 "tgt.Geometry.cylsz");
>>> 606 return (-1);
>>> 607 }
>>
>> Is there anyway to combine this with the other label and use a goto?
>>
>> Another general comment: Sometimes in the code we comment the
>> reference counting manipulation that is done, and sometimes we don't.
>> Perhaps we should be more liberal in the areas where it might be
>> confusing. For example:
>>
>>> 663 static PyObject *
>>> 664 TgtPartition_get_id(TgtPartition *self, void *closure)
>>> 665 {
>>> 666 PyObject *result = PyInt_FromLong((long)self->id);
>>> 667 if (result == NULL)
>>> 668 return (PyErr_NoMemory());
>>> 669 return (result);
>>> 670 }
>>
>> The call to PyIn_FromLong returns a new reference, but this may not be
>> obvious to other folks. Not a deal breaker, just a suggestion.
>>
>>> 40 #define MAXNUM 15
>>
>> Is there a define somewhere we can use that is more 'official'. Kind
>> of like what is provided in fdisk.h?
>>
>> slice.c:
>>
>> It looks like the definition for
>>> 200 #define SET_BOOL(nm) self->nm = (nm == Py_True) ? 1 : 0
>>
>> SET_BOOL is the same wherever it is used. I think it would be cleaner
>> to use #defines in the header files as required and only if the macro
>> is really different to the #define and #undef inline.
>>
>>> 214 * type: type object, do *NOT* assume it is TgtSliceType!
>>
>> This comment implies you are going to do some checking with regard to
>> the 'type' value passed in,but in the code it is simply
>> assumed to be a slice object:
>> 225 self = (TgtSlice *)type->tp_alloc(type, 0);
>>
>> But, it's certainly possible I misunderstand how tp_alloc() works.
>>> 439 if (self->user != NULL)
>>
>> This check isn't required.
>>> 518 return (PyLong_FromLongLong(self->blocks));
>>
>>
>> Sometimes you return the value from these calls, and sometimes you
>> check for NULL and return PyErr_NoMemory():
>>
>>> 550 if (result == NULL)
>>> 551 return (PyErr_NoMemory());
>>
>> It would be good if this was consistent, unless there is a specific
>> reason that this is different in some cases.
>>
>> zpool.c:
>> -The printfs are for debugging I presume? It would probably be better
>> ro have an explicit debug value that can be set and print accordingly.
>>> 114 if (self->mountpoint == NULL) {
>>> 115 PyErr_NoMemory();
>>> 116 return (-1);
>>> 117 }
>>
>> This type of error in this file seems like a good candidate for a goto.
>>
>> Nit:
>>> 219 * type: type object, do *NOT* assume it is TgtDiskType!
>>
>> This comment is wrong, it is a TgtZFSDataset type.
>>
>> libtd/td_dd.c:
>>> if (errn != 0 || slice_stats == NULL) {
>>> 1965 DDM_DEBUG(DDM_DBGLVL_ERROR,
>>> 1966 "ddm_get_slice_stats(): Can't get slice inuse
>>> data, "
>>> 1967 "for %s, err=%d\n", name, errn);
>>> 1968 return (errn);
>>> 1969 }
>>
>> Shouldn't this be a && here? If the err == 0, then returning and error
>> seems incorrect, even if the slice_stats are NULL. Not sure if this
>> can happen.
>
> Per our chat, will change this to just check errn != 0 here.
>
>> libzoneinfo_pymod/libzoneinfo.c:
>>
>> -Kind of an unfortunate name for this, at first I thought that this
>> code had to do with Solaris Zones. maybe consider renaming. Not a huge
>> deal, just a thought. I suppose you modeled the name after the system
>> libzoneinfo?
>
> Yes. Although I am also not enamored with the name libzoneinfo for the
> reason you mentioned, I felt the consistency in naming with the system
> library was important.
>
> Thanks for the comments,
> Sue
>
>> sarah
>> ****