示例#1
0
/**
 * This is used by the client application program to mount a remote server.
 * @param  srvIpOrDomName  the name or the IP address of the server to mount
 * @param  srvPort         port number in the server to mount
 * @param  localFolderName local name of the folder given to the mounted files
 * @return                 0 on success and -1 otherwise
 */
int fsMount(const char *srvIpOrDomName, const unsigned int srvPort, const char *localFolderName) {
	// do similar stuff as ass1 client app
	// save ip address and port number for subsequent remote calls

	#ifdef _DEBUG_CLI_
	printf("Calling fsMount to server\n");
	#endif

	remote_folder_server *newServer;
	if ((newServer = findServerByFolderName(localFolderName)) != NULL) {
		// printf("Server %s already exists as %s\n", localFolderName, newServer->localFolderName);
		errno = EEXIST;
		return -1;
	}

	return_type ans = make_remote_call( srvIpOrDomName,
										(int)srvPort,
										"fsMount", 1,
										strlen(localFolderName), (void *)(localFolderName));
	int containsError;
	int returnedValue;

	memcpy(&containsError, ans.return_val, sizeof(int));
	memcpy(&returnedValue, ans.return_val+sizeof(int), sizeof(int));
	
	if (containsError == 0) {
		//save id
		#ifdef _DEBUG_CLI_
		printf("Successfully returned, given clientID: %d\n", returnedValue);
		#endif
		
		newServer = (remote_folder_server*)malloc(sizeof(remote_folder_server));
		newServer->localFolderName = (char*)malloc(strlen(localFolderName));
		newServer->srvIpOrDomName  = (char*)malloc(strlen(srvIpOrDomName));
		newServer->clientId        = (int*) malloc(sizeof(int));

		*newServer->clientId = returnedValue;
		newServer->srvPort   = srvPort;
		newServer->next = NULL;

		strcpy(newServer->localFolderName, localFolderName);
		strcpy(newServer->srvIpOrDomName, srvIpOrDomName);

		addNewServer(newServer);

		return 0;
	}

	errno = returnedValue;

	return -1;
}
OptionsServerPage::OptionsServerPage(DVRServerRepository *serverRepository, QWidget *parent)
    : OptionsDialogPage(parent), m_serverRepository(serverRepository)
{
    Q_ASSERT(m_serverRepository);

    QBoxLayout *mainLayout = new QVBoxLayout(this);
    QBoxLayout *topLayout = new QHBoxLayout;
    mainLayout->addLayout(topLayout);

    /* Servers list */
    m_serversView = new QTreeView;

    m_model = new DVRServersModel(serverRepository, false, m_serversView);
    m_proxyModel = new DVRServersProxyModel(m_model);
    m_proxyModel->setDynamicSortFilter(true);
    m_proxyModel->setSourceModel(m_model);
    m_proxyModel->sort(0);

    m_serversView->setModel(m_proxyModel);

    m_serversView->header()->setHighlightSections(false);
    m_serversView->header()->setResizeMode(QHeaderView::ResizeToContents);
    m_serversView->header()->setResizeMode(0, QHeaderView::Stretch);
    m_serversView->header()->setStretchLastSection(false);
    m_serversView->setEditTriggers(QAbstractItemView::NoEditTriggers);
    m_serversView->setMinimumSize(480, 150);
    m_serversView->setSelectionBehavior(QAbstractItemView::SelectRows);
    m_serversView->setSelectionMode(QAbstractItemView::SingleSelection);
    m_serversView->setItemsExpandable(false);
    m_serversView->setRootIsDecorated(false);
    topLayout->addWidget(m_serversView);

    connect(m_serversView->selectionModel(), SIGNAL(currentChanged(QModelIndex,QModelIndex)),
            SLOT(currentServerChanged(QModelIndex,QModelIndex)));

    /* Editing area */
    QGridLayout *editsLayout = new QGridLayout;
    mainLayout->addLayout(editsLayout);

    QLabel *label = new QLabel(tr("Name:"));
    editsLayout->addWidget(label, 0, 0, Qt::AlignRight);

    m_nameEdit = new QLineEdit;
    editsLayout->addWidget(m_nameEdit, 0, 1);

    label = new QLabel(tr("Hostname:"));
    editsLayout->addWidget(label, 1, 0, Qt::AlignRight);

    QBoxLayout *hnLayout = new QBoxLayout(QBoxLayout::LeftToRight);
    m_hostnameEdit = new QLineEdit;
    hnLayout->addWidget(m_hostnameEdit);

    m_portEdit = new QLineEdit;
    m_portEdit->setValidator(new QIntValidator(1, 65535, m_portEdit));
    m_portEdit->setFixedWidth(50);
    hnLayout->addWidget(m_portEdit);

    m_portChecker = new WebRtpPortCheckerWidget;
    hnLayout->addWidget(m_portChecker);

    editsLayout->addLayout(hnLayout, 1, 1);

    label = new QLabel(tr("Connection Type:"));
    editsLayout->addWidget(label, 2, 0, Qt::AlignRight);

    m_connectionType = new QComboBox;
    m_connectionType->addItem(tr("RTSP"));
    m_connectionType->addItem(tr("MJPEG"));
    editsLayout->addWidget(m_connectionType, 2, 1);

    label = new QLabel(tr("Username:"******"Password:"******"Connect Automatically"));
    m_autoConnect->setChecked(true);
    editsLayout->addWidget(m_autoConnect, 3, 1, 1, 1);

    /* Errors */
    m_connectionStatus = new QLabel;
    m_connectionStatus->setAlignment(Qt::AlignCenter);
    //m_connectionStatus->setContentsMargins(4, 4, 4, 4);
    m_connectionStatus->setVisible(false);
    mainLayout->addWidget(m_connectionStatus);

    /* Buttons */
    QFrame *line = new QFrame;
    line->setFrameStyle(QFrame::HLine | QFrame::Sunken);
    mainLayout->addWidget(line);

    QBoxLayout *btnLayout = new QHBoxLayout;
    mainLayout->addLayout(btnLayout);

    QPushButton *newBtn = new QPushButton(tr("Add Server"));
    newBtn->setAutoDefault(false);
    connect(newBtn, SIGNAL(clicked()), SLOT(addNewServer()));
    btnLayout->addWidget(newBtn);

    QPushButton *delBtn = new QPushButton(tr("Delete"));
    delBtn->setAutoDefault(false);
    connect(delBtn, SIGNAL(clicked()), SLOT(deleteServer()));
    btnLayout->addWidget(delBtn);

    btnLayout->addStretch();
    QPushButton *applyBtn = new QPushButton(tr("Apply"));
    applyBtn->setAutoDefault(false);
    connect(applyBtn, SIGNAL(clicked()), SLOT(saveChanges()));
    btnLayout->addWidget(applyBtn);

    connect(m_hostnameEdit, SIGNAL(editingFinished()), this, SLOT(checkServer()));
    connect(m_portEdit, SIGNAL(editingFinished()), this, SLOT(checkServer()));
}
示例#3
0
int
LFRUManager::duplicateMethod(unsigned int serverId) {
    unsigned int needSpreadFile;
    double minWeight, curWeight;
    minWeight = 1000000.0;
    string logStr = "server[" + numToString(serverId) + "] is overload";
    serverLog.writeSystemLog(logStr);
    //get the file need to spread
    struct timeval callTime;
    gettimeofday(&callTime, NULL);
    ostringstream logStream;
    for (unsigned int i = 0; i < LFRUFileList.size(); i++) {
        if (LFRUFileList[i]->serverId != serverId)
            continue;
        logStream<<"for server "<<serverId<<",file "<<LFRUFileList[i]->fileId<<endl;
        logStream<<"\tcallTime:"<<callTime.tv_sec<<":"<<callTime.tv_usec<<" ";
        logStream<<"t0:"<<t0.tv_sec<<":"<<t0.tv_usec<<" ";
        logStream<<"vtime:"<<LFRUFileList[i]->vtime.tv_sec<<":"<<
                LFRUFileList[i]->vtime.tv_usec<<" ";
        logStream<<"count:"<<LFRUFileList[i]->count<<" ";
        double fk = getTimeSlips(&callTime, &t0) / (double(LFRUFileList[i]->count * 1000000.0));
        double rk = getTimeSlips(&callTime, &(LFRUFileList[i]->vtime)) / 1000000.0;
        curWeight = period - getTimeSlips(&callTime, &t0) / 1000000.0;
        curWeight = curWeight * rk / (double) period;
        curWeight += getTimeSlips(&callTime, &t0) * fk / (1000000.0 * period);
        logStream<<"Fk:"<<fk<<",rk:"<<rk<<",weight : "<<curWeight<<" ";
        //logStr = "in server[" + numToString(serverId) + "],the count of file " +
        //numToString(DWFileList[i]->fileId) + " is " + numToString(curCount);
        //serverLog.writeResourceLog(logStr);
        if (minWeight > curWeight) {
            minWeight = curWeight;
            needSpreadFile = LFRUFileList[i]->fileId;
        }
        logStream<<" minWeight = "<<minWeight<<",need spread file ="<<needSpreadFile<<endl;
    }
    serverLog.writeResourceLog(logStream.str());
    logStr = "server[" + numToString(serverId) + "] chose  file[" + numToString(needSpreadFile) + "] to spread";
    serverLog.writeResourceLog(logStr);
    //choose the machine that have the minLoad and don't have the file
    vector<unsigned int > containList;
    getServerList(needSpreadFile, containList);
    vector<unsigned int> noList;
    noList.clear();
    for (unsigned int i = 0; i < subServerNum; i++) {
        bool isContain = false;
        for (unsigned int j = 0; j < containList.size(); j++) {
            if (containList[j] == i) {
                isContain = true;
                break;
            }
        }
        if (isContain == false) {
            noList.push_back(i);
        }
    }
    int targetServer = lb->getMinLoadServer(noList);
    if (targetServer < 0) {
        logStr = "no server to duplicate";
        serverLog.writeResourceLog(logStr);
        return -1;
    }
    logStr = "the spread target server is server[" + numToString(targetServer) + "]";
    serverLog.writeResourceLog(logStr);
    //should have some transport time
    lb->addFileToSubServer(needSpreadFile, targetServer);
    addNewServer(needSpreadFile, targetServer);
    LFRUFileInfo *fileInfo = new LFRUFileInfo(needSpreadFile, targetServer);
    if (fileInfo != NULL)
        LFRUFileList.push_back(fileInfo);
    lb->printFileList();
    return 0;
}