Thanks Joao for the response, will track against the review for any more 
clarity.

Thanks,
-Pavan.

-----Original Message-----
From: [email protected] 
[mailto:[email protected]] On Behalf Of Joao Eduardo Luis
Sent: Monday, August 04, 2014 8:11 PM
To: Aanchal Agrawal; Pavan Rallabhandi; Gregory Farnum
Cc: [email protected]; Samuel Just
Subject: Re: Non existing monitor

Hello Aanchal,

On 04/08/14 06:43, Aanchal Agrawal wrote:
> Hi Joao,
>
> I have already fixed this issue(let me know if the fix looks good) and was 
> about to send the pull request with the following diff.
> But I still had couple of unanswered questions, hence this mail chain. And 
> they were:

I was in the middle of finishing a patch when I read your email. 
Although your patch looks good as a fix for the incorrect behaviour, I believe 
how the code itself was structured and the holes it left opened was concerning, 
so I pushed my branch nonetheless.  You can find it in ceph's github 
repository, branch name 'wip-mon-empty-store'.  A review would be appreciated, 
and any concerns you may have will be welcome.

>
> 1) Though in case of mkfs not being set, what is the reason for creating a 
> new levelDB store in case an attempt to open the 'store.db' is a failure, as 
> levelDB anyways seem to be throwing 'magic' error going forward. Are there 
> any use cases for this scenario?
> 2) And also, is it valid to flag "No Monitor present" in case the mon data 
> directory is existing, but with no data('store.db') in it, in case mkfs is 
> not set?

With regard to 1), it is a bug.  On open we specified that leveldb should not 
create a new database (see db->open() vs 
db->create_and_open()).  However, leveldb will create the directory
structure if it is missing nonetheless, and this is what was creating those 
issues.  The patch in the branch I mentioned above will work around that by 
checking whether the monitor's data directory is empty before opening the 
database -- thus, if it is indeed empty, it will not call on db->open() and 
therefore avoid populating the directory with senseless noise.

About 2), 'store.db' may not be present if we are upgrading a release prior to 
cuttlefish, as at the time the monitor store format was different.  We use the 
absence of 'store.db' as an indicator to check for a possible need for a format 
upgrade (which will then be performed by Monitor::StoreConverter).  However, we 
can use the total and complete absence of files in the monitor's data directory 
as a definite indicator that there's no monitor store at that path.

Hope this sheds some light on your questions.

   -Joao




> ========================
> <snip>
>
> @@ -152,11 +152,20 @@ int mon_data_empty(bool *r)
>     return code;
>   }
>
> -int mon_exists(bool *r)
> +int mon_exists(bool *r, bool mkfs)
>   {
>     int code = mon_data_exists(r);
> -  if (code || *r == false)
> +  if (code)
>       return code;
> +  // If mon_data(directory) not present, check for mkfs  if (*r == 
> + false) {
> +    if (!mkfs) {
> +      cerr << "No monitor with ID " << g_conf->name.get_id() << " in 
> cluster" << std::endl;
> +      return 1;
> +    }
> +    // If mkfs is true, we want to create a new directory, hence return 0
> +    return code;
> +  }
>     return mon_data_empty(r);
>   }
>
> @@ -268,7 +277,7 @@ int main(int argc, const char **argv)
>     }
>
>     bool exists;
> -  if (mon_exists(&exists))
> +  if (mon_exists(&exists, mkfs))
>       exit(1);
>
>     if (mkfs && exists) {
> @@ -452,7 +461,7 @@ int main(int argc, const char **argv)
>
> <\snip>
> ==========================
>
> Thanks,
> Aanchal
>
> -----Original Message-----
> From: Joao Eduardo Luis [mailto:[email protected]]
> Sent: Saturday, August 02, 2014 6:48 PM
> To: Pavan Rallabhandi; Gregory Farnum; Aanchal Agrawal
> Cc: [email protected]; Samuel Just
> Subject: Re: Non existing monitor
>
> On 01/08/14 18:20, Pavan Rallabhandi wrote:
>> Greg,
>>
>> The commands used were to start monitor for an instance id that is non 
>> existing, for which a leveldb store error is thrown:
>>
>> <snip>
>>
>> src/ceph-mon -i foo
>> 2014-08-01 02:47:08.210208 7f7341c3c800 -1 failed to create new 
>> leveldb store
>>
>> <\snip>
>>
>> The idea is to fix this behavior by throwing a relevant error.
>
> The infrastructure is there (ceph_mon.cc) but is not doing what I believe it 
> should.  It was introduced in 1eafe8dc45419a6b7d319345cac7fbc0d684d1b1.  I'm 
> fixing it now.
>
>     -Joao
>
>>
>> Thanks,
>> -Pavan.
>>
>> -----Original Message-----
>> From: Gregory Farnum [mailto:[email protected]]
>> Sent: Friday, August 01, 2014 6:16 PM
>> To: Aanchal Agrawal
>> Cc: [email protected]; Pavan Rallabhandi; Samuel Just; Joao 
>> Luis
>> Subject: Re: Non existing monitor
>>
>> On Fri, Aug 1, 2014 at 6:03 AM, Aanchal Agrawal 
>> <[email protected]> wrote:
>>> Any help on this ...
>>>
>>> -----Original Message-----
>>> From: Aanchal Agrawal
>>> Sent: Wednesday, July 30, 2014 3:37 PM
>>> To: '[email protected]'
>>> Cc: Pavan Rallabhandi
>>> Subject: Non existing monitor
>>>
>>> Hi,
>>>
>>> We found a case(bug?) in ceph mon code, where in, an attempt to start a 
>>> non-existing monitor is throwing up a levelDB error saying "failed to 
>>> create new leveldb store", instead we thought an appropriate message say 
>>> "No Monitor present with that id" would do, by checking for the monitor 
>>> existence way ahead.
>>>
>>> It seems that 'mon_exists()' checks for the existence of the mon data 
>>> directory(via 'mon_data_exists()') and also for the non-empty nature of 
>>> that directory(via 'mon_data_empty()'). The fix seemed pretty simple, as to 
>>> flag the appropriate message if 'mon_data_exists()' were to set 'exists' to 
>>> 'false', in case mkfs is not set.
>>>
>>> The other behavior that we are seeking clarity, again in case of mkfs not 
>>> being set is, if 'mon_data_exists()' sets 'exists' to 'true' and 
>>> 'mon_data_empty()' sets 'exists' to 'false' (meaning the mon data directory 
>>> is present, but it is empty), then the current code seems to be going ahead 
>>> in an attempt to open the 'store.db', and when open fails, it tries to 
>>> create a new 'store.db' (though mkfs is not set) and eventually gives up 
>>> throwing "unable to read magic from mon data".
>>>
>>> The questions we had around this were:
>>>
>>> 1) Though in case of mkfs not being set, what is the reason for creating a 
>>> new levelDB store in case an attempt to open the 'store.db' is a failure, 
>>> as levelDB anyways seem to be throwing 'magic' error going forward. Are 
>>> there any use cases for this scenario?
>>> 2) And also, is it valid to flag "No Monitor present" in case the mon data 
>>> directory is existing, but with no data('store.db') in it, in case mkfs is 
>>> not set?
>>
>> This is a little unclear to me. Can you describe exactly what commands 
>> you're running and what the response from the monitor is?
>> -Greg
>> Software Engineer #42 @ http://inktank.com | http://ceph.com
>>
>> ________________________________
>>
>> PLEASE NOTE: The information contained in this electronic mail message is 
>> intended only for the use of the designated recipient(s) named above. If the 
>> reader of this message is not the intended recipient, you are hereby 
>> notified that you have received this message in error and that any review, 
>> dissemination, distribution, or copying of this message is strictly 
>> prohibited. If you have received this communication in error, please notify 
>> the sender by telephone or e-mail (as shown above) immediately and destroy 
>> any and all copies of this message in your possession (whether hard copies 
>> or electronically stored copies).
>>
>
>
> --
> Joao Eduardo Luis
> Software Engineer | http://inktank.com | http://ceph.com
>


--
Joao Eduardo Luis
Software Engineer | http://inktank.com | http://ceph.com
--
To unsubscribe from this list: send the line "unsubscribe ceph-devel" in the 
body of a message to [email protected] More majordomo info at  
http://vger.kernel.org/majordomo-info.html
N�����r��y����b�X��ǧv�^�)޺{.n�+���z�]z���{ay�ʇڙ�,j��f���h���z��w���
���j:+v���w�j�m��������zZ+�����ݢj"��!�i

Reply via email to