Hi Anders, See my responses inline. Thanks.
Regards, Vu > -----Original Message----- > From: and...@acm.org <anders.bjornerst...@telia.com> > Sent: Wednesday, April 10, 2019 2:16 PM > To: lennart.l...@ericsson.com; vu.m.ngu...@dektech.com.au; > hans.nordeb...@ericsson.com; gary....@dektech.com.au > Cc: opensaf-devel@lists.sourceforge.net > Subject: Re: [devel] [PATCH 1/1] imm: return try-again on write requests > while fs is unavailable [#3019] > > Ok I think I get it then. > > The ticket slogan is missleading. > It should say something like: return try-again on requests that imply > fs-access > when fs is configured to be administratively unavailable. [Vu] Thanks for your suggestion. > > > The idea then is that the server (IMMND) detects the logical unavailability of > the file system through this variable and returns TRY_AGAIN on file system > accessing requests > such as apply of ccb or updates to persistent runtime attributes or > creation/deletion of classes or creation deletion of persistent runtime > objects. [Vu] Absolutely right. > > But now you probably need to tweak that TRY_AGAIN logic in the client > library side for handling ERR_TIMEOUT on ccb-apply. > If its still there... [Vu] I don't see any issue if we keep that logic. Can you explain a bit more about your concern here? > > I would also suggest that the operation of setting this new admin state > should ideally be two-phased and delayed in response not to interfere with > already > accepted and on-going applies. An apply can generate many completed > callbacks to OIs and be drawn out in time. > By two phased I mean rejecting new apply requests from clients by the > TRY_AGAIN but letting already started apply requests to finish. [Vu] Yes. I agree. The patch actually complies with that point. > > > /Anders > > > > > > > > > > /AndersBj > > > >----Ursprungligt meddelande---- > >Från : vu.m.ngu...@dektech.com.au > >Datum : 2019-04-10 - 04:33 (CEST) > >Till : anders.bjornerst...@telia.com, gary....@dektech.com.au, > hans.nordeb...@ericsson.com, lennart.l...@ericsson.com > >Kopia : opensaf-devel@lists.sourceforge.net > >Ämne : Re: [devel] [PATCH 1/1] imm: return try-again on write requests > while fs is unavailable [#3019] > > > >Hi Anders, > > > >Here is the text that I have put into the README file for this patch. Please > give it a look. > > > >--- > >Return try-again on write requests if file system is unresponsive > >============================================================= > ====== > >When underlying file system is unresponsive to pbe write request, all IMM > >requests that need their changes to be persistent such as creating an IMM > >object or creating an IMM class likely gets SA_AIS_ERR_TIMEOUT. > > > >And in case of putting pbe database on a network file system, there is a high > possibility > >the network file system server is unresponsive for a quite long time that > >will > result in > >timeout to all write requests at IMM library side. > > > >With this patch, IMM introduces two new administrative operations > >which are used to inform IMM in advance that the file system is being > unavailable/unresponsive or not. > > > >If IMM is informed that the file system is not being available for write, IMM > will return SA_AIS_ERR_TRY_AGAIN > >*earlier* by local IMMND to the caller [...] > >-- > >In my opinion, the idea of this ticket is quite similar to what IMM has been > done in the case > >*PBE mode is enabled but the PBE implementer is not yet attached/PBE > process is not started yet* > > > >Please note that, the try-again is only returned to callers when IMM has > been informed that the underlying file system is currently not able for write. > >And once the file system is back, IMM must be updated that status and then > IMM will operate normally. > > > >Regards, Vu > > > >> -----Original Message----- > >> From: and...@acm.org <anders.bjornerst...@telia.com> > >> Sent: Wednesday, April 10, 2019 7:54 AM > >> To: gary....@dektech.com.au; hans.nordeb...@ericsson.com; > >> lennart.l...@ericsson.com; vu.m.ngu...@dektech.com.au > >> Cc: opensaf-devel@lists.sourceforge.net > >> Subject: Re: [devel] [PATCH 1/1] imm: return try-again on write requests > >> while fs is unavailable [#3019] > >> > >> Hi again > >> > >> I have an additional objection/comment to this ticket. > >> It concerns the semantics of the returncode ERR_TRY_AGAIN. > >> > >> The meaning of this error code is that the operation could NOT be > performed > >> and the server has NOT executed the request. > >> > >> That is the server currently rejects the requests but invites the client > >> to try- > >> again. > >> > >> Crucial here is that if the client descides NOT to retry thre request, then > the > >> client *knows* that the request was not (will not) be done!! > >> This is the original and only sensible semantics of ERR_TRY_AGAIN. > >> > >> In essence a client that gets TRY_AGAIN is in control of whether or not the > >> operation shall be retried and may decide NOT to. > >> > >> Do you see how this is glaringly missmatched in this proposed ticket ? > >> This ticket proposes to return TRY_AGAIN for a case where the operation > >> may *still* be on-going. > >> THis violates the semantics of TRY_AGAIN. > >> > >> ERR_TIMEOUT is verry different. > >> It simply tells the user that his client side timer expired and it is > >> unknown at > >> the client what happened with the request in the server. > >> It may have succeeded, it may have failed, or it may still be stuck in > >> processing. > >> > >> Receiving ERR_TIMEOUT is a nuisance since the client can not know what > >> happened. > >> > >> But the solution must be to provide tools for the client to find out what > >> happened. > >> You need something like a new SaAisCcbDidItCommit API to get arround > this > >> problem at the API level > >> > >> But it gets complicated since the CCB Handles are a handle to a chain of > >> actual ccb-ids (actual transactions). > >> The ccb-ids are not vissible/exposed over the IMM SAF API. > >> It is truly a flawed api in its design. > >> > >> I dont see any really good solution. > >> > >> THe work arround that was in place when I departed was the hidden logic > on > >> the ccb-client side that > >> tried to recover the result in case of timeout by actually probing the imm > ccb > >> commit log in the database. > >> But that *hidden* client side retry mechanism had to have a meta timeout > >> since we could not block the actual client (ccb api user) forever. > >> And it was (is?) ugly since it overrides the normal/original/general client > side > >> timeout concept on handles > >> > >> /Anders > >> > >> > >> > >> > >> > >> >----Ursprungligt meddelande---- > >> >Från : anders.bjornerst...@telia.com > >> >Datum : 2019-04-09 - 10:40 (CEST) > >> >Till : hans.nordeb...@ericsson.com, vu.m.ngu...@dektech.com.au, > >> lennart.l...@ericsson.com, gary....@dektech.com.au > >> >Kopia : opensaf-devel@lists.sourceforge.net > >> >Ämne : Re: [devel] [PATCH 1/1] imm: return try-again on write requests > >> while fs is unavailable [#3019] > >> > > >> >Hi Vu, > >> > > >> >Well I think all these three cases could cause problems. > >> >The key issues here are the perceived reliability of the IMM service from > the > >> perspective of the user. > >> > > >> >If the user of th IMM API *ever* gets the "impression" that a CCB has > failed > >> to commit when in fact it has committed; > >> >or gets the impression that a CCB has committed when in fact it has not, > >> then the IMM service is in fact unreliable in > >> >its core functionality. > >> > > >> >So to begin with I would declare that a result of the user being uncertain > of > >> the outcome (commit/abort) of a CCB that has terminated, > >> >is not a catastrophe. Partivcularly if compared with the user getting the > >> "impression" of the incorrect result!!!!!!! > >> >The service and the API must be constructed so that this can never ever > ever > >> ever ever happen. > >> > > >> >It is better for the API to provide a result such as ERR_TIMEOUT (which > >> communicates uncertainty about the outcome) when/if > >> >the API/library side in fact does not know the outcome. > >> > > >> >Case 1 is not very well defined by you because you say the first apply > >> >has > >> "returned", but I have to assume it has NOT returned to the user/library. > >> >Otherwise why would the user/library retry the apply? I think what you > >> mean here is that it has been applied/commited in the server but the user > >> timed-out. > >> >So case 1 I have to assume is that the CCB commits, but the user/library > has > >> timed out beffore receiving the reply? > >> >As I remeber it when I designed this I had quite a bit of library code for > ccb > >> handling of precisely the case of ERR_TIMEOUT on ccb-apply. > >> >REmeber that ERR_TIMEOUT is generated locally in the library by a timer > in > >> the library expiring. > >> >The logic there did NOT attempt to redo the apply, OF COURSE NOT. > >> >Insteead it sent a separate message(type) probing the server for CCB > >> *outcome*. > >> >Is that logic still there? and if so what is the problem. If it has been > removed > >> then I would like to know why? > >> >That code essentially already does what you I believe you are trying to do > >> here. > >> >So logic that is already there (if it has not been removed) does in fact > >> >do > >> (internally in the library) some attempts at PROBING the result outcome. > >> >But it (of course) does so by a separate probing message on outcomme > and > >> NOT by a renewed attempt to apply the same ccb-id!! > >> > > >> >There is actually NO POINT in retrying an apply of a CCB when receiving > >> ERR_TIMEOUT in the client, because you must assume > >> >that FEVS is reliable and FEVS messages that have reached the server side > do > >> not get lost. Even if the local server crashes, > >> >the CCB is processed in paralell at all IMMND servers so the CCB > outcome > >> should be retrivable by the server from the sqlite file. > >> >Conclusion: ERR_TIMEOUT on a ccb-apply truly means that the server is > still > >> processing and that it is worse than a waste of time > >> >to attempt redos of the apply! It is worse than a waste of time because > >> from the server side it will look lile the library is faulty, > >> >trying to appply a ccb that is already being processed or has already been > >> committed or aborted. > >> > > >> > > >> >Case2 > >> >Case2 should already be handled by library code > >> >As you know, CCB handles are used to generate a chain of CCBs. > >> >That is, a CCB handle is linked to one CCB at a time, but it is not one > >> >CCB > >> period but a potential chain of CCB(ids). > >> >A successsfull commit of one CCB results in the handle IMPLICITLY > opening > >> (becoming ready) for the next CCB. > >> >This implicit chaining "feature" of CCBs under a CCB handle is a dubious > >> feature precisely because it risks confusing > >> >a user. There is no explicit "begin transaction" handshake between the > user > >> and the service except for the first CCB > >> >generated by that handle, initiqqlly and after each apply. > >> >The IMM standard is uniquely sloppy on this in my opinion. > >> >I know of no other database standard that makes the start of a > transaction > >> "implicit". > >> >This precisley because you never ever want a user/human- > >> client/programmer to get confused about the transaction boundary > context. > >> > > >> >Case3 should be impossible. > >> >I assume here you are talking about not jjust another thread, but a > separate > >> CCB-handle. > >> >One CCB-handle should not be used by more than one thread. > >> >I belive we have explicit warnings rules about this in the user guide. > >> >The main issue is not thread safety, but that the user/programmer or > their > >> "program" simply gets confused/fooled by > >> >concurrently operating one ccb-handle over several thereads. I dont see > any > >> good reason for anyone to use one > >> >ccb-handle in more than one thread. If they do then they better make > sure > >> through their own thread synchronizations > >> >that the handle is never used concurrently. > >> > > >> >In summary. > >> >I dont know what problem this ticket is trying to fix and the fix it > proposes > >> seems both dangerous and misguided. > >> > > >> >If I missed something then dont hesitate to point it out. > >> >Maybe a lot has happened in the implementation or even the SAF > standard > >> since I left. > >> >I have not tried to follow it. > >> > > >> >I only keep an eye on the IMM ticket process to catch possible dangers as > >> this case seems to be. > >> > > >> >Finally one more thing. > >> >The main reason that this problem is occuring is the unavailability of the > file > >> system. > >> >As long as the file system is unavailabale the user will have a problem in > >> obtaining the result of a commit request that > >> >has gone "to the file system". It goes via the sqlite library of course. > >> > > >> > > >> >/Anders > >> > > >> >>----Ursprungligt meddelande---- > >> >>Från : vu.m.ngu...@dektech.com.au > >> >>Datum : 2019-04-09 - 04:55 () > >> >>Till : anders.bjornerst...@telia.com, gary....@dektech.com.au, > >> lennart.l...@ericsson.com, hans.nordeb...@ericsson.com > >> >>Kopia : opensaf-devel@lists.sourceforge.net > >> >>Ämne : Re: [devel] [PATCH 1/1] imm: return try-again on write requests > >> while fs is unavailable [#3019] > >> >> > >> >>Hi AndersBj, > >> >> > >> >>Thanks for your comments. > >> >> > >> >>However, I need your help to provide more info on your concern so that > I > >> can fully understand it. Which use case below describe exactly your > concern > >> about "additional Apply requests"? > >> >> > >> >>Here are some use cases that I can think about the "additional apply > >> requests". > >> >> > >> >>1) "Additional Apply requests" are invoked after the first apply has > returned > >> with SA_AIS_OK (the transaction has been committed). > >> >>The additional apply should get FAILED_OPERATION as the CCB has > been > >> applied. > >> >> > >> >>2) "Additional Apply requests" are invoked after the first apply has > returned > >> due to timeout even the transaction commit is in progress. > >> >>The additional apply request should get BAD_HANDLE as the ccb has > been > >> cleaned up as the result of timeout from the first one. > >> >> > >> >>3) "Additional Apply requests" are invoked concurrently in another > thread > >> while the first one is on-going. > >> >>The additional apply request should get TRY_AGAIN as in legacy code > the > >> first call is blocking on waiting for reply > >> >>even such code is *not allowed* though - user should make sure not > using > >> same handle concurrently from different threads. > >> >> > >> >>4) Other cases > >> >> > >> >>Regards, Vu > >> >> > >> >>> -----Original Message----- > >> >>> From: and...@acm.org <anders.bjornerst...@telia.com> > >> >>> Sent: Monday, April 8, 2019 6:15 PM > >> >>> To: gary....@dektech.com.au; vu.m.ngu...@dektech.com.au; > >> >>> lennart.l...@ericsson.com; hans.nordeb...@ericsson.com > >> >>> Cc: opensaf-devel@lists.sourceforge.net > >> >>> Subject: Re: [devel] [PATCH 1/1] imm: return try-again on write > requests > >> >>> while fs is unavailable [#3019] > >> >>> > >> >>> Hi, > >> >>> > >> >>> I think this ticket (#3019) is erroneous and dangerous. > >> >>> If you currently have an apply in progress (a commit of a transaction) > >> that > >> >>> means you DONT KNOW if the operation will/has succeeded. > >> >>> What you DO know is that the wrtite/commit most likely will succeed > or > >> fail > >> >>> at some time. > >> >>> If you during the uncertainty generate additional Apply requests on > the > >> same > >> >>> CCB, then you can be pretty sure that those requests > >> >>> do not "by pass" the blocked request. Instead you can be pretty sure > that > >> the > >> >>> redundant apply request(s) will return an error code > >> >>> which most likely will cause the user to conclude that the CCB faile to > >> apply, > >> >>> when in fact this is uncertain and likely to be false. > >> >>> > >> >>> A disaster in other words. > >> >>> > >> >>> /AndersBj > >> >>> > >> >>> > >> >>> >----Ursprungligt meddelande---- > >> >>> >Från : vu.m.ngu...@dektech.com.au > >> >>> >Datum : 2019-04-08 - 03:05 () > >> >>> >Till : hans.nordeb...@ericsson.com, lennart.l...@ericsson.com, > >> >>> gary....@dektech.com.au > >> >>> >Kopia : opensaf-devel@lists.sourceforge.net > >> >>> >Ämne : Re: [devel] [PATCH 1/1] imm: return try-again on write > requests > >> >>> while fs is unavailable [#3019] > >> >>> > > >> >>> >Hi all, > >> >>> > > >> >>> >Have you had time to review the patch? I will push this ticket by this > >> >>> >Wednesday if there is no comment/feedback. > >> >>> > > >> >>> >Regards, Vu > >> >>> > > >> >>> >> -----Original Message----- > >> >>> >> From: Vu Minh Nguyen <vu.m.ngu...@dektech.com.au> > >> >>> >> Sent: Tuesday, March 26, 2019 1:19 PM > >> >>> >> To: hans.nordeb...@ericsson.com; lennart.l...@ericsson.com; > >> >>> >> gary....@dektech.com.au > >> >>> >> Cc: opensaf-devel@lists.sourceforge.net; Vu Minh Nguyen > >> >>> >> <vu.m.ngu...@dektech.com.au> > >> >>> >> Subject: [PATCH 1/1] imm: return try-again on write requests while > fs > >> is > >> >>> >> unavailable [#3019] > >> >>> >> > >> >>> >> When underlying file system is unresponsive to pbe write request, > all > >> IMM > >> >>> >> requests that required to be persistent such as creating an IMM > object > >> or > >> >>> >> creating an IMM class likely gets SA_AIS_ERR_TIMEOUT. > >> >>> >> > >> >>> >> This changeset introduces two administrative operations which are > >> >>> provided > >> >>> >> to > >> >>> >> let user inform IMM if the file system is unavailable or not. If the > file > >> >>> >> system is not available, IMM will return SA_AIS_ERR_TRY_AGAIN > >> earlier to > >> >>> >> the > >> >>> >> caller instead of SA_AIS_ERR_TIMEOUT. > >> >>> >> > >> >>> >> Besides, a new IMM attribute, saImmFileSystemStatus, is added to > >> >>> >> SaImmMngt class; the value shows the current status of the file > >> system > >> >>> >> according to IMM view. > >> >>> >> --- > >> >>> >> src/imm/README | 49 ++++++- > >> >>> >> .../management/test_saImmOmClassCreate_2.c | 136 > >> >>> >> ++++++++++++++++++ > >> >>> >> src/imm/common/immsv_api.h | 5 +- > >> >>> >> src/imm/config/immsv_classes.xml | 7 + > >> >>> >> src/imm/immnd/ImmModel.cc | 91 ++++++++++-- > >> >>> >> src/imm/immnd/ImmModel.h | 1 + > >> >>> >> src/imm/immnd/immnd_evt.c | 11 +- > >> >>> >> src/imm/immnd/immnd_init.h | 1 + > >> >>> >> 8 files changed, 288 insertions(+), 13 deletions(-) > >> >>> >> > >> >>> >> diff --git a/src/imm/README b/src/imm/README > >> >>> >> index 132ee0ac0..8e91b534c 100644 > >> >>> >> --- a/src/imm/README > >> >>> >> +++ b/src/imm/README > >> >>> >> @@ -2969,7 +2969,7 @@ attribute in the object: > >> >>> >> > >> >>> >> The following is the shell command: > >> >>> >> > >> >>> >> - immadm -o 1 -p opensafImmNostdFlags:SA_UINT32_T:1024 \ > >> >>> >> + immadm -o 1 -p opensafImmNostdFlags:SA_UINT32_T:512 \ > >> >>> >> opensafImm=opensafImm,safApp=safImmService > >> >>> >> > >> >>> >> This will set bit 10 of the 'opensafImmNostdFlags' runtime > attribute > >> >>> >inside > >> >>> >> the immsv. > >> >>> >> @@ -3027,7 +3027,6 @@ expires. > >> >>> >> To be possible to use this new feature, bit 10 must be set in > >> >>> >> opensafImmNostdFlags attribute in IMM object. > >> >>> >> > >> >>> >> - > >> >>> >> Provide an admin-operation for re-generating backend database > >> from > >> >>> one in > >> >>> >> RAM > >> >>> >> > >> >>> >> > >> >>> > >> > ============================================================== > >> >>> >> =============== > >> >>> >> https://sourceforge.net/p/opensaf/tickets/2940/ > >> >>> >> @@ -3046,6 +3045,52 @@ back-end database from one in > memory > >> to > >> >>> keep > >> >>> >> them both consistent. > >> >>> >> > >> >>> >> immadm -o 303 safRdn=immManagement,safApp=safImmService > >> >>> >> > >> >>> >> +Return try-again on write requests while file system is unavailable > >> >>> >> > >> >>> > >> > +============================================================= > >> >>> >> ====== > >> >>> >> +https://sourceforge.net/p/opensaf/tickets/3019 > >> >>> >> + > >> >>> >> +When underlying file system is unresponsive to pbe write request, > all > >> >>> IMM > >> >>> >> +requests that required to be persistent such as creating an IMM > >> object or > >> >>> >> +creating an IMM class likely gets SA_AIS_ERR_TIMEOUT. > >> >>> >> + > >> >>> >> +Since OpenSAF version 5.19.06, IMM introduces two new > >> administrative > >> >>> >> operations > >> >>> >> +which are used to inform IMM if the file system is unavailable or > not. > >> If > >> >>> >the > >> >>> >> +file system is not available for write, IMM will return > >> >>> >> SA_AIS_ERR_TRY_AGAIN > >> >>> >> +earlier to the caller instead of SA_AIS_ERR_TIMEOUT. > >> >>> >> + > >> >>> >> +Operation ID 400 is used to inform the file system is unavailable: > >> >>> >> + immadm -o 400 > safRdn=immManagement,safApp=safImmService > >> >>> >> + > >> >>> >> +and operation ID 401 is used to inform the file system is back: > >> >>> >> + immadm -o 401 > safRdn=immManagement,safApp=safImmService > >> >>> >> + > >> >>> >> +Besides, a new runtime IMM attribute, saImmFileSystemStatus, is > >> added > >> >>> to > >> >>> >> +SaImmMngt class; the value shows the current status of the file > >> system: > >> >>> >> +saImmFileSystemStatus = 0 means the file system is unavailable > and > >> >>> >> +saImmFileSystemStatus = 1 means the file system is fine for write. > >> >>> >> + > >> >>> >> +Fetching the value of that attribute, other services or > >> >>> >> applications > >> that > >> >>> >> +have activities to read/write data from/to the file system may > >> benefit as > >> >>> >> well. > >> >>> >> + > >> >>> >> +Note that, to use this new feature, bit 11 must be set in > >> >>> >> opensafImmNostdFlags. > >> >>> >> + > >> >>> >> +The following is the shell command to set the 11st bit: > >> >>> >> + immadm -o 1 -p opensafImmNostdFlags:SA_UINT32_T:1024 \ > >> >>> >> + opensafImm=opensafImm,safApp=safImmService > >> >>> >> + > >> >>> >> +In summary: > >> >>> >> + Bit 1 controls schema (imm class) changes allowed or not > (normally > >> >>> >off/0). > >> >>> >> + Bit 2 controls OpenSAF4.1 protocols allowed or not (normally > on/1). > >> >>> >> + Bit 3 controls OpenSAF4.3 protocols allowed or not (normally > on/1). > >> >>> >> + Bit 4 controls 2PBE oneSafe2PBE, see 2PBE feature in > OpenSAF4.4 > >> above > >> >>> >> (normally off/0). > >> >>> >> + Bit 5 controls OpenSAF4.5 protocols allowed or not (normally > on/1). > >> >>> >> + Bit 6 controls OpenSAF4.6 protocols allowed or not (normally > on/1). > >> >>> >> + Bit 7 controls OpenSAF4.7 protocols allowed or not (normally > on/1). > >> >>> >> + Bit 8 controls OpenSAF5.0 protocols allowed or not (normally > on/1). > >> >>> >> + Bit 9 controls OpenSAF5.1 protocols allowed or not (normally > on/1). > >> >>> >> + Bit 10 controls OpenSAF5.17.11 protocols allowed or not > (normally > >> >>> on/1). > >> >>> >> + Bit 11 controls OpenSAF5.19.06 protocols allowed or not > (normally > >> >>> on/1). > >> >>> >> + > >> >>> >> ---------------------------------------- > >> >>> >> DEPENDENCIES > >> >>> >> ============ > >> >>> >> diff --git > >> a/src/imm/apitest/management/test_saImmOmClassCreate_2.c > >> >>> >> b/src/imm/apitest/management/test_saImmOmClassCreate_2.c > >> >>> >> index f43884e1b..9e12f4f61 100644 > >> >>> >> --- > a/src/imm/apitest/management/test_saImmOmClassCreate_2.c > >> >>> >> +++ > b/src/imm/apitest/management/test_saImmOmClassCreate_2.c > >> >>> >> @@ -16,6 +16,7 @@ > >> >>> >> */ > >> >>> >> > >> >>> >> #include "imm/apitest/immtest.h" > >> >>> >> +#include "imm/common/immsv_api.h" > >> >>> >> > >> >>> >> void saImmOmClassCreate_2_01(void) > >> >>> >> { > >> >>> >> @@ -709,6 +710,7 @@ void > >> >>> >> saImmOmClassCreate_SchemaChange_2_02(void) > >> >>> >> /* > >> >>> >> * [CONFIG_CLASS] Add default value to default-removed > >> attribute > >> >>> >> */ > >> >>> >> + > >> >>> >> int schemaChangeEnabled = enableSchemaChange(); > >> >>> >> safassert(immutil_saImmOmInitialize(&immOmHandle, > >> >>> >> &immOmCallbacks, &immVersion), > >> >>> >> SA_AIS_OK); > >> >>> >> @@ -1534,6 +1536,133 @@ void > >> >>> >> saImmOmClassCreate_SchemaChange_2_18(void) > >> >>> >> disableSchemaChange(); > >> >>> >> } > >> >>> >> > >> >>> >> +/* Here are test cases to verify: > >> >>> >> + 1) SA_AIS_ERR_TRY_AGAIN is returned on IMM class creation > >> request if > >> >>> >> file > >> >>> >> + system is unavailable which is informed to IMM via admop id > 400, > >> and > >> >>> >also > >> >>> >> + ensure saImmFileSystemStatus attribute of SaImmMgnt class > must > >> be > >> >>> >> zero. > >> >>> >> + Note that, the test is only valid if PBE is enabled, otherwise > >> >>> >> we > >> >>> >expect > >> >>> >> + getting SA_AIS_OK instead. > >> >>> >> + > >> >>> >> + 2) SA_AIS_OK is returned on IMM class creation request if the > file > >> >>> >system > >> >>> >> + is back which is informed to IMM via admop id 401, and also > ensure > >> >>> >that > >> >>> >> + saImmFileSystemStatus attribute of SaImmMgnt class must be > >> equal to > >> >>> >> one. > >> >>> >> +*/ > >> >>> >> +const char mgmt_object[] = > >> >>> >> "safRdn=immManagement,safApp=safImmService"; > >> >>> >> +static void updateFileSystemStatus(uint64_t operation_id) > >> >>> >> +{ > >> >>> >> + SaImmHandleT myOmHandle; > >> >>> >> + SaImmAdminOwnerHandleT ownerHandle; > >> >>> >> + const SaImmAdminOwnerNameT adminOwnerName = > >> "imm_test"; > >> >>> >> + SaNameT objectName; > >> >>> >> + const SaNameT *objectNames[] = {&objectName, NULL}; > >> >>> >> + const SaImmAdminOperationParamsT_2 *params[] = {NULL}; > >> >>> >> + SaAisErrorT operation_return_value; > >> >>> >> + > >> >>> >> + objectName.length = strlen(mgmt_object); > >> >>> >> + strncpy((char *)objectName.value, mgmt_object, > >> >>> >> + objectName.length); > >> >>> >> + > >> >>> >> + safassert(immutil_saImmOmInitialize(&myOmHandle, NULL, > >> >>> >> &immVersion), > >> >>> >> + SA_AIS_OK); > >> >>> >> + > >> safassert(immutil_saImmOmAdminOwnerInitialize(myOmHandle, > >> >>> >> + adminOwnerName, > >> >>> >> + SA_TRUE, > >> >>> >&ownerHandle), > >> >>> >> + SA_AIS_OK); > >> >>> >> + safassert(immutil_saImmOmAdminOwnerSet(ownerHandle, > >> >>> >> objectNames, > >> >>> >> + SA_IMM_ONE), > >> >>> >> + SA_AIS_OK); > >> >>> >> + safassert(immutil_saImmOmAdminOperationInvoke_2( > >> >>> >> + ownerHandle, &objectName, 0, operation_id, > >> >>> >> + params, &operation_return_value, > >> >>> >> SA_TIME_ONE_MINUTE), > >> >>> >> + SA_AIS_OK); > >> >>> >> + safassert(immutil_saImmOmFinalize(myOmHandle), > >> SA_AIS_OK); > >> >>> >> +} > >> >>> >> + > >> >>> >> +uint32_t fetchAttributeValue(const char* attribute_name) > >> >>> >> +{ > >> >>> >> + SaImmHandleT myOmHandle; > >> >>> >> + SaImmAccessorHandleT accessorHandle; > >> >>> >> + SaImmAttrValuesT_2 **attributes; > >> >>> >> + SaImmAttrNameT attributeNames[] = { > >> >>> >> + (SaImmAttrNameT)attribute_name, > >> >>> >> + NULL > >> >>> >> + }; > >> >>> >> + SaNameT objectName; > >> >>> >> + objectName.length = strlen(mgmt_object); > >> >>> >> + strncpy((char *)objectName.value, mgmt_object, > >> >>> >> + objectName.length); > >> >>> >> + > >> >>> >> + safassert(immutil_saImmOmInitialize(&myOmHandle, NULL, > >> >>> >> + &immVersion), > >> >>> >> + SA_AIS_OK); > >> >>> >> + safassert(immutil_saImmOmAccessorInitialize(myOmHandle, > >> >>> >> + &accessorHandle), > >> >>> >> + SA_AIS_OK); > >> >>> >> + safassert(immutil_saImmOmAccessorGet_2(accessorHandle, > >> >>> >> &objectName, > >> >>> >> + attributeNames, > >> >>> >> &attributes), > >> >>> >> + SA_AIS_OK); > >> >>> >> + > >> >>> >> + uint32_t attribute_value = *(uint32_t > >> >>> >*)(attributes[0]->attrValues[0]); > >> >>> >> + safassert(immutil_saImmOmFinalize(myOmHandle), > >> SA_AIS_OK); > >> >>> >> + return attribute_value; > >> >>> >> +} > >> >>> >> + > >> >>> >> +bool pbeEnabled(void) > >> >>> >> +{ > >> >>> >> + return fetchAttributeValue("saImmRepositoryInit") == 1; > >> >>> >> +} > >> >>> >> + > >> >>> >> +void saImmOmClassCreate_with_fs_unavailable(void) > >> >>> >> +{ > >> >>> >> + const SaImmClassNameT className = (SaImmClassNameT) > >> >>> >> "TestClass"; > >> >>> >> + SaImmAttrDefinitionT_2 attr1 = { > >> >>> >> + "rdn", SA_IMM_ATTR_SANAMET, > >> >>> >> + SA_IMM_ATTR_RUNTIME | SA_IMM_ATTR_RDN | > >> >>> >> SA_IMM_ATTR_CACHED, > >> >>> >> + NULL}; > >> >>> >> + const SaImmAttrDefinitionT_2 *attrDefinitions[] = {&attr1, > >> NULL}; > >> >>> >> + > >> >>> >> + updateFileSystemStatus(SA_IMM_ADMIN_FS_UNAVAILABLE); > >> >>> >> + safassert(fetchAttributeValue("saImmFileSystemStatus"), 0); > >> >>> >> + > >> >>> >> + safassert(immutil_saImmOmInitialize(&immOmHandle, NULL, > >> >>> >> &immVersion), > >> >>> >> + SA_AIS_OK); > >> >>> >> + rc = saImmOmClassCreate_2(immOmHandle, className, > >> >>> >> SA_IMM_CLASS_RUNTIME, > >> >>> >> + attrDefinitions); > >> >>> >> + if (pbeEnabled()) { > >> >>> >> + test_validate(rc, SA_AIS_ERR_TRY_AGAIN); > >> >>> >> + } else { > >> >>> >> + test_validate(rc, SA_AIS_OK); > >> >>> >> + > >> safassert(immutil_saImmOmClassDelete(immOmHandle, > >> >>> >> className), > >> >>> >> + SA_AIS_OK); > >> >>> >> + } > >> >>> >> + safassert(immutil_saImmOmFinalize(immOmHandle), > >> SA_AIS_OK); > >> >>> >> + updateFileSystemStatus(SA_IMM_ADMIN_FS_AVAILABLE); > >> >>> >> + safassert(fetchAttributeValue("saImmFileSystemStatus"), 1); > >> >>> >> +} > >> >>> >> + > >> >>> >> +void saImmOmClassCreate_with_fs_available(void) > >> >>> >> +{ > >> >>> >> + const SaImmClassNameT className = (SaImmClassNameT) > >> >>> >> "TestClass"; > >> >>> >> + SaImmAttrDefinitionT_2 attr1 = { > >> >>> >> + "rdn", SA_IMM_ATTR_SANAMET, > >> >>> >> + SA_IMM_ATTR_RUNTIME | SA_IMM_ATTR_RDN | > >> >>> >> SA_IMM_ATTR_CACHED, > >> >>> >> + NULL}; > >> >>> >> + const SaImmAttrDefinitionT_2 *attrDefinitions[] = {&attr1, > >> NULL}; > >> >>> >> + > >> >>> >> + updateFileSystemStatus(SA_IMM_ADMIN_FS_AVAILABLE); > >> >>> >> + safassert(fetchAttributeValue("saImmFileSystemStatus"), 1); > >> >>> >> + > >> >>> >> + safassert(immutil_saImmOmInitialize(&immOmHandle, > >> >>> >> &immOmCallbacks, > >> >>> >> + &immVersion), > >> >>> >> + SA_AIS_OK); > >> >>> >> + rc = immutil_saImmOmClassCreate_2(immOmHandle, > >> className, > >> >>> >> + SA_IMM_CLASS_RUNTIME, > >> >>> >> + attrDefinitions); > >> >>> >> + test_validate(rc, SA_AIS_OK); > >> >>> >> + safassert(immutil_saImmOmClassDelete(immOmHandle, > >> className), > >> >>> >> SA_AIS_OK); > >> >>> >> + safassert(immutil_saImmOmFinalize(immOmHandle), > >> SA_AIS_OK); > >> >>> >> +} > >> >>> >> + > >> >>> >> extern void saImmOmClassDescriptionGet_2_01(void); > >> >>> >> extern void saImmOmClassDescriptionGet_2_02(void); > >> >>> >> extern void saImmOmClassDescriptionGet_2_03(void); > >> >>> >> @@ -1724,4 +1853,11 @@ __attribute__((constructor)) static void > >> >>> >> saImmOmInitialize_constructor(void) > >> >>> >> test_case_add( > >> >>> >> 2, saImmOmClassCreate_SchemaChange_2_18, > >> >>> >> "SchemaChange - SA_AIS_OK, Remove STRONG_DEFAULT > >> flag from > >> >>> >> an attribute"); > >> >>> >> + test_case_add( > >> >>> >> + 2, saImmOmClassCreate_with_fs_unavailable, > >> >>> >> + "FileSystemUnavailable - SA_AIS_ERR_TRY_AGAIN, > >> create > >> >>> >> class while FS is unavailable"); > >> >>> >> + test_case_add( > >> >>> >> + 2, saImmOmClassCreate_with_fs_available, > >> >>> >> + "FileSystemAvailable - SA_AIS_OK, create class while FS > >> is > >> >>> >> available"); > >> >>> >> + > >> >>> >> } > >> >>> >> diff --git a/src/imm/common/immsv_api.h > >> >>> b/src/imm/common/immsv_api.h > >> >>> >> index e6d613705..3ab3892d1 100644 > >> >>> >> --- a/src/imm/common/immsv_api.h > >> >>> >> +++ b/src/imm/common/immsv_api.h > >> >>> >> @@ -151,6 +151,7 @@ typedef enum { > >> >>> >> #define OPENSAF_IMM_FLAG_PRT50_ALLOW 0x00000080 > >> >>> >> #define OPENSAF_IMM_FLAG_PRT51_ALLOW 0x00000100 > >> >>> >> #define OPENSAF_IMM_FLAG_PRT51710_ALLOW 0x00000200 > >> >>> >> +#define OPENSAF_IMM_FLAG_PRT51906_ALLOW 0x00000800 > >> >>> >> > >> >>> >> #define OPENSAF_IMM_SERVICE_NAME "safImmService" > >> >>> >> > >> >>> >> @@ -159,7 +160,9 @@ typedef enum { > >> >>> >> SA_IMM_ADMIN_INIT_FROM_FILE = 100, /* Non standard, force > >> PBE > >> >>> >> disable. */ > >> >>> >> SA_IMM_ADMIN_ABORT_CCBS = 202, /* Non standard, abort > non > >> >>> critical > >> >>> >> CCBs. */ > >> >>> >> /* Non standard, regenerate pbe database from RAM */ > >> >>> >> - SA_IMM_ADMIN_REGENERATE_PBE_DB = 303 > >> >>> >> + SA_IMM_ADMIN_REGENERATE_PBE_DB = 303, > >> >>> >> + SA_IMM_ADMIN_FS_UNAVAILABLE = 400, > >> >>> >> + SA_IMM_ADMIN_FS_AVAILABLE = 401, > >> >>> >> } SaImmMngtAdminOperationT; > >> >>> >> > >> >>> >> /* > >> >>> >> diff --git a/src/imm/config/immsv_classes.xml > >> >>> >> b/src/imm/config/immsv_classes.xml > >> >>> >> index 6c20fecda..c6f448e82 100644 > >> >>> >> --- a/src/imm/config/immsv_classes.xml > >> >>> >> +++ b/src/imm/config/immsv_classes.xml > >> >>> >> @@ -46,5 +46,12 @@ > >> >>> >> <category>SA_CONFIG</category> > >> >>> >> <flag>SA_WRITABLE</flag> > >> >>> >> </attr> > >> >>> >> + <attr> > >> >>> >> + <name>saImmFileSystemStatus</name> > >> >>> >> + <type>SA_UINT32_T</type> > >> >>> >> + <category>SA_RUNTIME</category> > >> >>> >> + <category>SA_RUNTIME</category> > >> >>> >> + <flag>SA_CACHED</flag> > >> >>> >> + </attr> > >> >>> >> </class> > >> >>> >> </imm:IMM-contents> > >> >>> >> diff --git a/src/imm/immnd/ImmModel.cc > >> >>> b/src/imm/immnd/ImmModel.cc > >> >>> >> index 4bc3b8522..2cf2649cf 100644 > >> >>> >> --- a/src/imm/immnd/ImmModel.cc > >> >>> >> +++ b/src/imm/immnd/ImmModel.cc > >> >>> >> @@ -594,7 +594,7 @@ static const std::string > immManagementDn( > >> >>> >> "safRdn=immManagement,safApp=safImmService"); > >> >>> >> static const std::string > saImmRepositoryInit("saImmRepositoryInit"); > >> >>> >> static const std::string saImmOiTimeout("saImmOiTimeout"); > >> >>> >> - > >> >>> >> +static const std::string > >> >>> saImmFileSystemStatus("saImmFileSystemStatus"); > >> >>> >> static SaImmRepositoryInitModeT immInitMode = > >> >>> >> SA_IMM_INIT_FROM_FILE; > >> >>> >> static bool sRegenerateDb = false; > >> >>> >> > >> >>> >> @@ -609,6 +609,8 @@ static bool sAbortNonCriticalCcbs = > >> >>> >> static SaUint32T sTerminatedCcbcount = 0; /* Terminated ccbs > count. > >> >>> >> calculated > >> >>> >> at cleanTheBasement > >> >>> >> for > >> >>> >every > >> >>> >> second*/ > >> >>> >> +// Show the status of underlying file system. > >> >>> >> +static bool sFileSystemAvailable = true; > >> >>> >> > >> >>> >> struct AttrFlagIncludes { > >> >>> >> explicit AttrFlagIncludes(SaImmAttrFlagsT attrFlag) : > mFlag(attrFlag) > >> >>> >{} > >> >>> >> @@ -1125,6 +1127,10 @@ bool > >> >>> >> immModel_protocol51710Allowed(IMMND_CB* cb) { > >> >>> >> return ImmModel::instance(&cb->immModel)- > >> >protocol51710Allowed(); > >> >>> >> } > >> >>> >> > >> >>> >> +bool immModel_protocol51906Allowed(IMMND_CB* cb) { > >> >>> >> + return ImmModel::instance(&cb->immModel)- > >> >>> >protocol51906Allowed(); > >> >>> >> +} > >> >>> >> + > >> >>> >> OsafImmAccessControlModeT > >> >>> immModel_accessControlMode(IMMND_CB* > >> >>> >> cb) { > >> >>> >> return ImmModel::instance(&cb->immModel)- > >> >accessControlMode(); > >> >>> >> } > >> >>> >> @@ -2360,6 +2366,7 @@ bool ImmModel::immNotWritable() { > >> >>> >> bool ImmModel::immNotPbeWritable(bool isPrtoClient) { > >> >>> >> SaUint32T dummyCon; > >> >>> >> unsigned int dummyNode; > >> >>> >> + > >> >>> >> /* Not writable => Not persitent writable. */ > >> >>> >> if (immNotWritable() || is_sync_aborting()) { > >> >>> >> return true; > >> >>> >> @@ -2379,7 +2386,7 @@ bool > ImmModel::immNotPbeWritable(bool > >> >>> >> isPrtoClient) { > >> >>> >> /* immInitMode == SA_IMM_KEEP_REPOSITORY */ > >> >>> >> /* Check if PBE OI is available and making progress. */ > >> >>> >> > >> >>> >> - if (!getPbeOi(&dummyCon, &dummyNode)) { > >> >>> >> + if (!getPbeOi(&dummyCon, &dummyNode) || > >> !sFileSystemAvailable) { > >> >>> >> /* Pbe SHOULD be present but is NOT */ > >> >>> >> return true; > >> >>> >> } > >> >>> >> @@ -4023,6 +4030,27 @@ bool > ImmModel::protocol51710Allowed() > >> { > >> >>> >> return noStdFlags & OPENSAF_IMM_FLAG_PRT51710_ALLOW; > >> >>> >> } > >> >>> >> > >> >>> >> +bool ImmModel::protocol51906Allowed() { > >> >>> >> + /* Assume that all nodes are running the same version when > loading > >> */ > >> >>> >> + if (sImmNodeState == IMM_NODE_LOADING) { > >> >>> >> + return true; > >> >>> >> + } > >> >>> >> + ObjectMap::iterator oi = sObjectMap.find(immObjectDn); > >> >>> >> + if (oi == sObjectMap.end()) { > >> >>> >> + return false; > >> >>> >> + } > >> >>> >> + > >> >>> >> + ObjectInfo* immObject = oi->second; > >> >>> >> + ImmAttrValueMap::iterator avi = > >> >>> >> + immObject->mAttrValueMap.find(immAttrNostFlags); > >> >>> >> + osafassert(avi != immObject->mAttrValueMap.end()); > >> >>> >> + osafassert(!(avi->second->isMultiValued())); > >> >>> >> + ImmAttrValue* valuep = avi->second; > >> >>> >> + unsigned int noStdFlags = valuep->getValue_int(); > >> >>> >> + > >> >>> >> + return noStdFlags & OPENSAF_IMM_FLAG_PRT51906_ALLOW; > >> >>> >> +} > >> >>> >> + > >> >>> >> bool ImmModel::protocol41Allowed() { > >> >>> >> // TRACE_ENTER(); > >> >>> >> ObjectMap::iterator oi = sObjectMap.find(immObjectDn); > >> >>> >> @@ -5085,6 +5113,8 @@ SaAisErrorT > >> >>> >> ImmModel::adminOwnerDelete(SaUint32T ownerId, bool hard, > >> >>> >> flags when cluster is started/loaded or > >> >>> >> restarted/reloaded. > >> >>> >> */ > >> >>> >> ObjectMap::iterator oi = sObjectMap.find(immObjectDn); > >> >>> >> + auto oi2 = sObjectMap.find(immManagementDn); > >> >>> >> + > >> >>> >> if (oi == sObjectMap.end()) { > >> >>> >> LOG_ER("Failed to find object %s - loading failed", > >> >>> >> immObjectDn.c_str()); > >> >>> >> @@ -5093,6 +5123,16 @@ SaAisErrorT > >> >>> >> ImmModel::adminOwnerDelete(SaUint32T ownerId, bool hard, > >> >>> >> err = SA_AIS_ERR_NOT_READY; > >> >>> >> goto done; > >> >>> >> } > >> >>> >> + > >> >>> >> + if (oi2 == sObjectMap.end()) { > >> >>> >> + LOG_ER("Failed to find object %s - loading failed", > >> >>> >> + immManagementDn.c_str()); > >> >>> >> + /* Return special error up to immnd_evt so that > >> >>> >> NackToNid > >> can > >> >>> >be > >> >>> >> + sent before aborting. */ > >> >>> >> + err = SA_AIS_ERR_NOT_READY; > >> >>> >> + goto done; > >> >>> >> + } > >> >>> >> + > >> >>> >> ObjectInfo* immObject = oi->second; > >> >>> >> ImmAttrValueMap::iterator avi = > >> >>> >> immObject->mAttrValueMap.find(immAttrNostFlags); > >> >>> >> @@ -5108,6 +5148,9 @@ SaAisErrorT > >> >>> >> ImmModel::adminOwnerDelete(SaUint32T ownerId, bool hard, > >> >>> >> immObject->mAttrValueMap.find(immMaxCcbs); > >> >>> >> ImmAttrValueMap::iterator avi5 = > >> >>> >> immObject->mAttrValueMap.find(immMinApplierTimeout); > >> >>> >> + auto mgnt_object = oi2->second; > >> >>> >> + auto fs_attr_it = > >> >>> >> + mgnt_object- > >mAttrValueMap.find(saImmFileSystemStatus); > >> >>> >> > >> >>> >> ImmAttrValue* valuep = (ImmAttrValue*)avi->second; > >> >>> >> unsigned int noStdFlags = valuep->getValue_int(); > >> >>> >> @@ -5134,6 +5177,14 @@ SaAisErrorT > >> >>> >> ImmModel::adminOwnerDelete(SaUint32T ownerId, bool hard, > >> >>> >> } else { > >> >>> >> noStdFlags |= OPENSAF_IMM_FLAG_PRT51710_ALLOW; > >> >>> >> } > >> >>> >> + > >> >>> >> + if (fs_attr_it == immObject->mAttrValueMap.end()) { > >> >>> >> + LOG_NO("protocol51906 is not set for > >> opensafImmNostdFlags > >> >>> >> because " > >> >>> >> + "the new OpenSAF 5.19.06 attribute is not added > >> >>> >> to " > >> >>> >> + "SaImmMngt class"); > >> >>> >> + } else { > >> >>> >> + noStdFlags |= OPENSAF_IMM_FLAG_PRT51906_ALLOW; > >> >>> >> + } > >> >>> >> valuep->setValue_int(noStdFlags); > >> >>> >> LOG_NO("%s changed to: 0x%x", immAttrNostFlags.c_str(), > >> >>> >> noStdFlags); > >> >>> >> /* END Temporary code. */ > >> >>> >> @@ -12272,6 +12323,11 @@ SaAisErrorT > >> ImmModel::accessorGet(const > >> >>> >> ImmsvOmSearchInit* req, > >> >>> >> // The attribute is cached and the OI is transiently > >> >>> >> detached > >> >>> >> op.addAttrValue(*j->second); > >> >>> >> checkAttribute = true; > >> >>> >> + } else if ((k->second->mFlags & SA_IMM_ATTR_CACHED) && > >> >>> >> + (objectName == immManagementDn) && > >> >>> >> + !(j->second->empty())) { > >> >>> >> + op.addAttrValue(*j->second); > >> >>> >> + checkAttribute = true; > >> >>> >> } else { > >> >>> >> checkAttribute = false; > >> >>> >> } > >> >>> >> @@ -12844,6 +12900,11 @@ SaAisErrorT > >> >>> >> ImmModel::searchInitialize(ImmsvOmSearchInit* req, > >> >>> >> // detached > >> >>> >> op.addAttrValue(*j->second); > >> >>> >> checkAttribute = true; > >> >>> >> + } else if ((k->second->mFlags & > SA_IMM_ATTR_CACHED) > >> && > >> >>> >> + (objectName == immManagementDn) && > >> >>> >> + !(j->second->empty())) { > >> >>> >> + op.addAttrValue(*j->second); > >> >>> >> + checkAttribute = true; > >> >>> >> } else { > >> >>> >> checkAttribute = false; > >> >>> >> } > >> >>> >> @@ -13798,8 +13859,11 @@ SaAisErrorT > >> >>> >> ImmModel::admoImmMngtObject(const > >> >>> ImmsvOmAdminOperationInvoke* > >> >>> >> req, > >> >>> >> TRACE_ENTER(); > >> >>> >> ObjectMap::iterator oi = sObjectMap.find(immManagementDn); > >> >>> >> if (oi == sObjectMap.end()) { > >> >>> >> - err = SA_AIS_ERR_NOT_EXIST; > >> >>> >> - goto done; > >> >>> >> + return SA_AIS_ERR_NOT_EXIST; > >> >>> >> + } > >> >>> >> + > >> >>> >> + if (req->params != NULL) { > >> >>> >> + return SA_AIS_ERR_INVALID_PARAM; > >> >>> >> } > >> >>> >> > >> >>> >> immObject = oi->second; > >> >>> >> @@ -13808,10 +13872,10 @@ SaAisErrorT > >> >>> >> ImmModel::admoImmMngtObject(const > >> >>> ImmsvOmAdminOperationInvoke* > >> >>> >> req, > >> >>> >> osafassert(!(avi->second->isMultiValued())); > >> >>> >> valuep = (ImmAttrValue*)avi->second; > >> >>> >> > >> >>> >> - if (req->params != NULL) { > >> >>> >> - err = SA_AIS_ERR_INVALID_PARAM; > >> >>> >> - goto done; > >> >>> >> - } > >> >>> >> + auto fs_attr_iter = immObject- > >> >>> >> >mAttrValueMap.find(saImmFileSystemStatus); > >> >>> >> + osafassert(fs_attr_iter != immObject->mAttrValueMap.end()); > >> >>> >> + auto fs_attr_value = fs_attr_iter->second; > >> >>> >> + > >> >>> >> > >> >>> >> if (req->operationId == SA_IMM_ADMIN_EXPORT) { /* Standard > */ > >> >>> >> err = SA_AIS_ERR_NOT_SUPPORTED; > >> >>> >> @@ -13833,13 +13897,22 @@ SaAisErrorT > >> >>> >> ImmModel::admoImmMngtObject(const > >> >>> ImmsvOmAdminOperationInvoke* > >> >>> >> req, > >> >>> >> } else if (req->operationId == > >> SA_IMM_ADMIN_REGENERATE_PBE_DB) { > >> >>> >> LOG_NO("Re-generate the pbe database from one in > memory."); > >> >>> >> sRegenerateDb = true; > >> >>> >> + } else if (req->operationId == SA_IMM_ADMIN_FS_AVAILABLE) { > >> >>> >> + LOG_NO("Received: immadm -o %u > >> >>> >> safRdn=immManagement,safApp=safImmService", > >> >>> >> + SA_IMM_ADMIN_FS_AVAILABLE); > >> >>> >> + sFileSystemAvailable = true; > >> >>> >> + fs_attr_value->setValue_int(1); > >> >>> >> + } else if (req->operationId == > SA_IMM_ADMIN_FS_UNAVAILABLE) { > >> >>> >> + LOG_NO("Received: immadm -o %u > >> >>> >> safRdn=immManagement,safApp=safImmService", > >> >>> >> + SA_IMM_ADMIN_FS_UNAVAILABLE); > >> >>> >> + sFileSystemAvailable = false; > >> >>> >> + fs_attr_value->setValue_int(0); > >> >>> >> } else { > >> >>> >> LOG_NO("Invalid operation ID %llu, for operation on %s", > >> >>> >> (SaUint64T)req->operationId, immManagementDn.c_str()); > >> >>> >> err = SA_AIS_ERR_INVALID_PARAM; > >> >>> >> } > >> >>> >> > >> >>> >> -done: > >> >>> >> TRACE_LEAVE(); > >> >>> >> return err; > >> >>> >> } > >> >>> >> diff --git a/src/imm/immnd/ImmModel.h > >> b/src/imm/immnd/ImmModel.h > >> >>> >> index 65e20d305..0b54bfa1d 100644 > >> >>> >> --- a/src/imm/immnd/ImmModel.h > >> >>> >> +++ b/src/imm/immnd/ImmModel.h > >> >>> >> @@ -114,6 +114,7 @@ class ImmModel { > >> >>> >> bool protocol50Allowed(); > >> >>> >> bool protocol51Allowed(); > >> >>> >> bool protocol51710Allowed(); > >> >>> >> + bool protocol51906Allowed(); > >> >>> >> bool oneSafe2PBEAllowed(); > >> >>> >> bool purgeSyncRequest(SaUint32T clientId); > >> >>> >> bool verifySchemaChange(const std::string& className, > ClassInfo* > >> >>> >> oldClass, > >> >>> >> diff --git a/src/imm/immnd/immnd_evt.c > >> b/src/imm/immnd/immnd_evt.c > >> >>> >> index 0415ebedf..adae1e15a 100644 > >> >>> >> --- a/src/imm/immnd/immnd_evt.c > >> >>> >> +++ b/src/imm/immnd/immnd_evt.c > >> >>> >> @@ -3822,8 +3822,17 @@ static SaAisErrorT > >> >>> >> immnd_fevs_local_checks(IMMND_CB *cb, IMMSV_FEVS > *fevsReq, > >> >>> >> > >> >>> >> case IMMND_EVT_A2ND_IMM_ADMOP: > >> >>> >> case IMMND_EVT_A2ND_IMM_ADMOP_ASYNC: > >> >>> >> - /* No restrictions at cluster level. */ > >> >>> >> + { > >> >>> >> + IMMSV_OM_ADMIN_OP_INVOKE *adm = > >> >>> >> &frwrd_evt.info.immnd.info.admOpReq; > >> >>> >> + bool fs_op = (adm->operationId == > >> >>> >> SA_IMM_ADMIN_FS_AVAILABLE || > >> >>> >> + adm->operationId == > >> >>> >> SA_IMM_ADMIN_FS_UNAVAILABLE); > >> >>> >> + if (!immModel_protocol51906Allowed(cb) && fs_op > >> && > >> >>> >> + strcmp(adm->objectName.buf, > >> >>> >> + > >> "safRdn=immManagement,safApp=safImmService") == > >> >>> >> 0) { > >> >>> >> + error = SA_AIS_ERR_TRY_AGAIN; > >> >>> >> + } > >> >>> >> break; > >> >>> >> + } > >> >>> >> > >> >>> >> case IMMND_EVT_A2ND_CLASS_CREATE: > >> >>> >> if (fevsReq->sender_count != 0x1) { > >> >>> >> diff --git a/src/imm/immnd/immnd_init.h > >> b/src/imm/immnd/immnd_init.h > >> >>> >> index 58ed48329..9a3f70072 100644 > >> >>> >> --- a/src/imm/immnd/immnd_init.h > >> >>> >> +++ b/src/imm/immnd/immnd_init.h > >> >>> >> @@ -345,6 +345,7 @@ bool > >> immModel_protocol45Allowed(IMMND_CB > >> >>> >> *cb); > >> >>> >> bool immModel_protocol46Allowed(IMMND_CB *cb); > >> >>> >> bool immModel_protocol47Allowed(IMMND_CB *cb); > >> >>> >> bool immModel_protocol50Allowed(IMMND_CB *cb); > >> >>> >> +bool immModel_protocol51906Allowed(IMMND_CB *cb); > >> >>> >> bool immModel_oneSafe2PBEAllowed(IMMND_CB *cb); > >> >>> >> OsafImmAccessControlModeT > >> >>> immModel_accessControlMode(IMMND_CB > >> >>> >> *cb); > >> >>> >> const char *immModel_authorizedGroup(IMMND_CB *cb); > >> >>> >> -- > >> >>> >> 2.19.2 > >> >>> > > >> >>> > > >> >>> > > >> >>> > > >> >>> >_______________________________________________ > >> >>> >Opensaf-devel mailing list > >> >>> >Opensaf-devel@lists.sourceforge.net > >> >>> >https://lists.sourceforge.net/lists/listinfo/opensaf-devel > >> >>> > > >> >> > >> >> > >> >> > >> >>_______________________________________________ > >> >>Opensaf-devel mailing list > >> >>Opensaf-devel@lists.sourceforge.net > >> >>https://lists.sourceforge.net/lists/listinfo/opensaf-devel > >> >> > >> > > > > > > > > > > > > >_______________________________________________ > >Opensaf-devel mailing list > >Opensaf-devel@lists.sourceforge.net > >https://lists.sourceforge.net/lists/listinfo/opensaf-devel > > _______________________________________________ Opensaf-devel mailing list Opensaf-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/opensaf-devel