/** * 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())); }
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; }