Skip to content

Commit

Permalink
[XrdSsi] Version 2 changes.
Browse files Browse the repository at this point in the history
  • Loading branch information
abh3 committed Feb 4, 2017
1 parent d061873 commit 18f767d
Show file tree
Hide file tree
Showing 34 changed files with 1,839 additions and 1,431 deletions.
5 changes: 3 additions & 2 deletions src/XrdSsi.cmake
Expand Up @@ -15,13 +15,15 @@ set( XRD_SSI_SHMAP_SOVERSION 1 )
add_library(
XrdSsiLib
SHARED
XrdSsi/XrdSsiAlert.cc XrdSsi/XrdSsiAlert.hh
XrdSsi/XrdSsiAtomics.hh
XrdSsi/XrdSsiBVec.hh
XrdSsi/XrdSsiClient.cc
XrdSsi/XrdSsiCluster.hh
XrdSsi/XrdSsiCms.cc XrdSsi/XrdSsiCms.hh
XrdSsi/XrdSsiErrInfo.hh
XrdSsi/XrdSsiEvent.cc XrdSsi/XrdSsiEvent.hh
XrdSsi/XrdSsiFileResource.cc XrdSsi/XrdSsiFileResource.hh
XrdSsi/XrdSsiLogger.cc XrdSsi/XrdSsiLogger.hh
XrdSsi/XrdSsiPacer.cc XrdSsi/XrdSsiPacer.hh
XrdSsi/XrdSsiProvider.hh
Expand All @@ -30,11 +32,10 @@ XrdSsi/XrdSsiPacer.cc XrdSsi/XrdSsiPacer.hh
XrdSsi/XrdSsiRequest.cc XrdSsi/XrdSsiRequest.hh
XrdSsi/XrdSsiResponder.hh
XrdSsi/XrdSsiResource.hh
XrdSsi/XrdSsiScale.hh
XrdSsi/XrdSsiServReal.cc XrdSsi/XrdSsiServReal.hh
XrdSsi/XrdSsiService.hh
XrdSsi/XrdSsiSessReal.cc XrdSsi/XrdSsiSessReal.hh
XrdSsi/XrdSsiSSRun.cc XrdSsi/XrdSsiSSRun.hh
XrdSsi/XrdSsiSession.hh
XrdSsi/XrdSsiStream.hh
XrdSsi/XrdSsiTaskReal.cc XrdSsi/XrdSsiTaskReal.hh
XrdSsi/XrdSsiTrace.hh
Expand Down
151 changes: 151 additions & 0 deletions src/XrdSsi/XrdSsiAlert.cc
@@ -0,0 +1,151 @@
/******************************************************************************/
/* */
/* X r d S s i A l e r t . c c */
/* */
/* (c) 2017 by the Board of Trustees of the Leland Stanford, Jr., University */
/* All Rights Reserved */
/* Produced by Andrew Hanushevsky for Stanford University under contract */
/* DE-AC02-76-SFO0515 with the Department of Energy */
/* */
/* This file is part of the XRootD software suite. */
/* */
/* XRootD is free software: you can redistribute it and/or modify it under */
/* the terms of the GNU Lesser General Public License as published by the */
/* Free Software Foundation, either version 3 of the License, or (at your */
/* option) any later version. */
/* */
/* XRootD is distributed in the hope that it will be useful, but WITHOUT */
/* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or */
/* FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public */
/* License for more details. */
/* */
/* You should have received a copy of the GNU Lesser General Public License */
/* along with XRootD in a file called COPYING.LESSER (LGPL license) and file */
/* COPYING (GPL license). If not, see <http://www.gnu.org/licenses/>. */
/* */
/* The copyright holder's institutional names and contributor's names may not */
/* be used to endorse or promote products derived from this software without */
/* specific prior written permission of the institution or contributor. */
/******************************************************************************/

#include <sys/uio.h>

#include "XrdOuc/XrdOucErrInfo.hh"
#include "XrdSsi/XrdSsiAlert.hh"
#include "XrdSsi/XrdSsiRRInfo.hh"

/******************************************************************************/
/* S t a t i c s */
/******************************************************************************/

XrdSysMutex XrdSsiAlert::aMutex;
XrdSsiAlert *XrdSsiAlert::free = 0;
int XrdSsiAlert::fNum = 0;
int XrdSsiAlert::fMax = XrdSsiAlert::fmaxDflt;

/******************************************************************************/
/* A l l o c */
/******************************************************************************/

XrdSsiAlert *XrdSsiAlert::Alloc(XrdSsiRespInfoMsg &aMsg)
{
XrdSsiAlert *aP;

// Obtain a lock
//
aMutex.Lock();

// Allocate via stack or a new call
//
if (!(aP = free)) aP = new XrdSsiAlert();
else {free = aP->next; fNum--;}

// Unlock mutex
//
aMutex.UnLock();

// Fill out object and return it
//
aP->next = 0;
aP->theMsg = &aMsg;
return aP;
}

/******************************************************************************/
/* D o n e */
/******************************************************************************/

// Gets invoked only after query() on wtresp signal was sent

void XrdSsiAlert::Done(int &retc, XrdOucErrInfo *eiP, const char *name)
{

// This is an async callback so we need to delete our errinfo object.
//
delete eiP;

// Simply recycle this object.
//
Recycle();
}

/******************************************************************************/
/* R e c y c l e */
/******************************************************************************/

void XrdSsiAlert::Recycle()
{

// Issue callback to release the message if we have one
//
if (theMsg) theMsg->Recycle();

// Place object on the queue unless we have too many
//
aMutex.Lock();
if (fNum >= fMax) delete this;
else {next = free; free = this; fNum++;}
aMutex.UnLock();
}

/******************************************************************************/
/* S e t I n f o */
/******************************************************************************/

void XrdSsiAlert::SetInfo(XrdOucErrInfo &eInfo)
{
static const int aIovSz = 3;
struct AlrtResp {struct iovec ioV[aIovSz]; XrdSsiRRInfoAttn aHdr;};

AlrtResp *alrtResp;
char *mBuff;
int n;

// We will be constructing the response in the message buffer. This is
// gauranteed to be big enough for our purposes so no need to check the size.
//
mBuff = eInfo.getMsgBuff(n);

// Initialize the response
//
alrtResp = (AlrtResp *)mBuff;
memset(alrtResp, 0, sizeof(AlrtResp));
alrtResp->aHdr.pfxLen = htons(sizeof(XrdSsiRRInfoAttn));

// Fill out iovec to point to our header
//
// alrtResp->ioV[0].iov_len = sizeof(XrdSsiRRInfoAttn) + msgBlen;
alrtResp->ioV[1].iov_base = mBuff+offsetof(struct AlrtResp, aHdr);
alrtResp->ioV[1].iov_len = sizeof(XrdSsiRRInfoAttn);

// Fill out the iovec for the alert data
//
alrtResp->ioV[2].iov_base = theMsg->GetMsg(n);
alrtResp->ioV[2].iov_len = n;
alrtResp->aHdr.mdLen = htonl(n);
alrtResp->aHdr.tag = XrdSsiRRInfoAttn::alrtResp;

// Setup to have metadata actually sent to the requestor
//
eInfo.setErrCode(aIovSz);
}
72 changes: 72 additions & 0 deletions src/XrdSsi/XrdSsiAlert.hh
@@ -0,0 +1,72 @@
#ifndef _XRDSSIALERT_H
#define _XRDSSIALERT_H
/******************************************************************************/
/* */
/* X r d S s i A l e r t . h h */
/* */
/* (c) 2017 by the Board of Trustees of the Leland Stanford, Jr., University */
/* All Rights Reserved */
/* Produced by Andrew Hanushevsky for Stanford University under contract */
/* DE-AC02-76-SFO0515 with the Department of Energy */
/* */
/* This file is part of the XRootD software suite. */
/* */
/* XRootD is free software: you can redistribute it and/or modify it under */
/* the terms of the GNU Lesser General Public License as published by the */
/* Free Software Foundation, either version 3 of the License, or (at your */
/* option) any later version. */
/* */
/* XRootD is distributed in the hope that it will be useful, but WITHOUT */
/* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or */
/* FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public */
/* License for more details. */
/* */
/* You should have received a copy of the GNU Lesser General Public License */
/* along with XRootD in a file called COPYING.LESSER (LGPL license) and file */
/* COPYING (GPL license). If not, see <http://www.gnu.org/licenses/>. */
/* */
/* The copyright holder's institutional names and contributor's names may not */
/* be used to endorse or promote products derived from this software without */
/* specific prior written permission of the institution or contributor. */
/******************************************************************************/

#include "XrdOuc/XrdOucErrInfo.hh"
#include "XrdSsi/XrdSsiRequest.hh"
#include "XrdSys/XrdSysPthread.hh"

class XrdSsiAlert : public XrdOucEICB
{
public:

XrdSsiAlert *next;

static XrdSsiAlert *Alloc(XrdSsiRespInfoMsg &aMsg);

void Recycle();

void SetInfo(XrdOucErrInfo &eInfo);

static void SetMax(int maxval) {fMax = maxval;}

// OucEICB methods
//
void Done(int &Result, XrdOucErrInfo *cbInfo,
const char *path=0);

int Same(unsigned long long arg1, unsigned long long arg2)
{return 0;}

XrdSsiAlert() {}
~XrdSsiAlert() {}
private:

static XrdSysMutex aMutex;
static XrdSsiAlert *free;
static int fNum;
static int fMax;

static const int fmaxDflt = 100;

XrdSsiRespInfoMsg *theMsg;
};
#endif
24 changes: 14 additions & 10 deletions src/XrdSsi/XrdSsiClient.cc
Expand Up @@ -29,8 +29,12 @@

#include <errno.h>
#include <fcntl.h>
#include <stdio.h>
#include <string>
#include <string.h>
#include <time.h>
#include <unistd.h>
#include <sys/types.h>

#include "Xrd/XrdScheduler.hh"
#include "Xrd/XrdTrace.hh"
Expand Down Expand Up @@ -84,15 +88,15 @@ class XrdSsiClientProvider : public XrdSsiProvider
{
public:

XrdSsiService *GetService(XrdSsiErrInfo &eInfo,
const char *contact,
int oHold=256
XrdSsiService *GetService(XrdSsiErrInfo &eInfo,
const std::string &contact,
int oHold=256
);

virtual bool Init(XrdSsiLogger *logP,
XrdSsiCluster *clsP,
const char *cfgFn,
const char *parms,
std::string cfgFn,
std::string parms,
int argc,
char **argv
) {return true;}
Expand All @@ -117,9 +121,9 @@ void SetScheduler();
/* X r d S s i C l i e n t P r o v i d e r : : G e t S e r v i c e */
/******************************************************************************/

XrdSsiService *XrdSsiClientProvider::GetService(XrdSsiErrInfo &eInfo,
const char *contact,
int oHold)
XrdSsiService *XrdSsiClientProvider::GetService(XrdSsiErrInfo &eInfo,
const std::string &contact,
int oHold)
{
static const int maxTMO = 0x7fffffff;
XrdNetAddr netAddr;
Expand All @@ -143,12 +147,12 @@ XrdSsiService *XrdSsiClientProvider::GetService(XrdSsiErrInfo &eInfo,

// If no contact is given then declare an error
//
if (!contact || !(*contact))
if (contact.empty())
{eInfo.Set("Contact not specified.", EINVAL); return 0;}

// Validate the given contact
//
if ((eText = netAddr.Set(contact)))
if ((eText = netAddr.Set(contact.c_str())))
{eInfo.Set(eText, EINVAL); return 0;}

// Construct new binding
Expand Down

0 comments on commit 18f767d

Please sign in to comment.