diff --git a/broker/bin/main b/broker/bin/main deleted file mode 100755 index 60fc519df924ef0d6eae045e88ff9b2cffe47632..0000000000000000000000000000000000000000 Binary files a/broker/bin/main and /dev/null differ diff --git a/broker/src/hidra2_broker/database/database.go b/broker/src/hidra2_broker/database/database.go index e4f2a57882194f474a7673b6ada18a586c0c3be6..e530bf03e1587c224a9e13dc92437fa45c656d2a 100644 --- a/broker/src/hidra2_broker/database/database.go +++ b/broker/src/hidra2_broker/database/database.go @@ -4,6 +4,7 @@ type Agent interface { GetNextRecord(db_name string) ([]byte, error) Connect(string) error Close() + Copy() Agent } type DBError struct { diff --git a/broker/src/hidra2_broker/database/database_test.go b/broker/src/hidra2_broker/database/database_test.go index e6af70358f445f3eb52d8d1dbfd5c237c6351b6b..207b40683c2a6575b546a468a4b698d6f7071d9a 100644 --- a/broker/src/hidra2_broker/database/database_test.go +++ b/broker/src/hidra2_broker/database/database_test.go @@ -10,9 +10,9 @@ func TestMockDataBase(t *testing.T) { var db MockedDatabase db.On("Connect", mock.AnythingOfType("string")).Return(nil) db.On("Close").Return() + db.On("Copy").Return(nil) db.On("GetNextRecord", "").Return([]byte(""), nil) db.Connect("") db.GetNextRecord("") - db.Close() } diff --git a/broker/src/hidra2_broker/database/mock_database.go b/broker/src/hidra2_broker/database/mock_database.go index ebfdcf881e67607c198834328a8dd0de3df28a9e..fbeb4582c4e4304979a1d05f7ee70b7dd2a04ce8 100644 --- a/broker/src/hidra2_broker/database/mock_database.go +++ b/broker/src/hidra2_broker/database/mock_database.go @@ -19,6 +19,11 @@ func (db *MockedDatabase) Close() { db.Called() } +func (db *MockedDatabase) Copy() Agent{ + db.Called() + return db +} + func (db *MockedDatabase) GetNextRecord(db_name string) (answer []byte, err error) { args := db.Called(db_name) return args.Get(0).([]byte), args.Error(1) diff --git a/broker/src/hidra2_broker/database/mongodb.go b/broker/src/hidra2_broker/database/mongodb.go index c653a63bb96f508145097ab94cbea779acb9cbad..4c76cb3f9c69a9890716c74fb51c5912c65053b7 100644 --- a/broker/src/hidra2_broker/database/mongodb.go +++ b/broker/src/hidra2_broker/database/mongodb.go @@ -27,6 +27,14 @@ type Mongodb struct { databases []string } +func (db *Mongodb) Copy() Agent { + new_db:= new(Mongodb) + new_db.main_session = db.main_session.Copy() + new_db.databases = make([]string,len(db.databases)) + copy(new_db.databases,db.databases) + return new_db +} + func (db *Mongodb) databaseInList(dbname string) bool { return utils.StringInSlice(dbname, db.databases) } @@ -46,7 +54,7 @@ func (db *Mongodb) dataBaseExist(dbname string) (err error) { } if !db.databaseInList(dbname) { - return errors.New(dbname + " not found") + return errors.New("database not found: " + dbname) } return nil @@ -58,6 +66,14 @@ func (db *Mongodb) Connect(address string) (err error) { } db.main_session, err = mgo.DialWithTimeout(address, time.Second) + if err != nil { + return err + } + + if err := db.updateDatabaseList(); err != nil { + return err + } + return } diff --git a/broker/src/hidra2_broker/server/get_next.go b/broker/src/hidra2_broker/server/get_next.go index efdcf40746b1cfa586a0bf306f13961312dd9615..ae29d355f5d7f1181d867b32cc811df9df7910cd 100644 --- a/broker/src/hidra2_broker/server/get_next.go +++ b/broker/src/hidra2_broker/server/get_next.go @@ -15,7 +15,8 @@ func extractRequestParameters(r *http.Request) (string, bool) { func routeGetNext(w http.ResponseWriter, r *http.Request) { r.Header.Set("Content-type", "application/json") - + // w.Write([]byte("Hello")) + // return db_name, ok := extractRequestParameters(r) if !ok { w.WriteHeader(http.StatusBadRequest) @@ -28,7 +29,9 @@ func routeGetNext(w http.ResponseWriter, r *http.Request) { } func getNextRecord(db_name string) (answer []byte, code int) { - answer, err := db.GetNextRecord(db_name) + db_new := db.Copy() + defer db_new.Close() + answer, err := db_new.GetNextRecord(db_name) if err != nil { err_db, ok := err.(*database.DBError) code = utils.StatusError diff --git a/broker/src/hidra2_broker/server/get_next_test.go b/broker/src/hidra2_broker/server/get_next_test.go index ba177fb4cdd6e437690accd99c59d55c12b9f6e2..11385f121b5412533e9d30ff6c87357ca211fe07 100644 --- a/broker/src/hidra2_broker/server/get_next_test.go +++ b/broker/src/hidra2_broker/server/get_next_test.go @@ -30,10 +30,16 @@ func TestGetNextWithoutDatabaseName(t *testing.T) { assert.Equal(t, http.StatusNotFound, w.Code, "no database name") } +func ExpectCopyClose(mock_db *database.MockedDatabase){ + mock_db.On("Copy").Return(mock_db) + mock_db.On("Close").Return() +} + func TestGetNextWithWrongDatabaseName(t *testing.T) { mock_db := new(database.MockedDatabase) db = mock_db defer func() { db = nil }() + ExpectCopyClose(mock_db) mock_db.On("GetNextRecord", "foo").Return([]byte(""), &database.DBError{utils.StatusWrongInput, ""}) @@ -46,6 +52,7 @@ func TestGetNextWithInternalDBError(t *testing.T) { mock_db := new(database.MockedDatabase) db = mock_db defer func() { db = nil }() + ExpectCopyClose(mock_db) mock_db.On("GetNextRecord", "foo").Return([]byte(""), errors.New("")) w := doRequest("/database/foo/next") @@ -57,6 +64,7 @@ func TestGetNextWithGoodDatabaseName(t *testing.T) { mock_db := new(database.MockedDatabase) db = mock_db defer func() { db = nil }() + ExpectCopyClose(mock_db) mock_db.On("GetNextRecord", "dbname").Return([]byte("Hello"), nil) w := doRequest("/database/dbname/next") diff --git a/broker/src/hidra2_broker/server/server_nottested.go b/broker/src/hidra2_broker/server/server_nottested.go index 640e6d9b8727639fef5ff15d6994b7ac42a3b041..461d25649e5fd9228c5638b27ed48daadf82a3e1 100644 --- a/broker/src/hidra2_broker/server/server_nottested.go +++ b/broker/src/hidra2_broker/server/server_nottested.go @@ -6,9 +6,51 @@ import ( "hidra2_broker/utils" "log" "net/http" + "fmt" + "time" + "sync" ) func Start() { +// test(os.Args[1]) +// return mux := utils.NewRouter(listRoutes) log.Fatal(http.ListenAndServe("127.0.0.1:5005", http.HandlerFunc(mux.ServeHTTP))) } + +func test(db_name string) { + nattempts := 50000 + nconns := 8 + start := time.Now() + nattempts = nattempts / nconns + counts := make([]int, nconns) + nbad := make([]int, nconns) + ngood := make([]int, nconns) + + var waitGroup sync.WaitGroup + waitGroup.Add(nconns) + + a := func(i int) { + for ; counts[i] < nattempts; counts[i]++ { + _,code := getNextRecord(db_name) + if code != utils.StatusOK { + nbad[i]++ + } else { + ngood[i]++ + } + } + waitGroup.Done() + } + + for i := 0; i < nconns; i++ { + go a(i) + } + waitGroup.Wait() + sum := 0 + for i := range counts { + sum += counts[i] + } + elapsed := time.Since(start) + fmt.Println("rate:", float64(sum)/elapsed.Seconds()) + fmt.Println("good,bad:", ngood, nbad) +} diff --git a/worker/api/cpp/CMakeLists.txt b/worker/api/cpp/CMakeLists.txt index 12e73fc50834e6f2b006728b4a0ffd6d28da6172..8404ee9e46d62c69fc9f9906f67e129bf4db7eee 100644 --- a/worker/api/cpp/CMakeLists.txt +++ b/worker/api/cpp/CMakeLists.txt @@ -26,7 +26,7 @@ target_include_directories(${TARGET_NAME} PUBLIC include ${HIDRA2_CXX_COMMON_INC IF(WIN32) target_compile_definitions(${TARGET_NAME} PUBLIC -DCURL_STATICLIB) -ELSE() +ELSEIF(CMAKE_C_COMPILER_ID STREQUAL "GNU") SET( CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -static-libgcc -static-libstdc++") ENDIF(WIN32)