Esempio n. 1
0
 /// <exception cref="System.Exception"/>
 private void LoadRMDTSecretManagerState(RMStateStore.RMState rmState)
 {
     CheckAndResumeUpdateOperation(rmDTSecretManagerRoot);
     FileStatus[] childNodes = ListStatusWithRetries(rmDTSecretManagerRoot);
     foreach (FileStatus childNodeStatus in childNodes)
     {
         System.Diagnostics.Debug.Assert(childNodeStatus.IsFile());
         string childNodeName = childNodeStatus.GetPath().GetName();
         if (CheckAndRemovePartialRecordWithRetries(childNodeStatus.GetPath()))
         {
             continue;
         }
         if (childNodeName.StartsWith(DelegationTokenSequenceNumberPrefix))
         {
             rmState.rmSecretManagerState.dtSequenceNumber = System.Convert.ToInt32(childNodeName
                                                                                    .Split("_")[1]);
             continue;
         }
         Path   childNodePath     = GetNodePath(rmDTSecretManagerRoot, childNodeName);
         byte[] childData         = ReadFileWithRetries(childNodePath, childNodeStatus.GetLen());
         ByteArrayInputStream @is = new ByteArrayInputStream(childData);
         using (DataInputStream fsIn = new DataInputStream(@is))
         {
             if (childNodeName.StartsWith(DelegationKeyPrefix))
             {
                 DelegationKey key = new DelegationKey();
                 key.ReadFields(fsIn);
                 rmState.rmSecretManagerState.masterKeyState.AddItem(key);
                 if (Log.IsDebugEnabled())
                 {
                     Log.Debug("Loaded delegation key: keyId=" + key.GetKeyId() + ", expirationDate="
                               + key.GetExpiryDate());
                 }
             }
             else
             {
                 if (childNodeName.StartsWith(DelegationTokenPrefix))
                 {
                     RMDelegationTokenIdentifierData identifierData = new RMDelegationTokenIdentifierData
                                                                          ();
                     identifierData.ReadFields(fsIn);
                     RMDelegationTokenIdentifier identifier = identifierData.GetTokenIdentifier();
                     long renewDate = identifierData.GetRenewDate();
                     rmState.rmSecretManagerState.delegationTokenState[identifier] = renewDate;
                     if (Log.IsDebugEnabled())
                     {
                         Log.Debug("Loaded RMDelegationTokenIdentifier: " + identifier + " renewDate=" + renewDate
                                   );
                     }
                 }
                 else
                 {
                     Log.Warn("Unknown file for recovering RMDelegationTokenSecretManager");
                 }
             }
         }
     }
 }
Esempio n. 2
0
        /// <exception cref="System.IO.IOException"/>
        private RMDelegationTokenIdentifierData LoadDelegationToken(byte[] data)
        {
            RMDelegationTokenIdentifierData tokenData = new RMDelegationTokenIdentifierData();
            DataInputStream @in = new DataInputStream(new ByteArrayInputStream(data));

            try
            {
                tokenData.ReadFields(@in);
            }
            finally
            {
                IOUtils.Cleanup(Log, @in);
            }
            return(tokenData);
        }
Esempio n. 3
0
        /// <exception cref="System.IO.IOException"/>
        private void StoreOrUpdateRMDT(RMDelegationTokenIdentifier tokenId, long renewDate
                                       , bool isUpdate)
        {
            string tokenKey = GetRMDTTokenNodeKey(tokenId);
            RMDelegationTokenIdentifierData tokenData = new RMDelegationTokenIdentifierData(tokenId
                                                                                            , renewDate);

            if (Log.IsDebugEnabled())
            {
                Log.Debug("Storing token to " + tokenKey);
            }
            try
            {
                WriteBatch batch = db.CreateWriteBatch();
                try
                {
                    batch.Put(JniDBFactory.Bytes(tokenKey), tokenData.ToByteArray());
                    if (!isUpdate)
                    {
                        ByteArrayOutputStream bs = new ByteArrayOutputStream();
                        using (DataOutputStream ds = new DataOutputStream(bs))
                        {
                            ds.WriteInt(tokenId.GetSequenceNumber());
                        }
                        if (Log.IsDebugEnabled())
                        {
                            Log.Debug("Storing " + tokenId.GetSequenceNumber() + " to " + RmDtSequenceNumberKey
                                      );
                        }
                        batch.Put(JniDBFactory.Bytes(RmDtSequenceNumberKey), bs.ToByteArray());
                    }
                    db.Write(batch);
                }
                finally
                {
                    batch.Close();
                }
            }
            catch (DBException e)
            {
                throw new IOException(e);
            }
        }
Esempio n. 4
0
        /// <exception cref="System.IO.IOException"/>
        private int LoadRMDTSecretManagerTokens(RMStateStore.RMState state)
        {
            int             numTokens = 0;
            LeveldbIterator iter      = null;

            try
            {
                iter = new LeveldbIterator(db);
                iter.Seek(JniDBFactory.Bytes(RmDtTokenKeyPrefix));
                while (iter.HasNext())
                {
                    KeyValuePair <byte[], byte[]> entry = iter.Next();
                    string key = JniDBFactory.AsString(entry.Key);
                    if (!key.StartsWith(RmDtTokenKeyPrefix))
                    {
                        break;
                    }
                    RMDelegationTokenIdentifierData tokenData = LoadDelegationToken(entry.Value);
                    RMDelegationTokenIdentifier     tokenId   = tokenData.GetTokenIdentifier();
                    long renewDate = tokenData.GetRenewDate();
                    state.rmSecretManagerState.delegationTokenState[tokenId] = renewDate;
                    ++numTokens;
                    if (Log.IsDebugEnabled())
                    {
                        Log.Debug("Loaded RM delegation token from " + key + ": tokenId=" + tokenId + ", renewDate="
                                  + renewDate);
                    }
                }
            }
            catch (DBException e)
            {
                throw new IOException(e);
            }
            finally
            {
                if (iter != null)
                {
                    iter.Close();
                }
            }
            return(numTokens);
        }
Esempio n. 5
0
        /// <exception cref="System.Exception"/>
        private void StoreOrUpdateRMDelegationTokenState(RMDelegationTokenIdentifier identifier
                                                         , long renewDate, bool isUpdate)
        {
            Path nodeCreatePath = GetNodePath(rmDTSecretManagerRoot, DelegationTokenPrefix +
                                              identifier.GetSequenceNumber());
            RMDelegationTokenIdentifierData identifierData = new RMDelegationTokenIdentifierData
                                                                 (identifier, renewDate);

            if (isUpdate)
            {
                Log.Info("Updating RMDelegationToken_" + identifier.GetSequenceNumber());
                UpdateFile(nodeCreatePath, identifierData.ToByteArray(), true);
            }
            else
            {
                Log.Info("Storing RMDelegationToken_" + identifier.GetSequenceNumber());
                WriteFileWithRetries(nodeCreatePath, identifierData.ToByteArray(), true);
                // store sequence number
                Path latestSequenceNumberPath = GetNodePath(rmDTSecretManagerRoot, DelegationTokenSequenceNumberPrefix
                                                            + identifier.GetSequenceNumber());
                Log.Info("Storing " + DelegationTokenSequenceNumberPrefix + identifier.GetSequenceNumber
                             ());
                if (dtSequenceNumberPath == null)
                {
                    if (!CreateFileWithRetries(latestSequenceNumberPath))
                    {
                        throw new Exception("Failed to create " + latestSequenceNumberPath);
                    }
                }
                else
                {
                    if (!RenameFileWithRetries(dtSequenceNumberPath, latestSequenceNumberPath))
                    {
                        throw new Exception("Failed to rename " + dtSequenceNumberPath);
                    }
                }
                dtSequenceNumberPath = latestSequenceNumberPath;
            }
        }