/* * Copyright 1999-2006 University of Chicago * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.dcache.ftp.client.dc; import org.dcache.ftp.client.extended.GridFTPServerFacade; import org.slf4j.Logger; import org.slf4j.LoggerFactory; public class StripeContextManager { static final Logger logger = LoggerFactory.getLogger(StripeContextManager.class); protected final int stripes; protected final StripeTransferContext[] contextList; protected int stripeQuitTokens = 0; protected Object contextQuitToken = new Object(); public StripeContextManager(int stripes, SocketPool pool, GridFTPServerFacade facade) { this.stripes = stripes; contextList = new StripeTransferContext[stripes]; for (int i = 0; i < stripes; i++) { contextList[i] = new StripeTransferContext(this); contextList[i].setSocketPool(pool); contextList[i].setTransferThreadManager( facade.createTransferThreadManager()); } } /** * return number of stripes **/ public int getStripes() { return stripes; } public EBlockParallelTransferContext getStripeContext(int stripe) { return contextList[stripe]; } public Object getQuitToken() { int i = 0; while (i < stripes) { logger.debug("examining stripe " + i); if (contextList[i].getStripeQuitToken() != null) { // obtained quit token from one stripe. stripeQuitTokens++; logger.debug("obtained stripe quit token. Total = " + stripeQuitTokens + "; total needed = " + stripes); } i++; } if (stripeQuitTokens == stripes) { // obtained quit tokens from all stripes. // ready to release the quit token. But make sure not to do it twice. // This section only returns non-nul the first time it is entered. if (contextQuitToken == null) { logger.debug("not releasing the quit token."); } else { logger.debug("releasing the quit token."); } Object myToken = contextQuitToken; contextQuitToken = null; return myToken; } else { // not all stripes ready to quit logger.debug("not releasing the quit token. "); return null; } } class StripeTransferContext extends EBlockParallelTransferContext { final StripeContextManager mgr; public StripeTransferContext(StripeContextManager mgr) { this.mgr = mgr; } /** * @return non-null if this stripe received or sent all the EODs **/ public Object getStripeQuitToken() { Object token = super.getQuitToken(); StripeContextManager.logger.debug( (token != null) ? "stripe released the quit token" : "stripe did not release the quit token"); return token; } /** * @return non-null if all EODs in all stripes have been transferred. **/ @Override public Object getQuitToken() { return mgr.getQuitToken(); } } }