public Version putWithCustomTimeout ( CompositeVoldemortRequest < K , V > requestWrapper ) { validateTimeout ( requestWrapper . getRoutingTimeoutInMs ( ) ) ; List < Versioned < V > > versionedValues ; long startTime = System . currentTimeMillis ( ) ; String keyHexString = "" ; if ( logger . isDebugEnabled ( ) ) { ByteArray key = ( ByteArray ) requestWrapper . getKey ( ) ; keyHexString = RestUtils . getKeyHexString ( key ) ; logger . debug ( "PUT requested for key: " + keyHexString + " , for store: " + this . storeName + " at time(in ms): " + startTime + " . Nested GET and PUT VERSION requests to follow ---" ) ; } // We use the full timeout for doing the Get. In this, we're being // optimistic that the subsequent put might be faster such that all the // steps might finish within the allotted time requestWrapper . setResolveConflicts ( true ) ; versionedValues = getWithCustomTimeout ( requestWrapper ) ; Versioned < V > versioned = getItemOrThrow ( requestWrapper . getKey ( ) , null , versionedValues ) ; long endTime = System . currentTimeMillis ( ) ; if ( versioned == null ) versioned = Versioned . value ( requestWrapper . getRawValue ( ) , new VectorClock ( ) ) ; else versioned . setObject ( requestWrapper . getRawValue ( ) ) ; // This should not happen unless there's a bug in the // getWithCustomTimeout long timeLeft = requestWrapper . getRoutingTimeoutInMs ( ) - ( endTime - startTime ) ; if ( timeLeft <= 0 ) { throw new StoreTimeoutException ( "PUT request timed out" ) ; } CompositeVersionedPutVoldemortRequest < K , V > putVersionedRequestObject = new CompositeVersionedPutVoldemortRequest < K , V > ( requestWrapper . getKey ( ) , versioned , timeLeft ) ; putVersionedRequestObject . setRequestOriginTimeInMs ( requestWrapper . getRequestOriginTimeInMs ( ) ) ; Version result = putVersionedWithCustomTimeout ( putVersionedRequestObject ) ; long endTimeInMs = System . currentTimeMillis ( ) ; if ( logger . isDebugEnabled ( ) ) { logger . debug ( "PUT response received for key: " + keyHexString + " , for store: " + this . storeName + " at time(in ms): " + endTimeInMs ) ; } return result ; }
Performs a put operation with the specified composite request object