int rsDataObjPut (rsComm_t *rsComm, dataObjInp_t *dataObjInp, bytesBuf_t *dataObjInpBBuf, portalOprOut_t **portalOprOut) { int status; int status2; int remoteFlag; rodsServerHost_t *rodsServerHost; specCollCache_t *specCollCache = NULL; resolveLinkedPath (rsComm, dataObjInp->objPath, &specCollCache, &dataObjInp->condInput); #if 0 status = resolvePathInSpecColl (rsComm, dataObjInp->objPath, READ_COLL_PERM, 0, &dataObjInfo); if (dataObjInfo != NULL) { if (dataObjInfo->specColl != NULL && dataObjInfo->specColl->collClass == LINKED_COLL) { rstrcpy (dataObjInp->objPath, dataObjInfo->objPath, MAX_NAME_LEN); } freeAllDataObjInfo (dataObjInfo); } #endif remoteFlag = getAndConnRemoteZone (rsComm, dataObjInp, &rodsServerHost, REMOTE_CREATE); if (remoteFlag < 0) { return (remoteFlag); } else if (remoteFlag == LOCAL_HOST) { /** since the object is written here, we apply pre procesing RAJA * Dec 2 2010 **/ status2 = applyRuleForPostProcForWrite(rsComm, dataObjInpBBuf, dataObjInp->objPath); if (status2 < 0) return(status2); /* need to dealloc anything??? */ /** since the object is written here, we apply pre procesing RAJA * Dec 2 2010 **/ dataObjInp->openFlags = O_RDWR; status = _rsDataObjPut (rsComm, dataObjInp, dataObjInpBBuf, portalOprOut, BRANCH_MSG); } else { int l1descInx; status = _rcDataObjPut (rodsServerHost->conn, dataObjInp, dataObjInpBBuf, portalOprOut); if (status < 0 || getValByKey (&dataObjInp->condInput, DATA_INCLUDED_KW) != NULL) { return (status); } else { /* have to allocate a local l1descInx to keep track of things * since the file is in remote zone. It sets remoteL1descInx, * oprType = REMOTE_ZONE_OPR and remoteZoneHost so that * rsComplete knows what to do */ l1descInx = allocAndSetL1descForZoneOpr ( (*portalOprOut)->l1descInx, dataObjInp, rodsServerHost, NULL); if (l1descInx < 0) return l1descInx; (*portalOprOut)->l1descInx = l1descInx; return status; } } return (status); }
int rsDataObjPut( rsComm_t *rsComm, dataObjInp_t *dataObjInp, bytesBuf_t *dataObjInpBBuf, portalOprOut_t **portalOprOut ) { int status; int status2; int remoteFlag; rodsServerHost_t *rodsServerHost; specCollCache_t *specCollCache = NULL; resolveLinkedPath( rsComm, dataObjInp->objPath, &specCollCache, &dataObjInp->condInput ); remoteFlag = getAndConnRemoteZone( rsComm, dataObjInp, &rodsServerHost, REMOTE_CREATE ); if ( const char* acl_string = getValByKey( &dataObjInp->condInput, ACL_INCLUDED_KW ) ) { try { irods::deserialize_acl( acl_string ); } catch ( const irods::exception& e ) { rodsLog( LOG_ERROR, "%s", e.what() ); return e.code(); } } if ( const char* metadata_string = getValByKey( &dataObjInp->condInput, METADATA_INCLUDED_KW ) ) { try { irods::deserialize_metadata( metadata_string ); } catch ( const irods::exception& e ) { rodsLog( LOG_ERROR, "%s", e.what() ); return e.code(); } } if ( remoteFlag < 0 ) { return remoteFlag; } else if ( remoteFlag == LOCAL_HOST ) { // =-=-=-=-=-=-=- // working on the "home zone", determine if we need to redirect to a different // server in this zone for this operation. if there is a RESC_HIER_STR_KW then // we know that the redirection decision has already been made std::string hier; if ( getValByKey( &dataObjInp->condInput, RESC_HIER_STR_KW ) == NULL ) { irods::error ret = irods::resolve_resource_hierarchy( irods::CREATE_OPERATION, rsComm, dataObjInp, hier ); if ( !ret.ok() ) { std::stringstream msg; msg << __FUNCTION__; msg << " :: failed in irods::irods::resolve_resource_hierarchy for ["; msg << dataObjInp->objPath << "]"; irods::log( PASSMSG( msg.str(), ret ) ); return ret.code(); } // =-=-=-=-=-=-=- // we resolved the redirect and have a host, set the hier str for subsequent // api calls, etc. addKeyVal( &dataObjInp->condInput, RESC_HIER_STR_KW, hier.c_str() ); } // if keyword status2 = applyRuleForPostProcForWrite( rsComm, dataObjInpBBuf, dataObjInp->objPath ); if ( status2 < 0 ) { return ( status2 ); } dataObjInp->openFlags = O_RDWR; status = _rsDataObjPut( rsComm, dataObjInp, dataObjInpBBuf, portalOprOut ); } else { int l1descInx; status = _rcDataObjPut( rodsServerHost->conn, dataObjInp, dataObjInpBBuf, portalOprOut ); if ( status < 0 || getValByKey( &dataObjInp->condInput, DATA_INCLUDED_KW ) != NULL ) { return status; } else { /* have to allocate a local l1descInx to keep track of things * since the file is in remote zone. It sets remoteL1descInx, * oprType = REMOTE_ZONE_OPR and remoteZoneHost so that * rsComplete knows what to do */ l1descInx = allocAndSetL1descForZoneOpr( ( *portalOprOut )->l1descInx, dataObjInp, rodsServerHost, NULL ); if ( l1descInx < 0 ) { return l1descInx; } ( *portalOprOut )->l1descInx = l1descInx; return status; } } return status; }
int rcDataObjPut( rcComm_t *conn, dataObjInp_t *dataObjInp, char *locFilePath ) { int status; portalOprOut_t *portalOprOut = NULL; bytesBuf_t dataObjInpBBuf; if ( dataObjInp->dataSize <= 0 ) { dataObjInp->dataSize = getFileSize( locFilePath ); if ( dataObjInp->dataSize < 0 ) { return USER_FILE_DOES_NOT_EXIST; } } memset( &conn->transStat, 0, sizeof( transStat_t ) ); memset( &dataObjInpBBuf, 0, sizeof( dataObjInpBBuf ) ); rodsEnv env; getRodsEnv( &env ); int single_buff_sz = env.irodsMaxSizeForSingleBuffer * 1024 * 1024; if ( getValByKey( &dataObjInp->condInput, DATA_INCLUDED_KW ) != NULL ) { if ( dataObjInp->dataSize > single_buff_sz ) { rmKeyVal( &dataObjInp->condInput, DATA_INCLUDED_KW ); } else { status = fillBBufWithFile( conn, &dataObjInpBBuf, locFilePath, dataObjInp->dataSize ); if ( status < 0 ) { rodsLog( LOG_NOTICE, "rcDataObjPut: fileBBufWithFile error for %s", locFilePath ); return status; } } } else if ( dataObjInp->dataSize < single_buff_sz ) { addKeyVal( &dataObjInp->condInput, DATA_INCLUDED_KW, "" ); status = fillBBufWithFile( conn, &dataObjInpBBuf, locFilePath, dataObjInp->dataSize ); if ( status < 0 ) { rodsLog( LOG_NOTICE, "rcDataObjPut: fileBBufWithFile error for %s", locFilePath ); return status; } } dataObjInp->oprType = PUT_OPR; status = _rcDataObjPut( conn, dataObjInp, &dataObjInpBBuf, &portalOprOut ); clearBBuf( &dataObjInpBBuf ); if ( status < 0 || getValByKey( &dataObjInp->condInput, DATA_INCLUDED_KW ) != NULL ) { if ( portalOprOut != NULL ) { free( portalOprOut ); } return status; } if ( portalOprOut->numThreads <= 0 ) { status = putFile( conn, portalOprOut->l1descInx, locFilePath, dataObjInp->objPath, dataObjInp->dataSize ); } else if ( getUdpPortFromPortList( &portalOprOut->portList ) != 0 ) { int veryVerbose; /* rbudp transfer */ /* some sanity check */ if ( portalOprOut->numThreads != 1 ) { rcOprComplete( conn, SYS_INVALID_PORTAL_OPR ); free( portalOprOut ); return SYS_INVALID_PORTAL_OPR; } conn->transStat.numThreads = portalOprOut->numThreads; if ( getValByKey( &dataObjInp->condInput, VERY_VERBOSE_KW ) != NULL ) { printf( "From server: NumThreads=%d, addr:%s, port:%d, cookie=%d\n", portalOprOut->numThreads, portalOprOut->portList.hostAddr, portalOprOut->portList.portNum, portalOprOut->portList.cookie ); veryVerbose = 2; } else { veryVerbose = 0; } if ( irods::CS_NEG_USE_SSL == conn->negotiation_results ) { // =-=-=-=-=-=-=- // if a secret has been negotiated then we must be using // encryption. given that RBUDP is not supported in an // encrypted capacity this is considered an error rodsLog( LOG_ERROR, "putFileToPortal: Encryption is not supported with RBUDP" ); return SYS_INVALID_PORTAL_OPR; } else { status = putFileToPortalRbudp( portalOprOut, locFilePath, -1, veryVerbose, 0, 0 ); } } else { if ( getValByKey( &dataObjInp->condInput, VERY_VERBOSE_KW ) != NULL ) { printf( "From server: NumThreads=%d, addr:%s, port:%d, cookie=%d\n", portalOprOut->numThreads, portalOprOut->portList.hostAddr, portalOprOut->portList.portNum, portalOprOut->portList.cookie ); } /* some sanity check */ rodsEnv env; getRodsEnv( &env ); if ( portalOprOut->numThreads >= 20 * env.irodsDefaultNumberTransferThreads ) { rcOprComplete( conn, SYS_INVALID_PORTAL_OPR ); free( portalOprOut ); return SYS_INVALID_PORTAL_OPR; } conn->transStat.numThreads = portalOprOut->numThreads; status = putFileToPortal( conn, portalOprOut, locFilePath, dataObjInp->objPath, dataObjInp->dataSize ); } /* just send a complete msg */ if ( status < 0 ) { rcOprComplete( conn, status ); } else { status = rcOprComplete( conn, portalOprOut->l1descInx ); } free( portalOprOut ); if ( status >= 0 && conn->fileRestart.info.numSeg > 0 ) { /* file restart */ clearLfRestartFile( &conn->fileRestart ); } return status; }